summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2006-07-06 13:47:05 +0000
committertzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2006-07-06 13:47:05 +0000
commit39a1812c1ef76b6a792f00087f1e507616bbbb25 (patch)
treee50633c999779c514ef16f4a2ce7a70fc7511c9e
parent70ef1183eba2d2fe4f00668fd3438b7f1c842c94 (diff)
Tons of updates to the Astribank (xpp) driver:
* xpd_fxo.ko (FXO span) is now operational * Remove obsolete .inc initialization files (we use user-space init) * Added an install target to the utils dir. * Updated README.Astribank accordingly. * Using RBS signalling, as caller ID did not work well otherwise. * Better handling of USB protocol errors. * Fixed some procfs-related races. * per-card-module ioctls. * fxotune support. * opermode support (set through /etc/default/zaptel for now) * Userspace initialization script can also read registers. * Power calibration works (and implemented in perl) * some fine-tuning to the regster initialization parameters. * Leds turn on before registration and turn off after it. git-svn-id: http://svn.digium.com/svn/zaptel/trunk@1204 5390a7c7-147a-4af0-8ec9-7488f05a26cb
-rw-r--r--xpp/Makefile29
-rw-r--r--xpp/README.Astribank15
-rw-r--r--xpp/card_fxo.c337
-rw-r--r--xpp/card_fxo.h4
-rw-r--r--xpp/card_fxs.c339
-rw-r--r--xpp/card_fxs.h4
-rw-r--r--xpp/card_global.c40
-rw-r--r--xpp/card_global.h1
-rwxr-xr-xxpp/cmd2inc48
-rw-r--r--xpp/init_data_3_19.cmd7
-rw-r--r--xpp/init_data_3_20.cmd7
-rw-r--r--xpp/init_data_4_20.cmd59
-rw-r--r--xpp/slic.h6
-rw-r--r--xpp/utils/FPGA_FXS.hex1044
-rw-r--r--xpp/utils/Makefile24
-rwxr-xr-xxpp/utils/genzaptelconf49
-rw-r--r--xpp/utils/hexfile.c8
-rw-r--r--xpp/utils/xpp_fxloader63
-rw-r--r--xpp/xbus-core.c229
-rw-r--r--xpp/xbus-core.h3
-rw-r--r--xpp/xdefs.h50
-rw-r--r--xpp/xpd.h89
-rw-r--r--xpp/xpp_usb.c23
-rw-r--r--xpp/xpp_zap.c320
-rw-r--r--xpp/xpp_zap.h13
-rw-r--r--xpp/xproto.c34
-rw-r--r--xpp/xproto.h42
-rw-r--r--xpp/zap_debug.c2
-rw-r--r--xpp/zap_debug.h8
29 files changed, 1594 insertions, 1303 deletions
diff --git a/xpp/Makefile b/xpp/Makefile
index 1355cc6..6b32add 100644
--- a/xpp/Makefile
+++ b/xpp/Makefile
@@ -1,30 +1,9 @@
-EXTRA_CFLAGS = -I$(SUBDIRS) -DDEBUG -DWITH_ECHO_SUPPRESSION # -DHARD_CODED_INIT # -DOLD_CARD # -DWITH_RBS
+EXTRA_CFLAGS = -I$(SUBDIRS) -DDEBUG -DPOLL_DIGITAL_INPUTS -DWITH_ECHO_SUPPRESSION -DWITH_RBS -DSTANDALONE_ZAPATA
-obj-m = xpp.o xpd_fxs.o xpd_fxo.o xpp_usb.o
+obj-m = xpp.o xpp_usb.o xpd_fxs.o xpd_fxo.o
xpp-y += xbus-core.o xpp_zap.o xproto.o card_global.o
xpd_fxs-y += card_fxs.o slic.o
xpd_fxo-y += card_fxo.o slic.o
-GENERATE_INIT_DATA := 1
-INIT_DATA = init_data_3_19.inc init_data_3_20.inc init_data_4_19.inc init_data_4_20.inc
-clean-files := $(INIT_DATA)
-
-cmd2inc=$(src)/cmd2inc
-
-define run_cmd2inc
-if [ ! -x $(cmd2inc) ]; then chmod +x $(cmd2inc); fi
-$(cmd2inc) $^ $@
-endef
-
-ifeq ($(GENERATE_INIT_DATA),1)
-
-$(obj)/%.inc: $(src)/%.cmd
- @echo "Generating $@"
- @$(run_cmd2inc)
-
-init_data: $(INIT_DATA)
-
-$(obj)/card_fxs.o: $(obj)/init_data_3_19.inc $(obj)/init_data_3_20.inc
-$(obj)/card_fxo.o: $(obj)/init_data_4_19.inc $(obj)/init_data_4_20.inc
-
-endif
+ctags:
+ ctags *.[ch]
diff --git a/xpp/README.Astribank b/xpp/README.Astribank
index 5e49176..f6f995c 100644
--- a/xpp/README.Astribank
+++ b/xpp/README.Astribank
@@ -35,6 +35,13 @@ install the (externally available) fxload utility.
Installation:
""""""""""""
+apart from the standard 'make install' in the zaptel directory,
+run:
+
+ make -C xpp/utils install
+
+Alternatively, do the following manually:
+
All firmware files should be copied to a new directory:
/usr/share/zaptel/
@@ -45,6 +52,14 @@ In addition, the file xpp/xpp_modprobe contains optional modprobe settings.
It may be copied verbatim into /etc/modprobe.conf or (better) copied to
/etc/modprobe.d/ .
+
+Note that loading through udev is not yet provided. Run
+
+ /etc/hotplug/usb/xpp_fxloader xppdetect
+
+to load firmware.
+
+
Loading Firmware Details:
""""""""""""""""""""""""
The Astribank needs a firmware loaded into it. Without the firmware,
diff --git a/xpp/card_fxo.c b/xpp/card_fxo.c
index bd3e141..d383e5d 100644
--- a/xpp/card_fxo.c
+++ b/xpp/card_fxo.c
@@ -34,6 +34,15 @@
static const char rcsid[] = "$Id$";
DEF_PARM(int, print_dbg, 0, "Print DBG statements"); /* must be before zap_debug.h */
+DEF_PARM(uint, poll_battery_interval, 100, "Poll battery interval in milliseconds");
+DEF_PARM(bool, report_battery, 0, "Report battery status to zaptel");
+
+/* Signaling is opposite (fxs signalling for fxo card) */
+#if 1
+#define FXO_DEFAULT_SIGCAP (ZT_SIG_FXSKS | ZT_SIG_FXSLS)
+#else
+#define FXO_DEFAULT_SIGCAP (ZT_SIG_SF)
+#endif
enum fxo_leds {
LED_GREEN,
@@ -44,39 +53,19 @@ enum fxo_leds {
/*---------------- FXO Protocol Commands ----------------------------------*/
-/* 0x0F */ DECLARE_CMD(FXO, CHAN_ENABLE, xpp_line_t lines, bool on);
-/* 0x0F */ DECLARE_CMD(FXO, CHAN_CID, xpp_line_t lines);
-/* 0x0F */ DECLARE_CMD(FXO, RING, int pos, bool on);
-/* 0x0F */ DECLARE_CMD(FXO, SETHOOK, int pos, bool offhook);
-/* 0x0F */ DECLARE_CMD(FXO, RELAY_OUT, byte which, bool on);
-/* 0x0F */ DECLARE_CMD(FXO, DAA_INIT);
-/* 0x0F */ DECLARE_CMD(FXO, DAA_QUERY, int pos, byte reg_num);
+static /* 0x0F */ DECLARE_CMD(FXO, CHAN_ENABLE, xpp_line_t lines, bool on);
+static /* 0x0F */ DECLARE_CMD(FXO, CHAN_CID, int pos);
+static /* 0x0F */ DECLARE_CMD(FXO, RING, int pos, bool on);
+static /* 0x0F */ DECLARE_CMD(FXO, SETHOOK, int pos, bool offhook);
+static /* 0x0F */ DECLARE_CMD(FXO, RELAY_OUT, byte which, bool on);
+static /* 0x0F */ DECLARE_CMD(FXO, DAA_QUERY, int pos, byte reg_num);
static bool fxo_packet_is_valid(xpacket_t *pack);
static void fxo_packet_dump(xpacket_t *pack);
static int proc_fxo_info_read(char *page, char **start, off_t off, int count, int *eof, void *data);
static int proc_xpd_slic_read(char *page, char **start, off_t off, int count, int *eof, void *data);
static int proc_xpd_slic_write(struct file *file, const char __user *buffer, unsigned long count, void *data);
-
-#define S_(s,l,...) \
- { \
- .lines = s, \
- { \
- .len = l, \
- .data = { __VA_ARGS__ }, \
- } \
- }
-struct slic_init_data {
- xpp_line_t lines;
- slic_data_t slic_data;
-} slic_init_data[] = {
-#ifdef OLD_CARD
-#include "init_data_4_19.inc"
-#else
-#include "init_data_4_20.inc"
-#endif
-};
-#undef S_
+static int process_slic_cmdline(xpd_t *xpd, char *cmdline);
#define PROC_DAA_FNAME "slics"
#define PROC_FXO_INFO_FNAME "fxo_info"
@@ -126,7 +115,7 @@ static int do_led(xpd_t *xpd, lineno_t pos, byte which, bool on)
BIT_CLR(priv->ledstate[which], pos);
}
}
- if(!(lines & xpd->enabled_chans)) // Ignore disabled channels
+ if(!lines) // Nothing to do
goto out;
DBG("%s/%s: LED: lines=0x%04X which=%d -- %s\n", xbus->busname, xpd->xpdname, lines, which, (on) ? "on" : "off");
XPACKET_NEW(pack, xbus, FXO, DAA_WRITE, xpd->id);
@@ -151,7 +140,7 @@ static void handle_fxo_leds(xpd_t *xpd)
spin_lock_irqsave(&xpd->lock, flags);
priv = xpd->priv;
timer_count = xpd->timer_count;
- for_each_enabled_line(xpd, i) {
+ for_each_line(xpd, i) {
if(IS_SET(xpd->digital_outputs, i) || IS_SET(xpd->digital_inputs, i))
continue;
if(IS_BLINKING(priv,i,color)) {
@@ -172,10 +161,16 @@ static void handle_fxo_leds(xpd_t *xpd)
static void do_sethook(xpd_t *xpd, int pos, bool offhook)
{
- unsigned long flags;
+ unsigned long flags;
+ struct FXO_priv_data *priv;
BUG_ON(!xpd);
BUG_ON(xpd->direction == TO_PHONE); // We can SETHOOK state only on PSTN
+ priv = xpd->priv;
+ BUG_ON(!priv);
+ if(!IS_SET(priv->battery, pos)) {
+ DBG("%s/%s/%d: WARNING: called while battery is off\n", xpd->xbus->busname, xpd->xpdname, pos);
+ }
spin_lock_irqsave(&xpd->lock, flags);
xpd->ringing[pos] = 0; // No more rings
CALL_XMETHOD(SETHOOK, xpd->xbus, xpd, pos, offhook);
@@ -228,6 +223,7 @@ static int FXO_card_init(xbus_t *xbus, xpd_t *xpd)
{
struct FXO_priv_data *priv;
int ret = 0;
+ int i;
BUG_ON(!xpd);
priv = xpd->priv;
@@ -237,41 +233,34 @@ static int FXO_card_init(xbus_t *xbus, xpd_t *xpd)
if(!priv->fxo_info) {
ERR("Failed to create proc '%s' for %s/%s\n", PROC_FXO_INFO_FNAME, xbus->busname, xpd->xpdname);
ret = -ENOENT;
- goto out;
+ goto err;
}
+ priv->fxo_info->owner = THIS_MODULE;
DBG("Creating DAAs file for %s/%s\n", xbus->busname, xpd->xpdname);
priv->xpd_slic = create_proc_entry(PROC_DAA_FNAME, 0644, xpd->proc_xpd_dir);
if(!priv->xpd_slic) {
ERR("Failed to create proc file for DAAs of %s/%s\n", xbus->busname, xpd->xpdname);
- goto out;
+ ret = -ENOENT;
+ goto err;
}
+ priv->xpd_slic->owner = THIS_MODULE;
priv->xpd_slic->write_proc = proc_xpd_slic_write;
priv->xpd_slic->read_proc = proc_xpd_slic_read;
priv->xpd_slic->data = xpd;
#endif
-#ifdef HARD_CODED_INIT
- CALL_PROTO(FXO, DAA_INIT, xbus, xpd);
-#else
ret = run_initialize_registers(xpd);
if(ret < 0)
- goto out;
-#endif
- if(xpd->direction == TO_PSTN) {
- int i;
-
- // Hanghup all lines
- for_each_enabled_line(xpd, i) {
- init_waitqueue_head(&xpd->txstateq[i]);
- do_sethook(xpd, i, 0);
- }
- }
-out:
- if(ret < 0) {
- clean_proc(xbus, xpd);
- ERR("%s/%s: Failed initializing registers (%d)\n", xbus->busname, xpd->xpdname, ret);
- } else {
- DBG("done: %s/%s\n", xbus->busname, xpd->xpdname);
+ goto err;
+ // Hanghup all lines
+ for_each_line(xpd, i) {
+ init_waitqueue_head(&xpd->txstateq[i]);
+ do_sethook(xpd, i, 0);
}
+ DBG("done: %s/%s\n", xbus->busname, xpd->xpdname);
+ return 0;
+err:
+ clean_proc(xbus, xpd);
+ ERR("%s/%s: Failed initializing registers (%d)\n", xbus->busname, xpd->xpdname, ret);
return ret;
}
@@ -286,11 +275,43 @@ static int FXO_card_remove(xbus_t *xbus, xpd_t *xpd)
return 0;
}
-static int FXO_card_zaptel_registration(xpd_t *xpd, bool on)
+static int FXO_card_zaptel_preregistration(xpd_t *xpd, bool on)
{
xbus_t *xbus;
struct FXO_priv_data *priv;
+ int i;
unsigned long flags;
+
+ BUG_ON(!xpd);
+ xbus = xpd->xbus;
+ BUG_ON(!xbus);
+ priv = xpd->priv;
+ BUG_ON(!priv);
+ DBG("%s/%s (%d)\n", xbus->busname, xpd->xpdname, on);
+ snprintf(xpd->span.desc, MAX_SPANDESC, "Xorcom XPD #%d/%d: FXO", xbus->num, xpd->id);
+ for_each_line(xpd, i) {
+ struct zt_chan *cur_chan = &xpd->chans[i];
+
+ DBG("setting FXO channel %d\n", i);
+ snprintf(cur_chan->name, MAX_CHANNAME, "XPP_FXO/%d/%d/%d", xbus->num, xpd->id, i);
+ cur_chan->chanpos = i + 1;
+ cur_chan->pvt = xpd;
+ cur_chan->sigcap = FXO_DEFAULT_SIGCAP;
+ }
+ spin_lock_irqsave(&xpd->lock, flags);
+ do_led(xpd, ALL_LINES, LED_GREEN, LED_OFF);
+ spin_unlock_irqrestore(&xpd->lock, flags);
+ for_each_line(xpd, i) {
+ do_led(xpd, i, LED_GREEN, LED_ON);
+ mdelay(50);
+ }
+ return 0;
+}
+
+static int FXO_card_zaptel_postregistration(xpd_t *xpd, bool on)
+{
+ xbus_t *xbus;
+ struct FXO_priv_data *priv;
int i;
BUG_ON(!xpd);
@@ -299,42 +320,48 @@ static int FXO_card_zaptel_registration(xpd_t *xpd, bool on)
priv = xpd->priv;
BUG_ON(!priv);
DBG("%s/%s (%d)\n", xbus->busname, xpd->xpdname, on);
- if(on) {
- for_each_line(xpd, i) {
- spin_lock_irqsave(&xpd->lock, flags);
- do_led(xpd, i, LED_GREEN, LED_ON);
- spin_unlock_irqrestore(&xpd->lock, flags);
- mdelay(50);
- }
- for_each_line(xpd, i) {
- spin_lock_irqsave(&xpd->lock, flags);
- do_led(xpd, i, LED_GREEN, LED_OFF);
- spin_unlock_irqrestore(&xpd->lock, flags);
- mdelay(50);
- }
- } else {
- for_each_line(xpd, i) {
- spin_lock_irqsave(&xpd->lock, flags);
- do_led(xpd, i, LED_GREEN, LED_ON);
- spin_unlock_irqrestore(&xpd->lock, flags);
- mdelay(100);
- spin_lock_irqsave(&xpd->lock, flags);
- do_led(xpd, i, LED_GREEN, LED_OFF);
- spin_unlock_irqrestore(&xpd->lock, flags);
- }
+ for_each_line(xpd, i) {
+ do_led(xpd, i, LED_GREEN, LED_OFF);
+ mdelay(50);
+ }
+ return 0;
+}
+
+#ifdef WITH_RBS
+int FXO_card_hooksig(xbus_t *xbus, xpd_t *xpd, int pos, zt_txsig_t txsig)
+{
+ struct FXO_priv_data *priv;
+
+ priv = xpd->priv;
+ BUG_ON(!priv);
+ DBG("%s/%s/%d: %s\n", xbus->busname, xpd->xpdname, pos, txsig2str(txsig));
+ BUG_ON(xpd->direction != TO_PSTN);
+ /* XXX Enable hooksig for FXO XXX */
+ switch(txsig) {
+ case ZT_TXSIG_START:
+ break;
+ case ZT_TXSIG_OFFHOOK:
+ do_sethook(xpd, pos, 1);
+ break;
+ case ZT_TXSIG_ONHOOK:
+ do_sethook(xpd, pos, 0);
+ break;
+ default:
+ NOTICE("Can't set tx state to %s (%d)\n", txsig2str(txsig), txsig);
+ return -EINVAL;
}
return 0;
}
+#else
int FXO_card_sethook(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate)
{
- int ret = 0;
+ int ret = 0;
+ struct FXO_priv_data *priv;
DBG("%s/%s/%d: %s\n", xbus->busname, xpd->xpdname, pos, hookstate2str(hookstate));
switch(hookstate) {
- /* On-hook, off-hook: The PBX is playing a phone on an FXO line.
- * Can be ignored for an FXS line
- */
+ /* On-hook, off-hook: The PBX is playing a phone on an FXO line. */
case ZT_ONHOOK:
do_sethook(xpd, pos, 0);
break;
@@ -353,7 +380,7 @@ int FXO_card_sethook(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate)
WARN("No code yet\n");
break;
case ZT_RING:
- DBG("%s/%s/%d: (ringing[%d]=%d)\n", xbus->busname, xpd->xpdname, pos, pos, xpd->ringing[pos]);
+ DBG("%s/%s/%d: ZT_RING: %d\n", xbus->busname, xpd->xpdname, pos, xpd->ringing[pos]);
break;
case ZT_RINGOFF:
WARN("No code yet\n");
@@ -361,12 +388,13 @@ int FXO_card_sethook(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate)
}
return ret;
}
+#endif
static void poll_battery(xbus_t *xbus, xpd_t *xpd)
{
int i;
- for_each_enabled_line(xpd, i) {
+ for_each_line(xpd, i) {
CALL_PROTO(FXO, DAA_QUERY, xbus, xpd, i, DAA_VBAT_REGISTER);
}
}
@@ -374,23 +402,75 @@ static void poll_battery(xbus_t *xbus, xpd_t *xpd)
static int FXO_card_tick(xbus_t *xbus, xpd_t *xpd)
{
- static int rate_limit = 0;
+ static unsigned rate_limit = 0;
struct FXO_priv_data *priv;
BUG_ON(!xpd);
priv = xpd->priv;
BUG_ON(!priv);
rate_limit++;
- if((rate_limit % 100) == 0) {
+ if(poll_battery_interval != 0 && (rate_limit % poll_battery_interval) == 0) {
poll_battery(xbus, xpd);
}
handle_fxo_leds(xpd);
return 0;
}
+/* FIXME: based on data from from wctdm.h */
+#include <wctdm.h>
+static const int echotune_reg[] = {30,45,46,47,58,49,50,51,52};
+union echotune {
+ /* "coeff 0" is acim */
+ unsigned char coeff[sizeof(echotune_reg)];
+ struct wctdm_echo_coefs wctdm_struct;
+};
+
+static int FXO_card_ioctl(xpd_t *xpd, int pos, unsigned int cmd, unsigned long arg)
+{
+ union echotune echoregs;
+ int i,ret;
+
+ BUG_ON(!xpd);
+ DBG("cmd: 0x%x, expecting: 0x%x, pos=%d.\n", cmd, WCTDM_SET_ECHOTUNE, pos);
+ switch (cmd) {
+ case WCTDM_SET_ECHOTUNE:
+ DBG("-- Setting echo registers: \n");
+ /* first off: check if this span is fxs. If not: -EINVALID */
+ if (copy_from_user(&echoregs.wctdm_struct,
+ (struct wctdm_echo_coefs*)arg, sizeof(echoregs.wctdm_struct)))
+ return -EFAULT;
+
+ /* Set the ACIM register */
+ /* quick and dirty registers writing: */
+ for (i=0; i<sizeof(echotune_reg); i++) {
+ char buf[22];
+ xpp_line_t lines = BIT(pos);
+ sprintf(buf, "%02X %02X %02X %02X WD %2X %2X",
+ (lines & 0xFF),
+ ((lines >> 8) & 0xFF),
+ ((lines >> 16) & 0xFF),
+ ((lines >> 24) & 0xFF),
+ echotune_reg[i],echoregs.coeff[i]
+ );
+ /* FIXME: code duplicated from proc_xpd_register_write */
+ ret = process_slic_cmdline(xpd, buf);
+ if(ret < 0)
+ return ret;
+ mdelay(1);
+ }
+
+ DBG("-- Set echo registers successfully\n");
+
+ break;
+ default:
+ return -ENOTTY;
+ }
+ return 0;
+}
+
/*---------------- FXO: HOST COMMANDS -------------------------------------*/
-/* 0x0F */ HOSTCMD(FXO, CHAN_ENABLE, xpp_line_t lines, bool on)
+static /* 0x0F */ HOSTCMD(FXO, CHAN_ENABLE, xpp_line_t lines, bool on)
{
unsigned long flags;
int ret = 0;
@@ -398,19 +478,18 @@ static int FXO_card_tick(xbus_t *xbus, xpd_t *xpd)
BUG_ON(!xbus);
BUG_ON(!xpd);
- lines &= xpd->enabled_chans; // Ignore disabled channels
if(!lines) {
return 0;
}
DBG("Channel Activation: 0x%4X %s\n", lines, (on) ? "on" : "off");
if(on) {
- for_each_enabled_line(xpd, i) {
+ for_each_line(xpd, i) {
spin_lock_irqsave(&xpd->lock, flags);
do_led(xpd, i, LED_GREEN, LED_ON);
spin_unlock_irqrestore(&xpd->lock, flags);
mdelay(20);
}
- for_each_enabled_line(xpd, i) {
+ for_each_line(xpd, i) {
spin_lock_irqsave(&xpd->lock, flags);
do_led(xpd, i, LED_GREEN, LED_OFF);
spin_unlock_irqrestore(&xpd->lock, flags);
@@ -420,32 +499,31 @@ static int FXO_card_tick(xbus_t *xbus, xpd_t *xpd)
return ret;
}
-/* 0x0F */ HOSTCMD(FXO, CHAN_CID, xpp_line_t lines)
+static /* 0x0F */ HOSTCMD(FXO, CHAN_CID, int pos)
{
int ret = 0;
+ xpp_line_t lines = BIT(pos);
BUG_ON(!xbus);
BUG_ON(!xpd);
- lines &= xpd->enabled_chans; // Ignore disabled channels
if(!lines) {
return 0;
}
- DBG("Channel CID: 0x%04X\n", lines);
+ DBG("%s/%s/%d:\n", xbus->busname, xpd->xpdname, pos);
return ret;
}
-/* 0x0F */ HOSTCMD(FXO, RING, int pos, bool on)
+static /* 0x0F */ HOSTCMD(FXO, RING, int pos, bool on)
{
int ret = 0;
xpacket_t *pack;
slic_cmd_t *sc;
- xpp_line_t mask = (1 << pos);
+ xpp_line_t mask = BIT(pos);
int len;
BUG_ON(!xbus);
BUG_ON(!xpd);
- mask &= xpd->enabled_chans; // Ignore disabled channels
if(!mask) {
return 0;
}
@@ -459,7 +537,7 @@ static int FXO_card_tick(xbus_t *xbus, xpd_t *xpd)
return ret;
}
-/* 0x0F */ HOSTCMD(FXO, SETHOOK, int pos, bool offhook)
+static /* 0x0F */ HOSTCMD(FXO, SETHOOK, int pos, bool offhook)
{
int ret = 0;
xpacket_t *pack;
@@ -470,56 +548,26 @@ static int FXO_card_tick(xbus_t *xbus, xpd_t *xpd)
BUG_ON(!xbus);
BUG_ON(!xpd);
- value = (offhook) ? 0x01 : 0x00;
+ value = (offhook) ? 0x09 : 0x08;
// value |= BIT(3); /* Bit 3 is for CID */
DBG("%s/%s/%d: SETHOOK: value=0x%02X %s\n", xbus->busname, xpd->xpdname, pos, value, (offhook)?"OFFHOOK":"ONHOOK");
spin_lock_irqsave(&xpd->lock, flags);
- if(!IS_SET(xpd->enabled_chans, pos))
- goto out;
XPACKET_NEW(pack, xbus, FXO, DAA_WRITE, xpd->id);
sc = &RPACKET_FIELD(pack, FXO, DAA_WRITE, slic_cmd);
len = slic_cmd_direct_write(sc, BIT(pos), 0x05, value);
pack->datalen = len;
packet_send(xbus, pack);
do_led(xpd, pos, LED_GREEN, (offhook)?LED_ON:LED_OFF);
-out:
spin_unlock_irqrestore(&xpd->lock, flags);
return ret;
}
-/* 0x0F */ HOSTCMD(FXO, RELAY_OUT, byte which, bool on)
+static /* 0x0F */ HOSTCMD(FXO, RELAY_OUT, byte which, bool on)
{
return -ENOSYS;
}
-/* 0x0F */ HOSTCMD(FXO, DAA_INIT)
-{
- int ret = 0;
- xpacket_t *pack;
- slic_data_t *slic;
- struct slic_init_data *source;
- int i;
-
- BUG_ON(!xbus);
- BUG_ON(!xpd);
- DBG("INITIALIZING DAA\n");
- for(i = 0; i < ARRAY_SIZE(slic_init_data); i++) {
- source = &slic_init_data[i];
- XPACKET_NEW(pack, xbus, FXO, DAA_INIT, xpd->id);
- RPACKET_FIELD(pack, FXO, DAA_INIT, lines) = source->lines;
-
- slic = &RPACKET_FIELD(pack, FXO, DAA_INIT, slic_data);
- slic->len = source->slic_data.len;
- memcpy(slic->data, source->slic_data.data, source->slic_data.len);
- pack->datalen = sizeof(xpp_line_t) + slic->len + 1;
-// dump_packet("DAA", pack, print_dbg);
- packet_send(xbus, pack);
- mdelay(1); // FIXME: check with Dima
- }
- return ret;
-}
-
-/* 0x0F */ HOSTCMD(FXO, DAA_QUERY, int pos, byte reg_num)
+static /* 0x0F */ HOSTCMD(FXO, DAA_QUERY, int pos, byte reg_num)
{
int ret = 0;
xpacket_t *pack;
@@ -588,22 +636,16 @@ HANDLER_DEF(FXO, DAA_REPLY)
if(abs(info->data_low) < BAT_THRESHOLD) {
priv->battery &= ~lines;
- // DBG("BATTERY OFF (%04X) = %d\n", lines, info->data_low);
+ // DBG("%s/%s: BATTERY OFF (%04X) = %d\n", xpd->xbus->busname, xpd->xpdname, lines, info->data_low);
} else {
priv->battery |= lines;
- // DBG("BATTERY ON (%04X) = %d\n", lines, info->data_low);
+ // DBG("%s/%s: BATTERY ON (%04X) = %d\n", xpd->xbus->busname, xpd->xpdname, lines, info->data_low);
}
changed_lines = last_batt_on ^ priv->battery;
for_each_line(xpd, i) {
- if(!IS_SET(changed_lines, i) || IS_SET(xpd->hookstate, i))
- continue;
-#if 0
- /* FIXME: We don't want to affect the whole span */
- if(IS_SET(priv->battery, i))
- update_xpd_status(xpd, ZT_ALARM_NONE);
- else
- update_xpd_status(xpd, ZT_ALARM_RED);
-#endif
+ if(IS_SET(changed_lines, i)) {
+ update_line_status(xpd, i, IS_SET(priv->battery, i));
+ }
}
}
#if 0
@@ -635,9 +677,15 @@ xproto_table_t PROTO_TABLE(FXO) = {
.card_new = FXO_card_new,
.card_init = FXO_card_init,
.card_remove = FXO_card_remove,
- .card_zaptel_registration = FXO_card_zaptel_registration,
+ .card_zaptel_preregistration = FXO_card_zaptel_preregistration,
+ .card_zaptel_postregistration = FXO_card_zaptel_postregistration,
+#ifdef WITH_RBS
+ .card_hooksig = FXO_card_hooksig,
+#else
.card_sethook = FXO_card_sethook,
+#endif
.card_tick = FXO_card_tick,
+ .card_ioctl = FXO_card_ioctl,
.RING = XPROTO_CALLER(FXO, RING),
.SETHOOK = XPROTO_CALLER(FXO, SETHOOK),
@@ -676,7 +724,8 @@ static int proc_fxo_info_read(char *page, char **start, off_t off, int count, in
struct FXO_priv_data *priv;
int i;
- BUG_ON(!xpd);
+ if(!xpd)
+ return -ENODEV;
spin_lock_irqsave(&xpd->lock, flags);
priv = xpd->priv;
BUG_ON(!priv);
@@ -830,9 +879,8 @@ static int process_slic_cmdline(xpd_t *xpd, char *cmdline)
len = parse_slic_cmd(p, &sc, &priv->requested_reply);
if(len < 0)
return len;
- sc.lines &= xpd->enabled_chans; // Ignore disabled channels
if(!sc.lines) {
- NOTICE("%s: no enabled channels are marked. Skip.\n", __FUNCTION__);
+ NOTICE("%s: no channels are marked. Skip.\n", __FUNCTION__);
return 0;
}
dump_slic_cmd("WRITE_DAA", &sc);
@@ -852,7 +900,8 @@ static int proc_xpd_slic_write(struct file *file, const char __user *buffer, uns
int i;
int ret;
- BUG_ON(!xpd);
+ if(!xpd)
+ return -ENODEV;
for(i = 0; i < count; /* noop */) {
for(p = buf; p < buf + LINE_LEN; p++) { /* read a line */
if(i >= count)
diff --git a/xpp/card_fxo.h b/xpp/card_fxo.h
index 49078d3..762f47b 100644
--- a/xpp/card_fxo.h
+++ b/xpp/card_fxo.h
@@ -51,10 +51,6 @@ DEF_RPACKET_DATA(FXO, DAA_REPLY, /* Get status of a single DAA (for debugging) *
xpp_line_t lines;
slic_reply_t info;
);
-DEF_RPACKET_DATA(FXO, DAA_INIT,
- xpp_line_t lines;
- slic_data_t slic_data;
- );
DEF_RPACKET_DATA(FXO, DAA_WRITE,
slic_cmd_t slic_cmd;
);
diff --git a/xpp/card_fxs.c b/xpp/card_fxs.c
index d2413f3..41b503e 100644
--- a/xpp/card_fxs.c
+++ b/xpp/card_fxs.c
@@ -34,15 +34,21 @@
static const char rcsid[] = "$Id$";
DEF_PARM(int, print_dbg, 0, "Print DBG statements"); /* must be before zap_debug.h */
+DEF_PARM(bool, poll_digital_inputs, 1, "Poll Digital Inputs"); /* must be before zap_debug.h */
+
+/* Signaling is opposite (fxo signalling for fxs card) */
+#if 1
+#define FXS_DEFAULT_SIGCAP (ZT_SIG_FXOKS | ZT_SIG_FXOLS | ZT_SIG_FXOGS)
+#else
+#define FXS_DEFAULT_SIGCAP (ZT_SIG_SF | ZT_SIG_EM)
+#endif
#define LINES_REGULAR 8
#define LINES_DIGI_OUT 2
#define LINES_DIGI_INP 4
-#define MASK_BITS(b) ((1U << (b)) - 1)
-
-#define MASK_DIGI_OUT (MASK_BITS(LINES_DIGI_OUT) << LINES_REGULAR)
-#define MASK_DIGI_INP (MASK_BITS(LINES_DIGI_INP) << (LINES_REGULAR + LINES_DIGI_OUT))
+#define MASK_DIGI_OUT (BITMASK(LINES_DIGI_OUT) << LINES_REGULAR)
+#define MASK_DIGI_INP (BITMASK(LINES_DIGI_INP) << (LINES_REGULAR + LINES_DIGI_OUT))
enum fxs_leds {
LED_GREEN,
@@ -52,14 +58,27 @@ enum fxs_leds {
#define NUM_LEDS 2
+static int SLIC_DIRECT_REQUEST(xbus_t *xbus, xpd_t *xpd, xpp_line_t lines, byte reg, byte dL)
+{
+ xpacket_t *pack;
+ slic_cmd_t *sc;
+ int len;
+
+ XPACKET_NEW(pack, xbus, FXS, SLIC_WRITE, xpd->id);
+ sc = &RPACKET_FIELD(pack, FXS, SLIC_WRITE, slic_cmd);
+ len = slic_cmd_direct_write(sc, lines, reg, dL);
+ pack->datalen = len;
+ packet_send(xbus, pack);
+ return 0;
+}
+
/*---------------- FXS Protocol Commands ----------------------------------*/
static /* 0x0F */ DECLARE_CMD(FXS, CHAN_ENABLE, xpp_line_t lines, bool on);
-static /* 0x0F */ DECLARE_CMD(FXS, CHAN_CID, xpp_line_t lines);
+static /* 0x0F */ DECLARE_CMD(FXS, CHAN_CID, int pos);
static /* 0x0F */ DECLARE_CMD(FXS, RING, int pos, bool on);
static /* 0x0F */ DECLARE_CMD(FXS, SETHOOK, int pos, bool offhook);
static /* 0x0F */ DECLARE_CMD(FXS, RELAY_OUT, byte which, bool on);
-static /* 0x0F */ DECLARE_CMD(FXS, SLIC_INIT);
static /* 0x0F */ DECLARE_CMD(FXS, SLIC_QUERY, int pos, byte reg_num);
static bool fxs_packet_is_valid(xpacket_t *pack);
@@ -68,26 +87,6 @@ static int proc_fxs_info_read(char *page, char **start, off_t off, int count, in
static int proc_xpd_slic_read(char *page, char **start, off_t off, int count, int *eof, void *data);
static int proc_xpd_slic_write(struct file *file, const char __user *buffer, unsigned long count, void *data);
-#define S_(s,l,...) \
- { \
- .lines = s, \
- { \
- .len = l, \
- .data = { __VA_ARGS__ }, \
- } \
- }
-struct slic_init_data {
- xpp_line_t lines;
- slic_data_t slic_data;
-} slic_init_data[] = {
-#ifdef OLD_CARD
-#include "init_data_3_19.inc"
-#else
-#include "init_data_3_20.inc"
-#endif
-};
-#undef S_
-
#define PROC_SLIC_FNAME "slics"
#define PROC_FXS_INFO_FNAME "fxs_info"
@@ -111,7 +110,6 @@ static int do_chan_power(xbus_t *xbus, xpd_t *xpd, xpp_line_t lines, bool on)
BUG_ON(!xbus);
BUG_ON(!xpd);
- lines &= xpd->enabled_chans; // Ignore disabled channels
if(!lines) {
return 0;
}
@@ -132,8 +130,8 @@ static int do_chan_power(xbus_t *xbus, xpd_t *xpd, xpp_line_t lines, bool on)
}
#define IS_BLINKING(priv,pos,color) ((priv)->blinking[color][pos] != 0)
-#define DO_BLINK(priv,pos,color,val) ((priv)->blinking[color][pos] = (val))
-#define DO_LED(priv,pos,color,val) ((val)?BIT_SET((priv)->ledcontrol[color],(pos)):BIT_CLR((priv)->ledcontrol[color],(pos)))
+#define MARK_BLINK(priv,pos,color,val) ((priv)->blinking[color][pos] = (val))
+#define MARK_LED(priv,pos,color,val) ((val)?BIT_SET((priv)->ledcontrol[color],(pos)):BIT_CLR((priv)->ledcontrol[color],(pos)))
/*
* LED and RELAY control is done via SLIC register 0x06:
@@ -195,7 +193,7 @@ static int do_led(xpd_t *xpd, lineno_t pos, byte which, bool on)
BIT_CLR(priv->ledstate[which], pos);
}
}
- if(!(lines & xpd->enabled_chans)) // Ignore disabled channels
+ if(!lines) // Nothing to do
goto out;
DBG("%s/%s: LED: lines=0x%04X which=%d -- %s\n", xbus->busname, xpd->xpdname, lines, which, (on) ? "on" : "off");
value = BIT(2) | BIT(3);
@@ -222,11 +220,11 @@ static void handle_fxs_leds(xpd_t *xpd)
struct FXS_priv_data *priv;
BUG_ON(!xpd);
- priv = xpd->priv;
spin_lock_irqsave(&xpd->lock, flags);
+ priv = xpd->priv;
timer_count = xpd->timer_count;
for(color = 0; color < ARRAY_SIZE(colors); color++) {
- for_each_enabled_line(xpd, i) {
+ for_each_line(xpd, i) {
if(IS_SET(xpd->digital_outputs, i) || IS_SET(xpd->digital_inputs, i))
continue;
if(IS_BLINKING(priv, i, color)) { // Blinking
@@ -282,6 +280,7 @@ static void clean_proc(xbus_t *xbus, xpd_t *xpd)
#ifdef CONFIG_PROC_FS
if(priv->xpd_slic) {
DBG("Removing xpd SLIC file %s/%s\n", xbus->busname, xpd->xpdname);
+ priv->xpd_slic->data = NULL;
remove_proc_entry(PROC_SLIC_FNAME, xpd->proc_xpd_dir);
}
if(priv->fxs_info) {
@@ -304,31 +303,45 @@ static int FXS_card_init(xbus_t *xbus, xpd_t *xpd)
if(!priv->fxs_info) {
ERR("Failed to create proc '%s' for %s/%s\n", PROC_FXS_INFO_FNAME, xbus->busname, xpd->xpdname);
ret = -ENOENT;
- goto out;
+ goto err;
}
+ priv->fxs_info->owner = THIS_MODULE;
DBG("Creating SLICs file for %s/%s\n", xbus->busname, xpd->xpdname);
priv->xpd_slic = create_proc_entry(PROC_SLIC_FNAME, 0644, xpd->proc_xpd_dir);
if(!priv->xpd_slic) {
ERR("Failed to create proc file for SLICs of %s/%s\n", xbus->busname, xpd->xpdname);
ret = -ENOENT;
- goto out;
+ goto err;
}
+ priv->xpd_slic->owner = THIS_MODULE;
priv->xpd_slic->write_proc = proc_xpd_slic_write;
priv->xpd_slic->read_proc = proc_xpd_slic_read;
priv->xpd_slic->data = xpd;
#endif
-#ifdef HARD_CODED_INIT
- CALL_PROTO(FXS, SLIC_INIT, xbus, xpd);
-#else
ret = run_initialize_registers(xpd);
+ if(ret < 0)
+ goto err;
+ /*
+ * Setup ring timers
+ */
+#ifdef WITH_RBS
+ /* Software controled ringing (for CID) */
+ ret = SLIC_DIRECT_REQUEST(xbus, xpd, ALL_LINES, 0x22, 0x00); /* Ringing Oscilator Control */
+#else
+ /* Hardware controled ringing (no CID) */
+ ret += SLIC_DIRECT_REQUEST(xbus, xpd, ALL_LINES, 0x30, 0x80); /* Active timer low byte */
+ ret += SLIC_DIRECT_REQUEST(xbus, xpd, ALL_LINES, 0x31, 0x3E); /* Active timer high byte */
+ ret += SLIC_DIRECT_REQUEST(xbus, xpd, ALL_LINES, 0x32, 0x80); /* Inactive timer low byte */
+ ret += SLIC_DIRECT_REQUEST(xbus, xpd, ALL_LINES, 0x33, 0x3E); /* Inactive timer high byte */
+ ret += SLIC_DIRECT_REQUEST(xbus, xpd, ALL_LINES, 0x22, 0x18); /* Ringing Oscilator Control */
#endif
-out:
- if(ret < 0) {
- clean_proc(xbus, xpd);
- ERR("%s/%s: Failed initializing registers (%d)\n", xbus->busname, xpd->xpdname, ret);
- } else {
- DBG("done: %s/%s\n", xbus->busname, xpd->xpdname);
- }
+ if(ret < 0)
+ goto err;
+ DBG("%s/%s: done\n", xbus->busname, xpd->xpdname);
+ return 0;
+err:
+ clean_proc(xbus, xpd);
+ ERR("%s/%s: Failed initializing registers (%d)\n", xbus->busname, xpd->xpdname, ret);
return ret;
}
@@ -343,46 +356,139 @@ static int FXS_card_remove(xbus_t *xbus, xpd_t *xpd)
return 0;
}
-static int FXS_card_zaptel_registration(xpd_t *xpd, bool on)
+static int FXS_card_zaptel_preregistration(xpd_t *xpd, bool on)
{
xbus_t *xbus;
struct FXS_priv_data *priv;
+ int i;
unsigned long flags;
- int i;
+ const enum fxs_leds color = (on) ? LED_GREEN : LED_RED;
BUG_ON(!xpd);
xbus = xpd->xbus;
- priv = xpd->priv;
BUG_ON(!xbus);
- DBG("%s/%s: %s\n", xbus->busname, xpd->xpdname, (on)?"on":"off");
- if(on) {
- spin_lock_irqsave(&xpd->lock, flags);
- do_led(xpd, ALL_LINES, LED_GREEN, LED_OFF);
- spin_unlock_irqrestore(&xpd->lock, flags);
- for_each_enabled_line(xpd, i) {
- DO_LED(priv,i,LED_GREEN,LED_ON);
- mdelay(50);
- }
- for_each_enabled_line(xpd, i) {
- DO_LED(priv,i,LED_GREEN,LED_OFF);
- mdelay(50);
- }
- } else {
- spin_lock_irqsave(&xpd->lock, flags);
- do_led(xpd, ALL_LINES, LED_RED, LED_OFF);
- spin_unlock_irqrestore(&xpd->lock, flags);
- for_each_enabled_line(xpd, i) {
- DO_LED(priv,i,LED_RED,LED_ON);
- mdelay(50);
- }
- for_each_enabled_line(xpd, i) {
- DO_LED(priv,i,LED_RED,LED_OFF);
- mdelay(50);
+ priv = xpd->priv;
+ BUG_ON(!priv);
+ DBG("%s/%s (%d)\n", xbus->busname, xpd->xpdname, on);
+ snprintf(xpd->span.desc, MAX_SPANDESC, "Xorcom XPD #%d/%d: FXS", xbus->num, xpd->id);
+ for_each_line(xpd, i) {
+ struct zt_chan *cur_chan = &xpd->chans[i];
+
+ DBG("setting FXS channel %d\n", i);
+ if(IS_SET(xpd->digital_outputs, i)) {
+ snprintf(cur_chan->name, MAX_CHANNAME, "XPP_OUT/%d/%d/%d", xbus->num, xpd->id, i);
+ } else if(IS_SET(xpd->digital_inputs, i)) {
+ snprintf(cur_chan->name, MAX_CHANNAME, "XPP_IN/%d/%d/%d", xbus->num, xpd->id, i);
+ } else {
+ snprintf(cur_chan->name, MAX_CHANNAME, "XPP_FXS/%d/%d/%d", xbus->num, xpd->id, i);
}
+ cur_chan->chanpos = i + 1;
+ cur_chan->pvt = xpd;
+ cur_chan->sigcap = FXS_DEFAULT_SIGCAP;
+ }
+ spin_lock_irqsave(&xpd->lock, flags);
+ do_led(xpd, ALL_LINES, color, LED_OFF);
+ spin_unlock_irqrestore(&xpd->lock, flags);
+ for_each_line(xpd, i) {
+ MARK_LED(priv, i, color, LED_ON);
+ mdelay(50);
}
return 0;
}
+static int FXS_card_zaptel_postregistration(xpd_t *xpd, bool on)
+{
+ xbus_t *xbus;
+ struct FXS_priv_data *priv;
+ int i;
+ const enum fxs_leds color = (on) ? LED_GREEN : LED_RED;
+
+ BUG_ON(!xpd);
+ xbus = xpd->xbus;
+ BUG_ON(!xbus);
+ priv = xpd->priv;
+ BUG_ON(!priv);
+ DBG("%s/%s (%d)\n", xbus->busname, xpd->xpdname, on);
+ for_each_line(xpd, i) {
+ MARK_LED(priv, i, color, LED_OFF);
+ mdelay(50);
+ }
+ return 0;
+}
+
+#ifdef WITH_RBS
+int FXS_card_hooksig(xbus_t *xbus, xpd_t *xpd, int pos, zt_txsig_t txsig)
+{
+ int ret = 0;
+
+ DBG("%s/%s/%d: %s\n", xbus->busname, xpd->xpdname, pos, txsig2str(txsig));
+ BUG_ON(xpd->direction != TO_PHONE);
+ if (IS_SET(xpd->digital_inputs, pos)) {
+ DBG("Ignoring signal sent to digital input line\n");
+ return 0;
+ }
+ switch(txsig) {
+ case ZT_TXSIG_ONHOOK:
+ xpd->ringing[pos] = 0;
+ BIT_CLR(xpd->cid_on, pos);
+ if(IS_SET(xpd->digital_outputs, pos)) {
+ DBG("%s/%s/%d: digital output OFF\n", xbus->busname, xpd->xpdname, pos);
+ ret = CALL_XMETHOD(RELAY_OUT, xpd->xbus, xpd, pos-8, 0);
+ return ret;
+ }
+ ret = CALL_XMETHOD(RING, xbus, xpd, pos, 0); // RING off
+#if 0
+ switch(chan->sig) {
+ case ZT_SIG_EM:
+ case ZT_SIG_FXOKS:
+ case ZT_SIG_FXOLS:
+ xpd->lasttxhook[pos] = xpd->idletxhookstate[pos];
+ break;
+ case ZT_SIG_FXOGS:
+ xpd->lasttxhook[pos] = FXS_LINE_TIPOPEN;
+ break;
+ }
+#endif
+ break;
+ case ZT_TXSIG_OFFHOOK:
+ if(xpd->ringing[pos]) {
+ BIT_SET(xpd->cid_on, pos);
+ ret = CALL_XMETHOD(CHAN_CID, xpd->xbus, xpd, pos); // CALLER ID
+ }
+ xpd->ringing[pos] = 0;
+#if 0
+ switch(chan->sig) {
+ case ZT_SIG_EM:
+ xpd->lasttxhook[pos] = FXS_LINE_REV_ACTIVE;
+ break;
+ default:
+ xpd->lasttxhook[pos] = xpd->idletxhookstate[pos];
+ break;
+ }
+#endif
+ break;
+ case ZT_TXSIG_START:
+ xpd->lasttxhook[pos] = FXS_LINE_RING;
+ xpd->ringing[pos] = 1;
+ BIT_CLR(xpd->cid_on, pos);
+ if(IS_SET(xpd->digital_outputs, pos)) {
+ DBG("%s/%s/%d: %s digital output ON\n", xbus->busname, xpd->xpdname, pos, txsig2str(txsig));
+ ret = CALL_XMETHOD(RELAY_OUT, xpd->xbus, xpd, pos-8, 1);
+ return ret;
+ }
+ ret = CALL_XMETHOD(RING, xbus, xpd, pos, 1); // RING on
+ break;
+ case ZT_TXSIG_KEWL:
+ xpd->lasttxhook[pos] = FXS_LINE_DISABLED;
+ break;
+ default:
+ NOTICE("%s: Can't set tx state to %s (%d)\n", __FUNCTION__, txsig2str(txsig), txsig);
+ ret = -EINVAL;
+ }
+ return ret;
+}
+
+#else
int FXS_card_sethook(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate)
{
int ret = 0;
@@ -417,7 +523,7 @@ int FXS_card_sethook(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate)
DBG("%s/%s/%d: fall through ZT_OFFHOOK\n", xbus->busname, xpd->xpdname, pos);
// Fall through
case ZT_OFFHOOK:
- DBG("%s/%s/%d: ignoring (PHONE)\n", xbus->busname, xpd->xpdname, pos);
+ DBG("%s/%s/%d: ZT_OFFHOOK (ignoring for PHONES)\n", xbus->busname, xpd->xpdname, pos);
break;
case ZT_WINK:
WARN("No code yet\n");
@@ -426,7 +532,7 @@ int FXS_card_sethook(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate)
WARN("No code yet\n");
break;
case ZT_RING:
- DBG("%s/%s/%d: ringing[%d]=%d\n", xbus->busname, xpd->xpdname, pos, pos, xpd->ringing[pos]);
+ DBG("%s/%s/%d: ZT_RING: %d\n", xbus->busname, xpd->xpdname, pos, xpd->ringing[pos]);
if(IS_SET(xpd->digital_inputs, pos)) {
NOTICE("%s: Trying to RING a digital input channel %d. Ignoring\n", __FUNCTION__, pos);
return -EINVAL;
@@ -448,6 +554,7 @@ int FXS_card_sethook(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate)
}
return ret;
}
+#endif
/*
* INPUT polling is done via SLIC register 0x06 (same as LEDS):
@@ -463,6 +570,7 @@ static void poll_inputs(xbus_t *xbus, xpd_t *xpd)
{
int i;
+ BUG_ON(xpd->id != 0); // Only unit #0 has digital inputs
for(i = 0; i < ARRAY_SIZE(input_channels); i++) {
int pos = input_channels[i];
@@ -478,9 +586,13 @@ static int FXS_card_tick(xbus_t *xbus, xpd_t *xpd)
BUG_ON(!xpd);
priv = xpd->priv;
BUG_ON(!priv);
- if((rate_limit++ % 1000) == 0) {
- poll_inputs(xbus, xpd);
+#if POLL_DIGITAL_INPUTS
+ if(poll_digital_inputs && xpd->id == 0) {
+ if((rate_limit++ % 1000) == 0) {
+ poll_inputs(xbus, xpd);
+ }
}
+#endif
handle_fxs_leds(xpd);
return 0;
}
@@ -499,11 +611,14 @@ static /* 0x0F */ HOSTCMD(FXS, CHAN_ENABLE, xpp_line_t lines, bool on)
BUG_ON(!xbus);
BUG_ON(!xpd);
- lines &= xpd->enabled_chans; // Ignore disabled channels
if(!lines) {
return 0;
}
DBG("Channel Activation: 0x%4X %s\n", lines, (on) ? "on" : "off");
+ // Make sure we use normal (low battery) power
+ for_each_line(xpd, i)
+ if (BIT_SET(lines,i))
+ do_chan_power(xbus, xpd, BIT(i), 0);
XPACKET_NEW(pack, xbus, FXS, SLIC_WRITE, xpd->id);
sc = &RPACKET_FIELD(pack, FXS, SLIC_WRITE, slic_cmd);
len = slic_cmd_direct_write(sc, lines, 0x40, value);
@@ -522,20 +637,21 @@ static /* 0x0F */ HOSTCMD(FXS, CHAN_ENABLE, xpp_line_t lines, bool on)
return ret;
}
-static /* 0x0F */ HOSTCMD(FXS, CHAN_CID, xpp_line_t lines)
+static /* 0x0F */ HOSTCMD(FXS, CHAN_CID, int pos)
{
int ret = 0;
xpacket_t *pack;
slic_cmd_t *sc;
int i;
+ xpp_line_t lines = BIT(pos);
BUG_ON(!xbus);
BUG_ON(!xpd);
- lines &= xpd->enabled_chans; // Ignore disabled channels
if(!lines) {
return 0;
}
- DBG("Channel CID: 0x%04X\n", lines);
+ DBG("%s/%s/%d:\n", xbus->busname, xpd->xpdname, pos);
+ //do_chan_power(xbus, xpd, BIT(pos), 0); // Low battery for normal (non-ring) operation
XPACKET_NEW(pack, xbus, FXS, SLIC_WRITE, xpd->id);
sc = &RPACKET_FIELD(pack, FXS, SLIC_WRITE, slic_cmd);
pack->datalen = slic_cmd_direct_write(sc, lines, 0x40, FXS_LINE_CID);
@@ -552,14 +668,13 @@ static /* 0x0F */ HOSTCMD(FXS, RING, int pos, bool on)
struct FXS_priv_data *priv;
xpacket_t *pack;
slic_cmd_t *sc;
- xpp_line_t mask = (1 << pos);
+ xpp_line_t mask = BIT(pos);
int len;
enum fxs_state value = (on) ? 0x04 : 0x01;
BUG_ON(!xbus);
BUG_ON(!xpd);
priv = xpd->priv;
- mask &= xpd->enabled_chans; // Ignore disabled channels
if(!mask) {
return 0;
}
@@ -573,10 +688,10 @@ static /* 0x0F */ HOSTCMD(FXS, RING, int pos, bool on)
packet_send(xbus, pack);
if(on) {
- DO_BLINK(priv,pos,LED_GREEN,LED_BLINK);
+ MARK_BLINK(priv,pos,LED_GREEN,LED_BLINK);
} else {
if(IS_BLINKING(priv, pos, LED_GREEN))
- DO_BLINK(priv,pos,LED_GREEN,0);
+ MARK_BLINK(priv,pos,LED_GREEN,0);
}
return ret;
}
@@ -617,33 +732,6 @@ static /* 0x0F */ HOSTCMD(FXS, RELAY_OUT, byte which, bool on)
return ret;
}
-static /* 0x0F */ HOSTCMD(FXS, SLIC_INIT)
-{
- int ret = 0;
- xpacket_t *pack;
- slic_data_t *slic;
- struct slic_init_data *source;
- int i;
-
- BUG_ON(!xbus);
- BUG_ON(!xpd);
- DBG("INITIALIZING SLIC\n");
- for(i = 0; i < ARRAY_SIZE(slic_init_data); i++) {
- source = &slic_init_data[i];
- XPACKET_NEW(pack, xbus, FXS, SLIC_INIT, xpd->id);
- RPACKET_FIELD(pack, FXS, SLIC_INIT, lines) = source->lines;
-
- slic = &RPACKET_FIELD(pack, FXS, SLIC_INIT, slic_data);
- slic->len = source->slic_data.len;
- memcpy(slic->data, source->slic_data.data, source->slic_data.len);
- pack->datalen = sizeof(xpp_line_t) + slic->len + 1;
-// dump_packet("SLIC", pack, print_dbg);
- packet_send(xbus, pack);
- mdelay(1); // FIXME: check with Dima
- }
- return ret;
-}
-
static /* 0x0F */ HOSTCMD(FXS, SLIC_QUERY, int pos, byte reg_num)
{
int ret = 0;
@@ -683,7 +771,7 @@ HANDLER_DEF(FXS, SIG_CHANGED)
}
#if 0
Is this needed?
- for_each_enabled_line(xpd, i) {
+ for_each_line(xpd, i) {
if(IS_SET(sig_toggles, i))
do_chan_power(xpd->xbus, xpd, BIT(i), 0); // Power down (prevent overheating!!!)
}
@@ -695,15 +783,15 @@ HANDLER_DEF(FXS, SIG_CHANGED)
struct zt_chan *chan = &xpd->span.chans[i];
xpd->ringing[i] = 0; // No more ringing...
- DO_BLINK(priv,i,LED_GREEN,0);
+ MARK_BLINK(priv,i,LED_GREEN,0);
if(IS_SET(sig_status, i)) {
DBG("OFFHOOK: channo=%d\n", chan->channo);
- DO_LED(priv,i,LED_GREEN,LED_ON);
+ MARK_LED(priv,i,LED_GREEN,LED_ON);
BIT_SET(xpd->hookstate, i);
zt_hooksig(chan, ZT_RXSIG_OFFHOOK);
} else {
DBG("ONHOOK channo=%d\n", chan->channo);
- DO_LED(priv,i,LED_GREEN,LED_OFF);
+ MARK_LED(priv,i,LED_GREEN,LED_OFF);
BIT_CLR(xpd->hookstate, i);
zt_hooksig(chan, ZT_RXSIG_ONHOOK);
}
@@ -770,7 +858,6 @@ HANDLER_DEF(FXS, SLIC_REPLY)
return 0;
}
-
xproto_table_t PROTO_TABLE(FXS) = {
.owner = THIS_MODULE,
.entries = {
@@ -784,8 +871,13 @@ xproto_table_t PROTO_TABLE(FXS) = {
.card_new = FXS_card_new,
.card_init = FXS_card_init,
.card_remove = FXS_card_remove,
- .card_zaptel_registration = FXS_card_zaptel_registration,
+ .card_zaptel_preregistration = FXS_card_zaptel_preregistration,
+ .card_zaptel_postregistration = FXS_card_zaptel_postregistration,
+#ifdef WITH_RBS
+ .card_hooksig = FXS_card_hooksig,
+#else
.card_sethook = FXS_card_sethook,
+#endif
.card_tick = FXS_card_tick,
.RING = XPROTO_CALLER(FXS, RING),
@@ -826,7 +918,8 @@ static int proc_fxs_info_read(char *page, char **start, off_t off, int count, in
int i;
int led;
- BUG_ON(!xpd);
+ if(!xpd)
+ return -ENODEV;
spin_lock_irqsave(&xpd->lock, flags);
priv = xpd->priv;
BUG_ON(!priv);
@@ -984,9 +1077,8 @@ static int process_slic_cmdline(xpd_t *xpd, char *cmdline)
len = parse_slic_cmd(p, &sc, &priv->requested_reply);
if(len < 0)
return len;
- sc.lines &= xpd->enabled_chans; // Ignore disabled channels
if(!sc.lines) {
- NOTICE("%s: no enabled channels are marked. Skip.\n", __FUNCTION__);
+ NOTICE("%s: no channels are marked. Skip.\n", __FUNCTION__);
return 0;
}
dump_slic_cmd("WRITE_SLIC", &sc);
@@ -1006,7 +1098,8 @@ static int proc_xpd_slic_write(struct file *file, const char __user *buffer, uns
int i;
int ret;
- BUG_ON(!xpd);
+ if(!xpd)
+ return -ENODEV;
for(i = 0; i < count; /* noop */) {
for(p = buf; p < buf + LINE_LEN; p++) { /* read a line */
if(i >= count)
@@ -1032,6 +1125,12 @@ static int proc_xpd_slic_write(struct file *file, const char __user *buffer, uns
int __init card_fxs_startup(void)
{
INFO("%s revision %s\n", THIS_MODULE->name, ZAPTEL_VERSION);
+#ifdef POLL_DIGITAL_INPUTS
+ INFO("FEATURE: %s with DIGITAL INPUTS support (%s activated)\n",
+ THIS_MODULE->name, (poll_digital_inputs) ? "is" : "is not");
+#else
+ INFO("FEATURE: %s without DIGITAL INPUTS support\n", THIS_MODULE->name);
+#endif
xproto_register(&PROTO_TABLE(FXS));
return 0;
}
diff --git a/xpp/card_fxs.h b/xpp/card_fxs.h
index 5eaeb13..1d81810 100644
--- a/xpp/card_fxs.h
+++ b/xpp/card_fxs.h
@@ -52,10 +52,6 @@ DEF_RPACKET_DATA(FXS, SLIC_REPLY, /* Get status of a single SLIC (for debugging)
xpp_line_t lines;
slic_reply_t info;
);
-DEF_RPACKET_DATA(FXS, SLIC_INIT,
- xpp_line_t lines;
- slic_data_t slic_data;
- );
DEF_RPACKET_DATA(FXS, SLIC_WRITE,
slic_cmd_t slic_cmd;
);
diff --git a/xpp/card_global.c b/xpp/card_global.c
index 0f81f2c..dda4480 100644
--- a/xpp/card_global.c
+++ b/xpp/card_global.c
@@ -62,13 +62,10 @@ static void global_packet_dump(xpacket_t *pack);
byte *pcm;
byte *start_pcm;
int i;
- extern ulong pcm_gen;
BUG_ON(!xbus);
BUG_ON(!xpd);
- lines &= (xpd->enabled_chans | ~xpd->no_pcm);
- if(pcm_gen != 0)
- return 0;
+ lines &= ~xpd->no_pcm;
// if(lines == 0)
// return 0;
@@ -117,32 +114,44 @@ static void global_packet_dump(xpacket_t *pack);
/*---------------- GLOBAL: Astribank Reply Handlers -----------------------*/
+HANDLER_DEF(GLOBAL, NULL_REPLY)
+{
+ DBG("got len=%d\n", pack->datalen);
+ return 0;
+}
+
HANDLER_DEF(GLOBAL, DEV_DESC)
{
byte rev = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, rev);
byte type = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, type);
xpp_line_t line_status = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, line_status);
- int xpd_num = XPD_NUM(pack->content.addr);
+ xpd_addr_t xpd_addr = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, addr);
struct card_desc_struct *card_desc;
+ unsigned long flags;
- DBG("xpd=%d type=%d rev=%d line_status=0x%04X\n",
- xpd_num, type, rev, line_status);
+ BUG_ON(!xbus);
if((card_desc = kmalloc(sizeof(struct card_desc_struct), GFP_ATOMIC)) == NULL) {
ERR("%s: Card description allocation failed.\n", __FUNCTION__);
return -ENOMEM;
}
memset(card_desc, 0, sizeof(struct card_desc_struct));
card_desc->magic = CARD_DESC_MAGIC;
+ INIT_LIST_HEAD(&card_desc->card_list);
card_desc->xbus = xbus;
card_desc->type = type;
card_desc->rev = rev;
- card_desc->xpd_num = xpd_num;
- INIT_WORK(&card_desc->work, card_detected, card_desc);
- DBG("Queueing xpp_worker for xpd %d\n", xpd_num);
- if(!queue_work(xpp_worker, &card_desc->work)) {
- ERR("Failed to queue card description work\n");
- return -EINVAL;
- }
+ card_desc->xpd_addr = xpd_addr;
+ spin_lock_irqsave(&xbus->lock, flags);
+ DBG("xpd=%d-%d type=%d rev=%d line_status=0x%04X\n",
+ xpd_addr.unit, xpd_addr.subunit, type, rev, line_status);
+ if(type == XPD_TYPE_NOMODULE)
+ XBUS_COUNTER(xbus, DEV_DESC_EMPTY)++;
+ else
+ XBUS_COUNTER(xbus, DEV_DESC_FULL)++;
+ atomic_inc(&xbus->count_poll_answers);
+ wake_up(&xbus->wait_for_polls);
+ list_add_tail(&card_desc->card_list, &xbus->poll_results);
+ spin_unlock_irqrestore(&xbus->lock, flags);
return 0;
}
@@ -156,6 +165,7 @@ HANDLER_DEF(GLOBAL, PCM_READ)
unsigned long flags;
int i;
+ BUG_ON(!xbus);
if(!xpd) {
#if 0
int xpd_num = XPD_NUM(pack->content.addr);
@@ -199,6 +209,7 @@ HANDLER_DEF(GLOBAL, SYNC_REPLY)
byte mask = RPACKET_FIELD(pack, GLOBAL, SYNC_REPLY, mask);
bool setit = mask & 0x01;
+ BUG_ON(!xbus);
if(!xpd) {
int xpd_num = XPD_NUM(pack->content.addr);
NOTICE("%s: received %s for non-existing xpd: %d\n", __FUNCTION__, cmd->name, xpd_num);
@@ -215,6 +226,7 @@ HANDLER_DEF(GLOBAL, SYNC_REPLY)
xproto_table_t PROTO_TABLE(GLOBAL) = {
.entries = {
/* Card Opcode */
+ XENTRY( GLOBAL, NULL_REPLY ),
XENTRY( GLOBAL, DEV_DESC ),
XENTRY( GLOBAL, PCM_READ ),
XENTRY( GLOBAL, SYNC_REPLY ),
diff --git a/xpp/card_global.h b/xpp/card_global.h
index 9cfaa68..5ab8124 100644
--- a/xpp/card_global.h
+++ b/xpp/card_global.h
@@ -24,6 +24,7 @@
#include "xdefs.h"
+DEF_RPACKET_DATA(GLOBAL, NULL_REPLY);
DEF_RPACKET_DATA(GLOBAL, DESC_REQ);
DEF_RPACKET_DATA(GLOBAL, DEV_DESC,
byte rev; /* Revision number */
diff --git a/xpp/cmd2inc b/xpp/cmd2inc
deleted file mode 100755
index f1aa9c9..0000000
--- a/xpp/cmd2inc
+++ /dev/null
@@ -1,48 +0,0 @@
-#! /usr/bin/perl -w
-
-use strict;
-
-my $input;
-my $header;
-my $comment;
-my $len;
-
-@ARGV == 1 or @ARGV == 2 or die "Usage: $0 <infile> <outfile>\n";
-$input = $ARGV[0];
-$header = $ARGV[1];
-open(IF, "$input") or die "Failed to open '$input': $!\n";
-
-if($header) {
- open(HF, ">$header") or die "Failed to write '$header': $!\n";
- select HF;
-}
-
-while(<IF>) {
- chomp;
- undef $comment;
- s/\r//; # CRLF -> LF
- if(s/\s*[;#]\s*(.*?)$//) { # Comments
- $comment = $1;
- }
- if(/^\s*$/) { # Empty lines
- next;
- }
- my ($slic0, $slic1, $slic2, $slic3, $op, @data) = split;
- my $slic = "$slic3$slic2$slic1$slic0";
- die "Bad slic address '$slic'" if length($slic) != 8;
- die "Bad op (op=%op)\n" if $op !~ /^[WR][DI]$/;
- if($op =~ /D$/) { # Direct
- die "Bad input at line $.: @data=(@data)\n" if @data != 2;
- # len reg data
- printf "S_(0x$slic,\t0x02,\t0x%02s, 0x%02s),\t", $data[0], $data[1];
- } else { # Indirect
- die "Bad input at line $.: @data=(@data)\n" if @data != 3;
- # len data1 data2 reg
- printf "S_(0x$slic,\t0x06,\t0x1C, 0x%02s, 0x1D, 0x%02s, 0x1E, 0x%2s),\t", $data[2], $data[1], $data[0];
- }
-} continue {
- if(defined($comment)) {
- print "// $comment";
- }
- print "\n";
-}
diff --git a/xpp/init_data_3_19.cmd b/xpp/init_data_3_19.cmd
index 5c85bc6..69bdb80 100644
--- a/xpp/init_data_3_19.cmd
+++ b/xpp/init_data_3_19.cmd
@@ -104,13 +104,6 @@ FF 00 00 00 WD 12 FF
FF 00 00 00 WD 13 FF
FF 00 00 00 WD 14 FF
-; Ring timers settings
-FF 00 00 00 WD 30 80
-FF 00 00 00 WD 31 3E
-FF 00 00 00 WD 32 80
-FF 00 00 00 WD 33 3E
-FF 00 00 00 WD 22 18
-
; Automatic/Manual Control: defaults - Cancel Power Alarm
FF 00 00 00 WD 43 1E
diff --git a/xpp/init_data_3_20.cmd b/xpp/init_data_3_20.cmd
index 6bff2ad..203a39d 100644
--- a/xpp/init_data_3_20.cmd
+++ b/xpp/init_data_3_20.cmd
@@ -104,13 +104,6 @@ FF 00 00 00 WD 12 FF
FF 00 00 00 WD 13 FF
FF 00 00 00 WD 14 FF
-; Ring timers settings
-FF 00 00 00 WD 30 80
-FF 00 00 00 WD 31 3E
-FF 00 00 00 WD 32 80
-FF 00 00 00 WD 33 3E
-FF 00 00 00 WD 22 18
-
; Automatic/Manual Control: defaults - Cancel Power Alarm
FF 00 00 00 WD 43 1E
diff --git a/xpp/init_data_4_20.cmd b/xpp/init_data_4_20.cmd
index bef7534..1b3fde2 100644
--- a/xpp/init_data_4_20.cmd
+++ b/xpp/init_data_4_20.cmd
@@ -17,53 +17,44 @@
;
; DAA's CMD Reg High Low
+; Start with a software reset:
+FF FF 00 00 WD 01 80
+
; ----------------------------------==== 8-channel FXO unit initialization ===-----------------------------------------
FF FF 00 00 WD 21 28
-FF FF 00 00 WD 18 99
+; 99 also sets ring validation
+;FF FF 00 00 WD 18 99
FF FF 00 00 WD 06 00
; ----------- DAA PCM start offset ----------
-01 00 00 00 WD 22 00
-01 00 00 00 WD 23 00
-01 00 00 00 WD 24 00
-01 00 00 00 WD 25 00
+FF FF 00 00 WD 23 00
+FF FF 00 00 WD 25 00
+
+01 00 00 00 WD 22 00
+01 00 00 00 WD 24 00
-02 00 00 00 WD 22 08
-02 00 00 00 WD 23 00
-02 00 00 00 WD 24 08
-02 00 00 00 WD 25 00
+02 00 00 00 WD 22 08
+02 00 00 00 WD 24 08
-04 00 00 00 WD 22 10
-04 00 00 00 WD 23 00
-04 00 00 00 WD 24 10
-04 00 00 00 WD 25 00
+04 00 00 00 WD 22 10
+04 00 00 00 WD 24 10
-08 00 00 00 WD 22 18
-08 00 00 00 WD 23 00
-08 00 00 00 WD 24 18
-08 00 00 00 WD 25 00
+08 00 00 00 WD 22 18
+08 00 00 00 WD 24 18
-10 00 00 00 WD 22 20
-10 00 00 00 WD 23 00
-10 00 00 00 WD 24 20
-10 00 00 00 WD 25 00
+10 00 00 00 WD 22 20
+10 00 00 00 WD 24 20
-20 00 00 00 WD 22 28
-20 00 00 00 WD 23 00
-20 00 00 00 WD 24 28
-20 00 00 00 WD 25 00
+20 00 00 00 WD 22 28
+20 00 00 00 WD 24 28
-40 00 00 00 WD 22 30
-40 00 00 00 WD 23 00
-40 00 00 00 WD 24 30
-40 00 00 00 WD 25 00
+40 00 00 00 WD 22 30
+40 00 00 00 WD 24 30
-80 00 00 00 WD 22 38
-80 00 00 00 WD 23 00
-80 00 00 00 WD 24 38
-80 00 00 00 WD 25 00
+80 00 00 00 WD 22 38
+80 00 00 00 WD 24 38
; ----------- DAA ONHOOK --------------------
-FF FF 00 00 WD 05 00
+FF FF 00 00 WD 05 08
diff --git a/xpp/slic.h b/xpp/slic.h
index 2c12330..ea49441 100644
--- a/xpp/slic.h
+++ b/xpp/slic.h
@@ -67,12 +67,6 @@ typedef struct slic_reply {
(slic_reg)->reg_data = data; \
} while(0);
-/* OLD SLIC_INIT data */
-typedef struct slic_data {
- byte len;
- byte data[40];
-} __attribute__((packed)) slic_data_t;
-
/*------------------------------ SLIC Initializers -------------------------*/
diff --git a/xpp/utils/FPGA_FXS.hex b/xpp/utils/FPGA_FXS.hex
index dc150de..4ec2790 100644
--- a/xpp/utils/FPGA_FXS.hex
+++ b/xpp/utils/FPGA_FXS.hex
@@ -1,8 +1,9 @@
#
-# $Id: FPGA_FXS.hex 1152 2006-05-10 13:00:37Z dima $
+# Description : ECHO suppressor included
+# $Id: FPGA_FXS.hex 1492 2006-06-29 10:50:25Z dima $
#
:020000040000FA
-:80000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AD6FF4000E06008006AD6FF4000E06008006AD6FF4000E060080000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4455544455557475577775577675577775577765566665563625523235D2E37C2B5111155111155111155111F6
+:80000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AD6FF4000985E08006AD6FF4000985E08006AD6FF4000985E080000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4455544455557475577775577675577775577765566665563625523235D2E37C2B5111155111155111155111D4
:80008000155111155111155111155111155111155111155111155111155111155111155111155111155111155111155111155111000000000000000000000000000000000000002552222552222552220025522225522200000000001AA1111AA1110025522200000000001AA1110000000000000000000000002552222552222F21F11211
:80010000122F21F112122552222552222552222552221AA1111AA111001AA1112552222552222F21F112122F21F112122552222552222F21F112122F21F112122F21F11212255222000000002F21F112122F21F1121200002552222552221AA1111AA1112552222F21F1121200001AA1112F21F1121200002F21F112122F21F112121AA102
:800180001100255222255222000000000025522200001AA1111AA11125522200255222000025522200000000CFC6F66C6C4F42F22424000000000000000000000000001AA1111AA111000000000000000000000000000025522200000000255222255222000025522225522225522225522225522225522225522225522225522200255257
@@ -19,525 +20,524 @@
:80070000CCCCFFFFFFFFFF3F33F333334F48F8848425522200CFCCFCCCCCFFFFFFFFFF3F33F33333CFCEFEECECBFBCFCCBCB000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004F44F444447F74F44747355333000000CFCCFCCCCCDFDFFFFDFD1F13F331314F44F444443F31F1131300CFCCFCCCCCDFDEFEEDED1F12F221210000DF3B
:80078000DEFEEDEDDFDEFEEDEDDFDEFEEDED000000004F44F444445F54F44545155111000000CFCCFCCCCCEFEFFFFEFE2F23F332324F44F444441F11F1111100CFCCFCCCCCCFCEFEECEC2AA2220000CFCEFEECECCFCEFEECECCFCEFEECEC000000004F44F444444F47F774743AA333000000CFCCFCCCCCFFFCFCCFCF3553334F44F4444454
:800800001F13F3313100CFCCFCCCCCCFCCFCCCCC000000CFCCFCCCCCCFCCFCCCCCCFCCFCCCCC000000004F44F444444F47F774743AA333000000CFCCFCCCCCDFDDFDDDDD1F11F111114F44F444441F13F3313100CFCCFCCCCCCFCDFDDCDC1AA1110000CFCDFDDCDCCFCDFDDCDCCFCDFDDCDC000000000000000000000000000000000000B8
-:800880009F9CFCC9C9CFC1F11C1C000048000000000000000000000000000000000000000000000000000000F09C2300180000000000000000000000000000140000000000000080020000000000F071F8000000000000000000000000000000000000000000000000000000000000FFE40F800148000000000000000000000000001400A9
-:8009000000000000000080020000000000F0A225000000000000000000000000000000000000000000000000000000000000FFE40F2800001400004840012800484001280000002800480000108204140000484001002148000010F26B52000000000000000000000000000000000000000000000000000000000000FFE40F0000000000F1
-:80098000000000000000000000000000000000000000000000000000F04FFE80840180020000001002000010024001401102400100000080020000882880080088280000E06E0A008084010000200100000000000000120000400100004001000040012800000000F092548084410128004840818102214860118002211A01148002211A1C
-:800A0000041400B01281041480028004148828108204808802214800CF5506481800280000000021000000210014001002400100000080020000882800008088020000EFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000080020000000000000000000090120000000000800200000000008088CC
-:800A80000200004FD20400000000000024000000100200000000120000000000000082000000000000F0E33E000000000000000000000000000000200100000000000000000000000000F07CBE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000B7
-:800B00000000000082000000EFEC0B000000000000240000000000000000000000000000000000000000000000CFEA0900000000000000000040020000400200000000000000002008000000220000F03161000000000000000000000000000012000000000000000000000000000000F04BF2000020020000000000000000000000000076
-:800B80000000008002000000000000000000AF6605000000000000000000000000001002000000000000000000000000000088F0CFB7000000000000000012004800000010020024000020020000000000000028000048F0C3A700000000000000000000000000400200000000000000000000000028000042F0443E0000000000000000AF
-:800C0000120048000000240000240000800200000000000000000020087F3304000000000000000014004200000000000000000000002002000000000000004FEF0D0000000000000000000000000000000000000000000000000000000000F04FFE008001000000000000000000000000000000000000000000000000000000F0291400C4
-:800C8000000000120000000000000000002081010000000000000000000000000000F051B700200100000000000000000000002081010000000000000000000000000000E07E010000002001000000000000000000000000000000000000000000000000004F49070000000000000000000000000000000000000000000000000000000066
-:800D000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000012000000000018C01220010000000000F8
-:800D80000000000000002FC50900001200001200000000000080010000000000000000000000000000100100D05D0B000000000000000000000000000000000000001800000000000000400100F029FE0000000000000000000080010000000020011602000000000000000000000000CF680D000018000012000000000000000000000070
-:800E00000080012001000000000000000000F0C56A000000000000000000000000000000000000000000000000000000000000FFE40F00000000000020010012200100000000000000000000180000000000000000F07973000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000802101E3
-:800E8000802101000000008001120000000000000000000000F021BE000000000000000000000000000000000000000000000000000000000000FFE40F0000000020010000000000000000000000000000000000000000000000002F8904000000000012001812008001180000008001000000002001000000000000000000CD26000000B5
-:800F000000000000000000001800000020010000001200000000000000000040013FDC0E0048000000000028000000002301188008000014000048000000000028000040011002BF850B000000000000A011002081218181A111000020810100000018200118000000000000110014F0E2D10000000000000080018021010000000000005D
-:800F80002001120000000000000000000040012FB70B000000008081010000000020010000000000000000000000000000000000008EAC00002008001220010012000020010000001800001220011220010000000000000000004F510A000000A0111A0100000080A11112181AA1110000001800001AA1111A21A1111A21810100000000F7
-:8010000000400100703D0DA044802408A0111AA111002A828102A0111A21C1122B111AB112018A0988800115A1111E11005A25810412180000A02280020000242110F2DF140048000000A0111A01281AA111001AA111181AB112A111188008A0111240A1111A01A04118001218000080020000100121005FE90D8004420000001A012812F0
-:801080003A01A0111A81A1112B112C81011A08821A21011410011AA14118421A21810100002820020000104202AFEF0E00000000000000002001001200000000000080011800800100000000000000005FC50E000000000000000000000000000000008001002001000000000000000000E0C404481B21B01122B411324219B24291212B18
-:801100009419B24219B14229F24291222F1429D212A9421CE922C4812E4216E12264192E4296C1429AC2421B292CB49142B29122B49132421B282394212B8419B24218B14228B24228B2422892822A84E822B42C01481B61481B21421B2123B41132421B212B8419B242BB11B24228F24291222F1429D312B822D412E922C5912EC21E8170
-:801180002E4286E12265193CE418C2521B282CB581C6521B284AB19132421B282394212B8419B2429A212B84222B84222B842229B82294822E425F28032088040000000080020000001003188008000014000048000000000028000000002501EFD30F00000020010000120000000000000000000018008001000000000000000000F023D9
-:801200002A0082200800000000000000000000000000000000000000000000000040810214F0742A00C200000000002218000000240012200800001100004280010000002002000010C12240018FC30600200800120000000000000000000000000012000000000000000000000000DF170500000000000000000000000000000000000012
-:801280000000000000000000000000F04FFE000000002001000000004200000000000000000000000000000000000000007F280D000000001800000000800400000000000000000000000000000000000000E062070000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000078
-:80130000400200000000000000000000000000F0317800000000820000000000000000000000001800000000000000000000001400E011070000008008184800000000000000000000000000002100000082000000001100F0274E00000000001800000000000000000000100200000000000000000000000000ED9D000000000020040013
-:801380000000000000000000001200000021000000820000000000003FEA070000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000009C
-:801400000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000820000000000000000000000000000000000000000000000000000004FA10120B8
-:80148000080000000000000000000000000000000000000000000000000040014001EF3609004800000000002800000000218001880000400100800400000000800200000010022FD40F20082008000000000000000000000000000000000000000000000000110014F06922008200000000000000000000000000000000000000000000BD
-:80150000000000000040013736000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000020080000000000000000000000000000000000000000000000000000F0141A004A044882000000A022800200002421B012018A0951
-:80158000880050114001A0448004000000A02280020000242110F2D2FC00480000000000280000000021800188000040010080040000000080020000001002D0FB06800442000000002820020000104282011A088200400111004820040000008002220000002124D02E0A0000000000000000000000000000000000000000000000000004
-:8016000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F481B21B01122B411324219B24291212B9419B24219B14229F24291222F1429D212A9421CE922C4812E4216E12264192E4296C1429AC2421B292CB49142B29122B49132421B282394212B8419B24218B14228B24228B2422849
-:8016800092822A84E822B42C01481B61481B21421B212394212B1419B24299212BB419B24229F24291222F1429D212B922D412E922C5912EC21E812E4296E12264193CE419C2421B292CB491C6421B29421B2923B481324219B24298212BA419B24228B24228B2422892822B4229E822F465820082480000000000280000000021800188D9
-:8017000000004001008004000000008002000000501214FBCA000000000000000000200200000000000000000000000000000000000000F0479B008282000000000000000080020000000000000000000048008008004200000014F0B49D00C282000000002002000028400220018200001001002004000000008222004200002440013FD4
-:801780003904000000000000000000002800000000000000000000800400000000000000F0714D0000000000000000008002000000428002000000000000000048008004000000F0293C0000000048000000800400424880044200002004000000004800000000002004480000BF22040000002004000000420000422004004800200400DA
-:8018000000000000000048000020044200001FC506000000000000000000284200004200200200000000004800000000800400000070E2094800A02400002200220028222002004828480048008004002004800400200442000000480000481D7E00620000000000220000000000480000000000004200000048002028082004000000EFA9
-:80188000A40E0000002800002880048024040028000000000000000000120000000000000000008F670D20028002002002222004208404002248000048002004000000200120040082002004420000F0F9E88004004220020000002082022800002A2404000000000000200400800448200800000000482FD503000020044220040048288E
-:801900000000200280044800008004000000004800008004422084080000F0CF248004480000002200000000808404000000800200000000000080280400008004800400BF8C0A220000480022428004800428A024808204280000208402000000480000488200000000C2002004DFAA010020040000000000000000000000480000000053
-:8019800042000080044200008200880000006F32090020020048000020840600420000002004000048000000200480040042C80000000000EF620D002200000000000000008004000000420000000000000000000042482004200800DF1A04800200002800000000002004424820060080240400008004004200000020080082484200F08E
-:801A00002A7E000000000000420000228002004800008004800442800400000020048088088004200440018F170E488004002200280080024200000023A2421842880022486014800480044800420048888002480048110023048F2B0C008002422248282A0200A04248004A0600A022200442A04622A04400000000484248424880A888C2
-:801A8000CA08424A8CC4410046014784800220040042A044002024042220A2446A8204482A0400482880044842000000420088004242A044002084041C047FC1084A84820280042800A04480840228008024A4644280840442A04442008084044242428024A44842824880044882CA084A0800DFB409280022200442200442000022200243
-:801B000022000000000000000000004800888008000000144880042B11A0442A02A0C44A84A6666AA644424AA4444AA4444A86A22262626AA464222A02A0444AA4446A26A4444AA4444A240400A0444A24048A28A8CC88A088A0444AA4CC428A2C24A48C4F7C0D6AA6442A82A4844AA4646A26A4444AA444684AA4646A2622A2246AC222AB
-:801B80002922B23203CA0D884AA444421F140446A1444248004AA4444A24048AA888CAACA24AA424A044CAA48C13E42CB84284B4C2FC8336A02248A022424A84A2666AA244A0444AA644484A2422A264A0642B2422588008A0446A064E414AA4444A248404004A0420A48C4AA4C4284AA488A044CAA4CC4AA48C21488AF8661B002AA62254
-:801C00006A024A84A6662AA266424A84A4442AA46428202222B24262226AA7221A0882426AA6264E4130414A2404004AA4444A2404CAA84C4AAC644AA44E2024A8CC4AA4C8236424CA78BE0D2200000000000000480080042004004200800242200400000048800482A04880044800422024E83B0100000080020000008022022200280087
-:801C80000020044200200400000048000000002008480000DF7907481B21B01122B411324219B24291212B9419B24219B14229F24291222F1429D212A9421CE922C4812E4216E12264192E4296C1429AC2421B292CB49142B29122B49132421B682394212B8419B24218B14228B24228B242289A822A84E822F42A2380B411863411421B8F
-:801D0000212394212B1419B24299212BB4112BB4222F1429F24291222D9123D212E922C5912E821E812E4296E12264193CE419C2421B292CB49146B291061B2923B481364219928219B2429A212B84222B84222B84A2212B4229E822F4C3F5202888040020010000280000000021800188000040010000000000000028000000002501AFB6
-:801D8000BE030000000000280000228002004822228004000000000000000048800848200448000000F07FFB202428014880248A8282248104004880040020240200224A0100004200002004000082200830411904C240018F3F0442C2184848808482022A042A048082044840022025A24800220011002024040080040000A20020144171
-:801E000001244001FFF20D0000002008282001000022008084220200005800000000000020048820044A088024044A0800DF1E04000000000000004200008001000000000000000000200400000000000000001FA30500220080020022000028008002182200240028A01200001200802501000000000028C8424248002F73010028002019
-:801E80000200000042000028002800100200280000000042200400000000008A84842404F055DD0000000000200200800200202101000020021200001800802101000000000028000000AF6C099011800280020020220200000000001A0200002001280000800628000000200400008082021B7600420000000018200200002228200428EB
-:801F00001280040000200420040042480042488002800800420080F4A7D400000000280000002001000011004880012004000020020000000000000082A22008007F9D07100100808202000000000028304100228001200412200420020042480080040042008882428082025E6100128002000080810200120028000022422004000020B7
-:801F800002000062200280040000820028800880F46FE20000002200000000280022008002000000282A0118800142800100000000000020040000DD7A8004800200800200000048422A2404200400202204200200220020020000800428800C000000F0792C001880011800800200000000000042800400002002222002222002222002E0
-:8020000022002A842284024A022880F2A9EF0080018084222201800428200120030052001880010000180018008001000000008228480082A02842DFE40B800428000022000000000022000000200222000000000000000000000080040042F0C1D60080060018000012282880020000000000208201000080840400000000008200000098
-:802080008200275A8004001A220200480020014252484248802282A2428005006220840242800280248224820C2A084200820088C24888828FBA072088020022002212000000220000A04118120022000000000000000000000042000040011F97070048200AA0431200181278121800121212122B218023842881218101140018185800D4
-:8021000018000000808204808432C14A2218A22CFF7A03202C23228B0212282A820180058004183220A3241AA4421A012828A0422200800118001228004A080080840848A08C001422CFBD08428A0118282A2182A21300421880A112186AA4434A8481A213628024212121A231A0521AA212223A0122A012208622022A08008A86AC24428B
-:802180001CA268282E818AFE54328004282820A4212A0442A0112212285242284A020048802284A412621A030000484A848221220400006820A486200668484AA8C88A24D4180412200112422004422024212401120080040000188005481A82A4214828800228422842284A88A2848008200A22200200DF6F065AA511283AA3554AA45504
-:802200004AA1756AA655124848126A86A4333AA533181AA3156A26024AA4326AA3263AA1647AA7773AA2743AA3332AA2642AA2776A066AA6EA8AAC884AA4886AA2662AA6421BA88AAECCAA8AE8A4071AA5553AA322221AA1444AA1332AA2554A8486A4443A023AA3333AC3122B115AB162A3668A096AAE266AA2771F14A62214124AA7378A
-:802280001A21A4646AA611A066AAAAEA486A068AAA8C8AA8226AE41CEE2CBEE2AECC29F8C4558084A4332A02A0153AA7332AA2115AA4315A21A1775AA5776AA6774AB542A5556AA746885AA5322AA7336AE61381025AA4121A87A1113AA1751A012AA288A02628CA2CA44C4AA446688AA4CA2BCCAAA2A27FFD05481AA5222AA2115A25A4D8
-:80230000533AA3665AA5111AA1155AA5235AA5776AA6774AB542E525A1666AA6C51AA17D3AA7332AE217A5641B335AA4121AA7321AA1571AA3334A046AA688EAAA648A28A6CCEAAE424AA6CCEABCE2EE28A8A26FFC0A002200002082040000482081222104004A020028800200008001808481048A0448A048008004482008B0C807820036
-:802380000028200100000000000012284828008002000000000000000000004800008848003EEA80B51182B111A2141B212B1419B24291212B9419B24219B14229F24291222F1429D212A9421CE922C4812E4256E122641D2E42D6E122A52D2E521B2D2E521B2926B29122B69132621B282396212B8619B24218B14228B2422AB2422A92EC
-:80240000A22A84EA22F4841780916158198291612B1219B442B11192921B6129BA11B64228D312AA422D912AD412BB22D412E923C4912EC24E812E12C6E122611C26631C2632C126B291E42234916A31912336812316B16238812B2419B24228B842022BA490A229B4426A285FAA0800480000000000280000000021800188000040010035
-:8024800080040000000080020000005012F0133D200800200200220000000000004880220248480000000000180000000000224800280082F0A88800A282000022008001000000000000002280021800800480810448800448800400408114014021F4A65F0042008002222002122200000040022021A2182004221001002004121A0448C0
-:80250000800448A042802282448184420286018F6E0980220800000000000000000042002220220480010048000000000000000000140080F42BD8000000200480020000008002000000002820044200000018000000000000000020044F66020028008001128002800118000000000068008042024A210100800400000000000042482082
-:8025800084022F7701000000520080028001180028000000800422A04224482001008001000000000000420000F0FE63002002000012280000000000000000280000001A04000048000000000000004220A424B0ED08000000282824220000000020020020022004004800004200480000000022800242484A022820F443B30048000080F3
-:802600000100222200000060212880110212000028000062000000200200220022200200003FFB0C002001400180010000002001002004000000000000002800000000480080020000B0950A008001108143A2128002000020812281023022200100A0240000000000002200800420A2242A048002F0CEDB00000020020000000000000007
-:80268000800400480000000028006200000000002200A0420080742D0F0080020000008002000000200480020080020000000000000000006200000000F0CEE200800200002200220000000000200600200100000000000000820000208424042004001F6E0E000000220000000000000000000000000000000000000000000000200400C2
-:80270000F0FB85008002A041800222220000800200000000420000200400428004480000800428224200000000FF4C0B000000000000210000000000000000000000000000000000000000000040F1AFB70000220080020080810200000042808402000018000000000000000080020048800200F083AA0000000080820228000000004AC6
-:8027800002482800002082020000000000000000280042000000484B3B00000000001212120000000000000000808182010000000018000000000028008002F0FB650080040028480022212828000028800221A0148088A22420041400004800128004480022684200000010027F57080000802182A2221220230200000048484820040097
-:8028000080A1221800000042001800820080040048004240018F1E0100222800200228182829010000002800220048A034281200008004000000482004004A842406002280B44F0800282220848204222E228002002280022242A0642A022002224280040000005280040020026A0642006200008E7F0000004200000000002220020000A8
-:8028800000488004488004480000200442A0842004000080044880042F6E06002AA2224AA4557AA3622AA2232E223E2221002A02282822284A046AA626484AA4664AA372624A014A040080048085A4444AA8C44A24848404426A062A2224A4224AF476A9004AA4222A061AA1372AA6223AE22262232302222AA22228282A6222214AB45236
-:8029000027A4D8A0A24AA3726AF241114AE4140400A0444AA44458484AA48488A024484848426A062A622423A4222B441F4C0F80A4222A02A0262AA6221AE22262212902002A0222224AB642042AA326C8A0226880C4114A044AA44448004AA4441842428A24084A82A4444A046A022A8214A266F05E5800482A22064AA4262AA4223AE2D7
-:802980002262212902A02200222A22B24244A276621AAC44AA8206481C011B444AA4440042001842428A24A84442484AA444426AA6446A8614E226062FFC07002200A012200222000000000000A02420044A024A020000000000000000004880040000F01FB300002820012880022800000000420048000000008024040000000000000072
-:802A00000000000014AFB302481B21B01122B411324219B24291212B9419B24219B14229F242B1222F142BD212AB421CE922C4812E4216E12264192E4296C1429AC2421B292CB49142B29122B49136421B682394612B8419B64298412B84222B84222B84222B842AA4842E42DFF40A481B61481B21B0111692612B141B212F24B811A2A422
-:802A800019B242092F140B2F140B2DB12B422D912E521CE922EC11E82264182E5286C1539E212CB491C2421B692CB49122B481B642B18136421B682394612BA419B4422AB242289282482B84212B8426F275E200800400000012002800000000218001880000400100800400000000800200000010023FB9080000000060212412000000B4
-:802B0000000000000048180000000000000000000000000000E05F05000000000000240000000000000040020010020000001820040000000080240414F0DE1D0042000000800129210200000024001220080012104102004200001200002002000020C44200F09EE2000000000010022400000000000000201402000000000000420000CA
-:802B80000000000000B06E0322000000004002180000000000000000002100400200000000000000000000003F430A000000244002000000004200420024001A0400000042000000400200000022000000F04F9700000000000020010000480048000000002400002C0400000000000000000000007FC805280000400224002100000000A1
-:802C0000000010024A01000000000000002400000080020000007F3C0A120000000000200280022002400200000000400200008001000000000000000000BF6D022001002001000022000000002400000000000000000000002008000000009022003ED90000000024000000000000000080220121000000000000000000000021000000FF
-:802C8000F01A818081010020410200000028002200000028181002001002000000000082000024000000008F8E0D820000000000000000000000000000000000000018000000000000000022003EDF0000000028800210021C0222000000210021122812000000008002000024000000000048005F6702000000000000100100000000003C
-:802D00000028000000000000000000100200000000006FD10E820000244002240040022418241850220000001022120200212901180028000000000000000048F027650000000000000029020000004002000000000000008002000000000000000000BF9F020000000000210011A021200100000000002602120000000000000021000040
-:802D8000000000C041DF360F0000004002002100002800210000002400000000000000000040020000000000F06B5B0000280080828202000024001824000000212400220000000000000000000000008004F0D76800822800108281022C0100000024000000002100220000000000000000000000004800F0A3E3200848002110022140A9
-:802E00000229022381D122010010021880082440021412240048002800000080020000009042D0FF08200800100228225022001C8201181012020000258282E22203120024001220020000240000000000421C049F7105202882424242E2237222C222245022254362232C42C2122400004002291112B22212021821230100282800004031
-:802E800002000000208404485FF407000000000029011001B0322131120021242100400200000000002002000021210000000020042FF10300008008188001240080020024000000211A021220011220010000000000000000000020F4F7292008222A62282552222F22F312122F211102243553232D322D3225B2120124000080E122F17F
-:802F000032122F23F232122B111A61212F21B112011A01282A0200E024E42414020000004AA444004FCC0FA044222AC682272825F222322F23F332322125D22252333D222D322D3225B21251222121A011E028D922E122F932122F23F2222235A111165322215A05482A820200A0444E422B22800200004E422B4490424FAE068024A22274
-:802F800050222B222F23921225B212512229521335F122322953222B112512120218C08225E223F232222E322F224221C1122480A41120A22200004AE424942200000020B44204F01951208824A22650222B222F23B222F122222B11255222357323F122322B332D122B1125120280011E8225E22BF232222E322F22E21121D12151222B96
-:80300000111A05422A220200A0444E42290222000020B442C44248DFB70F000000002001000000000000000000808201000000000000000000000000007F5C0500220020220140020020011224000000002B1280010018800118200200008004000000000014AFF307481B21B09122B411324219B24291212F2499212B94112B94222F1412
-:8030800029F24293222D912AC4912E421CE82264112F22E419E22264192CA4292CB491C2421B29241B29421B2923B481324219B24298212B84112B84222B84222B842229A842882E429FFA01481B61481B21421B294219A21619E22499212BB4E0140B4E91224E93222D912B421CF922521CE922EC11984296A14296C1439E21481B292CC5
-:80310000B491C6421B29421B2923B481324219F2428219A2A419B24228B24228B24228928223928226B2640E20888401000000000000000000800188000040010080040000001100280000000021F04A4A200228006032222484240030120040220400248400212D2824121800800118280000100200480000002004F088175016A240026D
-:8031800029388224122021020010842101180060441992121818298202221818901245011440041181141200211841844122004D4142AE115041E2222430822D2125225182122322022901412011C2120012818AC212B022C122100180C1124A0122000014A10022001844408442822424F4FC8430220000208802000000001280040024ED
-:80320000465421801118A22118281800D014011410040014128014024008004004FF470522800147220084264208008001200110088024044418440010A81200000040014048020014842012080042F011DE10062180013E8218002800278180011098110081104CC218212412468202411261701204102802002001400410386448200244
-:80328000F0E1CC244424001E22A0121828210024001880411811088450485022402241220218244424120090210084000014008CB22404208204FB3380021240042C4808812200898101008001004842D084811104424038241800440084000024120044810081420000DFBC0F9014814008A414248502122618121802002440861104220C
-:80330000A0211844200140713832448420115824122B21C1284782284120020020044118BF1F0B280044100228005084220047A2000028A480416C441200001418401228041004200224184B148B214042081841002F842881F186B1008082014121842820410200004112840000404812088112104424024084C328404818041001181294
-:803380004418000040081FD703224941180421219CC22285028951822170220A0084402C1154488326F11228102C014C41D42182524244224F8102C41A3212806283161884C12C204104428E484781F0AA2700202211485428008001008141108401290200100420018001001810280184248443429C121904122480010000003F7F061034
-:80340000081200C01C901212A484844912140881008100C148948311A821C0214124200112488051841200A021002816044140082514082F880A00164482911C20323200A0122181903212490144D0480300284044442801000028128922820318411800892301802101528001BBFB241264842144C018184424000000204114044100107E
-:803480000841122418250844008100160430240000890143024C0126248102005FC30B248C212282412802818312A812100218284018280129424418D48423032508120012808114014400A02181004942080000848444415FBC0A822921D148014014444884410845014461C10030188161442001211A420C10C81421448444814100840F
-:80350000282800851408844018084140FDD7FC40084120021022931210120247912100328126080022813028891224024C01208102008190282A04104804001028044800F08F51302428002100848002225028221008004450428448460440140844810049044C112882B1246141504880030016080000608248AFD5450264104A0CC54294
-:80358000022485028150218416140810180421209144404222420826821462114048C428408821244198183014C12A41341852608180F1AA127024082E482290342A21121428C214181A02180028441A829112A0348068442A01164254184901450849A4211210082815382844800210441804813016F0116A2072842851A22504C167E303
-:80360000CB23A333282D2A8125B822524685C4184C11E88141D4481186921847463A63223A8152DA84437242828183F118498F8332188D1C83A1132E582283D38801224F41815344818D5872C54801FFEA47F21626AD126FC2731894181232182D166C4338382D22D11561818C311C165884893218264868C44568814D4A16D88A723A3482
-:80368000248544EA41514497418742444D1445AC214D188128188C321445FC1C14818181181220C11C4D4C7F5101E04152282AB314D2CCC33E894248F81212181E1812CD1E2CB13602CB224447424D184F2142B42CE444943985D44C5364ACA11143C114B012044381032A33242E244A524D8F81820183C1288447411678740C8D48253486
-:803700003C12EF4A0C008441804848024542484248062426482402228122812200100241289028412841844184400816088420014064834422A042A04281C749246F6951662D122721EF4A53CCCD344F427218C82889A3228B1113F11A384D2C4F43A3328782CFC1F314364F4252448CD288F66C5CCFC3F64C6ECFE2F12A22AF82722EFCF1
-:8037800034141E228F23A6661715282A56444F41F314144F42F244545F553124E082F11C1C4D3C8F82A2123AE386F358488F83F67C6C4F457516F4A4FD2465F64676A59E4AEF82FA28288F43F22E36AFC1711AFA1E34AF22F21A349711CF917126FE1E1C8B32CF83F13C1C4FC1F33E3C4F43B332F14868CFCCFF1C5CCFC4FF1C3C8FE3F2C2
-:803800003A22F7924FC3E161E2A3E746F711594CB338F73C1CCF43F31C1CCF42F34454DF55F1183C89D1C8F31C1C4D34CFC2B324F11C14CF84F178788F21F57E647E7C4F42F3CBD5244F61D162741A5A6AEF42D2CCF12C2C6F62721A58EAAFC2F32222AF817315F61A18E5FE1E18CB1289F2181C26782AE842D388B168F468C8CF43F668BD
-:803880006ACD1EAF62F23E3EEF91F3141C87A31E6C4AF43161283A52CCCD34CF81F12C24CFC5F559118FC131288F81F31C18CFC1712CFC1C38CF41F15C188F85F55818EFC3E7C3F34C5CDF88457282F41266A5FC5A24EFC2F3BC2CCFC2F22E3EAFC1711AFE3A3CAFA2F31E1AF7F1EFD1D1EEF13E3CC9B31CF31C1426F81C3CCFE1D18CB134
-:8039000068F458E4CF41F5EC72EFE3733AF63E3EEF91F3141C87E31E764E54DF53D3C8F37C34CFC3F138348F81F33C34CFC5F779318F81B118F31C18CFC1F13C1CCFC3F11C38CF41F17C388F85F57838EF45E1C1F16C6C9D298001230223024B12204208120024400481128112441008008902814901223022001044B824412802400884CF
-:8039800044844C028D249028C024D09C02E04112282142444208108A122A01804108400410044140480428211A0200001220810149810228188444120040080045E15B0E2CF4112485F2112C83F41124A7241FC1F24A121F41F24A921D28AB9455F84A9243F24A9147832F147924D81AF924481CF9244A1CF8254A16F1245A96E1A2655913
-:803A0000ACE449C24A1F49C2521F49D228F1912487161FC9324A1FC9B24AD141B24AF91128AB9451AB9443F34A9443F24294478229F92448984FA2F48887C0421FC1D62CF41128421F41724AF2112CE7241B21AF64D8C1F24AB2844EB743F24A9136F842854782AD916F82D418F926524E915FA2A8844F8265184D5A9E21BCF498254D42C9
-:803A80001F8CD2A4A5684F32E589726871913C4A1FC9B242C16CAF54F8112CABB459B24A38342F447924F842844F8294826F82948A4F22F513870082481200200100448002000000008001880000000000480000000000280000000021F02A420041C143518218CD12201108841058C1504221504244504824504824CC1244C214416D28A5
-:803B00009026496322A02184220010448881414888428821C11812891288F2272710328221F015228646114478222101121221111241E11542581C3215582810288111042218850421494101288CC12189D24901302A11412441424916646284181E4185F44C714032C4C418AF3102131124113314813218F1142741454248464A6181166A
-:803B800041AA1870328C4146D4219218C485E642A13420C228838102C71141C1893331818932224216846162160A567838F48438100221444196542E10C828004008400264114445C824A4508481400412414C4282024425210128148C024002100441812A4464816083002FC3010018502800001225022450420012442004008551A44C43
-:803C000002421840524880021046480200202184041002201208000027489024254324B21232286D222A411698211001508310481208608485440624128544944623216342256242221A02490247A22449032112188D141034241E49644B218D347283047F440741212D142C62212829A212442D18271240015012C0184180040051258469
-:803C8000121264411092184C12D242021A022C02264C820380058440644289042932143846082F36022214008912480600244002618100248100835484848461184648324412630222C0224481414002412C21041816060013136C41262804F03435242225648838C422109214259324211002850244002224841044982444C3120880023F
-:803D00002632482355480043042848218AA112402481A2411044443812C44CF1178C1420A1212100501411850430384901440090182564244150822061814014D241D2C2011887436212284F81B22221512411C45082288911481C54488C1208250818DD4C100423180424D0288302100100218053840080120425440221124100004004A4
-:803D80004410180C18000000000018001846F84B8E4016C412326022D04BC21385850281490125148203124382145C2481C1321614441C024D28A0124D62448321C2182A457C24B24141CC9200448444435148C942048443C14E17E730A212A342140C2031265062112C01400841854418022840144254A28982417424220190121A12448F
-:803E00007424428C0124001E286081182628046081811281F0CCB460228481008911220200290240044004811044088150421008A141C44100A1002642064410880100100440247126381444428FEC4B02184D12282180026400400410015084112508400200240000000044448344041088020018C48584614200410022212F440682835B
-:803E8000021800850324404241420410020000C1451854420010464412484814820100400881840000001004260800F0C3C10024008411508450C184401C41088450824440981200842485048C82420811400D818444256814812361412112403812814228122041381E47A29F790C21142081424808841048088441A4C1250A0049020087
-:803F00002618024008B480015022000044124D42200112124112814361421244A303F085E740888153A3122982C2224400288012991200103A282042420826C4428436429A2434494204400400284212000000400446080029B218F412CD143684020059614100104286420241400110140881000041005014812100840000104A0481406E
-:803F800012180481C02489026042CFF10811272881848A11121201D1000010020023020021442014024424182400414924121418843442414800250218240023C1480094F0F3CD6081800420D8241104181CC11489D114028011024425042D14C0124188856461B014021601D0826221144011584A411424848514C824408895282814104A
-:804000001402DFE94751222B19AD229313D2F37212E8424262112581722E44119D1740461436283028504CA53E64E518D88A522A855A68450861428352C822414D264E46144D4A107812425A82C469E442D284F139468932288D212D64BF970518136881A4869288874211A514D128312818916485D2245118A572291A7428E8C151CA2427
-:804080004302701462624F43126281BD2640761654C6503CA534494D18CC514A890118184C911889921C4E248C61421A41796CFAE97F243E258FA2921429E181A3115D32E141E54C78124158462508A518424854C2451444528250626C54C24341D8451326516413C21A144844A42D4881E38731128C11584CC331144E148423932447A1D3
-:80410000457C3424F14FA40040044424400224400224400314503800000000002128212821190219021D28D0810228C0284008008400148002F02C5CF037263FB2731EF81D118F81F12C2C4F42722D5D4EDFD1D18AF13838AD1C85DECEF21D1C955AEE75F5252CD5FA3C34C558A8A5FA2E2CE7E4E55AEEAF83F33C288F83F328288FA1F13A
-:8041800029214D226F36F2361DDD2D5D267F52F26B613B55AF95F778382AE22313F21614AF81F3381A2B754F63F37E5CCFC7F33C1E8F41E3C1F1426E1FDF41F233327F77F73E3ADF92B738F33F37BFD3F22D2DC5FC1D1DCD1C3AF3283C5555DD7F61F11F1E7557F77FC2F22F2CEFC3F32C2CAFA151AAEFCAFB6E2CED8AEF81F13A3AAFA36A
-:80420000F21913AFA1F13C3C1F92D275F2662FEFD3D19DD6E5F22626AB44BB66AFB5F77A3A6FC3E323F33234E1AF81F3281A2F85F724266F47F76434CD3CAD1C4CF1647EDDC7146F63F33373AFC3F33939CFC1F12B2BAD2C97D2E5F41F1CBFC2F3383AAD38D55FCEEFF151AAB55F62EFD2525EEF43F31C1C4D1EE5F62EAEE7E46556E6EF0E
-:80428000E3F33E2E8FB151EA3E3AA457326F23F5173C557C2C7F2EF64E4C5F65F17A518FE7F112141E122B314F61B11AF13C1A2B754F63F37E7CCFC7F13C3CEFC3F37C5C8FE6D7B943F132225F52F5382EBF97F33C3CBFB3F33A3CBFD252EEFFA1F12B3EAFA3D3AE53FFE5FC1E1FEFC151E895FF2E2DEFD2F23C3CCFE3D32451ACAFE3FABA
-:804300006E2E6768EFE1F11A3AAFA3F2383FAFE1F114163F723226EF43F51D3CD784C7F2E722BF96F6595E6F57F57C1EAFC1F11812EF81F31C16AB13CF62F15A788F63F37A785B358F83F33C3C8FC7F74C6EEF1C0D1880012D12A01210040000644006850685044450484014121814382430261004634278240243C248434228020040482E
-:80438000044C02890244F0EADB602A0000004C12041880010018410044805184442144456A412212218301001A024400000000100422001044045084BFFF0D2CF4112485F2112487241F49324A1D24AB141D24AB9419F24A9151AF243924AF143924AF347924D812F924481CF9244A1CF8244A16F1244A96E1A264592D4A9E242D4A1F49A3
-:80440000C2421F4952281F4932481F49324A1FC8B24AD141B24A9921AB9451AB9443B24AB924F44292478229F92448984FA2D4980F3CF411682E431781873612A7341D248F34C1248F7619F148B349F2489343B24A3924AF24598429DB86D412FB245A1CD9A4EC157A246A192E4A96D5B2E449D292E4C9D2A2E449D628E44922E4C9724A58
-:80448000E2C8D228D141E664D9C1F242B25D288F2439242F24F92448AD924F8294926D482BB44F82B17D0D8480042008000044800200000000800188000040010080040000004004280000000014E04B0C414043283142A41814844042181818111A15921846084068844441472448242664424444442860914042484454582100400C0089
-:8045000041184F8241444844B8620312231A922444222B821352421B418C32311112618741200145224298244161284A02444D1100281682121182121461622480E1440181890190483A04813430141E41F0651F203142104CE42214F82211449B14C3227222881144094511127442423824C721418E244C3444417444132242922C172202
-:8045800042844C149128504213614141812E1844002A0150186542641112477210845232282C012A08250130111484A143112A0116982800304880422284811244941400E01201244461502C480040088C241494184303166844844C022280A1212128002502201122010041148002814844E04442088442002004106241B0114441042841
-:804600001884181200608100204244F8F2C71026C22890248441231124042284146418448C11D4421184A142105226812D1247822B2160412C82024511C43120120812321644011481182F84C118701428A521304842CF110C412883C122260444182524041221140041164471120480C44241244522312489034901285041601243211256
-:8046800009A012180014812440381880A41240CC48AD5C90228022018C022124002881124429018141302418890224418C562884214860228004641800521116044CC211841812128B1412C01C182082044F9E45014901498202284001142C62832D141821484880012C61458D16C028121A04414031429014244331144064421AC414115F
-:804700008012942200B03404457818048D1244F082CF4082D42A0243110C2962224418512281110016042829410618C7224141224150825C024053184A0221489141811024B8248142231168888180022C028971970B182260111042144808800100850214120089040060A410485814428502200184120089822201129489811488084176
-:8047800000202431443F1D07182E148D224D114C138882C22B4412156281299111A5227441848122C158465448C7228D2483A461C18554422666244061116B12C1407428C5444B121601A8269B1817248321A84B81448D34A0344911E42E02A41082424254248400141A024508001220111284410260412100858114081614022C21210446
-:804800008B1284408421010084851414084008ACF4DF4500241120211114C8242211602118490118101648843118844110081810420C80010000181284001884122301214242480081421AB46F02128184100412280080420800632221E24481410800456B21810048E04281428421013840840232200400802102288426845224F0515C6F
-:804880001024118102000018190280210243022A811184512100404814240241800140212294112883810240480125012D124CC1C4002021849227001504511004441211122301112143022E144422844420820114244064414A0215084AA1241815048014149864284400214220B214880249342284AFAD078284211004418443028082F1
-:80490000024961422002452A41498422420912202203442881444111001848100889041301118504A0184694444820F3AE3C8041011216A8218443810118842981028110022228801184014C44048441481C11A4248400188302224848008C140218204504122844E921D4D105A460214110240184228400254822011008401408414470E2
-:80498000420A8034122200004C4411048183216281800119B142022838288C4208007FB50F414336180000004C210281240031000010858122230112641003400411100426042218422014042042A8188304248C01F0682640880100001301854162C1D048421828119612C0291421818941E254084100121412704408190413018005439D
-:804A0000235141114C1279484204444216082181EF3108F094131522C1141A21614243634119921227221E1144ACE12241E282F12874AB319F11711451882E24141F5134184B114CA2152B651A91282843C4551D251F15D11112B45805222A8201151563146781EB122AB788125CCC8B714FC6B11271EB081E164C5218144381921C4D1809
-:804A80004C53118D112289512483437416853114450884152A02C5CA1A65584284276241221B124D544C150143C2144CE182B244D488B144B548B6414182D121F16842161484CC282E224784A044BF39034197842F817124145844449311E88263238F816281A59816EB22286F43D2422271245D448D144B21C11F42314E6C04472249D47F
-:804B000049D1446241811222124483A123F038385A721864818D492B114731A382A164DE844F47A1565844488F82F22F7F0025011884400850148426224124416281A041811230118504811921840100229014D01401149014008C04842601341AC426004024212401BF7F0A45F63528C7E16D4445F438384F41711DB538F339383AE383CF
-:804B8000F33A1A25D28AF214349FB1D3EAF2162445565FC55C543E282E282E362FF1F1165E6F6151EE6F64F436344F43A3327AA7111B114F43F335648F83A3228B448B514F42F224341E181F2131225F41D18AE284F17A784F47F2E46C8F97B768F47C744F46A7653FAA024D144F97731CDF467414F438384F41F115158B31CF93F3343540
-:804C00001AF3183E2D1EAF21B13AF3393BAFA2F22E2C4D127F51D3CFF11D142D3C2E285F5AFA16146FE1F91616E5FE16546F51A1334F43F138381E145E114F53F33575CFC3A3338B458B564F46F23C3C1E1C87342D275D178D2A8FA1F17C784B674FCFFE6968CB66EFC4D444A4656F830A4F61F13576C7E1AF81F11C1C4F43F31C1CDF5194
-:804C8000B138F339388FC3F33822AFA1D3AEF11A184F62F233336F62F26624CFE6F33F1DED1C4F51F12C3C4F82F228AE2FB1F5165C45F62E2E25F426354F43A3334FC3A3111F41F534345F43F338394F41B158A455CFC5A7338FC7F3713229F21514AF95F56438AF87F7F4544FCEF764288F87F73E38CFC6F768785FC50B4F61F13F73F71A
-:804D0000F1AF85D1CCE143D3CCF11D198F43F33D2D9FF3F33A3AEFA1D1EEF11812EF23F133334762EFC6F26C3E7FD3D3D9F11D17CFC27224F82DADFD47AFC95564AFE2F232346F43B334F334144FC362411D4555F55111CFD3F334348F85E484F56C7C8F83F318189F3551377D17AFB6F57E5AEF87B7F4FFF4F84F87F77C78CF87B774F78F
-:804D80006878BD9B901400840041120022000084645048504840048912411442148412042004A0128001224800C0481400848054484881D048022F1A078240410444181240C81190181658228438122843813211400830182412002B52B02401181214165414284AE1813224C418C0124003003826084828482FDD082CF4112487321F41A0
-:804E00007248F11124A3D641B24AD141F26A911B21AB9453F14A9343F34A9143F34A914F83D412F935488D914FA2D418F8254A56F1245A96E1A27598E5A2F498244D4A1F49E222F591248D131F49724CF19124EB141F48B24AD1C1B64AD981F24A9351AF343934AB9443BA427924B842F92448984FA2F4E37BA0421FC1F62A534CFA6A110B
-:804E80001F413262CCF26E1111AF76F911248BA41AF24A9753F34A8143D33AB835D412F93748A9E922D558F925C24AFA241A87182E5287592E4387594D421FC8F2245A8AD438F1916447141FC9B24EF1812429F1116C2F6648FC48B35B21AD87322F447AA4B84261822F44F9364829F8245A4F76032508480000400240240400000000223A
-:804F000000800800000000800400000000000000000014F0CE26408341011889322A44421D2C1628C14181914E1844511392141638613024448181002E12184562413849A341001854445084C41140784202424502884222284480F247EAA024A22844872218242A61C300A8845412112A1192128C6214418C668868444845082304282299
-:804F80002C14411421430436781431411AA24836214891119042122893E1846884489CC44E8F5A0D467162982120C13884218D145141B82E4855981889A112903336EC31746461821E8C4934848C5484C07290212504C14813248111644241C3D484024941A2422054422381A2414A7848029483F1BC7A20220144872230221E24628C9232
-:80500000184001141944160510084222288400102211A4212E521B21490122441416C81111181B482661883413014820186982284924F424428F8204211A020012C0280021111440618185040028800144008444008410240400004C020040031800001220212408F05CFD902421472300898251214783C1836226406481202324044449E1
-:80508000A24242244830145062203224282A01282E1A444582D12282755422042420C118290188E6880C2041F455BA302229D1240320237128911881842641018521D14801482002424264481044141282922449A22580E2821112343221124C81440100168801882A8C048041F48152402402008440C2244522C2424024112882044064F5
-:80510000421A02003018400481000000411064224842212424121810021884924288006F7C0647243A440640022982316125982522211A24044140FC2412604440480442100441002A04C464402802404202411A82018421108C042D482238AE288082846211342216648884442869A11281A012161828A214248A038C010080214114D1D9
-:805180004A210120256142421890141A32241084422184789442282891422D34584AF1D3DB0044102441048213040081411082A21400814644182402644044085A62220000001654144489122285240100001A22011200F084D4E0443224701364212223312A997561C62A2281A14823038C0187448B214C4C588489028014141864454742
-:80520000222002414421CC6552D024E1212286848141811428D9823288421AB4488223F24D4E6028124302144441000013811184819438498422412463440041442112490126321818460812184C0212418C021614022001822524C1141221432184B4FD0A2100269412004140010010018002000000004810C444000000410010044904A0
-:8052800021C04400482141444426142634489F220F8420321180A2242881260400919021002841A0423034800200004004405848480020E6410246A4810000A041422A040010F49B27200824801221110100400400210028274141002220040048001C040000C0220080624422000010088C024608F0A89C400280049214400146942128EA
-:80530000412024040000001044060020042044014004400123C14814440029048C8844880800B0F84A21021100000042800240014024022002008082040011004142002240040000004210248102800440F1BAAE00840018124306814528220413044120041848444C4204440000001C040084200420A23422182004490288C012828B24E7
-:805380002928249412DF7503601244430288808402400381002A042400001024022400284814480000000000862288B881022B4158828002221048E85B0184434885244261414621042A847448812404000000002810060000000000400280C44292128225220492008008828628F82F166086802481C8268149122402448002688002269C
-:805400008201232282012EC241800260140084C041C029244284142848444228008CC41812800421487FB206483358542F41839891DB111501CD2142C0211544312120229222484604188062444904A04213B4442484840430442642026A62314B681BDCC217622458438CF41844C8422246D4182CB4820723728834216AB432C2212F4625
-:80548000B244364C444CA246429C145124A024E0628111A42243A22243C24223044141000050844140219267AC91448F2618024810A2D18CE884F1223C8D284E848A44E8C9F41C7D808202458161434826D48122A6421D21E18324A4646A14840263A122414C1244B6244202224248904144118114288144624B414AA21116A4822B844BF3
-:805500004442248B1D22E04A9862A14652281FFC0B20026182004148410084804401004440044440041002410000111011141118111C1114018200004C225148008285F4C62D142B4C5F44A2226B532F21F236A48F87E746F6686CA0441F24B462F449491D215F42B2615644242F22B222A2222A32222AE262F362424F44441216044AA4AF
-:8055800044DF54049445F125619D285D257F96F675795B55DF96F64741867263F544442B354F48A8981E2E2F48C9262F648CACC42F64FC749C142B445D4D2E252F43F512927F53F37C785F16F6282C2AE244F641622B669714115F46B6615644224F63F366662B4447422B114F42E26AFA66626F444CB2261254114AA444DFD4F441414E22
-:805600004945F125619D284D246D285F92F36D784B662F44F4C1432B2245B452F594C48F8151E8AFCCEC6EFEE2E429EC84FC48DE5F8F4CB342F425642E226F23F332326F43F339796E649FD6F62C2C4E441734AF94F649491D414F564651442652666F47F766642AF22414224D862D424F641452444F44E41484A4444FC454114855F4250D
-:80568000242E23CFE2F26624DF46F76477CFE6F7C2D4CEC23F34F644462B1547488AF134266F4EFD6C6E6F46BC82BC48FC4CD65FC942B3E2F62D254F72F276362F23F337B5DFD5F765659FD6F624244AF46163AF147649D111F464656E614544F216166F47F746644F62D24451444F62FA66626F6C14F224244D444E414AA4445FD4A444AB
-:805700008954455F46E232F22C2E7F52F22D34CFF2F764663F1DF5C1C32F2CFE44462B554F49FC5818CFE3F2EEFCCFEEFEE6E48AE884F84CCE6FBB080022800149810460224800140080024C0200004E24002004004200002220822422010048200800824220042F5702212042142211024128420000A02400410044400400108402420015
-:805780000041002841B04401880048008064442668441048F168CED022F41124E5F21124A7141F41324E1D24EB141D64AF149921AB9451AF64B924F44A9143F2429147822D954F82C4954FA2C4854FA264514FA264194FA264594D4A9E24ACF491244D421F49522C1F4932481F49724EF28124EB141D24AB961B28AB9451AF24B934B44AE3
-:805800003924AF447924D84AF924488D944FA2B4BB0567B21AD61EB411726E21716601ED1119D67AC9642DB11D68AD962AF44A94222F747934F8428525D852CB5A5CEBA2EC51F8224896F5264A96D1B4E449D2B4E4C9D224E449F62C429247249E2447248AF24612288F62E948F44A3259D268B924F44A86A6F84AA622AD946B4AAD14BEF8
-:8058800042CDBB4028882402000000002800000000001844880000400140084800000000000000000000F05F2340012223219238121180440848914200C9922448462842283424448C04C41A54861A64442800E01102464146410825488124840422268881CC420081422F39054B2186018414144B288C5834890116480370514802859129
-:805900001720C12440484834555012284C42984260414121C41881432261121821121412415E8A004412482AC145F01BA2D014638C284820A28114444241201222A41450423443C442188322654243084915847528B4558224123814421248488594220023112624A614418A1302C82C41A21284126FEC011041628126711138248C48633B
-:8059800081811668141508150826D848321181224410487848141158230085944200442712C41C01456181264148214101C0488922418424044684F47CED0000000010820240020020014004000010010022001100000021840000001004000000907680C121111902111C0100400220C128008820312460121008482002A7210030214564
-:805A0000110110414A4201942411119222004A48341800A4BD4B806112112240311110220200213028202108414C0228001001002800804211014002811440012541A11822008A44341800247F6501400811000000404204120000C01200130181200428241781211011518400101158220081604200440000005082FF930D139211266416
-:805A80004144203112812911280121412301008C04224181241440882114888212189421181011180200460214001052422C4248381800811F554302221012011312041C820580016021421100444810241408400C414014420444814424104418CA4821C018E04108418280448444F4B6BB404202A021210011009111648A0461120018AF
-:805B0000008014641244811024C11200001B21418001811400000060212042041068226F124413712283321241213861112B128C551811439184122522146184184C924481472446D5815284C04C41412444615120038424104CD922840400D04251422482441E484038288F4A04221241442E11402111180112247042024C2101000000D5
-:805B800000301810A8121A420822124551C145220100848512011608822C31248942084142413FCF05000020111A911800000000111084015024141008445048000000A021141A120800210080011084010000F6061004110018182412812001856431811811101C4508002110121802816C82C123140023421281513A892102141042043C
-:805C0000814441CB214D18002FE30B400800C01813412201400480110814446441814301002444401811280226420890222894502383210226442201400C80614110F2F1FD5088C304118011021608455C444303C11502130160A12553221E121B1192250810584215511115741A588987148013C112801148524445F424212A22420460EA
-:805C80004141C722A552221AF1D77F0020211102004001104811010012141001440000000000212400140081000010080000180000D03805818C24840400004054144C32288C02210010512290124381298848044041414118C84846820544000044414C22922800000025022D145B26401882040000001444800210010000211418411950
-:805D000048040040014088814402002200400489020041200210029FE109200100441800504400000010012421A011140000814001508800000018005044A022001002002421A0118BFC2420010000000000001110090000400100000000242021810100000000000081000000DF640D1038444A118221010045054122838201201141122B
-:805D800042A21120212818041001118588112A240400005044B02C022668218400401242A211A5068485888404001001504845848242431108101151262584E14191888800404143414858884C84240212004044D44492282A020000002556425FF90D0012004100004051284001810000004004000000002400122501120014008124003F
-:805E00000084120000F014C320010000004001009400101101001400004400000021004002000000000000000000F01A31002901180000001414843184151358881C011411004014414414080040028091112922A111220000855882002181800200457444012021612110040011111181148051111111001445514441401804000024403F
-:805E80003212121603400800000081244028010041F082FB3012C0141062411A01111410088558191042215111110011151504100400241032121864211004100110088184188144180000708A0D672227212AB112219112C0122592812F317111B189699985F888414E48D09114C1419518F94448874445B444E242024C02284554242ECE
-:805F00002467222F21A2122B111AB882092C5923882F317111B189799159888B484E48C048805488814F84E4D40F6F225224181223118281512229C8131F2191819E8887118D4142464859111C54818588F44844C1492262424480425444286F2252242A21B31238828AC1112592823CF1111219F891888391484246480848848588F47A52
-:805F80007D000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000000000000000003
-:80600000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000000000000C2
-:806080000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000042
-:8061000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000C1
-:80618000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000041
-:806200000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000C0
-:8062800000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000040
-:80630000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000BF
-:806380000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000003F
-:8064000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000BE
-:80648000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000003E
-:806500000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000BD
-:8065800000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000003D
-:80660000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000BC
-:806680000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F003C
-:8067000000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE4CA
-:806780000F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000000000000000000001E
-:80680000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000000000000000000000000BA
-:806880000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000000000000000000003A
-:8069000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000B9
-:80698000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000039
-:806A00000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000B8
-:806A800000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000038
-:806B0000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000B7
-:806B80000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000037
-:806C000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000B6
-:806C8000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000036
-:806D00000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000B5
-:806D800000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000035
-:806E0000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000B4
-:806E80000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000034
-:806F000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFEB3
-:806F8000000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE1440511214A4842445084311068D1144244054C1872130182061810044D04A91111921125824542240012441456A82415014220014644CC222002001F0294A4F
-:80700000404118485A4144C9811116210144814551619012258451122D185022D032C11316512181811D1890298722149C125A18D311283314286F12B11222D149437C24922890164F2261231E282183D186B18A02100110112A01400240041441244481211911080011144002182608401882021184409214241D22008D1184264104490F
-:8070800001258201164874AB0900212410448611921149011D18814011548144408A81410A408491141021016C9224288511021602160841181B2138414424844942A221608200847FCC410100910081404404004400000000301200272124911200848114111011184104004441200220024004204102AF520914819150840085040000CC
-:807100005024106221121821000023011450818111400100811044C824268802000041243022A0212400126309000000000000000000000000000000000000000000000000008004000000FDCE1400501284A501408108180020742118210144111211008415422141711242484805190216445121282881511C01814200800384702438CC
-:8071800014F0928420531250480081901AC138298C61548031129022252C0240684264224400363428222C81C2246041848C2206181400124044318622210023A6184826F8152E142C01404D481108AD11C12C81091504182D3114272144434281012244284411C0262A9128837124C12426415448894201229441138101431411269232F8
-:807200004018F22418188CF2724520124102248400202882848104488180420800154844125821806111A440020018121468232201110081008200004A226844D08D082001112A41081508100242001A04400128002004004042442281840244220000304A822182420080087014881304F08D2B00111A1218C842181289922C2011528119
-:80728000248426B41844E8222484C16400248B248C8523218493242C03663421109A282CE421A6141181800412A041608422C8208804CF2C0B6011184068841818261808000040C45881484818000023840512A012412E1222108112228204405828802404000022560800F01B49008012A921241009431262214294244E1828106122224E
-:80730000C06480048C12A8212446448223042E444C028184243AB442314388200812808538489084324928048BDE80814744E144124822422476228564215688654483C11243433824E964814E1342841AA221452294461E2422442528624640884143B4284108CC21B2884204C0442B244D482816821C18F8717140C244268801804205BB
-:8073800040142822488882240200212081028141164808003226084222C0423048142250414838208102104244122422F18BCC304230112800000080011004008110081004144148001008842021212102121022A4412284805484800840480818F0C3A82446024C2261428128234264261C62841218442816C82247818181874410251217
-:807400004998148C71488254842222238221A1218962211361442A011A34398C86114424A2842D42604212432411F8B38180E141D2189121420015040012248E488B1449242481024C0289C14242E041A2424421442A014D1820C2240042502A1538680090884889014422874484818289022F4D01100112180081830448810081008100DD
-:8074800000240042001248B02804428024021800382829024A810110A821981828800218D0D50B004D1240082800004843422434484064C24C02C148874484205548841284400828204188C26840284488032886A84100260881220081414FCB030026081038288B14801188850490188481001852442004212002211AA2438001000042FA
-:80750000802407444A01A01218422A88011200E0EB0D208104004228122212200112202122010023011884422A04800100008004282AA161128018084B14188881008B840040028F19091880816381200412830484008C011212008084013048000010C81489A14300280000004800588282826849A68460281880E6360F221200100122DF
-:80758000485082448001422200003022000080848484042841421AC6424100800228290A80022230181A22240229017FA40B4428848449021084C22400800422101434288994288354488514143858008C018142800184266885266884848CC418848C42C84884608800188C05C8D0570B128012216282201418810523810540882101462A
-:807600008201001880220220214482A4210020012100C22248218800128C0828208404DF250A8C220442008112288C4444042842002221181210064C051A48820448C0212A01842023051A041200584C288282318C00B044081A1802360412168113CA349D284AB4683258844785E041E24114D88824B3185248841E1A874347C4A14B446F
-:8076800042848395484AA141628F8484A41118228483E38431688CD32866848B38ADBC784F8731881AA8128E885AFA58B8222A064A44F463AE8003168833387028C814281B128158A0145AA11289F124141A62434A84A543414449B11285A226B04A21A1116044624A22C214681A3232181AA6C6428384A495A28F88088788A2481E181A59
-:807700009118481FE50D26A434C3B2114408281E482E588F449652878429058C244448981628608418465C888D48422E4E1848848D782E247E3A2AA6411AD128833638588B44728322A143B2A388D488B114B278B72481B4C4C3828AE42128F2168240044422442244000000000000810000000010082012080000000020220800800200C5
-:8077800040284428F4B8BFF024244F4452C85F53F51C3C5D252AF224248B335F77B312E121F1121480A7338B33CD162F42E182F2786ACF82F66C686F4554444FC454888D2A2F85E58525A4754F45E725D74EA4447AF1383AEFC2F728283E32AF8152888F82D6A8BFE6EF26FB6ADC8F88A821CF42B2A8FA2484DED8CFC2FEB8BA8D888ED85D
-:80780000AF86F45D1DA0322E288FC3F235551A53118F82F2243C8D385FF6F21E1485B27221D488D788E483D364F126142E288F83F22E3CCFC4F54C5CC7C44F4CAD448FA7FF52585E184E589F97F664644E6BEFC7A5453E183E32EFC3F258488FA4F22A288F83F358588FA4F6D2748FA2FA4AF88F84A911CF42B278FFA4948BFC4FC6AEFF15
-:807880002B819ED88F83F36AE2A0226843F131358B319D21CF42B278B538F31D37AFC5E1A5B11223F118483AB738536C6D3C187AF73A688F83D7CCF544444FC4FC18188D2A2B744AF558585E714FC6E7A5F5667C4AA7738D1AED3C8F86F6783AAF85F668386AF348AAAFCEEE2EFFCAF88F88F988984F43A3BBCFCAE88EFC6CCCAA98928B58
-:80790000D86E58CF3B024F42B328F23C289FD6F31C3C9D29CFC6E287B378F77D77AFC5E1A1B152A7558B538B518F83536C6FC183F178788F83F65858CF84F44C4CCFC5FC58188FAFB762A7545E488F94F6647C1F25F1767C5AB638F3283AEFC3F358588FA7B372F768788F86F718FAAF8FFFF8EAAF8DAD988F88D9CCF3A8B8CFCBB9F8FF03
-:8079800074FC8F8DADD48BD86E78BFFF040018804128C248C048400812400816480420E144028744208421048324228421840100184800221A24A241200912A0492848281200430C80021200200128188001428023029038205484008100484218A0128004C02883022A41088400C0488190280048280014CFB5062D421F417228F3112410
-:807A0000A3F69124A3D441B24AD141B24A9961AB9459F44A9443F24A9143F2429147822F54F924481CF9244A1CF8244A16F1264A9E252E4A96F5224A9E24ACF491242CF4912485F2912483F49124A7241F48B26AD141B24A9921AB9451AB9443BA4A3BA42B9447822B944F82A4944FA2F429AAD0A2A5612E431F81786A3111A71419F24E03
-:807A8000124CD27899618DB459F64A9443F24A9343F2489147822F54F926482D914FA2C5914F82EC51D8A6F498252FA265596FB2F498254D4A1FC9F2224A1F48D42CB591724AF29124A5F29164A7261F48E264F9812C8B3459B24A29FA4A34A22F4431B4274463BA42C1125E99608280040000000080020000000011188008000025014025
-:807B0000084800000000000000000000F0B3C6A0240020421842114801801142924420A224200412002A8421024220C24822A0142222412210220328182A8101232402800228A01C885FDA0459A1212E18228001001218200489044E1800148086E422042022840142462291521210223118122AA124A014A084801808C11812C8224A81FB
-:807B800043014742E042A424830328121011981143012E52602441812248112C24826121A02C386880041B42A7241A92182C2404441228681852B094A421328421452881A124282E42328A24F9DFEDC01112800284210000001088A41480028024A442000012200412488081A21216282211820228008820240280081880013F3B0722C001
-:807C0000110011182822200242400100000085840441894208002A4104A042A0120080912142442722400260814A01400848009F5806008C022E11833222811216CB11181400813902221889344828448304422D24898201C04858484C31124185E1422101129018428858872190862CB228818464461868441DE480028C0313C2282A113A
-:807C8000881191138004142002226084486044483028A7422800188CA4414830121E24944B2118302142C4239482421260411A228244B8440242412F660A0011805121202292182218140081310018107824088441424088012244004E3400008021011828C0128121A36824160842A04122F0D7F7242A410122431218311819D12881A220
-:807D000021103A184084242221A124104834224B1228688304804668414412441210084CD382E12441E42401830448414E14404448A24184CFB30DA042898201228800211855280248220000890423A112001008242881A0214291421048AC12200481A6C4288C02848302A01262408292143F3B0D00000089082002000080122831282270
-:807D8000A0428842844240C824584418602218002800818100180044102201464898424220F455B68041C1281A822202181633282B218342028C210283241188878295882CC4282A14E882D468A661C118224B61671110A412C41881CF24824122382821431428024256B84C1228243444BE3E30A2280041848541081230114028044C02D3
-:807E00002832814828224460412200004AC218001240088C0212811E482AA1418184248CC414438102230438846FD30910011B1210810212112826011901288480018122818C8284812422242204422004001228260880228292621210820468A042290240F2569F80814108282281100818808212182822010084420000421216282182CA
-:807E8000228221022210082880010000902229618128002820F24C9A20081800001302280000180032001220022200004008002200802201812C1208212484000081002004F09AB880010081180022818C028100800120420840048400202114082200280020014228211812438204B048022B21A01200219F4F0D8001A0120010083023BB
-:807F0000003038280016846181184400000030182084820222208221225182000000002242400240F1ECF14029420914E0111249214111482161124018A8424A02282588C2188480628528492164446044844800104802188C612244259A1880542841244C86841112D48A4F0114D018011C021818140040018001004200002084044828C7
-:807F8000222200182880012AC41881800400249012485840022023F4661E4021C81166C8119294808261115012402101281812200120020040081200841200200150824062412A4102C012002721002A04288FD20C26082A048308183618C128403418281608402802243022128C0188C02890284001124648042200181A42E281024412AD
-:8080000089A24141120080012112CDB4E01121681289E612224AD18861113E183E19221870180180A1237A52A88C021A820280A6418CA2131E58682AA252322A22021E384A312836481AB212E122452264242B24AB16AB626E224A420234321B2910B181127131B88111B131B211322999129121111351813A91182AA2144981A412897154
-:8080800024145888482283B43875481428068384270428221E281E2AAB248963A24F22B21232182518A241484D1A1AB126B422A226184D42CF764521E211F118181C7118E811D38861128C4381521AAD291CA1128D283E288781001A31186E288166882124C438C0682A4284E4410244283A018382C11223B35803D086D32881D1246181B5
-:808100005221241A852582F24DEF0000000014004003000080044880544848000042200442224200402804460242602400480028480000282FE541E11AF211399F13D111F591119F99F129288B22919F11F229298F92F218189D191D398B328D182AA2764D146E788F84F61858CFC6A6264A012AA2628F86F62474844D444AD444A6464FC2
-:80818000C2021AE587C6288B676E528B548B2269B622C7162F24B442F67634AF827324F642526F74B212A3222AF26446EF9442F131311F15F729191D41BE319F917339F939318F81F119295F73B223F2393C9F91F111198F82B238A1332A53448FA293128CF5747C6AB2C8082AAA337E28CFC7F7591945E416F22C3C7AF164242AA2517A3F
-:80820000A7558F82B232F35A5A2B662F43E622F7627A2F2191426F63F33A226F62B232F727262B312B332AF27476EF354EF121311D6197129F12D199F199191F93F2212995F811298FD27329F919381D119F81B138F338382AA2774F42E382538A8F85F12C5CCFC2D6880C223AF77848CFC3E791D444A4464FC2A6464F42A6223AE181E3C9
-:8082800084B638F23A222F21F352722F43F36232AD2AAFA4F442426F47F37A3A6F62F342726F65B152B562A6224F66F7DACB141F1BD31176297869D999F219399F93F229298F82F311299FF3F32B2AFF81D311F119198F82F238181E387AF734248F87D78AF14818CFC2F7246C8DC8A04A8B738F87F67C7C8F95F724641B664FC3A7774F8D
-:8083000042A6227AE185E581F13838AF87F67A7AAFA2B332E326F34A7A8F21F142426F65F15A52EFE3F372726F65B152A5112AF264763F4A0A002A012A01221226618114841412608128168822912812830428001088012A01002A0122A012482A4128E2812402A04120C1228C84024A02009F950826112152812215A8128C02108812183D
-:808380000100222880A24228418B24004828228100220000008446022C0146028901211229224102A04128227F570D2CF5112485F2112483F41124A3D441F24A111D24AB941B21AF1419B54A3924AF1439242F14F924482D914F82D418F9244A5CF8244A16F1244AD6E1A2645DACE44DE2A2F4D1242CF4912485F2912483F4912CA7241FDC
-:8084000048B24AD141F24A9219B24A19B54AB924B44A39242BB44F8294924F82A4944FA2F43C61D0A2F511648D421F4122F4112CA3D441F24A111D24AF64F911244EA15D28AB9443F24A9143D212E982D452F92648AD912E525CF924CA1E814FA2641D47A2D655B4DE2147A217CD45BA91D628F49124421FC9724AF28124AF24D141F248D2
-:80848000961D24ABB459D22AB924F44894D042EB83D442F826482B944D1A4E914028880400000000800200000010021880080000140000480000000044001200000040011F2C0F20828222C21122841692214038180023A21410880228844A02004A2201843042838202208101188128942800009582C418800284A024282F4E093534915D
-:8085000088130850211B21191284A11280188201841AC24140280180120844225084284100320080321410C2822082411244022811628044013F720241138EE2128482C121382E11493214262842829222008B12134412981812A0388462442810912289322820872101228428142C122422421279421228422142026621F116FA50121210
-:8085800082821041528124112091188220A11484200222A0420000121058844241000000124901A1820018400418808214880422EFFE0B008280080088000000000000000000000000000000000000000010010011400170E7451222144184114CE5241246F811114822859882169214396432C084185AC2484564383184288341B8831489
-:8086000088E14282281443A412C9C2854261A4382A64398D88211249A1482A48524AE084A241FF1F06A024714418811C22864238268A65118850A24129E42281C185122884448E415542E184B2194438828118444A8C12034C11CCA566922427812A81C48182F0424A412B183A4842048C3218EFFB090082800800880000000000000000A3
-:8086800000000000000000000000000010010011400170E705001840112112110890411412004088C34800100400801204228081029014602200C01200120042004004460428B0EB0D39C212136221384981011A02298281410489C5641A828482822104228072125458382C42084F22044A02222001365228438449022001424C722224E8
-:808700004284838114F8FC582419C21213012D11181A023224281A8401904826648378660818108402401491342884905423A242100412800246A218301200424226142612240128F0B2F10020222152411011081011C11480210400282004002829712804242220020038C02280119A16000012002012044E241842843F240B12302814F7
-:808780002A0112294151221A42514246628480110A6D22104208444312022440020029524830281A022001181A42044004280041002504127F4A01A04230182100222800402402284628220118290485A121A0242284420080D184A441004800902284244442482A44C812120090222B1460218FE406681084024181244784802802809178
-:808800001200204408520000004C22020010321600100200002800002218200400C83FAA0E327024D82983031688F22148A0212840C258184A8122F1462283216481142226A24222A02400002CC45616142802202102382024841428A2211841422118602C8F61044828004044225126908211214824228542080020444814041018861291
-:80888000022CC124002212244002890121281004122100809244006F5E498203284024C411122A810218280083048032440000292201009014800144000080218102290200413014430180084CB844A8826DBE404888240213810220810149C4143012E0441102224022021002000041004C022220810224308440020000004224524034B7
-:808900003F902200131121227124021848184002A041625828000020020026024012840200432101108401804202212280828402C01889F469E3C04828202401139412481141248D14905C1042480822901240021800201214021841630228001210042B284420484822C2846044448221882FAE0E822608144400002216013A041858C056
-:8089800012182480010000004004004C220100000022260400108241342422003084457159031280220220022880820228400A80420810028C01801102121812288184002800220021248606286048004624211484A421EFDB0F2400806624400841872483048745104208604400182082A2210044108892188042942441833214444961E7
-:808A0000818C08001200848412800310F818F1400880011CC2422229141151820081800142001840028180010012418001224400100428902423626A8828280028200484F0FC132004482117834C018440824246C82A4904200222241022831192A280114C4844E14112820148212228283244122341041A22012A211164424982542248FF
-:808A80004F620118AE2820E447F1511426D126B322E643F12A565E182B11C3D4C4448231582F82B4245222A01127222C82220212504245C8164F817334B414524240B4188261421E3443F332862B2A10C28228122AB2146246269414444F14381C5B3A242B2281283AD111C2613725878352111B21214E24E483351AC03420A4220012709D
-:808B000022A231188012A411234102182849A2322AA1221A712452688A82B122C2842359822E268741260443AC424964892E8CD72BE0250426D211122C8207C02146D128F22C481AD122E184B51AE422A435CC041A012827828C11622150C48B1344496242896342436262416041490238C145C28226C21418499914899874784E242B8D99
-:808B80008D442B6C8FAC0F000010082440410840024048020042002110020010181218044110040000414002004C48C884C0840040F45B94E022F62228243B515F14F51D3ABD215E7A2B314F74B762A7328D18818F8412F21252AFA2D78A55646F46A644602287822C512225B21251881648F222262F621252444554646F41F118184F410A
-:808C000023C1348FE1F312B22B92AEA22427282BA14F48F99C9C4CA1D94F4BF3941418CD98CFC1F43841245E422F84E422F233715F14F1492B3D292F85A7335F66F71B161E328FC7D5CCF15C5C2CF54252AFA6B5627564F666642B54183A63222F2AFA22222D822B11CFC2E283F315132F63F33227EB224F43F2446445F6266485F814342C
-:808C800043F324341E342F61D342B382BAA2DA22B882F814344F43E34ABBD4FDE4244F4BF586148F8CED8EF69383E023B622C6223F13F34D495F31F25F654FE7B752F77477AF47F72232AF84F7585A67841AE125F55E5CCD5C47622B222B111AE122712888682127212B118FC2F2343CBCF13636AFE3F3123C45D444D464F2162487814F91
-:808D000041E243E243D2E8F236B22F42EB2ACA222728AF81F8183CCFC1F1AC9C5AF574F44F41F94654CF84F96C7C7BF3245E62AB622E223F17F24D391F35F3777D6FE6B762F76577BF15F54262EF85D7ECF15E5E2D52AFA4F57E7C4F477764B622021AE122F322222B821E1227292B118FC2F2343C4F91F134349FE3F3163C4F43E242D66E
-:808D800064F242248D284F41E343E342E363F3B6B62F28FB82A22F28DA22F88A88CFC9FB34344F42B3D4BD64FE34F44F4CF5C8D8CFCEF68BF2A01220022A81E432A141221A0412608144001A0480220180120218002818A012800122A012A012122602204822099228822892282004775D20080014400118112468425022A01448290200D1
-:808E000000602200204244420444C0244100004445022C894202004C22614443014150142FC60B2D421F4152281F41324C1F41724AD241B24AD141F24A9119F24A9251AB944B42AF3439242F14F924482D914F82C4914FA2C4816FA264116FA264192E5A96F5224A8F49D2A6F491244D421F49522E1F4932481F49724AF28124EB141D2484
-:808E8000AF249921AB9451AF643924AF4439242F447924F842944F8B84F9A44AEFF30F25F81164A9F41124E7341E2887341D288F24C1244F34D9C1F24AB259C2924B422F3469828D934F82E4147926D812F924588D916F82EC11F8264887186B5287596F927498D586F491286D481B69E9B49132461F89724EF281244F24D181F24A961D55
-:808F0000248F249B212F6469822F4469822F4469822F4479A65842BE427F3F0F8480040000200844422800000000128001880000400140084800000000002800000000004F5E471102100116311110618210C24A141012C84A2249024501242082044449220138438181A2128091151604282816023814002021011622B84C22098F2509BA
-:808F8000484308122828422661811412421880C42418284E1880211201812424400A44414508281072214202282200502100444424648C120800144C72530A60C4E011041C331122911782431162C3209422818992724124541416028A91425084214C11116C4183632242282419818102281241122641840223E18241C8122446246161CA
-:809000007FB208290400222014810180642411108481142882210210280221302410A42100A0213412414C0228002583024004640080688288228F69048002400123420884204132113412280000002200001084A2124200001870240243D2412202420011108402444004A8F0F642304216C11114328711172919C1111381120A44128437
-:80908000481822442A84210400001AC22244247024C224221052842111128C012C83026024E0810244684C2127849128BFCC03481C61111114812B1816981185012548921118A142181004124222000018284C8202644C82021881611443D241022829045021608222414420848448D8594E022200321CC121250112221840148121022202
-:80910000200600000028442116228402400244260218832182210280044901A02443B124012A81F2BBF600001824838208320000848381014A81012220120119068002281844901683A1420044180025BC44412406260526148804002181F0F47490122143820234404149020023A28428210046128421512816021622025841802161A228
-:80918000444522040080012D22860C6022002031844890824412FFDD01005018181813480221A884000000604212480000001241128440041002290284822001128100120024000030486FE60D290128912CF1192240F22812A08200848B812E128085E164E241A2413224241B242C013849011618847126C212411002128812253C521ACE
-:80920000480815868142E82104480085C448FF7B0E8602411A024011410121842420040000005081002002481E242011241184128212440880C124A168001004C0840082008F4D03008432501200181828101241180222102201004002241828435122103214004302800221008002004C0228800100F0D3E2000000001810228101000027
-:809280002100800100200220011230246021244002200100280000163214124044A41210F462F620081111101233112410C221120000100200200181002444802102211841242E148021311418122A1122230400210000005FA545024002800110088421840022290100218021022220022400002841480028444122E141414490341200FE
-:809300004118222100214F7A030084211260232884201208002382810212122001002420032210141204C144801144021088A421404482424484030040717301102852288400D01231181818188C020089211202000081212200126480224148222244840322000048108481A212410000443D1C4008A0128850829100A119421141813164
-:809380002800102201282880028001290244002148100228412121002430122489012582818201707F0921822294232168112111842450811884000000008022020021102402830200269414004A410818C014422200846C220200F02BAF40084800120000402EC22813612128841812002180018800222322424102C4C0421828C0646002
-:809400002185026C41A22124412602402283322214AF664A028318D112A21196D2230214255A2829823118141E12188F2202160200A022812B22282B122F2231222828104E4432246F65024922947464C9012321E545A511232152C23AB112A2221A4251449F2D0C2048528986021E112F11528281128F135193149931221284222931125C
-:809480001880012642021682C2222A41062A82914821182836E442234258824C024C1246C2321AB32401269212C022F0A7C310028F82E22311DA121198199F21A1112F8253A1835381A428AF2282C1128021A1112A028C022260414B11676123F226261E14472165C426226F438171147212B61A012B172AD32201697224546E1AD266C232
-:8095000014442A01F0B3B100140000840000000040080000001008000000001004410000100424480044400244122041B4460A501115FB232B2371197811A222A5E88151289312BA19D1A8F32A282F83A21124291102A02285A83224212123A21345564664AF215262424084A221684AB41AA1112B315E722F23F146166D2443722A38280D
-:809580002F21A1228083018A04214E488D289FB337129F91F13B2BBFB2528B1E1A6F41A2333F53A3119D19AFA2B322A3331AD122711292121AB132F32828AEA22B222CE82262222B235D276426F3262E2536462CF216441AA1314B726B55AF21B112F112345AE7217342F214142E22E57C28E421E323139222F016142F144F024885FA3BEF
-:80960000333571197A1BAA33BF11B118D16AD32BB31AB3198151888781AB112B2218182B11A012228FA27822F222222F22B232A2134F7152662D24AC7212D64254441E1428286CF664642F81E181F112162B754E726F64F516144F22F22A3AAF2261226B324B122B322A91144F260E2189F4282A9F3753139FA1F13B3ABFB3F21B188FA156
-:80968000F11A3CBD31FF91F319111D11AFA3F13A38AF83B332D322B11291121E122AA3228FA2FA22222F2A52226F63F324344F7152627D244D3627616D442E2267653AB134E263F67664EFE151CE2B137AE721D566F414144F62D3CEB128E123F336326B322AE322D144B1E80E0022841C012E13404148628140484348022C22011200005C
-:8097000010821282820121901410022A012E12122412221220011228122C0228800277B8308200502200282C01181100182218221800002260820010042144452201502410044148C11200244110044014040070D4052D421F4152281F4132481F49324A1D24AB141D24AB9419B24A19B54A3924AF1439242F147924D812F924481CF92464
-:809780004A8D814FA264114FA264192E4A96C54A9E24ACF491244D421F49522C1F4932481F49324A1F48B24ED141B24A9921AB9459B44A3924AF4439242B9447822D944F8284F9244AFB8CD022F4116C8D431F4122F4112C23D441B24AD141F26A9415B44A9B25AB9443F2429147822F147924D812F926482D914FA2D518F924C21E814F37
-:80980000A264182E5A96E5B264594FA2F4912C4D4A1B69C7221B4983F49124E3F48124EB1419D26AD941B24A9B65AF2429F2489647822B9426D842F8264829E8A235CF400848000000004480020000001002188008000014000048000000000028000000002541F15E53148A33127400148121903181190881400218220028588160120017
-:80988000C44429116421808222125442004128121A8601198111987421442314428C12A4424F6E4F02430A12C4812100901224121601250810481142180124901225110281280040022011688213110241000011200400485214F0CBF6A0122B341506441184215021C3C1812A8101A121188C022562821412601A24244144163821121037
-:809900002822064301814C21023841B0218141E8622144C2425028581416F2727E10420412818421001A0210528100001001A014845022121181241004212824502410884203184C84010014481004604422442AF41C92000000002800100100000080010000002002240000440000000042000020040000007F14040080020000100200E2
-:80998000981008180000002C0400008001000000288002280000100422800242005F350900000000400214000000001200004221002240820100440080020022480000444228000000EF790E008002002200000092400818000000000000000000000080020000000000288004F02BB6001214002260810000001001588100000000189031
-:809A00001480010000008001000000200400804488048CF2B441000021400344100A004002400180021008000060228043044400410022414142001042028012064100F095F800000000001200810012000000000044000000000044800140010000001004400400F03BE800121121C0226081301A00810021601184000000108401128043
-:809A8000014400000012225141000020141264224014280489F27DCB000000114004000000130148002800840000108412A2210041104484010080044002000044484400F04C9F000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000009
-:809B000000F04FFE004800000000448002000000100218800800001400848004000000400428000000002180F1F3B5000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000F7
-:809B800000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000007
-:809C0000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000086
-:809C80000000000000000000000000000000FFE44F020000000000818011040022218001400444400800400400602200004400008451428004880000CF68024014440881100810011100000000D084068502004800234282431204418112001240081800000000221008EF4B4502414400000010111801440020120212874450484004006B
-:809D00002042C2241004442212001014080084114280042002006FED0E004008844008000012000000002800210083041002181002401802200100120044000082008170DA070000002410125112112410280100220000004C0200C01200124004122200008C0200008002000044222F860244284921121478111869212800254142461840
-:809D800098189012439114002121460218282781208201211A120269218392164922C1225211296549260840986426843228F02D68108412844214C818002D2140115222248341C818902212004002240028213022122410042428222632142624821202B0842102004E2444C028287FCB0F0012005021853112241140018504008011340C
-:809E0000140021E04402183018120012602320614112009018A04111290581224008222241F0C5481001D0240200001841804284010040121402131106124280542630112544C411222C21A22149022711214118183011100224000048282F4C09121048084D2884182321124C8802C02280022140022011414404442012012881480041E6
-:809E80002002004400200100001002485FE9070024301421000014240084210049023241400444242444810042812901218041022092442C14110800281044A4241008F06CCE901140DA8482712214082901948421608100222C02124150414065414144486522E224419816131102234336248022D4244411081212224044A4240042709B
-:809F0000CD070000618420011A02004124222140042D24002444002D425084001084022818A0126022131106181210410200210084A042EF2A0EC0158481181889011885221108B11054684084024902002301410040220221242200808222122426210380216141C0144E28256482288CF24D9F8001000024848502281002100800400268
-:809F80000040122401400200387048440422101494281800400200000044007FF30F002441250A101102848185442212080080021800002400000020010000004418002B1400002C22240420011FA60E0020013430186011604312901812233114290100212418841818182C818111040000181800A01424800118004100181820027FE993
-:80A000000482008C2101412400260240180300290120220200218001504350212226040020412402440018004180B2249126241AC218144C0B90120000100241250825810221C1214180110840024D122485024160112241800243022012828404220018211218818449022126F8ED8F3014455214105C811C4174141269114485121104D8
-:80A0800012C18485446441160441410044C4290174441825224104222218D081121802242420010010584841F027374041D284114111528219518400111212150280112823022614140800C01400224B1200A01200212111271122221129040021491102121840F21C7A5084144844414D184100004C31244C02442181000025024C0188C7
-:80A10000442400412501244D2844290400184C018041448103009048188302E1F0D28BE05131948578157A1452A1878137C1E55E98231279167A117226427818761C246181416FC2C124502E2D121E124CC11A90122480C3222D224818380069A221B71212213827111A91122B11212AB142A41326B828721449F2987F10C41245941A8581
-:80A180004995148D111A51238F81F3221A1D14656111CD161829518C80031A114614584647212371166E2117414352653A5144C445043A22614335B414A23630214A050044D0C851288F61D244D14831283FF10824159513444CB11A516324C014111283528815185286A42D144B2222284302100410844114F61226222524B336322244A5
-:80A20000242A8231244E5C8D463A6121502212414B114F2132346F84961416A8228CF2CBBD00210010040045020000240012288002444004001004006100100400148441400100444004440000BF7E4A7111E441D1CC711555691F31D1ECF11D13CFC151138F81F311318F2171197119F9181C4FE171163212C57C14D48CF2143450C44509
-:80A28000FA12126F61F1181A1AA1113E342A23A2132E224D16283AA7112F2111F2151737352F21B132F32122214E422341B21241F21A1AAF23F33A28CFC3F1381C87221FA943F115141FF5D568F11F57B54C586C9F31F1181EA57A2AFC2113BD37F77137911E18E5DEAEB11651C412EFC27224C414C48E9A27216F61781A7A18AC111F33E4
-:80A30000F326362772AFA2F232366E7A4CA2331AF132226F62F337333F35F63E3A6F42F321222F42A2551E3225B612E163F25A52AF61F5121AEF83F138348F23F3AC361417617F51F51F1FF7F1FD16FF51F11E1ED55119DF51C1249D218FA15333B5F91C1CCFE1F11E162B11C57C14F43E384F428251CCCD8A2B1145F61A1A6145E473D356
-:80A3800046B124F2242E27226F4295244F43A3112F2131221F33F36F3F6F43E763F123223B642CB112D164D166D122F17E3EEFE7F33E1C6FC3F238188FA2F31722145F61F11B57EFE1F15F1FBD12FD15FD1F957B1DFD1D1D9FB1F31B33FFB151FFB1CF41F11C1EED1E4F4171242CF13C3C4B134556ECCFA1F812126F69F11E1EEFC1F1146B
-:80A40000142F33D3467124F4363C2F61D14ED544F22424282F23F226367F33F36A7BEFC3E763F123227F24F712122F23F116162F21F13636EFC7F71C5C1E18EF83F338388FA2F3EBBD100414D02201450100341648024048628100004C02810029418401430223026302210030241222122240A2410020C122482001F0949F20088D13446E
-:80A4800070114842887111382212890174122011188422030021C01281AC012C8102C0120028182818C0121002181022014022912A264864121F75062CF4112485F2112483F41124A3D441F24A121D24AB9419B24A19F54A9243F24A9143F3429147822DB14F82C4B14FA2C4814FA264114FA264192E4A96C54A9E24ACF491242D421F49A0
-:80A5000052281F4932481F49324A1F48B24AD1C1B24A9921AB9451AB9443B24A39242B94478229F92448984FA2F4372EC0491F41D62AE4417248B111324A4CF24A1319F24A9428AF54BB15F24A8243F2489132AF143914ADA16B422DB12E5A1CE9A2EC11F8244A87194F226419BCE448D284F591282D4A1F48D62CB5917248F29124872463
-:80A580008E244D111D68AF64D941B2489B25AF2429F24896224E9426D842F9264829F92458DD8440084800400100400400000000000080080000140084A04111000000400428140000001002FF7607120026419928259211211548D182028001C48425021120C52400854442682200228002212D14182100C041830284000021C452251407
-:80A600000418F0411A00431808121504818311922A14230125741488018B12461228110844872220120418B042211294240041802281A31214232481815C22412229018160C1144CF4E612004614283219AC029118257126382332301218161CC8325021184A2141648A41404C825121584094242784122C01282063151722412003103635
-:80A6800022A584544A244118121F6A0F18001150412412A18414842140548400A148A110382440126822200280228202104604800122844216088A140220810144160849F4C3D22002230226019021001001800125628144128180A2421002C02449010024280000454204206281002100220080544820A4425F390671495121241293F1FC
-:80A7000012282D181F426182222E1250C284166842E08211684260816481902223422222762234286383F1261216321422230338CC0223422842423414A123E184C2221A025048412F720863225132B0238141C828456182A012100C89912289712488C1281008A4C022001E2428004F21C22228162241321444184430220021444C3122E8
-:80A7800018892422420C414AB21C0B11442800B43632111A022234249018502480111804384316022128472260244962A22061412141282C02228982C21884221002A42042A214008944E4CC03008721286022812C0190243018240026180400215021121038368512480410849248262204C02428000049B41892144829023024002880D5
-:80A80000E18F0D2A0144401244942C401AA521702401AC321418C12041021228541604B01484818403188504874523012901004502C1280085021696880084E064F195A80021D0342152181002184011124AD842012412893224100400218D420020C14481241121001A0248006A2101101B04800222211283012FA7081E2250684F118236
-:80A8800072240129021829C222503481A743678264C9912832404402142781AB2525628549A1414B12812A113122162C2193166800629048121D18412518C226478822903816C8429FA5070018502284E1161C424831118D128400181200440011284144418141004241904650220028006041290185122424021228100210F413DF2012FB
-:80A90000D6146122104438222352242604443180121402292222028128222881284138002D24260210281318382825846222403228420084620081284A31482FEE0540081110010021121121244901C0242100206222002C4102842448004002004440742822840144420030442410848404187FA60520121812C92250921190289028101B
-:80A9800028110C4038328400404A024014465822494204446445886183448418410018160880C144490142184608DF8D0545381100000080022840144482011004401604430143022224008421808204408402001844418011042160220040B2D90682141588424802101202281140088C02200200188400C02222818C041034148424C0F1
-:80AA0000241812A04129614121232124028311A8212D120040F15A8220C2222215220226A121223260A1701104001A32281678186281A94298342883C218818C012C91181688C1284AB31224014008260481C4004014241222E242210424CF8F0E114441C450948504440021104251C2508218246042000043810210040010122452248419
-:80AA800000231102201118021248128445080046F8BBA1100126422852829011182418811C011961A138A4832211088941141A584A44A13018102881E2414242944818441843012C42628144831122012781282331241818F03ABF4048820454281C121C1114D84141880229024440041861224C41840816062128260181A4E082C4222874
-:80AB00002200504240C44228120044450820922AB0154F41B484D1A4417C24495C221E34D044312A8F81118A5184278216DAC4B322F128182AD284512487A241450A3E282247818C733A62212E2823C1262721A9F22A4626742CE442311A3E222483612127418D1820F15448521A92148B361AD6189418ABC260126C525893121B7C2871AE
-:80AB800021E3329122182F32D28153549F41B118B22E722A42E821428AC238439122441E2AE12D2A2A7214A444848D146CB21411642243911E844D224FE2E144953218AD184A11A21249C1168F62C7161648044E28483FF60C197223B923D232C2221F32D2C1528A3D2426E2C112415723344D124C018D2245B41A313887424C7228BC386F
-:80AC0000F22E14648741A5562A84A93216C332228F467214CC381E281A7318082147436502CD6A5A3412448165782EF8222669A4161A61A4EF2C0500100440080000400444120000440000000021420022200200220048220000000090281028018F934C011D11DD1B95FB282C155C226F61B113F11434AF81F3193A2B111AF11538A7E34B
-:80AC8000AF81F128284FC2F238182F81F13C181E18C7E1A5DACEF2141C87A26FE1F13E3CCFC7E523F1122AEFC3F114244F23D3A6F23E3CCFE2D388F33C18CFE1D2A8F336144F64971AAF81F15A5EAF8414F214144F44F57E7C4F43F128187AA76787818D487F77437125F66172DD1FBF92F6282C95FD26256F62F3371447424FC3C3383E7C
-:80AD00003215F71C1EAFE2F12A3E87A26FC363832F83F326384F81F1243E6D26EF687A24ECA3FB161C4FE2F27C5C97322FA1F332396FC1F312126F23F73E3CC5FC283CCFC2732CFE3E1A6F43F34474AFC1F11818AFA5F34A4A29F114144FC5F57E7C6F63F1383E5E522B761E18AF84F51D92142CF21373FFB3F32F22AD2AF55C237F73F35C
-:80AD800016144F41F3123C1F21F31A386B11FFA1F13E2E2FA1F12C2EEFE2F23C3EAF81F13E1C8F83F3281C87A2EFC2FA181CC7A2CFE1F3383ACFC3E397F51A2AEFE3F1342E4F63D366F63A3A4F63F338384B33C7E12F61F176544F43D348F118188FA4B74214B214B158F57E4E8F83F12A1A2F87F772588F85D3A8F5666B1457627F73F70C
-:80AE00001F3FFFE4F22B2BF5DC6FD277F337354F43F3123C1D32AFA1F31717FFF1F13E3EEFE1F12C2EEFE3F32C3EAF81F12C3CCFC1F12C2C4D2EAFE2FA3A1EEFAAF21E3C8FE2F2383C8FB7F51A3ABFE3F332362F43F33636AF417328D448F33C14CF63F23E366F47A7338F81F118188F25F55A522B114F41F1185CEFA7B73EF33E3E2F87D5
-:80AE8000F762188FA5F3484AFFA40F1470220165014722844712404248031412244002000028214421004A02003022100218E0222151244824000012244022A12400F09AD7202A0184D08102400222115084A112A143C12212001004611E2424442C8182847222024722C0122880021A228482014A8194121242321084221348F1DC4BC02B
-:80AF0000421F4152281F4132481F41324A1D2CAB141D24AB9419B24A19F54A9443F34A9143F2429147822D914F82C4914FA2C4814FA264114FA264192E4AD6D5A2E449E2A2F491242E421F4952281F49326C1F49324A1F48B26AD141B64A9921AB9451AB9443B24A39242B94478229FB3448984FA2B4C901ACF41164CD421B2187241F41F7
-:80AF800032421FC1B24AF11124AF463911AF44BB15F24A9412AF543A24AF145984ADB52F81D45AFB245A8D914FA2FC18814D4A8F19D284F4D8212D5B8F59F2245A17892E5A1F49D624F4912843F6912C63F4812CAB121F41F64A941D2C2BB45D28AB9443F24A9484AF441B94B26F83B442F9241A7FDA0900480000002100800200000000D2
-:80B000000080080000140084000000000044000000000021F061AD00241211E0821118433811282870429218248116429824001668828435087048C464A31114822241B61482C22884846083268584224491148C411862418141444C85E224B2D50626A2299032265C2143810322B18429A181A024188902001140014284150A250846C857
-:80B080002421484A0230122D1149926844255224898181410210280210089C15F4E88214B052022611A412842D11A0214782282B12C6022829815382412411181A423AC9848445F848247041082883E524B244C122831352482AF428124D214394281A64526C311824842E148140C254181AF2618320022D12128352816981121851128496
-:80B1000024128981144808220081150800152254228351244C12024128008D1128814424901280014008004185048B2449F41E71302219021240182441E38182011412811228269822802282021420352244A0245850244461124048022AC128220000001002292282014A82E4DC0A1116B211523247B32661A3839226C028A7231E88A480
-:80B180004D1184161CE244D122212501542129124464224932122D241AC4181266210225941626524112442924134241292421C1148CC412263C2884B0FE0728122D1121AD1683722498182129C2321AD2129818153C1816443824182B2122284124221A1486829242692561611696212250C2212562412E18444200000029C1142A2412F6
-:80B200004C9828F0A3E510C3212813C1211112299225831148C8182412608223D222054818405112402412142683824408462401C01428130222212A11124189840124811823832224E45B0100102822028911124A941112672200C01710022384611160422522118201482181155C211A3411211215044E2151241331457022012B28482B
-:80B28000421200408471FA022241901650288440684144246082D028110441184012442651828144142821542E14282371280446642246886126184242108403580020622212218412BF234B911210044161005140382800482D218421182225010068144128224484288421100284142822400218222200C012903482423048727031447A
-:80B30000220164C9C1224312582814106892235162C023854226911214421644E324C22CC52231234C13425468844C7121941284212996254AE222C1444A81C221501212B84849A3924A32124668C524F74A20420410441822512C160C124068241648341144222100415021302400812E421A62221121D0149121892141924114D012810A
-:80B38000840146022148000028F0EBC250625542020028D01801100911C11845CA2600124C44020041291254246430222880333A0025222222522428422810044962612850842180D484F2AB1A0000441654C1252403200180217122B21102201102112682021921C41811604124A021840028004C8431184674125148008110080084182D
-:80B400004921F4E2E9002812401862C1412124004C1104414512019100001004514028014502659824814D21411461002561849470140123034145082816D24806F0FDA9C02C18D113011A0212E0C1022312EB2112619122001A02108264122C964424A04211111848118C64442C0400004280420414200410042200F05E7420486222C902
-:80B4800021C1122890140028106441104294283022902442800218104296648014022400418022C316E04124844242220230281844491208EFBA075014804208A48126028154A41C020026684128421C1402244905B014128402004123010022444024420416041AC24447812612240146286144481F934F82010026814281528141230125
-:80B5000040588240010014496111111415A21228C03146212191144011012E111828420040022C41850180430220A412442F930E2C81B228418142C1129480522418450240341818001A9431281410034427222C2422421404413036E0424102248C04704152241245082A61214C62224180021F3C012638181D448414254441D46242088A
-:80B580004439823221260994455918260261268201194A1101406212181CD1B294241D4249144141411111592216148102831102A487412A4458828CF2CE21246467DA95C12C144D3487523D1E97538F629114267935D134511BCD124D21C18CC13A2F21238133413C32651B515A7212735852331C62412746774227443942B41242962169
-:80B600002B426CD2C627C64A13074456A4144D2AD0E2B21CE2477252C848F05E46B03492314F82F21C111B3227811D324B214D3269721A120333E1417211F53B161D292664131C74417521C54123F212254425E742D251A272674147224562A15B112658271D44733124413211CD4A3591425B1165A2122FC1C2148B21C12991448742CF57
-:80B6800042F124643FEC0E2961212F6111731C7A21731638282548081E22A55E484D1A2E28842763C51129B62415F42222112CF4262153921C6B4245E42295321AC5112E63CD562E3143E21253424E2119715853434B358C7122F71111E5382C23F326142A61E2A598745A7248F8BE7B004008602240230140020000100111420021002847
-:80B70000318100210050124001244001148C4401000024800200F0F551242F22F233277FF1F2123AEF41C2248B11EB2357434F41E181B12262527F11F11B38FFD3F33D3D9F12721CFF3B2A37135F527315F5616115F365675F53D345F21D159F56F475751E144F43F174545F53F175655FE6D264D2556311275255F57573AFB7F7616C1F62
-:80B78000B3F3333B2F53F115176FC565814B116B2285F81C1C4F41F57C548F81D1CCF45D9E246D127FF5742FDF2FF63E261F62721EF42E343F13B11651C22B22AD285D159D1DFFD2F32D34A5F436272FA2F332317F52D155F361731F22F2E5F74F56F654F6CD25DF77F727345F74F734366F67F52D1F1F34D62546B215F214262F52525562
-:80B800005F26F73E7E1FE6E6E3F3232A385D176FE4F4766C4F23B226F31414CB11EFA5F56E4C4AF3447C7F65052F21F23377ED3D9FF1731FF71D17FFF3F11F1C5FE3F33E3E2FE3B332B2115235BF11D173F23B3ADFB2721CFF3B381F13F323355E411F14F741427F36FE63613F46F67959DFF4F4554447714F65F772723FF6F747455F6217
-:80B88000F726167F527312D152F267677F33F31A1B9FC1F11B1FBFB1F112315F71F15B5D8782CF83F32E28AFA2F21E1EEFC5F57E788F81F52C7C97812463F11F57FFD2F15D37FF73F23D17FFF3F22737BFD1F13C3E2FA3F33222A7A1FFF1F1131D7F63F33E3BFFF2721EF72B381F13F325555F14F761622F36F657E73F57F7F776DFB7F713
-:80B900004D4E65F564474F66F776726F56F741477F72F322177F537236F722277F74F61733EFF3F3313EBFB7F33B3B1CD173F15B5F6FC6F424226F22F1361EEFA2F14A58AF879778CFC2F61DB2003022B02241C812162822210214164831110028122812288002281890138001230225012180014302224822122001126081282024E144A6
-:80B9800002AFC30D2B1828A591212692212011285122009012360822002B14121C42C2212216218292144A9246803111220012106124008C1482141251422618420832258404F0D766D024F4112485F2112C87261F41724AF21124AB141D24AF249921AB9451AF443924AF1439242F147924F842914F82C4914FA2C4816FA264114FA2F46E
-:80BA000098212FA26459ACE449D2A2F491242CF49124A5F29124C3F49124A3F48124EB141D24AB941D68AB9451AB9443F24A9443F24294478229FB2448984FA2F48652D0A4F41164CD521F81726CF21124C72616F44C1119F242961FC1B2489A25AF6439242F747931F84A8453B2427922F842954F82E514F926CA5E857F82F4D8242FA224
-:80BA800064592E49DE256D4A1F8DD284A468EF32A529E7361F4932489E24E7141E24AD85CCF64AB159B24AB924F44A9643F2489441A9FB2648A9F924527F9B0D00480000000044000000000000008800004001400800000000400400000000812541F1186C80D12472247224116872C01400218C031429C114214522112494448044582491
-:80BB0000004C628444422F4211E4125124208141485482801104144A118404812044024F84924826F4561B502482811212840029810290184C11084400122D14128482442241442012E2820121A084D02818A41238409424281228005048444312DC84C24840053FB2071247268506895158214C911222213668435721124161458281C152
-:80BB8000424E14A041844318143424A4B051D22443C4114662848341E4816243814438432241E14241040043C2448D22ACF444284529F1C1A2502420F2112480020000100881120010D442018182442602002A44440A809284C0821200211004802204424558481018042034243F780D22100283421868C1000000002C012D24002004107D
-:80BC0000D448020000009014100221302628A02142848180014048041822002F284F02008B21412C11041F41C21A122A8145381424102811842204D084021082812622262302283018283018506812812228004CF81822460489447A2428E1849124BFF50728240045484214C4318502180018245028184422800481302820A124222A2443
-:80BC8000810226042301901823C2242981A12410084B81A4448148844781188904DF7944020036889218818311848181A2418444201132240042004C42141402002002200181222140140826088C02003842404C22228231245E42241C210428001200412E14282781374244201152260021204138882062434820151E8284010000898214
-:80BD0000021221288422008100228C4144A41C8F270520554821400241212455381820829118404148229122811A72246248244588042180014190245A8262628C21048481444230240090188418808482F186730000C0180029634100008140018B14C024400800800414442244888012011002411048441401400189014CA212008982A9
-:80BD800011F84F94301112850489410263321410781862A1901484182D1145D8622291288428A4C442269C1548602549012A6411443821264494488C128C41018445018941D848C2182A014E284393483FFF082140820280211142F422112850853011C048210000C02400214A522428418318420428804262812200C42168000020810271
-:80BE0000891104829FD709508220022A112831183052212604004044484814484448084518020000440022008504810010081004418002004D6820F2B2212081A2212991148082029A820218308481482A142402200886322821A4D048022412182848448008440022824144A01841224482160420984444AEE40018008911842241028047
-:80BE800022443446C400846082004B211004004100000000000000200141200143025084001248EF830A2D280044C04200800186262838280086220A00002440480450428449026149084004A23024184302002002101408008A023FCD0A82440041160625B4121284F5124248488C844402002400009227424428400620C124102242425A
-:80BF00000420C214120020810180921482A21A02F0F117C018324C032181101818088001001004850481A110428848588430280021800448418881100800848100104804800430282F5E01482480C528228400002883582286429446622F48344280088884404202860250424542024125224828DA84A818284C828208849084608110480B
-:80BF80008408F0232F20022122234208222012A21460C420048062228C0200002210048912E821021024040044820020410841000081A8424116E111E4810D84214C140600482692486048B08202308482244882862428AA18802812C828A082142A486282222A2C322260424C11042226048C02808281421424B48222F87C65C072BE34FB
-:80C000002E3643524A282183B12A72128CB1C2F41216CE42A3A844882B8A43B44A5222002E16502A2283322A455842244D1444242D4244888A524E4B22C7482AA1224B18C028C01C444444418F81F18484F0883454846D58244018D22221711C285242188F28A5441AAA442D844786214E44448E828C7428F8848886A888866A892D2645B5
-:80C0800048F8882247A226A8224B9225246E2226C2822658482E88874843E14262428918389C1849922C8B212885B824BC64CC219AB6D302322532145E244F82E366D188A27216AA2227232E128BA845C8C4C51CF64462AFC232244C1AC8848992884C528C2556442694288978127212B22452444B24284524A888B014C214E08103412001
-:80C100008328E24A5144224604FA694635010000824220248128011240480480440644002100008220882108C200888008208108888008888008810000FFAA016AF524362E144F61A15526D2AAF63E6C5AF2A4648E222F2B752AF28642ED22ED4E6BCC4B2626C8642BA8850C8AF8A2A88F82B2285244AEA22D288D8C89FAA4844F48F2E40B
-:80C18000C44F687AA2F222824F6AAAA88FCAA88AAAAA224B1B8F895388AAF894184B1947428F8AF8AC2C8E288F82AA884F43FFF4B48F84FE5937242F27F4367447434F63F75CFC4F66D6AAF62E7EAF85F3AC6C8E262F22F11A344556EE65F4C4C44F66762AE842E2AA5AC885DA8AB9A2FAACAE4F42A2228FAAFAAA8E2D841DA14F4AE818C2
-:80C20000F268484CE2AEF422A26F6AAAA88FCAF8A4844F4AEA42E24B73ACB4A8AAA8C7884B394F48FA8CACAAF29C38CFC8F884826F4FF9D4B4EFC6BFDB075AF514764F63F316148F21F14266AFA1F35E1C8F85D34CEC64FCF2F2AF2DFFC6C6EF2CFC4E4E6F4CFC44626FC4F44C2E6B88E55C8C8F8AFBAAA8EFA2382645F6222A6FAA7A2671
-:80C28000768AF1A4242CF8242C4F64F4A2622F22F8A4A68AA8AA8FCAEA4AEA42F234B48D2C8F8888E2C17814F4848485F82CAC8F82FB28A84F4CF8F2F44F4EFE68F8FF6E45F272426F63F336266F66F37A5A2F62F21A3A6F66F35A38CF42FE42D2EEF2EF2DFDC4C6EFACFC4E4C4F4CFC6466EFC6FC6C6E6B8AE5DC8CF8A8AAAF2AFA2EAEF8
-:80C300006F42F22422EFAAFA2E2E6D2627184F6BD241E8C2E24CFCAC662F22FAA6A6F028ACAAFAA4A42E343EB48FC3F128288AD8C87824B424F2ACA84F42FA3CB8CFC8B884FCD2D44F6FFF6CEC9FFD0D2A016B1290162002200800400644488D2490288281822800218D24691838223024302410026B829084120022842041042812448297
-:80C3800044924C22F81F4C00800181001628628180D2280181844282000000888485048110081A2222240200228440081E242A01810041288440084301A22FB1092D421F4152281F4132481F41324A1F41B24AF11124AB941B21AB9451AB944782AF7439242F147924D812F924481CF9244A5CF8264A16F1244A96E1A264594D4A9E24ACC3
-:80C40000F5D1242CF49124C5F291248B841F49B24AF89124AB141D24AB9419B24A19B54A3924AB9443B24A7924989A4F8284F9244A7F27026D4A1F41D628F4112487221D64CD121F41D62EF111648F64F89164AB345B68AB144F8AF44A9743D232E98AC4952F82D452F9245A5CD9A6EC11FA244A96E1A2E451D294CC212DD81FC5D2A2F860
-:80C480001164CF22BC91B248F89124AB861F49B24AF88124AF44F18124AB345B28AB1443BA4A31A4AB3445B84AFB2648AB942E1A2FFA0C20880400000000800200000010020000000014008400000000004480020000005012142FEB0F00504841418122C02480014964212CC4D4C12002384400248514068100201114448231880085249E
-:80C50000022001890100122002C1008CB4C70E428A0121242038142944C25290188182120061450841122220020040CC22442021A1122441E042810184002248208102CC12D884A318818641F45FEC20A41C404812246821484D224925216244A014430C41C3422231141A028612140440181104C981E12582318C60431828818021E2C253
-:80C580000118281885C428CCE2A8416818CB41EFFE0C0024444110C82400249018842C09295184210043020022812140486422800141400200C100002004002002124400F0A55A4002180000901210082100400681008400440024008024818422022001802101280000004400414A13048CB4FE0C43028120F122121240C42220851122BA
-:80C6000021648147221A3444278400502826180ACC61426D12282524B2162421121838243828002031210044436182002844404CF429D23024218C018023018012AA14100242E443D28284D48204004423120A4528022724442C848482028441222218808201004116C42C002634744008ED4A0000201112026901002301188001184410CD
-:80C680000840180824126449818281E241820181122218120000130200000000444447842F39086542D4410260820084248400418C9418304140080000D02401940000122E1485144202008444444722448118360460824C91140048188CF13B3580240400181218218514042162122121002122211256466A18008024018C1502810028A6
-:80C70000281190184840840122840060824B12212180F1E272C011000000A112420000004508200460440045088121008902002210880184003018220000180000C08840F43D2A90544459022022911A1668448124402461A1841490422260412424D4128125880481182149C22421B012029184184684813218121614886182184528025E
-:80C78000838C41F41DC1503200001608104218028074480244484008209444814014420112228384210110082200C4C02C2100000041384311024078470BC01400800118002081120220443442214242004100100480922212200220022220022220820200002828108812F8A9C6202404200200A183082504820082004B48823082418171
-:80C80000A4811008000022128002402841287284081062884438188441008200AFE8070000000080140200000000210000004400120022100420010000800200000081002884F0BED400004082040081200421B014142221288805008608128425C89824124164C0884118B01808890281001008221881814018442408CF53078284000046
-:80C880000040020080428401100442100282250A0012222812000012608200100800004400004008B03405452801002001004044040010424A0800000040024440062828004C02449028004100450800822222302420F91681904290220040E224612118122929816321828AA448484888189280080000218001493112100480614910049F
-:80C9000080180444A844444004884C08EFF90A0018402201218129010018100249010018000000200100002128122002440022220000808302B0840260486FEF474258624800100200414421682196022F2824092921180218842416D8225184244B8125C3A421C48D14C830181018144804108802100C000021F0EC63008E140090122452
-:80C980005E12B09841A2112858244F440896465826921888448FC83888851818582812002C3222324CE24228638926E8C96182266C8A2042481884C3182688A22245A4888C026FFB4772422611022412002D1880B142D82431922921D12238428E92C6A88480014018427812DE860143F214226B82167482341400811A922844818128886B
-:80CA0000C1830822C74140188858C88843F988F980D42C840322422311522827A4611002222F28A15C49BD42C4C429A54D860240C2122D1620C9162F217B22E441C1224943A8114CA31285149428D044322424284126B41488928C261484B224328489F85F5800008062242064814A28E12428E12428011220010012000080211822882127
-:80CA8000981482188241824901008880084C084C28C184C0840040F4E9EBE024A4112A036AA4575A45F25A4A2FACB4D2049AAC489AF2C4462F2CF8C6C68FACF8CECE2BCC8A2CB184B8840824616F2858462F41A9822F2A7982F28E96AAEA4AAA2A9AAB8A4F42A3AAF024244DA4AAA88AAA88A8A89AAA9B2AB2A4AAAA288F8AF8A4A42B888F
-:80CB00004FF34BF242424F6585A12226B232B142E424542AA7286F6CB4C2FCA2E22F28B4C2F494862F2CF8D686CE82EFECF8C2C22BCCB096B984E8A851AAEF88F88E8AEFE8F912941F13FAA2A22F3AD2C292244FCEAE3A4F417738F8ACACCFC2F2282CCFC2D2CCAAAA2AD2CCD28CA88849F32C1C8F8AFAAC888F8ADA24F2AE8CCFCAFA8ECA
-:80CB8000989B65246D464F41A53380A2311E124E52AFA1D1A2E941A1DC1AE324E921F9C4D62F2DF9C6968FADF1DE9E2BCC2BD41AB184598C8D8A2CD186F116126FE9F812149E212F6BF336A66FC3A323BAA7A34F43B338A2338BAB2AF22C244F4AE242AA2289728484B834F21C144BAA4B222AA2AAEFCAFAA4244B982FAC46F242424F6137
-:80CC0000A5112AC2222F25B752E521F11A1AAFA5FD52562F21F192B22F25B952FD94962F2DF9D6962F2DF9DE9ECAB452ED21B184598C8FA1D8AAF18E1AEFA9F91E1E2F41E139F2B2363F63FB12349ABBB8A7B37AF3B8A88F8BFB3C3C8FC2F22C2C8F8AA2A2AA5A8C87C8884BBBCFC1F12C28CF8AF82C284BAAEFCAFAACAECF88F823B700B0
-:80CC800000004082040000400224822492002008001810024B121002210080014110040000002008008220F8DE63A0480000002044280400208808248280040000181004182002400412000040040000320000888048F1C88FD022F41124A5F2112487241F41324A1D24AB141FC8F24A921B28AF243985AB9443F24A9543F2429547822DAD
-:80CD0000954F82C4914FA2C4854FA264114FA264592ECA96D5A2EC49D2A4FC91242CFC91248D821F49B248F89124AB841F48B24AD141F24A9219B24A19B54A3934AF443924AF447924D84AF9244889F9244AFF3F026D481B61AD52174185D241B448F1112427241FC97248F691248D225B4989A243AD853AD45AA8422D956F8B54122E5AE2
-:80CD80008D954F82FC18812FA254582ED816D5B2CC254DDA1D282EDA1D44CF227D11B46CD8C1B26A7981BC6AF1812CAF66F181248B345F88F24A14B2AF4441F84AB422ADB429D44AEB22F5896F0080040000004004280000000021800188000040014008480000000044800200000000E03E0324121212211002121800008189012100506D
-:80CE000084488410084024010000806321161804004008844008002200C028009F240620080041100CB0280182850624181841520000001014021210021210020020811204A021C014241282008C014114819D7200420010044118F01428604A64842418184118102C341A60884014262111110289012344424804120081418C22721804B8
-:80CE800021880040420483F1D7E8402281211102218420010084608124004800000000000000001A82210100284100120020012260816082004FC60B2110020080028001002100102A08400428000084C092908428452251221221128988022800A04100448002004CA242ABAB003D144022E8218221D18401202301D0C228011E4461436B
-:80CF0000210140441244084C1318C21826C284A24064428A2182014942242102002812001241890281CF5107505200213229A1218100181800C908A04188800110046181F01824200943088E2421251424282129424404220000188002608240F8C82A106221008800301480210250228041125C4249014120020000A4701288B286021246
-:80CF8000241E2212288180222201800522440012413024624FCE4D0241003028105282C98101800183111428281284840141008141B0220100841800121220180438852402109818808121C228892881F1E386000000290100508400430290822C01442A18423418428212008400002E1800DE2422504800004400002841000028414CF13F
-:80D0000059BA00212869010000000084122180023012000044002C03801AD282420200C0242302128400200100004508430100AE544012249212903A0084C98101D04881218168238226343440040012813881294302A13212C0343812E190148422842001812841184508369888160487EF10024004400221100800248425440890824884
-:80D0800018844614044014022A082210028830242888001280020016088021422402413F290216028001186021901600602122004042042100000000213220129224223800002222222042084428801204220026F4C3150045025082444140082D8800401C968884290821444006602140220140823828002012341C49020012204124010B
-:80D1000083412403121820F162DC00835122812901218100008800001024480412004100000028004044248181120441000000100400209214F09C940000008416120484403822414018C41C80810800242430120090224410044002001A62413014200183011220113C38222042F8475A2464401A04400844608800848081180661304418
-:80D180004100414184240040820100281850480092448C12484C0420528428002081F1423700808111542200602850428800240000000000000010842802264408228400222822200220810228800212C0246F83048001800826C41216A212128A218161610024002188604800214118126B1812208821812161482E84282008000010047A
-:80D200000000902884841FD50B6182001240024488444018082021412409182028182281010021802128210230121218008002001024024004404971340340A4418445C21C1844404CE2E841D224028C410A18909430869012908C1002006711902225189642808A08169484126041E0810212608120014429025F5F4F42B29CD128311890
-:80D28000478845D24C931C259812C5AA118592188C024B88CC318282881A088810D22CC112E0210112222A3A242B21442F41A32AEF42E142A2324D244B224C22932812C528213234262831243238CF11F13824EF3F092D14231852C21E1216480245E4A9AA88A421165E2284851844D44421D844A4814728255224235184005062411672CE
-:80D3000082586428D042A1A9431824893114204128C114434138144782838172144841F84383104426C11225D44A311227612C514C29B18AA8B8414D14AF41D122711AD224F112826D14214544844844341216127292A63296B682A1212A313C2212F0181816A4128E842A91282A11CC144138288D344C8203222E2849F1A44C00618421AC
-:80D38000104418A42141126089441264122041244124480444002901189092800118908484419084124184400840040081400485741C0FF014148D18C57C98F8181C8FA353AAAFA3D2AAF8928225F89A8AA1EFA1F28E9EEFC8183E12884B89CED48AD964F8868464AB11CFE1D12251226F68F922226F629382AEB2F02236214F49EF8AA851
-:80D400009B1E343AA2114F41A1318D188D188FC1A1114F41F138188F837218F81C1C3AF12C2C2A322C5FE507245E56AD1A4FE1759E78187C1AFE2E2EEFC2F2888E6F68B882F8A2A2E5548ACFC8F88C8CE518B684F884824F4CED28F996946F48F88696AB11CFC11852226F68F823216F42DA12E2A8BA24F2666A2B221AE7C3F2BCBC1AF253
-:80D48000A424BA6B411E248F83F3383CCF81B114A3328F82F13C384F43F334343E12A782267836FCA26D242F21D14654A8EFC161C11E1ECFC2D2AAF11A12EF6AFB929629F11ABAAD12EFA1D1AAF19A98ED182F41F182944B992F44B484D864B982C886EB11EFE1B11261216F696913BE122BABBEB81AF212762F23F23436C7C2BAEB41F195
-:80D5000084349AFB14141E343AB318D3C8A1114F43A3134F41F13C1CCFC1A133EFC2A222CB129D6BF014161E56AFA1F15C16E7C187E1A5FC3634CFC1F1B8BE9E962F21F91ABAEF61F1161C4FE1F19C9CEF81F114146F49B996F9C6C445F284962F28F81686EF21F19E1E2F21B112F194964F73F3B6B63B3BBAFB14146F63F736364F6FF3AF
-:80D58000389CCFCBAB334F49F394B43E348F81F33838CF81F31C1C4F43F134344FC3F13438CFC3D1CCA132EFC2F31C1EC7C2EF8C0B490121901280014182240000004022081244821042140200430200610090122002222002000040C8248002002F3902200100C425421408A1801814528400444100100400184002800228242880021E6A
-:80D60000244004441890184301221884181608221845F868A8D026F41124A5F21124E3F41124E3D441B24ED141B24AB981B24A19F54A9443F24A97478A2F147924D852F924485CF9244A5CF8244A16F5244A96F1224A96C54A9E246D4A1F49C2421F4952281F49324C1F49324E1F48B24ED141B24A9921AB9455B84A3924AB9443B24A79C6
-:80D680002498924F8294984FA2F48A57D0A6B411D626F41128E3B41132461781E33411AF44F89124AB241781AF642A7B4877B4681436F84285278A2D152E5A5CE9A2FC18852E4886F5265A549CCD256DDA1D2CACFD8164CD521B214B841FC1B24EF81124EB841D242F44D9C1B242DB85B24A29F24A9443B24A3924AD942B42AD944F22F598
-:80D700006775508282480000000000280000000021800100000014000058000000000028000000002541F1F97800004440088C2112042088018381418C010040388400001820C194124400003024200118000000400420411814FCB69140A418862201120000008110028420280484184440841108008002384218249800122604002800B6
-:80D780002002101804481681B2490344C2881880018981421404838A11628181800824813014824308840030114B2110084230822022C1348011842202000084406284453118FFA305204142048400000000001845888104804148041200180082181E244812200144000000002002411084011843F2118800000000280000001800802101
-:80D8000001000000002001001218001200000021000000000000F0F72400121012280120614112001604121816068001120080810100840000002081220112000000414004811248009E1C00122410280122121604004301201114228101000000000000800100200280410200000044001800F08374000000000080010018128081010044
-:80D88000182001121200128100120020210112000000004400400848004FD40B004100000000200180019012000041000000124400180041001800000000400800800181849FAC0400008400400812000000200480014004001800842901210020010040080016080081184004440077BE000041302210280100001240880130182001008B
-:80D90000200112004220042001002418000010080040080042F0533D00004184221028010012001884A0410020414404001880111C0200408401183012810000841018088420410481C72600100424001008180080012011028921010000188001204522058001000000008901002001410083048EF20000000012180000800100000000BA
-:80D9800000008001001800000080010000000000000000DFD20B00000000202101180018802181010000000000002001002021010000000000000000D0CC0A0000000018180000002001000020010000000012000018120000000000000000007FC30620040000120043012A01121200181824001AA11192008001118011084200001800BD
-:80DA0000100422000000400220D1F80C00000000008001120000000000000000000018002001000000000000000000D0DA01818C24840400004014C42422281200005022102281298808804111414118C84842482001004014C4242228000000250229F139C2400848000018004084810220010000218001880000402101841848800100A9
-:80DA8000004004280000000021F0D426000000008001180000000000001A010000000000001800000000000000000000F02995000000000000000000000000000000000000008001200100000000000000006F220381814242000018801194142A210212000024241A0112828200001113018181524200180000414122220000002424F07F
-:80DB0000CD3C404888840400000044442828000000109212181A81880800C01114404888842401000040448482020000002121EFC90B000000000000001800800100000000000000000000180000000000000000005F110E000000800100180000000000000000000000180000000000000000000000006F430F000000800180011A8101C7
-:80DB8000120000000000000000000018122021210100000000000000001FA30C0000000012001A0180010000000000000000121A8101001A818181010000000000000000FF7707000000208101120012001A0118000000000080010012001800000000000000000000F0A1C4702612A2122B119012C0122582E8317111A1988659888E418B
-:80DC00004E48D09114815489814A744854444AE242024C02284514A4326722212AB112A1812B99C0922582E8317111A1889659888AE484048C04488518A8445BD4F02222241812122180512229C8111B1119E88919D818242444591148848588E44414942422224480425444282F22428221A181232888512229C8111B1119E8881898484D
-:80DC800042428480445888487BFA000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000009A
-:80DD0000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000045
-:80DD80000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000C5
-:80DE000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000044
-:80DE8000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000C4
-:80DF00000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000043
-:80DF800000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000C3
-:80E00000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000042
-:80E080000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000C2
-:80E1000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000041
-:80E18000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40FC1
-:80E200000000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FF33
-:80E28000E40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000000000000000000BF
-:80E3000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000000000000003F
-:80E38000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000000000000000000BF
-:80E400000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000000000000003E
-:80E4800000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000BE
-:80E50000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000003D
-:80E580000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000BD
-:80E6000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000003C
-:80E68000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000BC
-:80E700000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000003B
-:80E7800000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000BB
-:80E80000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000003A
-:80E880000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000BA
-:80E9000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000039
-:80E98000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00B9
-:80EA00000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04F36
-:80EA8000FE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F7
-:80EB0000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000000000000037
-:80EB80000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000000000B7
-:80EC000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000036
-:80EC8000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000200100000000200180010012800100002040
-:80ED0000810100000000000000000000EA0C000000002001000000008001000000000000001800000000000000000000009ED5000000000000000000000000000000000000001800000000000000000000E0260A000000000000000000000080010000000000000000000000000000000000ADF2000000000000000000000000000018800E
-:80ED8000010000000000000000000000000000EFF5020000000000000000000000000000000000000000000000000000000000F04FFE00000000000000008400000000000044002001000000000000000000000000F099C42400000000000000002001000000000000000000000000200100000000188001F09F2A0000000000000000847D
-:80EE000000000000000044000000000000000000000000200118001D381002000000000000002001000000000000200100000000001200000000000000FF3E02240000000000000000840000000000000080051880010000000000200100121810084D490012000020011212200140480212121624010041008081810180011890181838A6
-:80EE8000181604002200802201008400F0F29200120000008081011800002588014C810100410080212101521212121883013212000000000000128440083F280A10020000120000001008001200000000000000000020013014002002001A8201001200F09C2B004002008C110800008001000000121210080000000080010000188800C0
-:80EF000000000000200180F16422000000288001301400001800001002120010040080018C0100121800008001120000000000186F77060010088100008400100800180000000040051800000000000000000000000000002FE9090050820018180081006081002001000040084151200100001880010080081820010000001200F074B59D
-:80EF80000000008C12480880010020010000800100000000122001008001200100000000000000F0C343000040180810084410480800008001000000848081210100000012000000000018180000002FF5080000100400001280410480911818008504008911881148088112000012000000000000000000008DBB000000000000188001C5
-:80F00000808101002001000000200112000000000000000000000000F0C3EF00004100810041001880010020010018181048040081000000840000400800840000180000188F810800008400800100000000000000000000000000000018008001000000000000142FF80B440044404C0481C4000000000044000020110410120880410889
-:80F080000000120000000012608100404808EB530084000000000018004004490184004014088C411868819018000000400800000000810081008001EE7F000000100840280184000000000000402401000000808101000018800100001220011800F071E34018C4480000410040042812000020012180218108000014818184800400182C
-:80F100008400400C280000000021815FE40144814004C5440450CC4418811A2101A0118112180018C01812C11824878183011A2101800180210100400881901818181E180084948417AE0044810010088901180000301480816181504800D048E1C111088041088100800180410889810100000000001818CF650E0010548884844484000A
-:80F18000121E18844C0100430141200141400884858841B818410820018130180018000000203118001800F08765000000000000200143014170140847815084508400008001188100008110088110088110088100844008001F840B455444C50CC54C5844C5FC1C1C85A8111885D8CC91144554444D148C51CCC7C1C55C84E55CCC41859C
-:80F200005C884554282781852851881A01128F815188850884848F81A1118484850885F818181A7118F8181885A81185F8181885F8C776004F4454CC48C55C8850CCCFC151884F41018F8353CC4B2100457414DC88C112655484AD1885B88458C88F8158CC857A1A781989D198F11818A0451A815488878184848F81F118184FC141F8285F
-:80F280002C8588A2118F81A1111A011E12A5A811AD18BDB950444D44C55C44C55CCCC55CCCCFC1514C1E14188B3149C1140018CD1484126185C418D08C78185CCC4544F21A188D198351881E18A0411A01F0181810A8118F814114885288001AF118181A018F8111F218188D18FF6605D04454CC4744C55CCC8558CCCFC151CC1E14B0182D
-:80F3000093143E1450444D148B111E18CFC11156688445D48C78187C9C54CC857A1A7818A9119F81E181011AA4118784852801818F81A1111E1481CD2820F218188F81A1118F81018F8111E2215188DFE30300000040088420011244400444124440048504810010880118008001400800120000002011080000AF4606820010084008003C
-:80F38000008400001800000050481800810000200100800100180000121800100840718F042CF4112485F2112483F41124A3D441B24AD141B24AB911B24A3915AB9443F34A9143F3429147832D914F83C4914FA2C4814FA264114FA264192E5A96C55A9E24ACF591242CF4912485F291248B141F49324A1F48B24AD141B24A9921AB9451D7
-:80F40000AB9443B24A39242B94478229F92448984FA2D413024D4A1B614D421F81324C1B21E3F41128EB141B21AF44F81124ABA45B21AB8443F34A8143F34A8143D31AB836D41AF824521CF924CA1E812E4A87582A65582D5B8F58C2521FC8C25A1F49C6421FC8B248F1912423F4912C2B141FC1F242841D2C2BB45D282B9447822B944709
-:80F48000822B94478329F83648A9F924525F1F0E8480040000004004280000000021008008000014008480040000004004280000000021D05D08000000402801100800000000000000401208121200000000000000800100000000F086CB008240020000400816080010880100000000000000001200800100002001800100004001DFB733
-:80F5000007200410021008100C22000000400220018200240013210181200400120000412083010000400220F1559600000000800140981800008418000000000084000000120000000000002001000000E06D051800000084400800000000008400000083010000400218000084200112006081000000006F120800400880011200800107
-:80F5800000800141001200448C0100610018000080810100810010080081000000ABF900008100100800800100200100200110C4186081240000000020210181901800100883018100000047A88001000018204108000000004410080000001004800110820100000080010000000000B094090010080082004008188001000000830140D6
-:80F60000080000008001A0121200002001180000828022028071B7060085220140080041000081000000200120010000400800000044004018880290112005008081F125280000000082840000001008000000000000000000000018000000001001400800004E2600103818008140084008188011080000000016080000400818001A020A
-:80F68000100400001200005800228001FF790A0024000000000000840000004008000000000000001812000089410800122018280200E0AE04120000160884000084008400000000001004000000000000000000000081120000006F570C000000810000000000000000008C0100000000000000000000120000000000221F1908000000BE
-:80F70000000000008381110800000000000000000000000000000000804108221200F06CBD608110088400000000008001000020810100000040080000000018100800000012002200AF2A07820000008001840000000000000000000020010000000000000000000000002E112F880A8400000000008001000000000081840000008400F4
-:80F780002001000000801188810212000000009FB70B004008814008000000810018000000000000000000000000008001000012000000AF690240180881100884000000121200000000000000101808000000000084840018C01880010000CF3809848044080000004480C218000000100289018800004001400848000000004C818202F4
-:80F800001200000029017FFA0520088548480884000000E081410800008011084004000000000000000018182200102801281228141AF2C1AD00848110981881811810080085081A0100000040080000205188000000002001852881010018A0110000F0983AA011400800841008008C011A1108800100008489010000508800200100006B
-:80F880000000852801181A61818901008021F295A7004008844008000000840000000000000000000000000000000000001220410100709F0D1A0110281848088F810185081E141AB118A11118A0110000508885080000E0815188001A01000000F018188508A011D088D1880100A011226F54031AA144858844184818F8181850CCE0434A
-:80F90000A3118F81A3111A011A012421901285F8888880080015F11818855988E0850548000000CFC151882E34A011128D188D18124012A2112B328F7F011A810481818185088F8101850C1A038B111E181A011A01100218848D88000040F118188548081A05000000F0181C85A821A011188D188D181800211AA1323FED061A81548887CB
-:80F98000848788818518F8181850C8B014038F83E181A111A01100212450888D88200800148F81518984B01805420000001E1C85B814031AA111188D181A4101211E122AF2BB4A8001004008840000200116080000000000000000000000000000400800126081000000AFA70B00810000000000800100000000400800001008000000001E
-:80FA0000000012180000000000F06D37C0421F4152281FC132481FC1B24AD1C1B24AD141B24A9921AB9455B84A7924F84A9147822F147924D812F924481CF9244A1CF8244A16F1244A96E5A26459ACE449C24A1F49C2421F4952281F4932481F49324A1F49B24AD141B24A9921AB9451AB9443B34A39342B94478329FB2448B84FA2F46651
-:80FA800081C04A1F41C6421FC122D4C1B242F1112CA3D4C1F242941FC1B24AFB15282B8447822F147934F8429147822D916F82D412F9245A1CF924CA1E812E4A96E5A26459BCE459C25A1FC9C24A1F48D628F5912483F49124A3F49124AB141F41F24A841D24ABB45B21AB8443B34A38342B84478129FA164829FA245ABF6E0C2088040066
-:80FB000000000080020000001002188008000014008480040000004004000000005012F0782400000012811008818181000000000000000000000000000000000000008001250800F0A6B60082008400000080010084810000000084000000000000800338000000000000186011F035E600C20084180081101CA812004008002400122019
-:80FB800008000011008120040028800210042200001850822C011621F19EC9000000100800008100008400000000810000000000002001120000000000000000FFB304000000000000000000000000000000400800180000000000000000000000F0D3E50000000020080083014008200100120000000000002001000020010000002001A8
-:80FC0000008100FBCF000000000000901800810018000000000000840000120000001800000000000000F0D8640000000080080000000000001200000000000012000000000000000018001008F0152E000000C01800000000000000000000000000000000004400200118001001000080F1F6980050280000200180010000000000000090
-:80FC80000000A0121200000000001800000000000080F15147000081100800280000000000000000000000000000000000000000408101002002973600404A08608120210200000000000000000000A0210000000044000020010000000000578C000000840000200100000000000000000000180000000000121800000012000028F02BB2
-:80FD0000AD000040080000000000840000000000000000000000000000000000000000003FF4070000000000000000000000000000000000000000000000000000000000F04FFE000000000000100800000000000000000000000000000000000000000000F0CD5A00810000000000000000000000000000000000000000000000000000E3
-:80FD80000000188FD90A000000000000810000000000000000000000000000000000000000000000DFAC05000000000000100800000000000000000000000000000000000000000000BB74000000000000000000000000000000000000000000000000000000000000FFE40F82820000810000008400000000000000000000000000000026
-:80FE00000000000000000070D70C84800400000040042800000000218001880000400140084800000000448002008001002901AB1A008200008100005088840000000000000000000000000000000000000000000018BF63022008000000000000000000000000000000000000000000000000000000002F330C10084008000000100840A1
-:80FE800008000000000000000000000000000000000080010018F0C46B000000000000000000000000000000000000000000000000000000000000FFE40F0000885088000050888508000000000000000000000000000000000000001A4101A011F04B84004A04480085080045048FC252882800004012022B11A0988008001501148508F9
-:80FF00004E48800400005044E042022800A0114012A2112971A40680040050880040048D28810000001002188008000014008480040000004004280000A01100211A81B1630C800442885088004004CD288528020000104282011A08820040011184904820040000400449022200A0111410E221014FD402000000000000400800000000A0
-:80FF80000000000000000000000000000000000000006FBA030000000000000000000000000000000000000000000000000000000000F04FFEC0421F4152281F4132481FC1324A1D24AB141D24AB9419B24A19B54A3924AF147924F8429147822D914F82C4914FA2C4814FA264114FA264192E4A96C54A9E24ACF491242CF4912485F29189
+:800880009F9CFCC9C9CFC1F11C1C000048180000000000000000000000000000000000000000000000000000002F8D02000000000000000000000000000000140000000000000080020000000000F0DBD7000000000000000000000000000000000000000000000000000000000000FFE40F00808401000000000000000000000000140015
+:80090000000000000000800200000000007046010000000000000000000000000000000000000000000000000000000000F04FFE800200400100800414800280041480020000800280040000214840010080041400108204000021BF26050000000000000000000000000000000000000000000000000000000000F04FFE000000000000E4
+:80098000000000000000000000000000000000000000000000000000FFE40F481800280000000021000000210014001002400100000080020000882880080088280000F0D136000048180000001200000000000000200100001400000014000000148002000000002F49054818148002800414182810820416012810A21140012810A241E3
+:800A00004001002B11484001280048408188022148008828108204F05C65808401800200000010020000100240010021001400000000280000808802000088280000F04EFE000000000000000000000000000000000000000000000000000000000000FFE40F000028000000000000000000140000000000000000000000000000000000E8
+:800A8000F017D400000000000000210000400200004022018001000000800200008200000082220000F0F9BC000000000000000000000000000000000000000000000000000020080000F0CEBE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000F1
+:800B00000000000020020000EF1C04000000000000000000000000000000000000002002000000000000000000EFBC0E000000000000000000400200110020010000000000000000000000000000007B69000020020000000000000000000000000000000000000080080000000000005F8A0E00000000000010020000000000400200120A
+:800B80000000000000000000000000000000CFD90F000000000024000000000000000000000000000000000000000000200800F07F8C200100381002001800000024001200000000000000400100000000000000000000D04F0E00001224000012000000100200000000000000001400000000000000000000006F9B0C1800200200001002
+:800C000002000000200100000000000000000000000000000000880000AF3C0D000000000000000014004200000000000000000000002002000000000000004FEF0D0000000000000000000000000000000000000000000000000000000000F04FFE800100000000000000000000000000000000000000000000000000000000E027080041
+:800C800000004800000000000000000000000000000000000000000000000000004F160D0000004800000000000000000000000000000000000000000000000000004F160D1800000000000000000000000000000000000000000000000000000000007E82000000000000000000000000000000000000000000000000000000000000FF69
+:800D0000E40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000020020000000000000000000000000000000000000000000000F2
+:800D800042002F3F0B0042000000000000000000000000000000000000000000000000000000007F7E05002200000000000000000000000000000000000000000000000000000000BFA90A002200008002000000000000000000000000000000000000000000000048006F770D000000000000000000000000000000000000000000000081
+:800E0000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000014
+:800E80000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000094
+:800F00000000000000000000004001EFE10300480000000000280000000021800188000040010080040000000080020000110021F01338000000000000000000000000000000000000000000000000000000400140013FE10A000000000000000000000000000000000000000000000000000000004001EFE103000000000000000000004F
+:800F800000000000000000000000000000000000000000F04FFE00002008480000000000000000000000000000000000000000000000000000FF53030000004AA44400000000000000000000000000000000000000000000001400007FEF0DA0448024084AA44400002A022800004012022B11A098800800150114004A0448000000002ADE
+:801000000228000011242110F2368900480000000000280000000021800188000040010080040000000080020000001002D0FB06800442000000002820020000104282011A088200400111004820040000008002220000002124D02E0A0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000F6
+:801080000000000000000000000000000000000000000000000000FFE40F481B21B01122B411324219B24291212B9419B24219B14229F24291222F1429D212A9421CE922C4812E4216E12264192E4296C1429AC2421B292CB49142B29122B49132421B282394212B8419B24218B14228B24228B2422892822A84E822B42C01481B61481B38
+:8011000021421B212119B64291212B9419B2429B212B94222F1429F24291222D912B422D912E521CE922EC11E82264192E4296C1439E212CB491C2421B692CB49122B49132421B282394212B8419B2429A212B84222B84222B842229B82294822E421F690B2088040000000080020000001002188008000014000048000000000028000089
+:8011800000002501E3060000000000000000000000000000000000000000000000000000000000F04FFE00822008000000000000000000000000000000000000000000000000110040015FBA0B200C0000000020020000002400122008000011000042000000000022000000400214B0F2030020080000000000000000000000000000003F
+:80120000000000000000000000140000E097070000000000000000000000000000000000000000000000000000000000F04FFE00280000000000000000000000000000000000000000000000000000002200CF110C20020000000000000000000000000000000000000000000000000000000017110000000000000000000000000000001F
+:80128000000000000000000000000000002002F0489E00000000000000001001000000000000001200000000000000000000000000FFBE030000000000000000000000000000000000000000000000000000000000F04FFE000000000080040000000000000000000000000000000000000000000000F09538000000000000000040010054
+:8013000000000000000000000000000000000000000000F0DAC6000000000020040000000000000000000012000000000000000000000000005ECF000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000004B
+:8013800000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000008F
+:80140000000000000000000000000000000000000000000000000000FFE40F20080000000000000000000000000000000000000000000000000000001470630300488008000000800200000010021880080000140000480000000000280000100110023F2606200820080000000000000000000000000000000000000000000000000040C2
+:80148000018F730E20080000000000000000000000000000000000000000000000000040014001EF36090000000000000000000000000000000000000000000000000000000000F04FFE000020080000000000000000000000000000000000000000000000000000F0141A0000000000000000000000000000000000000000000000000080
+:801500000000000000FFE40FA0448084080000002A022800004012022B11A098800800150114004A0448000000002A02280000401202219F2F0480040000000080020000001002188008000014000048000000000028000000002100BD6F00482004000000800222000000212418A0812008001410018004420000000028200200001042C4
+:8015800002EDA2000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE80B411021B21421B212394212B1419B24299212B94112B94222F1429F24291222D912AC4912E421CE82264112E4296E12264192CA4292CB491C2421BF1
+:8016000029241B29421B2923B481324219B24298212B84112B84222B84222B842229A842882E42CB1280B41186B41122B411324219B24291212B9419B2429B212B94222F1429F24291222D912B422D912E521CE922EC11E82264192E4296C1439E212CB491C2421B692CB49122B49132421B282394212B8419B2429A212B84222B84222BBF
+:80168000842229B82294822E425F26082088040000000080020000001002188008000014000048000000000028000000002541B1AF0C0000000000000000000000000000000000000000000000000000000000F04FFE802208008882000000000000000000000000000000000000000000001001004001DFC70528C20000000000220000FE
+:8017000000400220018200001001002004000000002002001001400214708C09000080880800000000000000000000000000000000000000000000000000F0A7F8000000000000000000000000000000000000000000000000000000000000FFE40F0000000000180000000000000000000000000000000000000000000000008FFF060084
+:801780000000000012000000000000000000000000000000000000000000000000EF89080000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000140000200400000000000000000000000000000080F2BB490000000000000000000000000000000000000000000000000000000000006C
+:80180000FFE40F000000000000000000004200000000000000000000000000000000000000FFE10D000000000000000000400100004800000000000000000000000000000000222FBB05000000000000000000004200000000000000000000000000000000000000FFE10D000000000000000000000000000000000000000000000000007E
+:8018800000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000008A
+:80190000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000000000000000000000000001414FFED0F0048000000000028000000002180018800004001FD
+:8019800000800400000000800200000010022FD40F000000000000000000000000000000000000000000000000000000004001EFE103000000000000000000000000000000000000000000000000000000004001EFE1030000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000058
+:801A00000000000000000000000000000000000000FFE40F000082000000000000000000000000000000000000000000000000400100F0198A004A044888000000A022800200002421B012018A09880050114001A0448004000000A02280020040411202214F2F0D80040000000080020000001002188008000014000048000000000028CE
+:801A8000000000002100BD6F00482004000000800222000000212418A081200800141001800442000000002820020000104202EDA2000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE80B411021B21421B212394212B1484
+:801B000019B24299212B94112B94222F1429F24291222D912AC4912E421CE82264112E4296E12264192CA4292CB491C2421B29241B29421B2923B481324219B24298212B84112B84222B84222B842229A842882E42CB1280B41186B41122B411324219B24291212B9419B2429B212B94222F1429F24291222D912B422D912E521CE922EC9D
+:801B800011E82264192E4296C1439E212CB491C2421B692CB49122B49132421B282394212B8419B2429A212B84222B84222B842229B82294822E425F26088282480000000000280000000021800188000040010080040000000080020000005012F08E81000000000000000000000000000000000000000000000000000000000000FFE4FB
+:801C00000F208801200800000000000000000000000000000000000000000000000010C121F0DD8200C20000000000220000004002200182000010010020040000000020020000002440012B3F0080018008000000000000000000000000000000000000000000000000408102BF6A0400000000000000000000000000000000000000005B
+:801C8000000000000000000000F04FFE00180000000000000000000000000000002002400100000000000000A028142820024E1C0000000000000000000000000000000000004001000000000000002048810200FE820012000000000000000000000000000000200200000000000000000028002002AB3F0014000000200800000000004C
+:801D0000000000000000000000000000000000000000001F2503180000000000004001000000000000000000000000000000200200000000005F840E0000000000000000000000000000000000000000000000000000000000F04FFE80110100000082000000000000000000000000000000000000000000000000F06E770000000000008A
+:801D8000004001000000000000000000000000000000000000000000F0E3FF000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000AF
+:801E00000000000000000000000000000000000000000000002002000000008F9C090000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000022F0443E000000000000000000000000000000000000000000000000800200000000F0689CC5
+:801E8000008A01000000000000000000000000000000000000000000000028000000C021F043210080048200000000280000000021800188000040010080040000000080020000142012023F910E2008800800000000000000000000000000000000000000000000000014206212F0126900820000000000000000000000000000000000F0
+:801F0000000000000000A0220000004001FF360A200100000000000000000000000000000000000000000000000000000028F0E14B000000000000000000000000000000000000000000000000000000000000FFE40FA01100000000000000000000000000000000000000000000000000001480A222F0CCF3005A0548000000002A022815
+:801F800000004012022B11A098800800150114004A0448000000002A0228000040120221CF8804A05100000000002800000000218001880000400100800400000000800200000090222A025F280FA0512004000000800222000000212418A081200800141001800442000000002820020010012124F05A3700000000000000000000000044
+:80200000000000000000000000000000000000000000FFE40F820000000000000000000000000000000000000000000000000000000000FFFA07481B21B01122B411324219B24291212B9419B24219B14229F24291222F1429D212A9421CE922C4812E4216E12264192E4296C1429AC2421B292CB49142B29122B49132421B282394212BF6
+:802080008419B24218B14228B24228B2422892822A84EA22F42DDA809461581B21421B212394212B1419B24299212BB419B24229F24291222F1429D212B922D412E922C5912EC21E812E4296E12264193CE419C2421B292CB491C6421B29421B2923B481324219B24298212BA4112BA4222B84222B842229984229E822D4270D00480000E4
+:8021000000000028000000002180018800004001200248000000000028000000002501EB5920080000000000000000000000002400000000000000000000000000000000EFFC0120082008002200000080020000480000002002000000008001000000008800001114F0D9DF004200880000002002000000240012200800201201002004C3
+:80218000000000002002282008002440013BB7000000002002000000280000200400100200000000000018000000000000001400EF660D8002288082010000000000002800000000000000000022000000000000000000F0A9FF000000000000000000000000000000000000220000000000000000002004006F3C0A000000180000000066
+:802200000000000000000000000022008002000000000000000000B7930028800228000000000000002200000000000000000000000000000000004200F0F1F9000000000000200200220000000000000000000000002002220000140028004800F065AB00000000000020020000000080010000000000000000000000220000000000F09F
+:802280009D8B000000000000000000A0120000000000000000000000000000000000000000FC050000000000000000222003000000000000000000000028800200400180020000F012BF000000000000000000000000000000000000000000000000000000004200F04BCE00000020010000000000000000000000000012000020010000F1
+:80230000000000000000286F640720022022012002200200000028008002000028000020010000120000000000002004007A05008002288002000000000000000000000000000000000000000000000000005F34030000000000000000000000000000000000000000000000000000000000F04FFE000020080022000000280028008002EF
+:802380000000000000200100001200000000002222200442147D9D80010000120000008002000000000000000000000000000000000000000000B02B0E2822280000228082220200002820022820020028222822000000000000000000000000800442BA0312000012000000282828000000000022000000000000000000000000000000B1
+:802400000022BFBE06004800000000002800002800902280018800004001008004800100000028000028003042F0CB9E002800008002288002000022002002000022200200800100001A010000000000222800484681F696288001008021010000000000280080020000000000A0110000A0110000000000000000F08AE2A02122282222A4
+:802480003218222A02282222A0222200222A0220A2222002208222020000000000000000000020024A044822FBA4000080022800220000008002002800000000000000000000000000000000004220D4BF0A2AA2222A022222122A2202A02200002A0228A02228A0222AA222002AA2222A0200121200001A8101000000000022800420746A
+:80250000EF083AA266A0622232122A02A0222A820228A02200E02212022B332AA2BAA0A22AA2222A521140A1111AA14480041A010000A0228002A022224012022B227FCB0A1AA1622A0228183A022AA2222AA2222800A0222AA2222AA2222B222A82A1222A0AA0222AA22214001AA1114800A01100000028000020024AB442A4444AF41C24
+:80258000D2A0232A066A82A2113A02282AA2222A0220022AA222222AA22223E22282A1223A0AAAA2222A021410A1111A810442A011000000282002A0222220B442E424A462CFA2041800008001000000000000280080020028800200000000000000000000000000F01DE82002000000002200002200000000000000000000000000000018
+:80260000000000000000149F310B481B21221B21621B212396212B1419B24299212B94112B94222F1429F24291222D912AC4912E421CE82264112E4296E12264192CA4292CB491C2421B29241B29421B2923B481324219B24298212B84112B84222B84222B842229A842882E428F2508481B6148132134112314B16211B14299212B9619A6
+:80268000B24229F242B1F042B1222D9129D412EB22C5912EC21EA12E4296E12264193CE419C2421B282CB591C6421B29421B282B141B282394212B8419B2429A212B84222B84B0422AB24238222B8426F2D72900800400000000800200000010021880080000140000480000000000280048000010022DCD00180000000000000000000081
+:802700002002000000000000000000000000000022000022479E0000000020210112290100220028000000424082010020022480822102000000000000004001AF9D07200500000000303280022800222400322088043012100120024200200200002002000028400280F2D15D000000008021011200000000000000000000000010828220
+:80278000010000000000000000008F4E0E0000000000000000000042000000000022800100000000000000000000004A82F4A14600000080010000400220020014180000221200420000184002001800000000002848280000BF490F0000001800000024000000480000202201000000180021001800000000000028002A84F4F39600004E
+:802800000000000000002002001118000000004828200100000000000000002082040000BD3D001800120000480032000028000020210448000000004242000000000022000000002002BF5C030000000088002828002200002228200100000000000042000000002002000000004870B80C18000000A028000000008200000000000000F6
+:80288000000000800200002002000000280020F8AF9600000000004880820120022A080028004280040000000000800200008002000000280020B8BC0518120018002002000000000028000000000000004800000000000000000000A024F02CC200820000000018008001000000800100000020010000122800000000000022000000BB13
+:802900002900000000000000200200000000000000000000004280020000000000000000F083E200828002282228800200200220020000000000220000000000A0240000000000000048009E6900120000120000002800000000001800000020820280828402002880022800200200220020D23C0818800180010000000000002004000068
+:80298000422001120000222082040020028082040028004828001425038001000000000000000000480000002002000020022220020022220000280080020028DF2C080000200200280080020000000000000000000000482002000000002800000000D0E10620080020010000120000000000000000008002000000188002200200002056
+:802A000002002200BF2F0E82802402000000002800000000218021812806002214000048002002000080020080048014029A0A20080000002812000000280048000080042002000000A014000000000022002842420014D05E01A01800800200008001000000008001182002008002002220021280022222220080022280022280F24B8E8F
+:802A8000202121A12220A33122200200A0230000004800008024812221A2122880828282A6222AA2622228282828420022220022224A0422AF150A000082180000000000000000000000000000220000000000000000000000007FCA0F9AA1113A03A0A2002A02001A0100A0222A024A04200118A0661A013A8302002AA222A022A0110088
+:802B00002AA222004A04282AA2222AA2226AA6662A02F04488A0115AA53348A0232AA2222A02001A0328002AA22240120229018AA8446AAE11A0331D21E012A2222AA2622AA262283AA3222A022A8282A26480A2222AA2222A026E622B22B022F28BC2A0111A0500882AA22200001A030000004A14021880086AA611A0112E2100A0222AB9
+:802B8000A6222AA2221A81022AA2222AA2224A06A0222AA222A0662AB222022A9291A0191AA5114282183AA32200001A0122000000212400884AA46E1A011AE1120211002AA2226A82A2332AA2222AA222A0224A0422A0222A022AA2222B22242AF2634A000082000000000000000000000000000000000000200200220000800200000033
+:802C0000FD6500120000000000000000000000000000200200222002800220020000002800800260122F250F481B21B01122B411324219B242B111B24299212B9413B14229F24291222F1429D212A9421CE922C4812E4216E12264192E4296C1429AC2521B292CB49142B291A2141B2923B481364219B24298212B84112B84222B84222BAA
+:802C8000842229A842882E42DFCB0B481B612A341162112B16112B1613B142B911B2423A112BA4222F1429F24291222F1439222D912E521CE922EC15682286C1529E213CE519E22235912CB49146B281A6141B292B141B282394212B8419B2429A212B84222B842229AA422B842392A22E42FB410082480000A200008002000014002100B3
+:802D000080080000140000000000000080020000280021F078420000223200208101120020141418A44200840000001A0218A0142001220000604400008880014088040028AF6307388A01814440341243089042E08104208105400C6830484008261204222200000080820122421008000000A22048018FAD0A1A220D83922400181812CD
+:802D8000002218004489412446024628812408209216B0112222052084022022012604102802000081422400224F46050000185024308440A241C048808481045048800281100820020000180000002084040082200100A22008F0DAE700100222602200400200000020420400004400210000280000000000000000004470480481F0CF70
+:802E00003E10044C0141184112494801008140581481458844082848810022414428492202108402810010088820011608842011280300F062FD100400281241204801000084511084140800000044002822800222000010080018608110081884200481F028E400244C0144C02218414002100800818428412022140841225042224100D9
+:802E800010044008000082000000004438C100F0EAA32481608180047014628441180080014442405424844143C12800840040048100410000490240444428031281802102001889F278ED10A84200414C010040042840082110184802821250488052828022010028000026084481400483028400890210480842BDDA401116042C010011
+:802F0000004002414800410000004221840084168822020000000000A081001800443018200241F0EDB8401112044D521860214618840121448905444484C41098844146588284872281818C012200284100104844441884116881901840C4381A02228141816FAB04214C92180044400400000010820440040028410000284B124008009A
+:802F80000080220200880012400810088180A142CF8F0900444124100280020046044B24444604524122400400608122000000120000448001841004124181508420819814E0C40500248001440000480085040041800124001004001002400200410081410000181018C81441608800818AF19B9E244184000040140884422084210442C0
+:80300000200400400C100484240044100200C412000000002812001888C18880F8B1B40043844102414400480081100420024100210043012200443024240044412120222202860426141804C02481C4008584028FF609C241004002222280040010A42141800180020044101C4404408211440400008441444088528444100810281808E4
+:8030800094BA0E00450A842D44890244442820C224000022400441800100101802000000101244080000841A42180800004048F41E970000301400430483028142001004410049021810044400224302100400401818A421800218A0282008202801C08470A901004006200289022688C2180020228202002644440800444922011004413E
+:8031000000250200853414C018811216C814411004441241006FDB092D1C8004441800418440048C828492482044041002491188080020621200848024121428020060488002008428C02C10023FEB0D18828721644B11651262448D2442814A5488474412422262F044141634244352444504442881C962422D2400246144442912BE28D9
+:8031800021E24293144C028E184CF114881E14C5781854CC4391881849781CC9885FA84D5242C145048116B42412742428A222814A41684445D444D244A22200803212504441414C61824321125464449014502444C4CD284508490883721848044C5984406C884D28812604AF430949C444105662428584028D2C4688228254842AB64857
+:80320000817444A4414128445088160844454846022A02234104244008448116048D18209218C7822002899A148F4168C8884B18A90E522011226824204418C448C048800448800440040000002821001004000041001288802881288128832842240BA285E4AA074F45F414148FE1C1548F85A419EF86B46484F248646AA6265A754CF489
+:80328000444466F47C5C4F46F264644F45E16131242212D04851440045F614144F42F22424241E1665544445F62626A558C8CFC2D28C52444F4AFA9C988D888E884FC8F98CACC5FC84848FC8DACCF22CA88F8AF828AC4F4AFA24A84F4A034741474C85BA12F5C8582B55E538248F8484D244F268283E74C5D44464428FC1F524244F427487
+:803300001464412302295188CFC858444C4844F434345F52F2242434AFA151464E4C45F62666A55888CF82F23C3845B424F2181C8F81E9CADAC47118FCB4BC4F4BFB84A4CD2C8F837B285A4E47482BB2F735F044544D4485CE16C7C14F65752E7C2484F248648FC6A6268F85774CF444444746CFC735644F46E445E1413126439214D04894
+:803380005844004F62F214164F52722444F2121E65D44454646F62125A48CFC2F22C2C4F41F124248FC17188F818B8CD1CCD1C8F8BEB4353488F4AF82C888F89DBCAE848F82C983DA4244F44B584F4181A2F65F14A5E6F69518E4F46F4684C8FC2F2486C8F86F25C78C3A4444F46F25C7C4B264B464F45E141F124244D264554888D8C459E
+:80340000748444F4242E6F63F322212A52216FE15146CD44B06252C885F4242CCFC3F314144F4AEA81F19818CF81FB849CCFC1F11C1C4F495944CF4AB83CF99CB8ED8CCFEAFA2C881EEA10040065024382044822000000C02412440040044450484120020021001042382410240886089244964864888504814004BE8B0000444200302832
+:8034800000848140044C02100422004008002244412800614441000016180400890144121800120040F17F75C0421F4152281F41724AF21124A3D441B24AD1C1B24AD981B64AF91548AB944F82F44A914B422F14F924482D914F82C4914FA2C4814FA264114FA2E419E2A2E559C24A9E24ACF491242CF491248D121F4932681F49B24AF15E
+:803500009124AB141D24AB961B21AB9453B14A3934AB9443B34279B498924F8B84F9A44ABFEF0725DA41C6421D2C27241FC1B242D1C1B246D181D242F9116C29FB156829F834482D914F82D412F924482D912F82D452F9245A1CF924CA1E814D4A8E218CE558D2B2E559D2A4F48128ACF591648F22F59124C3B691B24AF19124A3F611242C
+:80358000AF46F81124ABA453B14A3A14AB9443B142688925F49648A18E525F5206208804000000400400000000000080080000140084800400000000000000000021701E0C18218C0329410A80D248942283018021342400001024229228602144182A84028D3400182311C8148141580083820940282412084C4134888912F8D5FA008250
+:803600009084451264611E2881388C017048449C1C84416B14CC3448818904834416A442104824914C806423410030148C41C814848044984818828C88548481C04414F0841B00C2814532146548D48223C2444B1220D248341C4E1C4C12941443C442003248872A4142253418421383441C882304106441169858418149A241831218081B
+:80368000288184855424451868819F59042C012A8108901210E881126A8100008130428481848744902841A012004C0285A412422416941284188441800181828084A14889884424018A84027FAB0900002C0118100423220112404824018428412840441828028042025800100249A1610000000044800200424508D0CD022B1212615094
+:8037000012153424256C22411822124449A8148C824482714884C14C00293264448D42CC7144B8164248043214288922021A3238224238488182888C41648449921887421862F0BB5F242800242441504228412AA1121230845698241260814F846241430664814C66428061A44D128442804211124884211208802304888218C0484118A1
+:8037800045188406AF9F0E121861C011142E1481442121004C01108844020081002884608425CC24286041200128283268182A8122041008418443022281621608F0FA8F9029254404408592184042A1241212C14C813444C0282412901884202291684129018485C42258456881811A12141888247118A41210341C83688244864854841B
+:803800000028CDFAD0480189A121122212211840941128C12092228D12602464C44CA112491224B148321218283022214385A2124604892482882308448042882431841800248D844448DEA5244800108401471241444018822405004C01844028542281104494288446142402002838448321021088883482002848C01481281220F883D0
+:80388000B1F0443341812AC1144D1132E5211144C152B014944C2221562C6186444508482D286528E2A1F65824165C8246C42C43A242124C8231288F4461832E888903C0982C815884C9B418E2840A8644C4248608485FAF0D2190140028A0214110D28182418831144A022504A1128D14264804124120A22124508216BC2224312C1222F3
+:8039000044004A688180068021483414894118381444A2D7DA20A4284128200243C2148480810200430124800100008C11424248041A7262382480020040483484824028041884C0145A022800223FA101260425281118211122D4620248844E242D44412522324828004C24041072640242100212124C6481184289222204838212082A78
+:803980000880110400411218885F5A074362480021482D41000000844922145884201462441A0442404A982444904446280200281604008A12048228844284002281288A4104F04F842440420246244124912242422152800142218001103228248304006023504200304449C1284004A01441128381219884856488808858248C08F01C22
+:803A0000B8002222214E9211254272440884832404102404482C82228481241294422A1488046241184902490160C24200E28128888189214124C1841200908C41AB4D008120021628022002002301214120022011041818441812268804004243022002122E4C8305100843840200604242815220F2BBDB00400483025268248448128082
+:803A80000440386464A0144518481208004221252881430625480844188430248C818E08824420B944C8381024524830885F490E428684022933228531142846622140080040182285240123034210D4864624342448422001005084418309CC8422A8218B818200206812898CC811F0D35150A2C048166448CC9824481241402ED1C29280
+:803B0000122B412981B424012828A1818B34A14B850030148114C41A6486282A24614462224200C0348052488284844964840021F0E8B780748434282B214DC88FB291741AB228B16C162A14582A4C55261E54CF82F428422B5723A446CB14818B448F21247166F2244A25E4C314921483B31483C7442A62414FC372485C88123EA4874AF4
+:803B80008B828B984BDA478C1E8847488CC12CCE88148FC7BA8A6D91845D4F24288F289222442B351F4158694D466744258894582B714F84116644E7A44AB24682024FC1E1C1F422228C024E5C128F44B24884711498626D742E4643B214A2112A37483A22342C8E184B249A021E2881C74816F88484CB832E546EA84145C48149F84A2478
+:803C000070662652E42E1287622B2427172B161E62644E12278146CA4436A24150424C41A273005E48267246582E8D642371247A44E24666C7462A64448F8241140C49F42464CEFCCB448C4CE88332481A8991988384B114924482169814AAF2A34B00211004450324844048420812608124844008002144180090120080010018100420E1
+:803C80000100124400120085040044AF270B45D644F2282AAFA1F35A689F85765AA8166F66F746461A21F44A426F65F546666F64D54EA442AF27D12AD122F168788C51A88F84E4A4F51A5AEFE3F51E1EEFA2B224D6EC7476566665F65664457814D4CCC4488FC1D388F4A8E8CFCCFA84A4CF889A184EC8CF8DFD18B88D8C4F44F4B4BC4FDA
+:803D00004FFFA481488BDD8F89F9AEA8AF69024D244FC4F6282EAFA3F55A6C9FA7F71B2829F36672ED466F41B148E567F74A4E2F64F446566D4C4F82F67852A985F16A688D58AF827128F888CE2F21F522A6AFE5F52E28CD48DFF1F776766D258FE6B256F67478CFC3F224248FC7F7783C8D488F8AFBFC344F46F6A8AC8D888FC3F9D8D8C2
+:803D80008F88F9889C8FCCFCBCB8CFCEEF1AFE88CAEFCDF59C9C2AF3ABF1F034766F4246D6CEB14AF75B6DAF85E626F67E6ECF64F6585452AF25F256564F64E424F51E544F46F6727A2F22D68AB122D388F1687A2B444F44FC1C5AEFE3F53C1EEFE2F234768FD4F65E2CEFE5F6367E6F45F434744F41F33C3C8F82F43C3CCD4CCFC9FCD887
+:803E0000C88F8AFA88AC8F88F3C8E8CFC5F59898CD8CCFC4FC3C3C4F4FFFEC88AABCD2FD8898CF8ABBF74BE263F32A622F62F27E3EAF67F73B37BFF1F34676EFA7F76E62AF45F54812EFA5F75E5E2D466D52EFC1F52E6C2FA7F532628F83F13474CD5A8FA6742AFA4ECCEF21F5BA76CFE7F72C62EFE5F55E7D6F45F75F7C7E7A6F45F43CDD
+:803E800074CFC3A333CFC7F77C3C4E688FCCFBFCFC8FC6FEA8A88F8BFBDCF8CFCDFD949CCD1CCFC5F5B898CFCCFCECECAAFEC6548F88B924F291CFB02401002F2AC1484D1248472248A041241E482440C4486C22A1241244A0242094128F441232484B1283B42421B424012210C448418443A2482286089E48608844124C229828928524F4
+:803F000068EA200822841001281800004944848401420030488481840040C8241058A2009014128016A8418908202904409888844A084282608AD9012CF4112485F2112487241F41724AD341B24AD141B24A9921AB945781AB9443F34A9147822F147924D812F924481CFB244A1CF8244A16F1245A96E1A26459ACE549C24A1F49C2521F0E
+:803F80004952281F49B24CF19124A3F69124AB141F41B24AB911B24A19B54A3924AB944B422B94478329F92448984FA2B49B0C2D481F41D62EB411724CA221A7341D2C2B141FC1F242961D2C8BB45F81B24A3834AF347934E81439242D9169D412FB24581CF922CA8D854FA265192E5896D5B2E559C24A1FC9C2521F49C6421F49B24CF1EC
+:804000009124AB161749AB141F41F24A941F41B24A9B21AF443934A9B824B44A29D342F9264829E9A2F54DC200800400000040042800000000000088000040014008480000000000280000000014F0B5FC2012229114299428214484288905842C24A842464A1C1A0C8112812246046B142142224AC3128082632A8041481468418B21C18B
+:80408000288A230881424241428B42428044A2C980A41890828B824CA54289641149248802859414448082C4421A84044E2420C214830281248572847868925400364A24041A044CA41E2784C058418A7429A481848B29921AD2C16211428FEB0D48232461688BA4382A1438194B244D88282287641E246224C127842CE4212484B1380414
+:804100004B2C16F45C221088D223473E488384A3A42F81F21244461824C1148F42E547984E3A281F846482CA11E8812664244D2856A1418F940222122412C04C214C04A01410088841832402450884108402100248402869221E2400000083044028028190884D411084688B381440F24F53000020C22424400200004412290246018084A5
+:804180000200812A01411A0244001810223128A0120082808488849844004C88840181412F88044941629129321485B1142261428CC12283256141904216CC4826088C024C14FC8268C4628554228331482183341848202311249158644A3124422232831141B828185848848CE8C2042A1CF84547104412186241C12634122416C8228CE3
+:8042000024C1142400F0284110882452284618246441212381048C0448800120315822C0248A04428309814B288181449024A02444C7F720011621823221183024001200412CB52C31480028604444A2818362825084872310C41820C12212169428C0164A0120A2213041888C04418CE8849858308884B7D340C242002698142A94364C5B
+:8042800042C41493A6218C344418524508222446042A8592884112491214C2648428239148122E88281062442036284480120A44220050224E381698485B6F248B244885F112285012438164112885048C1204295242406824858282941C2534C42C9168A0122230448C483618256441200418424B1818441228D2001A3C288318C14288A6
+:80430000442AF866D4C0110010221218084602184200002C014148840042404804C01818211248800243014489322800208209818A0116A41219250810F42369242A1452812E1A83D214E34221C4352616282135444924B21244426862844C8634242F4462448C61C54982B322C142C48C3952181E241A182414142434B4228083B11A049A
+:804380008A215F48898994C2F816948C9F9C0E9C012502247048E2C10248181D6881842412444781802444088C048444230241814B124222442D42302C1A42028B168C22648100888281412083220184812AF417120012004822512942142294180090121082132852482422448608C64484418882E242844354224400234418481488127E
+:80440000024441A048169444302884182AF4F3160060614A0252A902284827824827818C7212140C424110024B4148A446C2C8248C410284AC414204382418224163468224A618422A2804898C4248180C4B388928F8DA552044884108444651628429012249022221212B12002A0142444841188A0200004440444214C46200400446CABC
+:804480002244908442841841A2124082F1C1C34004C014100142569428180028439418433444212A118404000018A042441008821844280028306A818504862484888402282001182508AFC5082B4842830210120C2822482961812921011240942280012B41248944026C126421494222C5220070181224112418088A0123089018448873
+:804500001A484408C2F0DC3D200148D0423241C022002822000000848554828123219224904C2024324412612622018C010043A44143014394284C2484044C2A3848304826042554487F33058444442B6142A0128C0142704802C4604410982220444404811602282508261888141824028512041082A2121A2274180400200366088843FA
+:8045800092224AF8E4BB1082215248222C028152122100242034444189058D5242004800842A24944243242321088012082810021841224C110420A4288002C012183FCF0A45188804444C01164418C41844A0212E482484322041841152242849B21498541088021C04C018638224220481526282504880E28104854404482C419862F005
+:80460000A61E242186C8346D1246944195D26CF338124C61842A86018D424D1245E266B27CA122AF247714447244E4846422CB44472983E266711464428D2449A42143514AE3D248C2642F47E446F4224645A876C9F142A8414A5C484F82973C8F85C94C6E4C47A18FCAB21C35C46F84014B458D14D088A6226F71F12461424F84B418B40B
+:8046800012F75212A9F21E1A2B1289B44284C128254AE884C1142942F616C425A2C66D668CD6A27614E2A77432F88686B024C22267A1668272166A882A648866DA28B482182418E8C4E84AB22818982812CAEA81FBC9474024753C624749A42627C127832D242F263228857814084F457252DC48B11E5442CB11474389B454E423B42C728C
+:8047000048E8C1C13C4E1830688D68184E362AC1361E1244185024818B358F44731CA4E92AE14447B444A58CAA14B44491B42A9914269A426E14004184404801450245020044842416480244004004008504810010180461302440420816180424406481004492008110F8AF7C242B114E1C4D1E6F63F71E1EF5BE5AF75864AF85F55A7C33
+:80478000CFA1D12AF32212EFA1D1827244FC1614CFC2F17E46ED1AA7A385FC54544F25548AEF6EF716426F25F612526F63F31A5AEFE3F332742F26F6BAB62F23E24252A8A5FE46443AF36E262F67B4EAEE4FF65C688F86B2F2BD94ADEC4B99CFCCFC3CA88F86F6CC854F48FAA4BC4F43FF76683793242B111E584F61F11634CFE1F31F3E8B
+:80480000BB75EFC7F75A482B76AD3EAD3AAD3EAFA151822167456F43F37E4EAFA2F37A58EFC4F414544F6654AAEFEEF75616EF62FD3252EF67F72E4EFFF7F75676AF76F6A2BE2D166E6EE4AFE2F446646F47F37E74EF46F4AAA48F4AF25864AF87B7F2BBD4FDC4C84F49F9BC9C4F8BBAFCF65C148AFABEBC3AFF34646346B252D544F53CAC
+:804880003EEF63F326245F33F37A7C8FE5F752322F45F7685C8FA6B61AF31C16AF8151ECEFC5F12416EFC7F51C1EAB63AFC4E544F54452EB62EF66FE165CCFA7B776F47466EF41F53C3F2F47F6726A6FCBEB23F226648FA1D3CEF254544F67F56E6E2F66F7FAF84F4FF7F87C8FA6B6D2FFC4C48BDDCB9DCFCEFC3CBC8F84FDEDEC4FCBFB77
+:80490000A6BC4F4BFFE4788B2F246F44D44CF1383EAFA37346F63737FFF3F33E3E2F27F76676AFA4F74A3AED12E761E7E125F65E1EAFA3F37E7AEFE3F33E7CCFC4F454544F66F46E6EEFE7FE561EEFEEF5764EEFE7F62666EFF7F77676FFE6F6B6966F63F32E666FE3F36E2E6F65F57616EFE7F77E7EEFCDFFAC6CDE72AFA7B752F744446C
+:80498000CFC5F5DCDC4FCDF5F4FCCFCFFF5C1CCFC9FBBCBC4FCDFF445CDD48800143024B1AB0248124A2414008004844488D24B0480246048B2460446044188B2400222002188081048C04860896088A049240182811084A2278DC088200A014133148842B141E482304181608482502188418120044202122010080C5242AE141921A44B7
+:804A000022108232649A42A248206844324A1884A24998A220F8FB26C0421F4152281F4132481F41724ED341F24A121D24AB9419B24A19F54A9243F34A9343F242914F82D412F924481CF9244A5CF8244A1E214FA264592E4A96C54A9E244D4A1F49D224FC9124E5F2912487241F49324A1FC8B24ED1C1F24A9219B24A19F54A9443B24A9D
+:804A800039242F447924989A4F8384F9244ADF5B0B4D421D68581FC132481E24C7341D24EF2491212F46D9C1B2489B214E964783AF3438242F14E982C4956F82C4916F82C5954DC88F11B2247C98A54296E192759891441FC9D2A4FC9164EB421F497248B291B248D181B24ED1C1F26A96118F449B252F446982AB94437B424498BA2F8317
+:804B000094882F22F5B9914008480000000000280000000000188008410040010080040000000080020000004001DF5A022011588158842111F0244A60818120C448A145222222794428932828225084001E4429220222103228188024E2482406284281A01C8744424B184828828A01F056251442330838893234907C3814560818428C81
+:804B80009824128B5218444122008582944230228B2C2212121E421228122CA128821A22842221781208C84460281220BA888434489611F4FC2460241F8441E882B448C21421130246764428B12881A468874625D8843132419666442AA12189B2C282D46808262837131A829518224AC1288A23A84248C81888E148E220C58423C58448B6
+:804C000068C6E2816C1947218FEB0E003011188C021E4C2AD1818241081008182A042260824008240028C84422408242022C012021C22462A012101884C84820816A8800005FD80D40240200000018800110140200302481482002848041440200221082022840048021088200202124432441048F6E0C49322188A9A3124832AF246122C9
+:804C800043459812C018907270423244669448524284A912622448668242288381911221221A622818452223087A08488064844DD2228A0488A847844286F8D895302426A52823818324023044248081014907426314045E24488C44224282C4222845C812120000188A02206148A0E112888034488E1228984218808114F815B300008954
+:804D00000280F14A122823C118124048022121A0248C0484248C024881481280021682312228230223C1262200004220084C044820CAA4461C24F8E2173048488C18688190484D2200651868812A042142274280642281490100AC01002504222184182A04604100108412048A862808880000A212F0B96F30284812416285012188284154
+:804D800080524A90382584C44870184204640028461402822084F822188A9242A082222A0118C0824B4818288C140484182A1414C444828CF8AA75C012284F12881144A21281839C1818002084185828124301006822424218812B24841694122004122129012026A2C1400800A01862888281888400A764A016283601CB43144A71288403
+:804E0000E42241088CD1840421CD428762584CE1814218E4648282B468A114A12A74826C612C052AC52212B0128AA3122A041E442AC84812C2814182890E2A5C4849B8682899888FA80524106CC140782A02A18418842420648B214881481084010010062100282C089828211004A021889082008A84280192001004D02801A0180040425D
+:804E800022810426025220E46102482582A414002880128214A23421108245082118218041280280242822011284221A2488288218F83ACA2024045200844200C028200420140800182442422004100242482120012082048004C8208204C82A084C04008001FF2107200800001216020024206181AC01802404002123240100100224305D
+:804F00004218008022042008800820048882820080F281494008482024814402B012066152A100201504305241000018800112800100124004808422880842004AA8140000001F730F481820180818004842008004208101001842200200184B4180034800208224822222A4422002188083088604888A82C8216F430A00004682542200B6
+:804F800040C24483446821E0847228449218121614322A48816229A412212848B012248315D8220121424242008400886A812804008004F06619000000888084850183014008C04222240021000080C44280214402100418200100808824142408402481041812823F23098482008258420018181A2441082400280021420042224C03805E
+:80500000240100243800C9C144180000102804420080028301F09BB6401888040012002724456842222D12B04882311242120021242C438209804202146024848004001004804404280012824800882192BE7420A4598085447242E225C152482E521A74186221218F21F368425AE122022440A266422F86B6622192422C2231422B44429E
+:805080001E4821A981B132839424484A84A46283A4A88AA4948AAC42D04488A88A822AC311AAFA265180240830C82B94582140B25AB22201585AD58224B12CA4112D1C29911452259C42241E624AE42391522E14582CE12185A3551606244156A4244442428822281A24A431CAAC58432D048AA888F05BB4008400A041168824B55211F494
+:80510000482A4B56A7848568422D1825BA42A4455A248145C222004901722F2424A121212724242816028B142AC5182A028AA848428314A412CAC8184A8205881E481283F163C600180080090024844048020024002004100200002100100241200222200222200200281200004A02286FAB069A21A411488FA4FC52122F2155222B144ADF
+:80518000F45E12AFA2F34A1487842F21F362222B364F46F62232A7A12F215144488FA2A6628FA2F422126F66F222222F26F63434242F2252228B224D462FA6F322222D12AFC2D244A1224F46A222F06C68706888F1D4F492EAFA14144F45ADAA8A7888A8BAD0ED0C1A41A811488F84E421B14235122B1129F162142B762B1623943A7E22B3
+:805200002B776F47B432D3AA91426F41A5118FA7E722F2A8DA2B124F666E216E624F63F251432E624E437E3A4F61B572E72392528FC6F644542AF664242A86FCECEC888FC4AADC4F4CAD88FA7A44F454D42ACA82AF89A8BB29B1A2075AA5511A018FA4F45252AFA5751ABA52E524F44A26AFA2B24A7348FA1A1A2F23F65A584FE6F7223276
+:80528000AFA5B41251461AF1283A2B428FA2FE12526F67F222222F23F346443CF472722F21F132681E426F62F722322F23F37E2C4F47A3274F46A2666AFAA8AC2AF248688AF99494FAABAE4D441AA1A28AF8EAE8AAABB29F1F06DAB518A111428FACF452D2AFA5751AFA52522F25F57A32AFA2F34A3AAFA1F12A122F23F67A7AEFE6B562FE
+:80530000735ABA42F144144AF5687A2726AFA7FC32526F6FF652522F27F776762F31F532723F24F572722D426F63F732322F27F37E6C4F43A3454F46A2666AFAE8EC6AF64C488AF9C4D4EAAABF4F44F454D46A8EF8FAE8BEB2AAFA65AA0000004800A04180041A048C0416081A0412422004420018421842184218008081941448A048205D
+:80538000084880041A048200003FAC051880012001122420021810A2414A022100002428A021002428002400122228224422200222004004A8008028884AF1878DC0521F41D228F111248B141F41B24AD141F64A121D24AB9419F24A9251AB9443F24A9743F2429147822D954F82C4914FA2C4856FA264114FA264192E4A96D5A2E449C256
+:805400004A1F49D222F4912487221F4932681F49326A1FC8B26AD141B26A9921AB9451AB9443B24A7BA4B8427B24B842F9344889FB244AAF630CACF511648D521D244AD14192181D648F24D141F242941D2C4EB25D28AB9443F2489722AF547B24E854F926488D952F22D558B926EC11E882E45D72246A192F9264592E4A17C96F82F491A0
+:80548000448B421F4932641F89326E1788AB161D24AF42D9C1B64AFB8528AB1443B2426A882D344D48ABB46782A9FAB4427DDC4028880400000000800200000000800188000040010080040000004004000000001002FEA3A0140081831488410884D0820152001A2424062604002200904240A2422D38415860220042284881412A6482BA
+:80550000200198800868284782200ABFC60C602800282024012981011884410010A814162814845422622A212123040068802461418C0118243248418A014812428084928C424A08144CF6675280648C21904881528C4142582416283248412025344812362614E4212432E238301242241B2428B048015244898124032391444CF43488F3
+:80558000A0421852A04822CC0A87268028F3C2A680014028020020810118120000284881000000184A024032184B42808492120020C42880028001880020A4424C082849F436A100001068C1000018112180018504424130248004240000206241804242040080C14883042A01000028222093982280F4E87E0021188901408822210480E2
+:80560000014880E4842281928870150829C2641A3468222A242121228421818202683210242102002084C4884984049048868872220610028160810012001002421004008908168934222E428084A242803224007022840228121285240528002084E4821884246381628C28B4C505004A2111481488024218452121820189C468524C02C1
+:8056800026440412411AC4280018181248898301482084024881281200220020068018082AF1A16820224204E084A224444A02840090442006404808A028001048C848008001480000008C0418860818882008184220014283F835F600200180211102220000200149420840548483240248002812001084A12122808281023028304842A8
+:805700001841302420022AA42480F6DB28004002120000420000181044C11400180000224180110832002280012002008002004008288C5148002A01DFEF012822160212468815A4242200004118625962810012100800001E688C012A81011AA2213800320060828A0252124184222AC118411AA4241A94682F8E0C0041001A62220048AF
+:805780008100A01440044484814185A44A28A02445180800004448002002228C0412818C04822048044A42880228827A0222000028000042004800834408004880040000200180012212000018800100810080082088821408DFFD0D1260410010048C32280052000010042800224122C9121484442824810200208111088002A081908864
+:80580000004212481A1488220CAF710C12305400284110480841182A0410084120022032145048444148890112228120812401810028001038A8008218425A08908818BFA80C8D288B444A2404008082D24454444B622A22024881002442A0151A212B020090418051888D288B444A24240112200141982AA22222200400872268481AE10F
+:80588000B10F000000200200008400000000000020020000000000000000000080240442480000BFE20A818CA4144800000044414C228202830418485022901216C4B48288003814111484818C24840400280044414C22C228100800502290127FFC0B84800440040000448428424810080010021880180400400140081A240120014200F8
+:805900004480020000001002BFD304A054002001005044A0221008000000B0140100104408420085084A0500180000002A42080081122008A0118FEC0D008001441800000000002004000020820200000000000000000010084800002008005FA40A188B444142221200004514B82482242234488480042445A211281282824484221011B9
+:805980005188B04884212402000010B424022200000024241AF18994405888484A04000000444584E28282010000109212181E14A8A80000141440D88885A44480012200404C84A2220000001012B25B0900000020020010080000000010041048840400002001800180010000002025C488180000F0E6F3001212002001000040880400DF
+:805A00000000004400002800000000000000000048000042480000BF4F0C000020A11100008110084840288404100441436282444C44A822000012A01100181228480000460818C08842A08800F06B542081A11100440000008442813048810000504426848202418120040000800112000000816084428C0418480000BF47072041248131
+:805A80009214A022000081844E484AC148202104000044B0240222180000A0112081021822001008004842811A240400F0F94D7026B212A2122B111229012C5122881E1317118B98967948F888414E48421D4911489518F8444887444F42B444E24222C224805244412A7226B212A2122B111AB882092C5922881E1317118B9896F94888D1
+:805B00008B484E48428C04488518E884F479B1F0262245A21232122118182592821CB11191819E8883D118246484941D4148848588F44844C14B246226448482425444282F2242A212321A38828A81512229C8111B1119E88938188B48C2464888844458884877F600000000000000000000000000000000000000000000000000000000C4
+:805B80000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000047
+:805C000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000C6
+:805C8000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000046
+:805D00000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000C5
+:805D800000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000045
+:805E0000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000C4
+:805E80000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000044
+:805F000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000C3
+:805F8000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000043
+:806000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000C2
+:8060800000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000042
+:80610000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000C1
+:806180000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000041
+:8062000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFEC0
+:80628000000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F08D
+:806300004FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000000000000000AF
+:8063800000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000000000003F
+:80640000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000000BE
+:806480000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000003E
+:8065000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000BD
+:80658000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000003D
+:806600000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000BC
+:8066800000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000003C
+:80670000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000BB
+:806780000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000003B
+:8068000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000BA
+:80688000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000003A
+:806900000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000B9
+:8069800000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000039
+:806A0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40FB8
+:806A80000000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FF2B
+:806B0000E40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000000000000000000B6
+:806B800000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0084004588842121A24220E14201444C064800892221210140048981A124831428142804C048180000008222000080A249280092EF8B0C2AA41416984842C14F82F424484644C4242284442A443824C9F328141AA6410081441AA2121C
+:806C000018406881324226280456688130488994684E2862722A8112084A628622728321A2818CA91C846FAF09A0411008444902A04241128130448422412004124008222011081A0200001E4890484281842280210100628400200283893418AF9409228001C4481843251424021A0220048C45889278004084E142011884488B243028D7
+:806C8000420016081800202402A88902208422C518C80092D0D70148810000428100801244248212848201001800000000400880040020A442482842000000208222210980F8236A00108884444828C224000000440049220100180000801128212414080010084008200200800200800200EFC90100000000000000000000000000000077
+:806D00000000000000000000000000000000F04FFE0024842021040028181AA214418441422E1418C4200200804124C14820041A8402248C22C3486848281220E48208908420240280282221F29A42001240B448828212241122048181422244001822460841814022A2422094221800004400848400A01818892514884248988430148C74
+:806D80000548CFDE0C008430784A220218284A218355484243024C83C11C288C0600C012A0258C44228601280025A8218C8496482818A0948C2B04C928122882084B188C22A142FF9409201142040044240010088160440000004181004302200480050043024008000090184800428444001A04708C05400428004128421008810000840D
+:806E000081222800478240280428481224822011A42149280116048C060048888C04004302484A0100AF850869818293121813022001881C0200D08421A2844883344445088984421898442848212A110C7214222880A6128092284A2182018488478212C122A0244B82687EEB402422B22201002800834841080016C4288A044842814445
+:806E800080821468442848241281122644010042128400428019480845088442422228F07D819012441220C12144A0140022000084102836284444833248848420228411A28241A0141AC2A41A021E24224A823228186280048822431384222134844AF211253028288B1200000042440010484C0845084044048743222281C048418381DC
+:806F0000A1214981842103CC02482024A618C014C38804438202224921A141F0FE2890184880012884126688C2448B4100002A6141C024248C828202812004430280022281304428428002004490284200C800160482004D750021902848844122008428100C00006082200142442001100884000010088181000081423018A84034242094
+:806F8000584820F4D223602322123628C428C1128C04893438400C818CC214C02428224B2180C624B01804C952841289218302184B1226C848C0282024864828C44480224C044902C98104ADCB003028000028226880041018840185048145082A51488428004840880216840400434228040018901886B84821C824224C22C1948218485C
+:807000004F1D07400428604228844C420442004004200441C145881428110841100400004810440880024A420880014C028D3418440022289B9D2004281810082800004280042002002200188C22440800490420040028124849048001206488C41880A848928200F0FDA38003506281814604201488020028414200008002000081402834
+:80708000828424144408442881411A94144228C382E14401891D88020012985BCC001A024064248181448004101418881404C40041811044A84248480048892112848281A1524441100C00100420029028A04A82425FE70A4126682282002242102432480080020042421008284180C224814A026084200484448022840442188480248418
+:8071000001D8C0584280029F250D108401892102A04240084840848402855448004A0284C0444008814D484480628220026084223028842282400C8C2205008A2224088F960924101424024200200444424014188802444508892424250200008122004034280081411230484C0660814C1444F4C81444412848285BFAA0212081826264BD
+:80718000814A02282828004181224932288022222222922822812E48282302284C524880221248182482228402C048008C04628C22820420F4841C408C91445662410000004490248904409844688148290458908443044084D21804E082014C84C1640080628828460C4A02824782102434343012F04694702484A3312A72141498288BD5
+:80720000622684A2248B2248C0448782288145B42CD444B22412EC82A642C32136644D28F0244442859848A0362A3414C7435E482AB624C2244AA217684840D484F17414CCE442F314244FC2E6460180F27C45C022C1E04181526427C2424922E482A4444142414B242AF4442483648481C0648146C8284D4889D64844424868465E284C07
+:807280008414A4228CB128224438648B4349A4124E28CB2449514889B4F8E289AC548A81AA823AAB929D15A015367424D626F42A186E684A4428544481205444878444C126E8824684D4C864864289E242D5484228766888F22C446843B268428452C8284D14C5F44844C01C8F887248B828C8488F8DA4458E2849314C8F8A38584B484A5E
+:80730000A6484AF4186F0000002410040000004484008100001008850400102401120040088440A88212888008288400208102F0F1DBF044666D1C4D266F617548FC2C4EAF84B268A2644F4434448F844254444554444F44F44464CFC4726CF82828CFC4F4244C1A24A2748D688F86B448F4686A6F46A6444F82F22C6C4B364A43B834F3E7
+:807380003464CFC5F5484CCFC6F64C6CCFC3F7BC2C878F8F82F2C8CCCFCCF4842C4F4DF9C8B44F45FE5494CDAC4D346AA611BAF85922F024266FC4D664F23666EFC6746CF64A488D284B644F42E244A4226E644F44F44C6CCD2C814F42F24C68C7C2CFE6F66E68CFC2B67225A2BE8D688F823C6C87A66F46F641417AF37C7DCF86D744F159
+:8074000074744F42F23C24C7C54742C5FC4C4CCF47F7FC24CFCFF2A8A88FCA7E84748CFCBC944F4BFB44644FCEDCCC7A44B662A6BB2B66FF170E4F64F736546CF23636EFE5F12E6EEFC4F26C2C4B644F44E446A2244A56444F84F46444CF44F64C64CF46726CF82C2CEF46F62C4C6A25B248FE2864CFC6F64C64CFE6F666648D2DCFC5F769
+:807480007C7C4F86F654644F42F41C344F41F25C4CCFC4E446F63C3C7E388F87EBC7F3A8A84E68CFC4FC14D44F45FF54B44F44BE44FE2CBC4BFA2BFF7AA59ACF25044F66F72A644D266F67F27E7EEFE6F26A688D284B644F42A2662AB2445644CFC6F42C2CCF44F66C64CFC67624FC6C6CEF46F62C6E4AA7227AFA6868CFCEF66864CF6695
+:80750000F46E6CCFD4F64464DFC676247814F43474CD24CF43F27C4CC7C245F41C1CCFC7F37C8C8FC7F72828CF8CFE5C88CFC1FC3CFC4F47FF4464CFCEFE2CBC4F4CBDF2EF2FADEE3F53092A012A01618C04844382244208484484284881200442A0246044B04812B448024243223424100441001064882286089E48449E48A041280080E3
+:8075800022F827F1100440848112820200004190442042044CE2821408812281202442848462820044418C32482822CC1484220483044443912841424382A848C0419FF9042CF4112485F2112487241F41324A1D6CAB141D24AB9419B64A19B54A3924AF547924F84A914F82D412F924481CF9244A8D814FA27418F1244A96E1A26459AC36
+:80760000E449C24A1F49C2421F4952281F4932481FC9324A1FC8B26AD1C1B24A9921AB9451AB9443B24A7BA4B842793498924F8284FB244A2D5FC04A1F41D62AF4112487241F4112D481B64AD141D24AD941B64A9B25AB94222F547924D81AB924D412F926482D954FA2D518F824C28F11E82264592E4896D5B2E418C24A1FC8C24A1F4826
+:80768000D628F491244AF1912C23F4912C23F2114CAF449921AF449B25AB94412BB4478AAB14478329F8164829FA245A9FEC0284444800000000002800000000001880080000140000480000000044000000000021F06635002444100400488142800414228D442240148402490249024822832212822205005024004784A0428085220401
+:807700004E844C4248A4412624B8448182F282230040884192148D212E444588020010085041E084C1284141462802842290448044042C22040048808862819028901844004230288426B828781811F4752D0042A1486041990290284304224021D2844405502C2614248332A4846228262C32432604898224046442202882034F8582B2E8
+:8077800028044B844902443028872287472E1816F45A1C0010245124004C364C002004810022F0144828004D4800008004005810020000C30483040018410083048B3441888220F29D67009016282E129014100881004004546044C02441004048A45228430222003024282112004160244862A08420040028402482029F540BA0122810D0
+:8078000084023034222092582901498112C228C18400602442388141219014184901232101244322C22842902818460848806482818B48226288C1F0B92600F022149034221604C3221228D2280144445722E0844248080048278444464804C01412494142A412006922120C488100822084942881C820844A08AF5A0B80032824008001C1
+:8078800000481220011044C424410000322A6122430222008003211200224890626AC14842480000898262423024F01D89B048816482122002413845489438282314943A20114474120241182684C21284A9111402181624220142281E4449214204402484220428478C102C42414484F6EAB850484304414C080021424C218403120049A9
+:807900000442A4C4381884402812042800101488E144011008188C414404293284C19822C458C0422800AFEE0FC0222022C81422220000400410048032641800400441801344242222018A0280029048828381822208000088811998188449F82BE860414D22008023922460848023C1444436084A0166B422658141C0242604C14D184C86
+:807980003126442A213334A02818201124925892438162248249588422E658844B8428824B214149F886F1800483E241124404B0224184C14824C012401444048514840381301827222002004180211184326416084481848002482049048941284418A842BD6A008280210180040028200110042249022141220044466244000000284331
+:807A000002002C92242200C82800201A480C80088142EF2C0218812428C024426045001222442741229012200143222301E02221C31226220180012001122818128004002200001014448282083F7206200C400400004092142002183821800100201202002064412001C02228001A44842202420020088168220042F04C55E0A2614240C3
+:807A80000412444E244084040010043024004012A412414812484200282289020000000010048002802902840060822F9E050030445248004248800424802482020041222200402412044004282248200622430220CE8800004400608C88828814CEFA0020028A4204262403842A418201122100282604009024440090242A11224184012C
+:807B0000480000000081414420212802200422F044A6000000181A0200220030449014102201C014414022024381114284011800122002000042004880820300222800AFCB06308422C0842E824A0180A2210044809228440028280000522880818304001863811304418004424028046880022082828422F4AA86408882848382D484924A
+:807B80001820018D44498122C154101814C4141821C034128848212A4432241C8202842248182001224A0260468023A14145082210481822F2263D00822A42E44A91B4EF410148122A2282024C11F424344311B224912422499114266442416E124F4764652A43624118CC227264A422292142F62434802282B428044304B0284A84A22439
+:807C00008225C82148F77920F1A66C90245A62444843A7244B24E024C11418E045148A8242E4426141282E2480A2531A0222446B432A2223A2211218168422034B42A0848A4828044AA1819281F0288C898EBE28B828F2826A8003B07211A4436AC26C4B1190581E6843711636762A63212E1A47421A2291263606284D122F44924629916A
+:807C80007223E1449214281AC11238126A02381A84A2466887444A922412284B7ACCE182E2420422228A24F4441D00001882800400120000004412000000004400000000220000200200000000000000F0C8DD2078440C4F41A1644F67FE1A4889E746E744D58C1268424F61F156344F64721AD48893124F41F314164322F1162445D46472
+:807D000091244E461AF534361E124F655546701464216FC682F134742847415E146E24A0ACCF8EFA282826F444545AE34AF5BC9CC782419F8AB8E8FCE8C8AE882781AF29063AD2C4044F41A3E54F67F37A6C8B146E742E348D4C8B731E344F61F156144D66EF41D188F326144F41723434264F43F2242447424F68DB44E226AE514F67F31B
+:807D800014165F74F636241E21CFC3E321F32674184F41034F43F354344F46A222428FCEEA86A6644D145AE14BF7BC9CC5B844F468688F28F86A48EEC82E38AD3150444F4256444F43A3544F65FE5A488B744F47F744548FC4B74884F214144F456127E7618FE3F316144F41C3346B221AF1241426D464F8266465B626F716762B554F75B2
+:807E0000554670147C24F626641AF134341AF314144F47F564644AA4A88FCE5E88284F44A5153ED4CFC3F92C24CFC4F4C8C98BCCAF8EFEA8888F84F5246AF0A424CF427224F414147E744F65F37A788B364F47F764748F86B378D324F1121667454F63F71E368FE2F326144F41F224244B224F43732464424F63FA26746F6EF636746F67BB
+:807E8000F756544F751536114FC1F124266F43A3334F41A3334F43F374744F46A666EAFEE8E8844AD444A115BEF4CFCB5BCCCFC4F4E8E88BAAAF8EFEE8E88F84F463FC00200249012AA1410020011200288002208102004604428002002002222002222002228400A04828800228A024F0F2810028220028414C04282248004449440430E5
+:807F0000340000442212221222444112000000001844000042004B48880010C84800DF4E032CF41124A5F21124AB141F41324A1D64AB141F41F24A9219B24A19B54A3934AF1439242F547924D812F924485CF9244A1CF8244A16F1244A96E1A26459ACE449C24A1F49E222F591248D121F49724AF29124A3F68124AB141D24AB9419B24A85
+:807F800019B54A3924AB9443B2427924D842F92448984FA2F4DADCD0A4F51164ED421F41F24A121F4116DAC1B66EF11144AF64D8C1F24AB259F2489243F34A8336E8547824D812F922482D954FA2C5B14F82EC11F8224896F52248C6F5221B96F5264A17C84FA2B591D62EF58124EF24F181248B121F48B64AF18164AF44D941B64ABB159F
+:80800000F24A9443B3426882AD944F8AF44294678AA9D9A4F521B7402808000000004480020020010000188008000014008480040000200800000000004001AF6F0F4132411810A42180220490485220024C2422010046428402280068214C228402004004184481002024A494C80089185C480046F8BC3E2027284284A461824382084217
+:80808000002001008082C2244100484046242481020020430200802224822802880030242222C24214F033BFE045224D24012288202834446046421800208243624241522182606280241691243028A01600410044832412242206D24A0828C0242C04141AF4DB2C00282244421E442AC124220010280122904400280040A4420044203103
+:808100002280040024008081028008A048001094A8848D844840F8761A002008880080080000000000000000000000000000000000000000110010011400775EA024231245A412894223544245A8312AC48182608169A1482A0874188F810248C2748588A245843398484D146A820871442A91684E83104298242AD418294808619AA5823E
+:80818000186487812849F89ED350224A1241A412C942251446AA22483C0129688149B181A4821485E68181A288444944034E211E4811235888184E442D822811442A912C5C281444B822A3413C281842B814A1482A884136188C025F5201008280080088000000000000000000000000000000000000000010010011400170E705210000A9
+:80820000A01268C50218480044484C010020820244222822442004200200006302224880240400802424088E482088085F580E4C024426721C622100E08284060020014A82024024C444222024E124324422262414241406642820440428888A2205100480F4448880266684F0CE3F7022044428A991121842414AA21600004841282200D1
+:808280004122414C228282612444422842441004444024140480280A00802424F84488898C824C085F760F000041242828854208480044181248002022240480249224482241802214022422290228422848425200410048004822C8F0424E30482AA421814004211222108C120A22400200290200222200002823216422120000100400E7
+:808300008C188402001008841288A082DFD2048D2648802244E84402284604498213042021040021414C010022009041441064244C6622004A81020010044312A482C241000084705C0950242001002A01008200481823042222000000400216044480220400284800282614040088008001424048046F5A01472426A6212E1842C14A025D
+:808380006042302812E148181A44022880020022800200414168224A1182922242582222444186081044848A5C48C0481281C4A85F140E22000050241AA21248200800222148280040140480420249012E42126044214C02001004220000820020010082004FC603410050842249012190222800000022004180820290264200200443022D
+:808400000000442822124C04C8624848208226A125424C08183B6A20024C122404222848430244428094414222421122193421614044D42194218084020022C0220000482822880041884B848880082A084688B4E40A4A22022902442800800465420200842022242282014823044323140428428082228282868224810668288004800448
+:80848000484934188A1404BDB900100490184C14140440148802482100100121111122172120842242624400140044206412004081388400220028002008EF9C088212A042E024112803490100428061424A11840200490210A22420024100004841000010040080B884221404182021246C124FD146022100200A8001182084430458A0B9
+:8085000016009042484C924413011211442A44044C4444844434144C4224844464484448411443A282488443C1C44110F49E77002688020042468882042002000014466142114410411114044814000000000040046A086811008024282C2802007FFF0F424042040018441842229012298563828D320020040022281230141A32112264D3
+:80858000C04400285200220048200848004C8282020048BD317012081A4482049044624A0244418C2202000013942671114C11810C15040020844228C241122621644440012244800200000010025F120B4F22A4294CF222244638444A3428C042204236426815A2268C011B224326025D554CC22713D4421684C4252AD242064534242641
+:80860000A4224F4262426E244CC43436C52411EA38414744424B244B68223AB874A44443D81498144FEE4EB242121824143238CD241AD744F334144A857244A811413A94188B234E3146014E415F52A422111B421AB7647153A51212486245A242204434125E5148114890C422484BA8C84848224AEC8485B834AB44C262BFB40818222E88
+:8086800012414984B3227144A6464A2242A242A42B144A9144426B42D031D6458212722431446517A1724F1432641D14414A84D24186420128414B26624A26B6C48E82045B8AA6A48449A2284C63884C9848484FF306442200002002000010445184144100000000000020021001111001111001111001000084400884F0162CF044726FD9
+:808700008583F322262F44E462B356F678684B555AB45425E2E6F4564C6F45E715F6755557712B551F16F625271F14E614F667651F16C4331F77B563F731151F56F371613A056E263F14F441411F5232213E514E711F14E644E656C24115B1C4FA81211F5E2CF481C12AAE6E4F46A2DD8F8BFAD888878C8E88CF83F26548246F26F7367895
+:8087800049F32666AFC4F4283EA7854B557E747AE74525E2E4F6525A2B554F57F57151DFF3F376745F56F661613D611D215F57F761611F38FA37133BF65F13F761757AB631D744F46167A5F844641FD4F625243E314F557141F141614F57E317F565251F5CAC6A8A5E55CAFC64C4EAF464248F8FFFB8A84F6F7E86E48CF86E28CF570D6C80
+:80880000F312742CF32226EFC2F27C7E2F44F678683AB354E64383F24862A7212B551B658F93F17C4E7F57F721215F52F243611F14F465751F16F661E73F31F532743AF331755F57F634552AE262F6666C4AD64146F134341B544F42D251E245F17534AA7A41A5A64AAE8C5F54A4224F48FCB4948F85F574449A9882CDC44F86F7A8FC24EB
+:808880002D36AF41D124F34626EFC6F63C3EAF86E647A7715E343A83F24C42AF25F516541B574FD7E5A3F173715F56B421D655D615F265745F16F665E33F31B1F6A7371F55F774644F53F764241F66F6262C5F54F4296445F534345F47F725254AF674345F45F52565CAAAAC1F1C7C45F5C4C44F42F2E4E44F47A1BFCFCFF8ECEC6F4CFC30
+:808900008CC64F86F6233AB024012A01238214048004400244484C82C42411446044114E242014C224114A22022242002220822482048220088A048A84A24889A2418B248283047F9809A228242862B028811604220084004A02302130254C02302510C424A021000000000000004A0888822088220812188048F165ABE022F41124C5F27B
+:80898000112483F41124A7261D24AF24D141F24A9219B24A19F54A9253F24A9157822F147924D812F924481CF9244A1CF8244A16F1244A96F1224A96E5A2E449D2A2F491243CF4912485F39124A7141F49724AF18124AF14D141F24A9119F24A9151AF143924AB9443B242792498924F8284F9244AAFBA0727A21F41D62EB411724CF2113E
+:808A00002C87261F4172687211D468D841B648BB15F64A8253E3247835A8844F82F4429167822D914FA2C5914FA2CC815F8225FC261A96F1244BD651869E286FB2A469CD438AF24E119A724EA129EF1281F66A954CF24AB128AF5429F24A9443F34294A6D842F922482D94AE5A3F9B088480040000420044000000000000188008800140FF
+:808A8000014008480000000044000000000021F0BF5410922425C834C32421322220820100420000138202004002C014809224224F2401A021412694644449441444048001004449C28422414C62434974F304462258240090121044042A2401812001A312042A64412E44C0244226263224182444A0612A14020084601242488222C89065
+:808B0000C441880046088CC481F0FFBF80346681C0441622932240142462433048200184282C2222E141024338426C922426A4121D26281889C4624A4184E24442C8441C42141424A21E00414004842449A41A43F568B9100265E241120800412818480000002912054844482002200100444D421A02284004444024848408004E84C084B5
+:808B8000224CA84244264804CFDF08200128004014A42100002042240100120010010018003024000012188400424800428220024881120081F01D6A00434206491684A2123880A61242189016222822148C766811080028F021146C7624280152681228224448281922828282044008C084A041412684944442FF55078041064C44044C34
+:808C0000818223842284016B1244384011F8284100400120A225278212905448200220813221A02448004200224908C0148024045B68004902282820823214208201002002282086110800226051444100222818206241488420022242008608004289054302C4485F7C0D814382024220A41280912218281142003800902218485648042C
+:808C8000324148142021224722A324184C04688184448924044C04C918040042443822BD3E10824494242002C02446044384312820628510982800412D241220850420D1410210880142258422418831418182412888202201824460844812CFC30324002052422800002810020045220190180000918126381821814004001301840028B9
+:808D00000040010012100422180048DF834A028092242822686042642818102824C2586C018C028983018C048B412E182250128118443220012564C6188C86415884481420043A48442498244A11A86170FF0D86C22441602444A021A04180C61211002092180040B4240441144885C45812430222422C81E2122101008C6214908848300A
+:808D800084508418000049042AF48DE124282A010028180020810600301400284004104408302C00200211C018122220426442144848620000448084120CC1F0B72E40022C0228446042263424C0140024382228221880C3240041182840081218000011184C122404461404440011001200202424F5E9B520088002180000221818001876
+:808E000021800200180000302C2081020000121084011004000000004C011004F059FC000000C0241812182014848201806181606320624120111424011004432101C04520011214A024304141110000C0440040F4AE7300168242222201444C0248002141A02100001840041400182023810214800528C02C4889028D24280010842118EF
+:808E80001828024440F14357404428014480041222182082020040A42100A4000022000012004081260100200210018C420100004C268404DF1E03252242026042200200284002002211800141400414471111490100000040110141111508408802001200001004CF3908200822004442000012128002124220021800414508800200006D
+:808F00000080041828412220041411000048800490449B4340488264244328880210244204282A011081618430243184181588D9810181114001124D18800485018180048942148802100830440021149FE10A218728122CA22A1841184391145AA254006301282A01263824674226494C54894CF1141C8D1426081260411F111124812120
+:808F800031184F41F11C44D01956488189145C18008D9430444144484D454F44F4667C4024CB2222414F414884E6420122223012282CA213125A228183C214184114412E2149524832441A0280A1141438174289024D24444B6428142601511810688166A442463448F0276C2426923223924225A4226A732484E24282A1214B13C0123AC9
+:809000004194214F928127A1114F21120447418711113629C111382A010015F811241B4245212276293164226A3461104101208184364C4180F178FE4004442200480080040041244301518100000011004440044440C4114414004814488004004110041E4814844008FF1B0E2CF236344F61F326644CF23434584D241E344D243AA36786
+:809080003654642F21F134264B215F51F175558F87F3343636F41D19418558448F81F1111D1F1151C45F52A3324F4353445F51515145FC34355F53F321218F83A3228FC6F6292885A8669F925641D5CD21449E948781C7C14B222E28C5187854F89ADBD066F276744F63D34616F434342AF714344D241E344F42A2331E3665F616164D1646
+:809100004B111F13F371514F47A3326743DFD1D1CC51C85F58F818195FC3FB1C118F82F211115F53F324241E119F9151514FC1B531A2228F83F3282CCF83F36C6C1F1252C8CFC6F269299FC252DD55E541F1989CC7C112DFC2E2E6F64E4C85F4461C8BC4F024266F4367222B2245E443A3554F42B214D144E247A7761A7314D646B136F304
+:8091800032343E311B448F87F334346D34DD3D495188DD8D8F91F1311D1F12E281F1313147513A03179149F111551E113AD344F23C3C4AF6292CDD2CC5EC44D699D611529955054B998D184D144B2289944E8C94544F1C022F22F232723E32272645B434E345F524244F43B124E245A3364F217112921269F112142E315F45F45C3C3AE305
+:8092000043F33D39C55CC8DD8DCD195FCBF13C31CFC2F211113E214F435345179149F119155F43F23534CD2DCFC3F34C68DFD2F26525C5FC686C9F96D69D52DD15A111CF89D9CCF148184F42F22824EF44E4E4F44444DF740B430223022302411222122212002041044480220100408481921428490149014901189014800143024048012F
+:8092800014001008830481F091C420880244412800181604281812642218802141343489014018081220018021011260418190181934482004814004852441840400F05376D022F4112487221F4132481F41324A1D64AB141D24AB9419B64A19F54A9243F34A9143F24A9147822D914F82C4914FA2C4854FA264114FA27498E5A26459AC56
+:80930000E449C24A1F49C2421F49D228F1912483F49124E3F48164AF14D141B64A9961AB9451AB9443B24A39342B944F82D442F924484CF9244A4F370F2FA2D441F62852174183D641B22AD141B64AD141D24AD941F64AB259F24A9243F348915392BA4B422D917F8294922E5A5CF925CA1AF8214A87491F2264492E4B96C54A9E2CBCE475
+:8093800048F628539674687191346E8AD41AD141F66A941D44ABB459B24A39B4AB144393828CD442FB22482F44E9A2354E008004000000400400000000000080080000004008000000004004280000000025017F3602962202414981022AD48421321200184212160481445CC16480022230284D21D04201908841808201261104004008C8
+:80940000120042009028288482F0FB810086240800980041808201001128608240A841844141001A04004C042084110480011400004241400493024442881483E2650412660448412892624126341428262481844101847015528458324443088149034C1141C4888160854301001001100C2E544120042830242E424061837FB50F2420D9
+:80948000488401008901218001004C21024782A0424008222062142400424084840260121604000000004150814008868808DF7F0E00400412800200800100000000000020020080020011000000004200480000000080C42800288002490244200200800820820412002E4C2822008004488024211402008094241A0488280088418828B8
+:809500001244203284445F5A020040044B21604200001820088022041800C3022820024200280010030080442404C200004480821104604841A80022800200002200000000000080240200008004421242000000281800222024088800002820F4A3230000000080010000001200008002840050482A04288100002800000000000082805A
+:8095800004008200DF594D828282420816081008000000002024814208411054480010840100004084010042000041100400408424F2314A0000000018008400401102000014800200000000000012410018002800000000400400F0A6DC80024008890140088400002100202401262812045048A0242082010080018021012002001024E8
+:809600001884044400003F6D0721282200001218000040011800001302100844504800418100002244410000480000000000308442223C0D0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F80040000004004280000002B
+:80968000002180018800004001400848000000004480020000001002183F5F0B0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000006A
+:80970000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE008B
+:809780000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000100400000000280000000000000000000000480000000000000000C4
+:809800008F6E0E00000040080000000000001004000000220000400240040020080000200A200400F0815B0041188011280200110000000010048400400848400200000020028004001200800840084220047E2A004400004008000000000000100400000000000024004C02200482000020A882000000F0EF8D0080011884220040010084
+:8098800000000044100800812004282100000000000000120000008148422004EF620500000018008400002002803214000010140800800400181A1284220280046800000000282A0410089F570DA02180A2418C01224160812200000044284C82246182260441604622130443644212002200224A820200A048000026A84188898804487F
+:809900001BAB000080842101000000200210042800220084208602424822002A21220280840248008200002228C2811008830DA012808241082244818321020000809234444212814C12440444601440148481014480828282042800480000814A2182280442AEB80042001008188400800248004180024420241204220011134404A042FD
+:809980002004280000228AA42444624818420080240CF01924004344082244002005C18B210000120000001200000011202212880400000000C024200100000020F15AF8800100008400418428000048000040058082040040044004001800222848120000000032220084F0B49280018180124408844345688212800448188002501442B3
+:809A0000284C2204001142004C2202800120222224810420240148808102C884F05531004400400812000081000041001004000022001044240248002002008082880620240180024200F0C6E8000018100C000000812014040000000000801404450800280042000020049048000030480022F051AB0022104804208212080028280010A0
+:809A80001C011018011018A424281005404141014A1291412004141C02C011848400000020F4FCAB0000001841412A0449820280040000100441000040040000000000000000484200488100004822AFE50B00204204001828002228B0451225021008486880044828004262814848804408224218428C05220080428822260228006F1DF6
+:809B00000B8248608440C828815618088484812200000000800442100480440480040040210452301438168421812121014A2121011CF4BC552021A14100001220040000411044040028800100004844801668820000C0214228004442800248000022009F3504282228223820110400000010C121004001228413044C9248190683922825
+:809B800084131201282866A1241001111312111858818382A2424822284828F0AFE900102831184C312489034A32288400000000402422010000445428000000110080014A0148000080813118004A015F8D0F26082A04200200004C022848198202800210624418802854411148C0418064822248008460828002CC011C428141C84881BC
+:809C0000208411028FEB0128F228814B3187C1442E345A436842890284224B4441491208844470248404008CE25462544D21474685A8440028116822808281826382814295A1216AC4588185081AE31224B435048032283E288149B1182291482A12688281A0641F4212410113024189840280F424444F143421484E448C8694281D411C4E
+:809C8000022A12B14126F4515842835515905483A11226D888A1266AA147182238489F66043220A114442843528C228B4428801208145C22524400142AB25144E8141428644249146482812815A1262290484641996180D611A5421B71421D5984890183818423862484F2BD8C004088410884E08104844008480044841426484148414893
+:809D000041C8218450850000005018501810281128011E481412200112202124016F17071AA33189A233CCF134342E2C47415E58488CA222260C284D2445F4212581911B22C7C29D21DF42B221528895511DF028288F86E646E646A6446AA6662A52882AF261681F96F649499F16F768689F94B529F221291215D199F128288F83B228223E
+:809D8000E58622A5263AA222EFD6092AE282A6223AB234F224244F43F324344A21B424A2224480C22445A4229511F9292AFD2D9D21FF47F729289F9C5C19DF165C8C9FD2F26D6D1F16F64C6C8D488F84A4662A56889D491F96F661699F94F449414AF4414195F521298D2895D99952888F8252886A628446B262A2442B555F7608221AF7A6
+:809E000028283E38CD1C8F43F32C2CC7438F87B728F6282C8B228D2881504445F4252545E812528877524D2C4F5657CC1F144CB864F44D495F46A644CFD6F66C644AE482A6221F12F6212185A8228197141F92A3371D119F51D791A73117919F91F128388F87D388A1558D187AB362A513188F290FB028F228288F83F33C3CCF83F32C2CBD
+:809E8000CFC3F378788F84F6282C8F82528C8528564445F5242455ED1202ED2C5D2F4F5657448F845C914B4E5F14F4296D5D45CFD6F66C6C8D481D486A7621F129291F16F221619F167249F151595AF159599F13F731798F85F118191F93F138388F87F778787AF778787AB372E723A7549FBB042220024901490100220000C024001008D1
+:809F00004220142114411494282004421400004081044822004814840028800228F05D432008002A0118281848000042110000003024000042A024430200222002800600408102008489A242A04200281CF46C2EC0421F4152281F41B248F11124A3F41124AB141D64AB9419B24A19B54AB924F44A9143F242B147822D914F82C4914FA2DD
+:809F8000C4814FA264114FA264194FA26459ACE449C24A1F49C2421F4952281F4932481F49724AF18124AB141D24AB9419B24A9945AF143924AB9443B24A792498924F8284F9244A5F2A08ACD541C6521FC1A2141FC132421FC132421D4C2F44D9C1B262D985929A4B42AF1419F14A945392B23F82D44AFB255289F924C28F11D824F4980B
+:80A00000215F2264494D4B8F19E2227491CC4A1F49C6439E2C46F1912C271617C9271617C12D841FC1F642A15F81F64A8143B34A3834AB8443B342783698824D5A3F850C840040028400004480020000001002008800000000840000000000000000000010029F2404B0220129830428001800001045148112212104282241202424212430
+:80A080000222414812002242424818001C0448002848CA822201128394C700821200841200100883040020022284288044A84230244382922148C144162202182084C228281024084A08802209008334141C28F234A9004A22B122211428010045088B4280424424822262A1222061824B2C80E242A4121B42190249921C424A012024C245
+:80A10000282812414968142A0480A2924288281E4A441876F898FE402201002002200100001110011180042A040049040048850430228001224842480000884800004A02208108476400302200000000000000000084282A042242481004301820011024611215382884201108004008220000003F9509806181188CC13832C0182A012230
+:80A180008024211219E8840248380011842812222026239444221A0228282004326285015248830882004880041A22F23A15001283218121A31200220020042814844608200240618248421084A41246082822001091498CB218221409121008830880044280032FFE0C408202818100898101220018400822209418282A048022810222ED
+:80A200008031441218C024382200202211888424080022000080F27E43004810084088021880412812840300834208B048220500842840840118814142803518480020084422816A61820022808122F51D11004880228101180018411826084028840100812081045200904144892212283248814004490148304816644200806182108809
+:80A2800002127B362001000022608142A0240000200230140080022002442082044112002820828202180020082004001220048DF820011008002A412824018C410800283028160481682248804288024C96148141184481838231244AC2148085086048842266088430183862F0B8B6000028181283021812A0610044328148181008406F
+:80A3000028048005410042221A0228004216082800C04818001A041228220080B4930A188C021A06188002A0412001812212208184060000848021820118421828181200400818C126080000284400488001CE478002288422842884400820020022001880028110080048448410080000840060442842120022128412A0218002F0996701
+:80A3800000208284011088C128000018008092281280022004004008410060822002262404101824220448282818000080B6220A84000028000000800148200220844488840180048480840222228004100838000080020022008004B0E4078A021008812838001220018022031241800220040018281885840118A0251830242042182834
+:80A4000024618300000020810440F12BB120012001000080040028002248182800802114880444484248422004480080044C0528482868A0420000282002FFD30D008190281281102801120020011281002004102844081843A212B02801180000002002004C0180018418802102F0DA2300280012220012188001128981011822830280B3
+:80A4800002480010381C15684126A42120012248263428A012284420242404421881802282A45222CF56098480840200182002448984020010082014A21418184A0820A442221C042A440848104894288304628354488022048122000021F073E420628889E28294181638288483618158128B1420218523F128188C25A1248C3248B04822
+:80A50000152824B164F714246AF1142489218121242152848B22488C9238C4485E181842685AC1281684A1232AA54414421F860AA022A0142A9228B038028B1280818231282A03384AA2214A84840440081078187448F8144C423E686AA2418B332A81241264843AF444446A6484A04248800289021828A016F0F92EA03120B21822A112DB
+:80A5800028181828522021C118202322312C2A2222A2414A044E488C8441E81295282A2584A12200D04842BC28921832C9F228348B624304422AB428E1820120A4221AA2225F2D0100842284400816080020240100008002004210082800410020020041008400200148281220011200F043CEA0236AA222381E18E082A2238CA1114AA5ED
+:80A60000118F81A14587817AA7332AF338388D584D544AA44420D4880489F418188FC1F15515188FC4F158181AA7551AA1232A322883F268488B62CCD644F278788F8222A5444A84B428B228A223A0417AA5576AF6E4FBA0232E68842A8682A2223A83A1114F45A5118FC1A3548F85A5333AA3118F83F338584F6131428F84F44A584AF4F5
+:80A6800088C848C88F81F1181C1F51F1191D8FC1F358193E785AE581A5222AF22824CF42F268488F83F714744D648FC7F72828284A24A42783B228A2222AC2622B555AB562F7E18BA0232AF628288D388F83B318F328288B238F81B138E341A1118F85A6111AA1763AA3133E188F83F754542B448021A4C44E488F84F418188F44F5151560
+:80A700004F11E145F138181E685AA5513222CD28CB228F84F64878CFC5754CF4785C8F82A3354AA4442AF7383889A1332AA1132B463AA572FF350490288F82B268F238388F8153888F81F318188F83E341A111CF8585A1553AA1111AF118188F83F754542B4624A0444AFC48488F8CF41818CF47F5151D4FD1E341F339183AA7558B313ACE
+:80A7800021D2C8F22C2C8F86F67878CFC5F76C6C7E788F83A711A0447AF738188F81A1333AA3752B663E522AF67569A0120080010000000040089028120000810010889128224220840122302420A241438224C2488004008428A024A024F072F120082220022A21212201800118800318844A028B2484C0484220941480654526280128C0
+:80A800001810481808400400002A140800428041F18DD7C0421F417228F2112483F41124A3F41124AB141D24AB9419B24A3915AB9443F24A9143F2429147822D914F82C4B14FA2E414F8244A16F1244A96E1A2E459D2A4E449C24A1F49E222F4912485F29124C3F49124A3F48124AB141D24AB9419B24A19B54AB924B44A3B242F4479249D
+:80A8800098924F8284F9244ABFA209ACF4116426F2116C421FC132421FC132421D2CAD941D64ABB45F81B24A3924AF1439242D912E482D956D482DB14FA2E514F9248A8F11F8244296D1A5A4294D4B8F59C24A1FC9E2A2F481448D521F49324C1F49324A1F48B242F1112CAF44F91124ABA459B24AB934B44A3A342F447834B842F8364830
+:80A9000029F9245A1F310F848004000000400400000000100200880000400140080000000000000000000021F061250029014C022800222220014820828126812414082800004200002218441008441884401C08124200220000809424F0B3C900A2CCC2124840A821844038288C81014200418416248222A4246280226142904410180404
+:80A9800022448921227441A421008384648120741234348D6448414B4160114B24AF6F0B20C528414222842AC1282245688236280428186041424502221A04C20048001304899218444A12084C2264145048814118360846922412452844E421044B211E4497A8408212A4212100000012200148A04240A8142608224A220222124302410A
+:80AA000000440041160812C11A023048484200124CA24200444820F25B9E0028210020028110880200220081A024200442000022444183014A220220B12441240680042044082220C21449840281B0A701001200228023011A1408200449942822284422282A84820628388004624112882A010028440084C84800904416C488A8208584D5
+:80AA800024F2E56600281800222880014A8102202412C42822222022A6424868802283820456188422A22180312422220048000030249028438A84242404AFDB0B0021000038811048080080048130640020020000444128A01488002011644400814A28244408484C21881184038128BF1A06A042A0120048810028402C024028040000C6
+:80AB000080C48881004860443088488220044C010020842444041A044200008A0183F51DF300482820020048004244222002414008444820018A2404850428490410882401604181121008402402004B1488184800127FD404246011004034148418000084814100121248200400000012184400000000202301180000001240082608CFCD
+:80AB8000EB051042A112226044C96184182800102812684490181248800484898404CC0476C45482420012406441811812568804001A044241828084992883F4EC6900282A010000008014084048040010240442000000004508880080010022001A0400001A84211108002F3A0B000028000028008100000020820420420400412002002A
+:80AC00000081418004401414884408838404000000424FE40C00810081890181302800008120120800488044080000488184480000008198485800180080210441188011F4FD6100009028180000000000100420120848224842843044002014880400000084A014801404418100000084EF680560462004200100008002008140080020B9
+:80AC800004800240044C0242400420848404188444408401808484010020F11A11308484200100000020140880028305818092688182444120048C3448000044848304C048000000004200840000AF1A42420884608128844008844480440800A024000000884822C084490200002004C04860414412202104200100430112E0E5072280E1
+:80AD000094283018302830884318180C101808408818A8840000800448008088080000804188051889140858100418802104CA4AC2244100002220020010882202812810280A10C814432482648242444842001054840060844008008C84030018444924246445BFF90B8428482041040000448002200A8004422302188100282002548197
+:80AD800040088C04000048004480820400004018024D12244D24834898282AF3182C3E188126B828588481000028898282A422484A22A422CE1445142C44CC2466742404200C8147448984E484A4D1C3F1145416842191184688A14520D18431148C2191147FB608224420010000A082008428840020146888C0488B4441422A02209464A9
+:80AE0000895488CE4800448420048484848448C784CC0444B04404444248484C74FE0B214B6281428781188128811008C784831438288B82C48F847128C88883A6C22284858884A4624B464B488446A8440041451828048183E444354858802584A7448C0118C014A01483F5775400001820020000800484400848892218288802810000C2
+:80AE800041008188008441484008844100842001000000004F724152464485F838388CF23C2C87838F8272287828F888A88D2800818F82E288DA88E285A766224EC8F068686E484F84F444444744F068688EA4CFC6E2C202CAAC445048F0484848833418468CA1155AB158A5555AA1554AF45454F01C1D4F44F418585AF544447FAF415223
+:80AF0000444FC656888F835788CFC37138A822878287824CD288B268068912F888888D285AF7486885B24AAC46AF8527F4CC144F44F424446AF46C68CEE4DFD6F464448F947448288444D8C474482864844A3448CF45E145A1158B771E585AA7444AF41454F01D1C4F65F51A585AF546441F5D487226F4246485F838388F81F23C3C8F83EF
+:80AF8000F128288F82F228288FC8DA88821258888B228F88EA82E287F76868EAFC42C8C88F82E786F444CC4F447444A4628FC2E648FE6C4D47C68F84E48CA88C4885048F8484B448B4C8ECCCAC511E14F058785AA5444AA4444F45A511CF81F15454AF81A5444D544EC52467424F4256883AD388F23C3C87838F82A2228F82D288D288B21E
+:80B0000048B448742858888F88F828287AF728688F8EFC4AC86EC28F86E786F45CCC4F44F424646AF66C6CCEE4CFD6F664249F84E484A44450CCC7C48F84A4448F84B4C8FCCCCCCFC5A5111AF158785E187AA5444AF454541AF11C1C4F45F51A585E524F44F4A68D30260000200222000000800228100828100846044A02284322044200D2
+:80B080004008008C040000480000004400F09FC62008818440981884811008810080024008A024004800004E24224484000044800490148C0412890120A1141218121880014F2E0B2CF4112487221F41B248F11124A3D441B24AD141B26A9921AB9451AB9443F24A9143F34A95478AAD914F82C4914FA2D418F8244A87114FA264194FA263
+:80B100006459ACF49824ACF491244D421F49522C1FC932481F49364A1FC8B24EF1112CAB941D28AB9455F84A944782AF447924B842792498924F8294984FA2B43904ACF41164872215B46CF11124A3D441B24AF18124AF465141ABB459B24A79A4F84A1136D85AB8A4F44AB163DA1AF924528DB14F22FC18812E4287594F227418D534FC89
+:80B1800098252CF4112C4DCA1B694D421F8922F4916C23D4C1B246F9112C2D841D6C2BB45F81D242E982F4429426F84A944782AB9463B24AF9241A5F9C0E84800400000000800200000010021880080000140000000000000080020000008125013FBB0D4441800200441008402804004440A824814248C024400846A824008120240200D6
+:80B2000000428384081200001816284C240242411F970F2048040084120081201888018902C1005084284142285084284122004604C0288100818022840248428144838444014D18874494F06158403444442200844C0181C19088838403844484E02214984448444B1C2210EC84A242190281C1424AC228000048424A9824124242894293
+:80B280008414881454A4C3D4183414EF2F02000000000000000028404408102802224008400400420040081008830200000089A1411C083800F01B942002211048088481000000008444A0148481844200000049410420020000622004008882008845188884024A027F970D4A01C02212228C81026A21E884010010AC42818306522A0560
+:80B30000286230649024432202440060828332284008414B81A01812008D14CCA22C4A02488904C83F94051800102A028181528884000041688448121E4866182804800444414400000040084608488604988A81084D1849F284680068424888DFFF044A02212818818981022280050010481834284280012868902480222243140422C02E
+:80B38000288C2202281084010000C088906842402822F477FF802146A41248002218818484162402811400C48128002828200220424444C442858241889228421200442042A41283240130882826A81489A46177D14022542880084183010042442A0422400824103838211200440000004483084280018446C44822818941742408228203
+:80B400008001488230181F5E44020081860C008142121884100C4841442001004884180000222422000000002820840500001244800100F07A66D0220185B618C24840A421128184464888442C92410085361889C238A02481124C0200282422488001228C216481418C6444818C024D1880A381448B8128424A0183F4F3D1002800410043
+:80B48000848148181218008450844400000022000028414441442D82100822006880A2141200830400209128828324E2B2098001A02484802402428021A14189011212008002812004004984A141C01412188141C447844218008184008322044C0896240240F4F44A80022812808401A01622481008A04200A012188002004E321088221C
+:80B500002402289024A0214820018002280048418988042A04484222EF2D4E020000100218180000000010045822002001122200440042002112002848200648000000100440F84B88200148109818818906488032688183122821022242006082462A04A400004C34488C02200428188081C1148364422880911400189884002B4120888E
+:80B58000012003008062821241420084802201840000200240346C4480314444C0244C84E1820448008004484130A44C232A1488054F6B078420018190382222004481188100180080142204802104462426015200A021004880258288010080848104800920F423C38042880200481800124200A0142A142484042858808404181AC418E2
+:80B6000012802582828193441098280020C4882A08882008848248288800AF1D02232482A161181200004420018004480012001842008542021084C2264841200218412822200F004A28084308444144821441AFFF0F16488404604222A04180644148281A242201124242212180128808891204281412448C12C85418220048288042A4E1
+:80B68000182818188C14881401422388F1A43CB022E749A12290288D5689B32824A4428982B548B45881B418B428A61180A344482A06878430428CD388D4C2E243F254144E4447433E644B444C61C32F41C244160C586AA4962AF328284B74808DE188994C4CE845C754C246C1242F350A12898281C21860854A810142221E28848F878110
+:80B70000A11149A211442C2282012A76488824E4211204844B322443E442713488332422CB222828128A74180488C88441160462AE81BA8AC4C1814F314F0220A1513AE4812282A2235AB3242595140066288424A6441AE185011A06481AE12394128B414B442A26A1748CA12128414AF15C184AB4782587A2218CAC8420A8245EC4C3E47D
+:80B78000CE981441418D88184B411D4520240222208204482001008002800480220110080081490141003024302484490100608800200848448A040020F48D89242B114741008788CD2C8F86F66828A0118F87A7778D188F81F148488F84F558184F47A3331AA1118F83A7554A048CA4448D582F25B55AE544F4585C4AF644666F41E34523
+:80B80000053AA12283F474348F84A4555AA7758B3189A299CAA4514F41F51454AABA34F33495CFCBD988A8D94F42F2CAC5243AF314742A825688C5FC28288F83A355528FC7A6778F86F518188F87F768588F86F274347AA65524AF8724A145818BDDF0189A2FA57522EC42F4595D4B644F71F4766C4E444B441E344D648D442E3887845A72
+:80B88000A5315AE7CDA7EC9AAB4CDAF154544F4165484B7B5F4BFB9C9EAF88A8DD6F46F32C99242B774F41A7221AF24888CF45F368686AA2555AF1486C1AF748785E588B448F86F178384F45A5517AA542AF82A6774A054EC85AF4387A2FA5F75E584E448FD5E544E664F4161C5E144CF434142AF258684F45F758184AA2446AF558548B3F
+:80B9000064DAABCC5AF5C4D44F8DBDE4BE34F384944F49F94AC89AFD2474CE82242B764F41A3225AF35818CFC5F3786887867AA5378F83A7738F85F518188F87F468588F87F374747AA7576AF47A583AA15687828F85AC458FAFF7527A6FC3E346F7585D4F47F775666F47E745D544E642F374248FC5F6447C8F86A7764AA3778F8FBDE866
+:80B98000AE9DCAACDD4F45F5DC9CCF4CB8F4FFF4F4FEF4AF8CEC2DFD44646FC502218001188C842121028004480000200120048120849128292124024B12A0120090148422482248228E488004480044928D248200AF15070000424883020080140889A14180840100422200004240142404461424118422840212200100001285240200E1
+:80BA00008420F236CCE022F4112487221F417268F21124A3D441B24AF11124AB9419B24A19B54A3924AF143B242F147924D852FB34481CF9244A8D814FA264116FA27498F1244A9E254D4A9E24ACF491244F22F49124C7221FC9324E1FC9B24AF18124AB141D24AB941D28AB9451AB944782AB9443F2429447822B944F8294984FA2F4B565
+:80BA80007E7024FA114487221F41746C321183D441B64AF11164AF467811BC4A9A25AB94412F144BF842B54D48ADB563D312FA245A8F14B924F818816FA27498D124F488254D539E214D481FC97226BA91342C1FC936461F88B242F1812CAB141D242F44F1112CABB45B292B844782AD1432257424B84A7936B84AF92452CFE70184824871
+:80BB00000000000000280000000000188008008044010080040000000000000000002501DFC5062C34142001A18004A280842401208284B21C2401490240224468242081115228282441003024424142430882000092414441184142289F940A188A6242C11A828202128440081001008C014A2204002284424332284E22224624440428CE
+:80BB8000242002222A044E28228B42888004221312A142224049F46621C042430F16EC224188228431A84142220000423846EC230420018602D02464821217234C64848D2424660400432214042E8441222220048A23024C6622C049321FCC0418302400280000402824410128102801484C022032488C84024A120224004002222082263C
+:80BC0000C448228E48880000455141801104414BE90011001800A01200001028010000200400008004240000440000401488A2840000000022A884004F8E0F2A8112C23428623064608428000022818B1480829628002002628012241444B4240422902C8012E48423B28C24810580B18424688148433144432642F4D8B18041024923822C
+:80BC8000064A221288020081186084002A0448000048801224440444C0245048200242228C88810400428880044CC46C00178C2062120012004118480000804228012260820080022880041012A42400200240C43C8166A484120012860489012E142A082241BF410A184A0181844004848110C82800301100810084481A146886890442AF
+:80BD000048C9C228289028E08532288481284444C12122CCA8821258460480210A3212FFBA0F2004304422004AA21400284881C048420000004B214002488002480089840421444C41882181223A48442A010030144C064024F175FD0000122001000000000028221741800C8100200281208101000080028A24220400480022824483028B
+:80BD8000842A18088FA3091800814784324160848410488814088924028D15800C814C1668A48B2420247418E482250248C038A3C2248D148C8E6144C18AB248C24888181A260489816282A84781B0C8032001120000221A040000C0114828001088048002428428220020020081004C828112028812004C18C4244B418880029FD60C21EC
+:80BE000022212222002222208212088480228424240268000020D2844248180410840428810020840C89280800004084812828F41B6500106884420040088311084608810000000010080000004828400400E08482034483811308200228281A021812F0966140224102902842002200002002000080648220028304424C04008022020040
+:80BE80008D2428006848200400810080A84200BC4302200181000042008006002A044A022280440826880200482810480848800240B8188208883694882008490818482036A43FE30FC222802284042210880148840048000000480048282002284884220022008004430428424842008A04480000F09A32404898424008001840080000CB
+:80BF000000282002208101008004410000000000000044008A028004402408122F340F28801288026842288012480884812200008422840020841434288082044122000081528181411200168822011888AA8101F03881C012121800480040080000002228000022812289142804448F4234440040248224820266684349220492460800C9
+:80BF8000004C1AA4429A34E4EFC7082628E482046082268864842A042604282828842094288012021881A800A0244001C028818C2402000084A22E44818A0288A08482426210028FF6022B328B2A2F82F328486A86A6262AA42689E283A222008528A22220A266E08222D4880228228B6448CD642AE244362446084128812A220226B81845
+:80C00000727844AC46BE585E88A012288084E1489D44D2C8F076CEC04229211142688248288961861860848C844238486842A022A06248850885084A22724854844C86A4222826AC224828228B248CC5784BCE452894148F84882888E9488AB224E24881AB174F4452AF24602581288183142844881458888183048902626884002007873F
+:80C08000824A668220D484342842406842490440982C48624189A2A1A88B688A14A8824628A484127AAA4282BAFCDC6D2014024008004820018C04848004000010088110081024042002430222848024820486286281200882288A04122041F4CB99241AE52242A8228784878485A8265E184008878685588885784828A2468F84048578E4
+:80C1000028F838282E2826A8466E286AE64686D484D4445688C0245088228558884E482AF23C2C4F42D288FCC8F88B4CF01898A0D14AA4914F45F97494EAAA6B2AF253B2241AF1726285B828F248488F84F248486AB2189128C59C288D2C85D888722858882AA2228D4824AF82F26848AF83A7228BAA8B228BE62AE646964C5FD2F42424FB
+:80C180008F944448E442D68822528887828B4489F77824C57468FCE8985E688CF41818A051481AF174B44F61B982A9672F46F73129245E522E62818B226E688F86F648482AE287A3668F43B328E284D68854888F82F268682AA4448F8404AF827228A876842E882AE286A2646E644E4C4D6D4D648F84E482C2244B6285A822855888842A74
+:80C20000F234344F4AE2C8E88CBBC8AF888F81A92A9AAD4EFAF95414FE442BAEBABFE4F5B74F245E722F2296288B228F86F668688F84A6228F87F768688F43B328F24C488D4883F228288F86A6624AF66848F02A288FA6A472848F82FA28288F8EA6646E64C7C64D2D4D249F84A422444F42D288A222008F82D288F33C3CCFC8EA8EEA8E7A
+:80C28000FB98988F88FC9898AAA2D9AAAC9F4F47FBF4F42BBAFEF24F4EF47BDA80010080044800000000002880024210084280024241000020020022120000C048008004824420043F320182901A10880400841884810084002082220284008100484484284828430200C028814883C2448326010080220280A342384712CFC3022D421F67
+:80C3000041522A1F41324A1FC1324A1D24AB141F41B24A9921AB9455B84A7924F84A9143F2429147822D914F82D418F9244A8D814FA27418F1244A87194FA2645DACE449E2A2F491244F22F4912487221F49324C1FC9326A1F48B64AF11164AB961F81B24A5985AB9443B24A7924F842B4478329F93448984FA2F4C4ABF0224A1F41362A89
+:80C380001FC136621FC132621FC1B26AF1116CAF46D8C1B242DB85B6427924F842B14F82D41A3924AD916B42AD914D528DB14DC28F11FA244287194F22F4D82526FB98252E4217C94FA2B491E42274913C441F89326A1FC8941E1FC9F6628417C12B245F89B24278B4B84268892F44FA344829FA3648214FAAF523AD0080040080020044F5
+:80C400008002000000108202800800001400000000000000000000000021F0FCA200222210042220026284124812A024008428812242004302800442222A04100460894A32480020332888186082460818A0282084E2520E4A2208802112AC42A0422002002890188022A46820128406186826282221042242204282041A62444288C220CB
+:80C480000442484449084430641441BEB2A0244A023014224982822292248322838481223618C02826828AA24341A24302304830512842892264442880011E2800884BA4222A24814448148411642A43044B21CF130B00220010880448420000000020C448008004184A22820242220000B04A8826C4444280418808A04283240800224211
+:80C50000702A0800000000628400000000A18002000081004828000040042082120800421A04848100008C0400F0AD528092124542025218180028284008582884200452284A12280681269238848086022061423014A061A042E2282E88488A84A8284328136448833224812E489F560C2412441082240110082200002800482200222041
+:80C580000284222D6889026228004C21022A21220468CA22B628058120988440C444222884684FF706224002200118628002400852401A082025821488440880010000004410048303002088243C8828A021C08884414078E8464204846180020043C12428283018402801008B421281128095144800808106898231444144228001802646
+:80C60000A24926084200823081422272350A200489324482204208C41228812002484142A4004A22010084002840088304460842C0218100860CA082812A688283024822492221D1D404001A820149C844181A24048480150448810012008002100842304822212200A0210020C24820010000424220420110F4A7E840042E18EB124280E5
+:80C6800084321842E082014849819248102424212291682880D44881240489A212812848128149C24422206284A06922D2891888A242892688868882B144B2D307210010C42441124216342800161808E0810410C848000012100880042B422002411200266181008100008A140800284984022F250D1E24412241836182830230242A040B
+:80C7000042108886C4282A8102281008422268120080052844001226042200A084888818000080E9842804E02D0C0044284C941430141A8204484C011A0400000000001200452842880218001800C100424110288222AA840022800188F0B5978082222201812122841800200442004018180A2820220220220200840000830180021028B5
+:80C7800028014E182001A018004858AF320B425240082149031018C8248042041088041604184244800400480000482A01412002418088018042849388382A01A0218183D23E0E1E44402482220683C2242238224880C12826A812802382E386012818122A21921830585A02001200001A04004788C08812220000802C04F0C36600004C0B
+:80C80000911A444608200442A0218C0420A441810020040084442001200200488082C2282604444004200180281128312843A2241BD8004723844084011281411008002004814242481028A442414008844C0243810481490141161424B444A2434A9248308848E818261888722884286888EE5E102208A0822502201118488822210218E5
+:80C8800000423A24A1248004800100008084840422424200184A086A010018810014286012F08BDA4008488084941441482044044A0260421A5448128181A524A212B0488884A121482214782284224934141840146842121844A028861868481668480082A3056DCEF014544F69D248D24421272436282E144F4411984844529048C018D9
+:80C9000089F248485AA7118741684B4490541830244848481818488902124A32144744284D144A8CA44C281A28A822848C0B11A0288F12F92868BE98A0248A34248B238AD76A87F21434288D288CE382024852228B128362C532C782A3E282668222B02862831E18123668433880024245041E18448B234742224F4161818381B888B17870
+:80C98000A2D9818116AC18CBC4D88E294AF8CD5530222A0124C57E34F81E1C7058A8426A24A44718CD784AE244A6655838C0684A3148287A26A56443D288A3248D28723E646E4843A4131AD1447324E4820646A8648AB2CCCBA883094DD846E84929A3B23E88BE3866B84484F1ECD9244042080048A04120010043014508413014814321F8
+:80CA0000140449014084614418460444182002188400002200411004438812143814F05293244F62F23236EF82F23436EFE8F236242F42F26C6C8F84F22C2C8F84A666424D144D244F42B27CF128248F47F22C248F86F4687C2E4C4F46A6224F42F22C748F82F63C2C8FC3F23474C5FC24645AF444444B444B2247414F43725CFC1C3C4D02
+:80CA8000284E484B33AAAA911AA19945F4DC1CCFC3F31418CCE248781CBD98FCE4644FCDFDFCCC8FCA42E247F6787C246D24CFC8F63664EFC3F26C7CCFC1F33C3C8FC4A4664E24188F84F524244B172E747E34CF47F36C5EAFC6E3C2F1643C4F42A2FA8B73CFC2FE38288FC3F2646495A93345F5644C4B444F8757444F43F36C2CC5EC848C
+:80CB0000E486A637AAF8549C3AF31838888F88F13C3CCB993E348FC1713CFD14462BCC8F8AFCBECC3DAEF042543E748F82F23426AF47F67E24ED3CCFC1F12C64CF46E647A76628188785CF86F6787C8F82B36CB128F67C7CAF86F734688B764F44A4E689F53868CD1CCF82F2185C8D492AF674444E484E442E644741437154ECC1D3CCF2A4
+:80CB800044444F47F764644E446A87AB119AB9ACCB9C9EB84B1287834FC7FDEAE88F8DFDECD8CFB50C2F45F71876AFA2F21E3CCFC5F77E2CEFC1F32C3C4F41F33C3C8B778B2643D444F15C1CCF86F6785C2AF76418CFC7E786F56A384F83F56C4C6AA4C7CF43F1BC6C8F8333348FC7F554753AB771F5644446E443F714144F41F1743C4FEF
+:80CC0000C3F37C7C4F46F674744F4EFDC8DC4AD588A1914F48B9BCDBC8E883F32C18C7C18F83F4FAF8CFEBF9ECD8EB6380010049C14849411844088C041A048480041281120000008011081024040090148422482008860892608820912892448281F02AD2800400401424018400008004B048018148C0488024014008A021224249041853
+:80CC800044C12800221A24048901421608848100224441BF2E052CF411248D121F4132481F41324A1F41B24AD141B24AB911B24A3915AB9443F24A9147822F147934D81AF934484E914FA2C4814FA264114FA265192E4A96C54A9E24ACF591242E521F49D228F1912483F49124A3F48124AB141D24AB9419B24A19B54A3924ABB443B24216
+:80CD0000792498924F8284F9244A5F1D0B4F82F411446B521FC1726AF2112483F21164AB121F41F66A841F41B24ABB11F24A94322F546B822F546B83ADB52B432F54EBA2C5B5ACFC58A52E1A9E254D4ACE214D1BDE21ACF1912C2E5A1F49F62852174983F481646B141F89B24E9121AF465941ABB419F24A9422AF442BFA421445B84ABB4A
+:80CD800036B442F8241AA73E402888040000004004280000000021008008000014000000000000400428000000405412D0BB0E208203902C498102181222184281A04180042004A4008112202104322084A2121618040028848422200488462802009228008FAB0AA018880012008304008304441880A2214A62822218222200224424006E
+:80CE00002168225200202101800598C088800189046081D081C511F0E69900C28A012061418084911428221088A141222A25428284A1212322480841124811386889A6434A618141002022054B12A0488012A824008C61293E411C21F119AB001A2202C02C801208008B1448440000488922028400A0124002240000280018120081848802
+:80CE80001008984881000084002F110480228202288002288002002242224A082002430200222002000000004200000000000000003048F076BFB024111214342412482002120020042608001200200243032604222002224822002001284822000042202882040082427F660A26022800120028800100008304428001000043020022002C
+:80CF000080022200480028422800004880888204008C041FCB07498112C4244C82828402289024282024822222082002438202122226240220022004008001000000000000002088F49CFA00440044208402002800420012802202208822021200002220040000000000008446010084000081BF294A020000C12001400818002818488406
+:80CF8000200144008002844248000044284F2102004A0200004800188422103C1822004F780F0012000000000010841404008C0400410081000000000041260480018002000000004008425FFB0F40240100481800202201484A82814428C21840042828288481484800804484F21422412604680020024240018400C1122230485FA90723
+:80D00000210010440C2800810040044412004A02204804800100800200000000120000402824012281104808F032FA00444120020000000000002800004004004480020000000000000000000010482804004F110D2880C22441002002220000002241004312240243020000000000000000000000000000800448CF1505282042840200AE
+:80D080002280128402008002004C020000100422000000000000000000000084840080E4EE0A30444422440000504445B424A2222200604240024132414B2800001001100842000000004120020000002C8404125FE60B4122002200000000000000000000000000000000000000000000000000802444F81DA510C8484384044100004451
+:80D10000444422280000002502292181298808222214111484818C24840400004014C424222800002054229012AFEE0784800400000040042800002002902222188088020040014008480000000044800200400840180A6FDF012880420422000044A022000000000000220000000000000000000000000000810020F47D720041400400B9
+:80D18000280000000000000000000022000000000000000000000000008142005FBA01851428240428000041B02402220000002662222021212A8A0200111110182824040000004141222200000024A4F07E7C40C828484800000040C424282A0240040010128281818808280014144048888404000000444428280000008421216F23011B
+:80D200000020024100000000000000008002000080020000000000000000000010080048842F190D2820020000000000000000004100000000000000000000000000000010480880F4A9BDA0222E24100441000000000010042820322400202202200200000000000000000000508820648440F82716003024442002280000000000000091
+:80D28000282200802202280000000000000000000000008598484688D4140245042828224C02000000000000000028800280A2220000000000000000000000008508904883F4ECC770269226182B119012C0122582E8317111A1889659888E414E48D09114815489C14A764854444B244F4222E24202284514A4226722212AB11281B88203
+:80D30000092C5922881E1317118A689985A8484E48C048805488814E484F79076F2242A23212122180512229C8111B1119E88818D818242444591148C48588E4441494244322420428444584F222222418121A388282182592821CB11191818E88818924244408488485C848DF59090000000000000000000000000000000000000000004A
+:80D380000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000CF
+:80D4000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000004E
+:80D48000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000CE
+:80D500000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000004D
+:80D5800000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000CD
+:80D60000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000004C
+:80D680000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000CC
+:80D7000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000004B
+:80D78000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000CB
+:80D800000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F004A
+:80D8800000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE4D9
+:80D900000F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000000000000000000002C
+:80D98000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000000000000000000000000C9
+:80DA00000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000048
+:80DA800000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000C8
+:80DB0000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000047
+:80DB80000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000C7
+:80DC000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000046
+:80DC8000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000C6
+:80DD00000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000045
+:80DD800000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000C5
+:80DE0000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000044
+:80DE80000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000C4
+:80DF000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000043
+:80DF8000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000C3
+:80E000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000042
+:80E0800000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFEC2
+:80E10000000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F08E
+:80E180004FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000000000000000B1
+:80E2000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000000000040
+:80E28000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000000C0
+:80E300000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000003F
+:80E3800000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000410000224100004428440000000000000000000000000000000000000000B0B80C80020041414441440049421404449024000041440000000000000000000000000000001008812F370880020000442042040006
+:80E40000004144220000000000000000000000000000000000001008817F450E0000414100440000000010040010140400000000000000000000000000000000F0A1570000000000001004444428000000000000000000000000000000000000000000AF1A0B00000044004400284400000000000000000000000000000000000000000014
+:80E4800000F05CF3000000000000000000000080020000000000000000000000000000000000F0289400100400411800000000224044C44426040080040042120000000080020000000000000081E09F0100002844280041800385044C01440022400448C1206242400800482800800120040000880088008324042281FF8E080000408456
+:80E5000082010000C4402442044143C2244400C44822430283840100220020012800000082008200892404002FF20700412002410044A021002001400442002004000000004200000080040000000000009028845F420E4004200200002A21911884A0410081221004A0240000002608000000008002282280480812200832880026F8C23C
+:80E5800021802282624212623822844220060028228982C44C16A821688904282AE441A2246862124222422220828302188904001A042084062A848A24B4682826748804C02422432282A2212800A0411648082A0426881408440022224226242486322880828402802202800420820184A04180A22872C0A84AC268AF28062200802104E1
+:80E60000102884230200122210386489A112688C2404221222808421040080220180C128200248888084024A08802C04F0EA3EB04801842200901820848182222405008128404818A8218001844262A01228C302681684A2241252288842482200414088214484E1840248ADE310880480240200281084022002181A0880024212C9024C4F
+:80E6800004180020341880040000200410842902800200004A013F240A1002120018280040088608C048002043840144003200182A048024040000281A04000046280141E082014A0860825FED041221800120912880226182C0C848288324918820932812484444182A41880428383044422244802481A443888004904849018C02584410
+:80E700009A3468428B428F8A03481088228402128004008001001822101448886282904480A12548A0421A02808122022A01424880820900441289020018F0E52A008412002002128C220244201508002284484884A04180A3242822A0124800848022018082A41258A02880010018800C80F8E44C00800480820448802581841228222164
+:80E7800094180028004884180041121281410080442804004008384008844A28326858008388E4B306A0210042000000220022008448008420028004286082428440082812003A2405200100008280042A8CA42448F0B54EC06800282800280041481228442026222261432002180089149848102814082081C41828000084821044684891
+:80E80000228400C01400F086162004004800002200000089A41248008100001248001228200242320010881208424181828220220C48180040B1460680024A028C44888242C8280028C0181248800400E084022081052001124820848426014200A021C6042001122081A2180082EFB4084024020000001008002A0400228C044E1848000B
+:80E88000818180024412460850480000800488C01418209818400840A8848870C90C28000042108802000062000048422A0428834208220042482022048021240480046888428008820080088868425D81400868C0282248408804C42268844A6142896143200223021848C810984881811C82814308481840088C228428C4AC802202C48A
+:80E900001A4404201202DF55092AC21800488B2483E282A22287828F4102807418A824892494486A21014A048C1228B428A4224B228981B22862864A02007A86322842890668488F869A1489A82889D18834588B44C2882A681C8ABC94034A8482223448220080044232A0243E5852226684344C89068B426A4488E481638446A8268FC190
+:80E9800045B8140748832441A815181A6282F0F888A81A856888128CA288481E242AFED4588A9228F0B67D0026A4122AA222484A048B41282A7438C844B02414E842F318781A83E28266862E3828814AE58121B41894481628A451811E48E0C383911848468824A444184B1D828A0249A98A4E1428181A014A842CF4A8BD400400844028B3
+:80EA000044284428240141701408478120010000180044184418444084018901890181100881128141100445088440085F28034F42A2233AA2222AA226228B664AA4246E487AA5154D444D244F46B234E242F238248B374FC7B768F638388F82F668288F84A1444AE483F5484C4F45F744444D144CF254144F44E48352882A47E881F11816
+:80EA8000188944F868B88F85B11849F81C1CCF41F12CACCF85E54FEDCFFD6868C7C485E886F448C86FE70D4F42E287A6232A56888F8624B268A6466E284FC2A2335A8384F44434CB146E748F42F34C6424A7828F85F16A788F86F6C8981AA4F78F87F5486C4F45F661615AE455F6347C4F44A4638D188F83B238E282F2682883B448A4B7D9
+:80EB0000CFCBB398B928A2199E184F4BFB5C188FCFE9CFF97C3C5E92236C8AAF8CB9FF01484F432481F268286AB248B62872489868CC82A3344846F86C387E346AF554187E38CF47B36AA6337887848F84AC514AF43818CF86E641E514E483B354E6C5A1444F4336188F83A3458B118B156E68A0B78F45E9838B8BB898F92CA88FC5FDF873
+:80EB8000C8CBDF6E684D142BE68BCE4ED84FF50E4AF63C64326AF248688F86B648B6287268F828688FC2F268784A81F44C4CCF86F3681C6AF744784FC7F73818AF82F2583A8F86B668F458C81AF4F8788F87F56C683E644FD7A7235B653E744AF434241E183AA2678B777E386E684AF478B8FEBCBEB89ADB88F8949C4BBB8FCDFDB888CB32
+:80EC0000DF4FC3FB58D82BE68F2AEC8C7C8C0D0000802402002200004880041008830400421008838431482004000048002009822001822008820020F86B6A20080000000020010012004A01184883441808128420022005001200181242002004008812818200184888142796C0421F41D228F1112483F41124A3F41164AB161F41B64AA6
+:80EC8000B911B64AB915B44A3934AF1439342F147934D812F924481CF9244A1CF8244A16F1245A9E212E4A96C55A9E24ACF591242E421F49F228121F49B268F19124AB141F48B26AD141B64A9921AB9451AB9443B24A3B242BB4478229FB2448984FA2B4D8062E421D688F22751124761114F2116423F2116C2D841B61ADB41B61AB9416D7
+:80ED0000F842B1122F146B812DB16F81D412FB245A8F14FB24C21E814FA2E51DE2A265192E5B96E1A27591E822F591488F227591B4687191B46A7181B46AD141F46A9411AF449A21AB9490BA48298A94B269B442FB24524F4908848004000000400428000000002100800800001400848004000000124480020000001002375200001200E4
+:80ED8000480080041304812088832502830242246280024242A0120048280020422842089A048142200200828242008F4B0142A68482021820032128001842421A049082A0418082040010480A2024020044808404488280028842A041281828806258E05D01424B24224800A0210043061984C128A058385821242A053A44220A00841099
+:80EE00002101892284024C042242288C04498462824A88061828A02886823284123D1500001A02124240020000424800200A84004248200248831482820400008014082088090020220418004800BF740B2C81021280840122282A4108120018002242224E24004B4289822141081800009012128082012280084A2808000000824222EF03
+:80EE80007B0F422003242A6182188041A2148144C38403328A06124325A14228C042C0668016222684A5252800188004004800A0188A9248488A4408481A026F5E0380A2120029C328122218101288112482218204182E1478282022141254822E422004486A81020020012200208888811888844C088A2483D2EA04522120014218002235
+:80EF0000388B144034481280212A2224148484C2448922A161001228481240822181812204004A084280882204000042F078DB200440824428C1242220512428181042A8144921044212841210044812128001A014004301006A0142E084888304000028880046F42231004243024118000090542800180080831102CA618480A4422100EC
+:80EF800020041A122822040088202102412800B07428240A8002221E9D204122812201C01280012881481883220100000043420420410428A024420012A0124B142E444182200280088A410820048002274A80014383C24420912400E02641A814100890143800B04868C64160265820014A210452004381B244813414822210084880F8F6
+:80F00000748842A2208802448784800421901216081223228101002C2193181A04481848180060440049012220A22580820118B02488868124A24818822001002A0480A2429D8920810218180029228121024100120010042200802214341420218421841302800220818404482800688004002008E0C60B24C022C022200424008081359F
+:80F0800042002248000028202482034344C41244C125A442250412491234444184004C881804418C9884824382140441FF2C0D2A240122002242212812222B244818000000000044004422002002283224003822288002100400008088288428F24B18100218808402002C81440420022305A12C811182130421124800000081006912848C
+:80F100004608101444880840240420044400482F1B0A8A8104800260220000424002244228C01400122001492124210200208103000000888842800488482004800214EDF200800429040048E042654220012C042448002189042E184238A0124258121A042301484880240400480082200880220800C2A0CD002422004824602240820196
+:80F180002120210118418CA4149044421008002444246026424412214444C44C02000030680000208408F0C66380220200222200222460212422005A02001A82012828002838264218D2820300221082028181902822308890C881008800A086BFC60F841858280080846224E041042852214221221642142426C21480382281210014003E
+:80F200008C11B21654840022101404448C8402C084400482482D44F09E1A2412EE32223866A2242E222CC422A025226CD122C422236121232112C45C2321D344644226A412124C31342C022D422B123A241562218C1114382C22844288C24120A24482A288A084AA64584AF2F99EA014211A1102002B26421A83D522A3245AB162A5142B79
+:80F2800044222F84C116614B5242128CA6645AA224C992624B425E1E497144D8868192246F4213624643C2144D48CD442289840A86BC48C88C8F844CE444C4A44144C044CFF5092A2281622278224830322F227426A2411A041224184E6268121682C2782A422241F826143AA4141A1122D128C2222F22E56701474229E64483C624D04453
+:80F300006882228B8C424926480482828AA4844A2CFAC82B24C012800121000012200100008460816081400AA4C01A448C4104441844181008180000000041100441100441706D0B5E622F21B112E2233292291262226E6227242AB272B352B142A5742D122F21F112122F27D6AEF15A58CFC4A5338D2AAD2AA5FA2242CD6CEB31AF61F361
+:80F380001434EFC1711E6C426F42D366F1123227E1655E44CFC3F3581C4FC45244CFC8A8AA8F8AFA88884D8CCFCC5CC44B448FC2EA445454CAEC46E644F4A4A4CF4744B242E687E723B332A22B2B642D222E226E6227262F62F272322B754AE525F552522F21F13212AFA7F61E1A2F25F514348FA3F328784AE62AFA2A4ACFC3FF5E74AFA1
+:80F4000063F356769F95F558484E47EFC5F556562F25F7363E6FE2722CFC7474CFC57144FC4444CFCCFC64648F8EFEC8EC8CF888A845BC44F428AC4E445F48F8C4C62F46E644FCF6B4EDD4242B251AA5333E322F25C5222CE422E426F652222F67F672122B755AE525F552522F25F11232AF87F654522B556F47F53838382E244EC28F879E
+:80F48000F446644FE3F354728FC7F752518F85F47C582FE2B342F516566F61D36EF24664CFC2F34C5C4FC4F64C4CCFCCFCE8EC8F8EFC88A88CF8C88845F848CC8F86BEC4AC444F44BC22B644A47ADFE70B5AF338722F23B332E327E724E624E626E626F672322F27F672322B454AE525F552522F25F572727AF6585AAF85F536343AF32899
+:80F50000688FE6F662E27AF4FE7C4FE6F76462AFE7F754458F85F47D7A2FE3B342F514744F63F32E26EFC6B664F74C5C4FC4F64C4CCF8CFC686C8F8EFCCC488CF8AC8C4F88F8C8CC8F86BEC4FC44C44ABC62F6C4C24F4EF76B83800100184880440226A241804422410285221128314820048170480480012014022B128423C2481800829F
+:80F580002200008220088A0400F0497D80042A014A010025024A012D12A014202411028004304820812481140810A2212A04403442444128418008884880040048808428788E0E2F22F41124AD121F41F26A121F41326A1F41B24AF11124AB941B21AB9451AB9443F24A9143F2429147832D914F83C4914FA2C4816FA2E451F2264A96F1E3
+:80F60000265A96D5A6E549D2A4F491244D521F49D228F191248B141F49B24AF18124AB161D24AB9419B24A19F54A9443F24A9443F2429447822DB44F82C4944FA2D4CC012F82F41164A9D541726AF2112483F61124A3F21144AF44F81124ABA459B24A3924AF1419D412EB83D452F816482DA58CC5B56F82EC51DA86E418F22658CE216D38
+:80F680001B8F1DD224F181284D5A1B688D521F48B248F1812429F1816C2B121D6C2D941D6C2BB417882F4463822D942E482F446B822DB42F82F442B42E1ADF680F848248008001000080020000001002008800004001400848000000004400000000002501EF15072002438181512220011228240028209242A01200420020220100250211
+:80F70000000000002200008100000084803284F0213300828821484902284843220458414024011822800228C048004022138602184828241002008002200882006018004814224E8E00C22C3814486C02801514248211868282818221E2220120038A0428182011210281484240020022004160CA200800828124708421F3283B002800AA
+:80F780001812242880A214200410043042002280048400408252261022012824000000280000000014002A04707E0A00000000004230480000208404002E4800000028211004410012000024820042E014080042008008EFBB0A232412C2120041802402200148226420810228482012024CC21461188128481022022C021846848824823C
+:80F80000A886920028241C4888984848814AF2D2712448001221002084220489012052248081022260862800263414441A42084100280021124C846824A8884A280142002100800448CF120A2012020044000020044800202404800410020021108222042504A01200000020A284908128C081462838489088281FC9494143020021400461
+:80F8800024400221100252486410524184218014440410811202414100440041424130440041001008414444D059074862004424101212120428000060884812210000008100D041012901481265021800448014048064240048002508446F6507401401802181014A81621100000000000040440221404404442400002444482120042001
+:80F9000008004162008002F0FE9980140640042141212D122218100221008849240111101284046508446042258401415022641848C04442000041422180044184005F540C1428250124122C21014810110200A041830421404408006100102441026180410444244440248484084240A4428100434254244F590624004022040000702479
+:80F98000011504004C040045021002000010041002244111404404000041100400414100D0920D4210428204490454423041481C440220041004004002004114240000800424000088800888458248C4840082414338889F5F05002400115043000010420100000044000041400241100200002100004400000000000040E47C0914000018
+:80FA000048214840040080044582040040420200100241002400248004440042400445020000002482006F3F0824484464001054242004006C020041000000400200450200401404001004000088000040080081F0C92B100248000014424124421400304100100400004004009046000000000080088880C88480088888812120F845C854
+:80FA8000201414024642614420220422B04102002024140200501240131115014014140240410100214860441114C084442F4408444918444478C30782824400000000000010040000004042820424003042400400210060444142000020240400848444BF340B25081C0414408104212415C4422848400224480031800119180111104469
+:80FB000001400A484110044124602854C024140040280800F0BFC5242562281092423114651414421252716074214512522442650441214012D2245412541552444D4200004054214400414446044908244D84904481888E8A65788818D442014A644841641446D244E414C422432444A144271411402404480000210021004501444C545D
+:80FB80002241443041214141502243840810D41408100250444C18042F54061123545260241C241461544C041B642819B424044681E444040074405212341505555242242121442546026542014445A4448A48B2C118F1838444824F44E84CC888474800448FC8F873AE100111000080148216022141214914121412041100100111000099
+:80FC000000501240012110820482218221822182218658128444005FC948A34445557475F642C34E421F44E474F422246D442B662D434E421F64F447656556774D466F44F446424554554544425211F0474665545455556425F246462464755555507424405222F042C21F3CE4287883E5787884A2444768E5FC8C84CFC8F884844B888F6B
+:80FC8000A8F8A14F343F14F4444D4515E53CE424D461F4424546F264666F6642F322657F44F447474177546B446D446F6454443555442F2141A29825F246C66554555553572F44E43454A8F0414D5595426546026425A2442F645C311F125A756DA74F28E824F88686ED8CCFC8F88C8ECFC8F884824F69F9E141243F14D444546575F64236
+:80FD0000411B441D415F74F426674D444E461F12D611B642F447464B447D4569D466A4446554465585018835F1424375575755577625F2464484646D4445545775544624214E42412F44FCC3418A7A81E5183886CE4223788CFE82862D842B888AF88C1CBF7B42F34242ED465514D732F4434237343D414E416F46F642443F32F645231DDA
+:80FD8000445F54B442F445474A74449644654454752C51223F3158333F3C547775577765B342F44342255A22AD466576475757654456424E424B4C2BCC37181F387A87F5A4852B88CAE828F88E8EFF68F88A8C6514F48C96FF29032110068014844401008044032440820400000040140120140200002501414002244824400244400485A2
+:80FE0000245848F0B18B80040023043400442111213042000000002400502240420410064004000000201401410046124422084110F41E91D034F4112485F3112487141F41324A1D24AB141D24AB9419B24A19B54A3924AF1439242F147924D812F924481CF9244A1CF8244A16F1244A96E1A26459ACE449C24A1F49C2421F4952281F496F
+:80FE80007248F29124A7241F48B24AD141B64A9921AB9451AB9443B24A39242B94478229F924484CF9244A4F5F0B4D4B1AD638E4417248F11124A3D441921A1D44AD941D44ABB451ABB453D21AB924F4429147822D917F8284F9265A1CF925CA5A78252AE9A26459BCE419C24A1FC9C2489E648D439A7248B3917248F2812489B181D64A5D
+:80FF0000B181F64A344B28AF1431A4A9B1A4B442712498926F82D442F92458A307848248000000004480020000001002188009420040014008480000000000280000000025015FEB0C640011000000000025010021000000001002441004000061000000008A0482444200440081246F4A0F20481284582110140200005042100400004424
+:80FF8000401442144402100225042100400600440000000010088114C11FA24741240C7188004121100426043542044502400260416048214400411121100A219044000040140422800842004012483114DFC60424000011210000000000000000000024442400444004400240140200004A0810040045081048789E07000000000000245D
:020000040001F9
-:800000002483F49124A3F48124AB141D24AB9419B24A19B54A3924AB9443B242792498924F8284F9244A1F9308ACF411648D421F4132481FC132421D2CAB141D24AF44D941B24A9B25AB9443F2429147822F147924D812F926482D914FA2C5914FA2EC11F8244A96E1A26459BCE459C24A1FC9C24A1F49D628F4912483F49124A3F4812474
-:80008000AB141D24AF44D941B24A9B25AB9443B24A39342B94478229F9364829F8245A5F570B208804000000400428120000001002188008000014008480040000004004280000000025017F6D0200000000000000810042000000000000000000000000002001000000000041E01E0F20080000000000200184000000000000000000004D
-:800100000000000000000000000014F0D2D700C200000000412002830181420024001220080000110081200400000030142002000000244025F119A3000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000087
-:800180000000000000000000000000000000000000000000004001F0723E000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000000000000001100EFF402400200000000000000000000000000000000000000000000000000002400F098CB0000007D
-:80020000000000000000000000000000000000000000000000000010010024006FF30F000000000000000000000000000000000000000000000000000011000000FFF403002100000000000000000000000000000000000000000000000000000000350B0000000000000000000000000000000000000000000000000000000000F04FFE33
-:80028000000000000000000000000000000000000000000000000000000000000000FFE40F000000000040010000000000000000000000000000000000002440020000001FB90E0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000042
-:8003000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000001400000000000000000000000000000000000000000000000000F0E1D3000011000000104141110100000000000000000000000000000000101242020000002F5C0B20080000000000000000000000000000000000000000BD
-:800380000000000000100140012F630C848004860100004044810200000010021880080000140084800400000040468202244002001002530F2008000000001001110000000000000000000000000000000000001002110014F0A19D0082008200000000110000000000000000000000000000000000000010020014C09100001114001154
-:80040000005011140000000000000000000000000000000000250225125222000000F09B5A0014000000000000000000000000000000000000000000002440022440020000F09BF600155111151101501100501111501100000000000000000000000000000024212440022400110000EFD40BF0414915D11114015011004554111F52521B
-:80048000111D2100004012022B11A09880080015011485084E48800400005064212E26800200002421B012F1A3BF00485011110015014054111D2150110000002180018800004001400848000000004424295222212512522221002180712A039048704111015011004415D11552111712000000212418A08120080014104108890442009E
-:80050000000044246952222722255222251242012124185FAC0E000014000000400100000000000000000000000000000000000040020000008DE7200800000000000000000000000000000000000000000000000000000000F0AF7FC0421F4152281F4132481F41324A1D24AB141D24AB9419B24A19B54A3924AF1439242F147924D8128D
-:80058000F924481CF9244A1CF8244A16F1244A96E1A26459ACE449C24A1F49C2421F4952281F4932481F49324A1F48B24AD141B24A9921AB9451AB9443B24A39242B94478229F92448984FA2F42235C04A1F41D638F4112483F41124A3C424AF14D141F24A941D24ABB459F24A9143F24A9143F2429147822D916F82D412F9245A1CF92464
-:80060000CA1E814FA264192E4A96C54B9E25ACF4912CACF491648D421F4932481F49324A1F48B24AD141F24A961D24AF249B25AF243924AF2439242B94478229F9264829F9245A2F680A848004000000400428000000002180018800004001400848000000004480020000005012F0AED5200800000000100800000000000000000000001D
-:80068000000000000000000000000000EF4C06200888000000000000000000000000000000000000000000000000000040016F8C0F200400000010142802000000240012200800001100812004000000100422000000400214125F4309008008000000000000000000000000000000000000000000000000000000A75E0000400100000021
-:80070000000000000000000000000000000044200800000000000000F0BB7600000018000000000010020000000000002002000000800100000000000000007F9809000000000000000000000000000000002200000000120000000000000000F0FEB60000108101000000000021000000000000000000000041200800000000000000F01B
-:80078000DADE0000000000000000100A000000210000810000000000000018001800800118220000AB450000140000110000000080010000000000800100000000400400840000000000002F3A0100000000000048000000120000000012000000000000000000000000441800006F4E080000000000004800240018000024000018812063
-:8008000001000000001004121008008001200100F099990000110000140000001008200100000000000000000000000000180000C0142200009FAE0D4100001800000000000000000000410000000000000000001821000000000084F09AE2000000000000000000000000000000000000000000000000000000000000FFE40F00000000FA
-:800880000000004008000000000000000000000000001800000000000000F0316400000000000000008100000000000000000000000000800100000000000000CF750D0000000000000000000000000000000000000000000000000000000000F04FFE0000001008000000000000000000100200000080010000000040080000180000D0A8
-:80090000BD0B0014140000000000000040020000000000000000004008000000000080020000AFF3020000000000000000000000000000000040020000000000000000000000004F5F0A0000000040010000000000000000000000000000000000000000000000004F380D00000000000000000000000000002001000000000000000000E7
-:800980000000000000AFE50F0000000000000000000000000000000000000000000000000000000000F04FFE000084000000000000000000000000000000000000000000000000000000F0F5CD000011008100000000000010020000100218000021800100000000400800002A0100003FD20A00148400004001000000000000000000000A
-:800A000000000000400800000000000000007077060000000000000000000000000000000000000000000000000000000000F04FFE00400100004005000040040021004400100218808802218001884008000028840000800200002FDB050014000048405588281082044480022100448002214818808802214818448828842148408481DC
-:800A8000421882041E148002211A01445C03000000000048400400800444000000440000000028000080080000002800000000D0A10200140000005400000044001002400400218001882810021880088400008042080000280000F0B25D000000000000000000000000000000000000000000000000000000000000FFE40F000000000033
-:800B0000000000000000000000000000000000000000000000000000F04FFE001002000000480080022148008002000080028004000080044480022148400400214840040021FBA3000000000000000000000000000000000000000000000000000000000000FFE40F00004001000040040000400400004004000028000080080000000059
-:800B80008002000000005FAD0A0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000008002000088000000000000000000008FE20800004001000040040000400400004004000000000000000000008002000000002FABFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49
-:1E0C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFF00
+:80000000840000000000000000000000000000001002000000880000F0E9D90000218001008302220000004841614290444002C04400004004241004004200820014004810180800F04CBC0040020000800228240000800421421004240000000000004400800480081001200489180800F02F4E000000120010080081000040140480040C
+:8000800000304400004004100200004002000000000000F066E5000000008241212481400200240010020010080000000000000000001812001811000000183FB90B910021400114004100000000002100001008400421000010020040041004002140020000443F7A0100002200290C0000401808210000000044000000000044411200CE
+:80010000000000004001000080F25DEB1001108202100240024002844002000000404408100421000010840100440020010040020000221F140700001001195424008400814002000000008100000000004502000000200140220100000041BF3E0E000000000000000000004100000000000000000000000000000000000000AFC40F00E6
+:800180004100008424004002004008640044440000100400210010020000000020010010280100A0AE00000021000000000000000000000000000000000000008001000000120000F0B3870000000081001008841048040040044044044400000000000000000000184400128081211108EF150C000000000044000000001002000000003B
+:80020000000000000000008001000000000000FF4D0800000000100444000000108204000000000000000000000000000020010000009F7D044400708804410000210024002410441414140240044421100240020000000018000020018041410812F09A9600820000008400000044002400210000000000000000000000000000000020DD
+:800280000114F0177940084800000000448042044400004840C414444C48440400140084800400002001448022014412000021F06DB100820086041008000081104A042424244C5444410045044441240000000000000018001880011289C111804109DF6B052008004044582800810010048421216914044441444044020000001002003C
+:800300000000002081018001121E18C011F043824004411018020044412124400441004544042440140441410000212400000000A011120010044C01120000F0D4B64004444044420C4481100AA1504A1002000000400224442440022400000000000012301420018414846081F073480045141454884554C4455CA84554AAA55A8A6552C3
+:80038000EAA51A4A1A52666F44445444214144401642566225022552222502210000001A21A1111A51444514E441A1118B1189A1118F81518885F892E450444FC4149444C55C448181855A4465048F8252AE2D2445544CA42145F444444F4454642B11F0849445D46458662544543150128548E28414820400001AF114141AE1438381126B
+:8004000044A4118B118F11F1181AA5082B113F3C0A45844404C50C818145568825042C528C25048556822465F646446554444D1445C4822512421216444102842448210000001AE14101281AA1114B11441A61811AF11818211A81F143C800CD444442855A66E55C8845568825568A8D2A412762E55C6C254852266F44F4444445D644514C
+:80048000444F615866676865145424254112415A228914220400001AE141014922F134144B111E141AE181A1111AF11A188FA181F1DF7100001004004184400840440884244004440000000000000000000000000000200112008170220482000000000010080000100448004002002150224002240000000000000000000000E0E10F2C72
+:80050000F4112485F2112483F41124A3D441F24A121D24AF249921AF2419F54A9243F24A9343F2429147822D914F82C4914FA2C4814FA264114FA264192E4A96C54A9E24ACF491242CF4912485F2912483F49124A3F48124AB141D24AB9419B24A19B54A3924AB9443B242792498924F8284F9244AAF6A0E4D4A1B61CD421B2187241FC129
+:8005800032441D282F24D1C1F242961D2C2F24DB85F2429226F84A9743F2429147822D916F82D412E9A2C5952ECA1E852E4A96F5244A96C14B9E25ACF4912CACF491648D421F4932481F49324A1F48B24AF11124AF44F91124ABA41B21AF4428F34A8443B24A3924A9B93694824FA2F514FE40084800000000448002000000100218800832
+:8006000000001400848004000000400428000000002501EF5A0D82000010084002000000000000000000000000002800000080010000000000005F870B2008000000000020010000480000004602000000000000000000000000001140015FF50B2004001008401204228001000024001220084800100110084228000000100422000000D2
+:80068000400314121FDE0E000000000000000000004200000024000000000000000080010000000000002F160B00240000004001000000000000000000000000000000820000000000000040F82F580000002400120000000000840000000021100222000000002100208101180000100800F0AC7F004002002100400100000000000000E8
+:800700004002240022000000002100808101180000000040F84A3C00000000200100000000400800000000000000000000200800000000008400003FF401000000000000000000000000000000001002440000000000000000000000414FCE07004412100200003100120000004800001004844100000022000000000018000000848001E9
+:8007800077DA00000000100100000000000000000000180000000000002004000000000000F0AC230040240121001100250100000000000000444098140021002002000080040000000040081844EFB30500000000000000180000004800000000000010040000000000200100000000F07BA34004100400810011000000000000004004CC
+:80080000000000000000000000000000000000705B06000000000000000000240000400800002400000000000000000000000000001BAC000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000100200100800002400000000000000000000000000009F270D000000000000000000003D
+:8008800000000000000000000000000000000000000000F04FFE00008400000000000000000000000000000000000084000000840000000000F07DAB004001000040010000000000000000001800002120010000000000000080020000AF2501000000810000000000000000000000000000000000000000000000180000F0F7B5000000AF
+:80090000000000000000000000000000000000000000000000000000000000FFE40F0010010000000000000000000000000000000000000000000000000000008F8301000000000000000000400200000000000000000000000000000000000000EFFA0F000000000000000000000000002400000000000000000000000000000000EFE232
+:8009800009001411008100000000000000000040022001000020010084000000810000800300009F6F0300400800001400000000002100000000000010020000000000000000000000F0E6BA000000000000000000000000000000000000000000000000000000000000FFE40F0014000000540000004400100240040021800188281002B4
+:800A00001880088400008042080000280000F0B25D004001008004548588022148400428100240042810828401882810828441848842188204441828842148E041012810A21140C435000000000080044400004840040000400400000080020000880000008002000000001D2A004001000040050000400400210044001002188088022136
+:800A80008001884008000028840000800200002FDB050000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0021000000800400281082040028000000280048000000484004281082044400108204440010B23F0A00000000CB
+:800B000000000000000000000000000000000000000000000000000000F04FFE004001000000004400000044000000440000800200008800000000002800000000F0C36D000000000000000000000000000000000000000000000000000000000000FFE40F00140000000000000000000000000000800200008800000000000000000000C9
+:550B8000EF880A00000000000044000000440000004400000000000000000000002800000000D0B2F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFF72
:00000001FF
diff --git a/xpp/utils/Makefile b/xpp/utils/Makefile
index 562c738..d840333 100644
--- a/xpp/utils/Makefile
+++ b/xpp/utils/Makefile
@@ -3,13 +3,14 @@ PEDANTIC = -ansi -pedantic -std=c99
CC = gcc
RANLIB = ranlib
INSTALL = install
+INSTALL_DATA = install -m 644
-BINDIR = /sbin
+BINDIR = /usr/sbin
DATADIR = /usr/share/zaptel
MANDIR = /usr/share/man/man8
HOTPLUG_USB_DIR = /etc/hotplug/usb
-DATA_FILES = ../init_data_*.cmd ../initialize_registers
+DATA_FILES = $(wildcard ../init_data_*.cmd *.hex)
CFLAGS = -g -Wall $(EXTRA_CFLAGS)
@@ -18,15 +19,16 @@ TARGETS = libhexfile.a fpga_load test_parse
all: $(TARGETS)
install: all
- $(INSTALL) -d $(BINDIR)
- $(INSTALL) genzaptelconf fpga_load $(BINDIR)/
- $(INSTALL) -d $(DATADIR)
- $(INSTALL) $(DATA_FILES) $(DATADIR)/
- $(INSTALL) -d $(MANDIR)
- $(INSTALL) fpga_load.8 $(MANDIR)/
- $(INSTALL) -d $(HOTPLUG_USB_DIR)
- $(INSTALL) xpp_fxloader xpp_fxloader.usermap $(HOTPLUG_USB_DIR)/
-
+ $(INSTALL) -d $(DESTDIR)$(BINDIR)
+ $(INSTALL) genzaptelconf fpga_load $(DESTDIR)$(BINDIR)/
+ $(INSTALL) -d $(DESTDIR)$(DATADIR)
+ $(INSTALL_DATA) $(DATA_FILES) $(DESTDIR)$(DATADIR)/
+ $(INSTALL) ../initialize_registers $(DESTDIR)$(DATADIR)/
+ $(INSTALL) -d $(DESTDIR)$(MANDIR)
+ $(INSTALL_DATA) fpga_load.8 genzaptelconf.8 $(DESTDIR)$(MANDIR)/
+ $(INSTALL) -d $(DESTDIR)$(HOTPLUG_USB_DIR)
+ $(INSTALL_DATA) xpp_fxloader.usermap $(DESTDIR)$(HOTPLUG_USB_DIR)/
+ $(INSTALL) xpp_fxloader $(DESTDIR)$(HOTPLUG_USB_DIR)/
libhexfile.a: hexfile.o
$(AR) cru $@ $^
diff --git a/xpp/utils/genzaptelconf b/xpp/utils/genzaptelconf
index fe5c9e4..1763427 100755
--- a/xpp/utils/genzaptelconf
+++ b/xpp/utils/genzaptelconf
@@ -32,8 +32,11 @@
# Don't override variables here. Override them in /etc/default/zaptel
#
# 0.5.3:
-# * Experimental support for Sangoman analog cards (A20x)
-# * fixed timeout for Astribank load
+# * Experimental support for Sangoma analog cards (A20x)
+# * Support OpenVox A1200P (A TDM400P clone refactored)
+# * Fixed timeout for Astribank load
+# * Delete unsuccessfully-probe modules
+# * Pass callerid from trunks
# 0.5.2:
# * Now it should detect most PRI cards and even wcusb
# 0.5.1:
@@ -342,7 +345,7 @@ print_pattern() {
fi
else # this is an FXO (trunk/phone: FXO signalling)
# we have may have set it. So reset it:
- echo "callerid=\"\" <0>"
+ echo "callerid=asrecieved"
echo "mailbox="
if [ "$group_manual" != "yes" ]
then
@@ -410,22 +413,29 @@ count_proc_zap_lines() {
load_modules() {
say "Test Loading modules:"
- for i in zaptel $ALL_MODULES
+ for i in $ALL_MODULES
do
- if [ "$i" = ztdummy ]; then
- continue # No hardware to detect
- fi
lines_before=`count_proc_zap_lines`
args="${i}_args"
eval "args=\$$args"
# a module is worth listing if it:
# a. loaded successfully, and
# b. added channels lines under /proc/zaptel/*
- if /sbin/modprobe $i $args 2> /dev/null && \
- [ $lines_before -lt `count_proc_zap_lines` ]
+ if /sbin/modprobe $i $args 2> /dev/null
then
- probed_modules="$probed_modules $i"
- say " ok $i $args"
+ check=0
+ case "$i" in
+ xpp_usb) check=`grep 'STATUS=connected' 2>/dev/null /proc/xpp/xbuses | wc -l` ;;
+ *) if [ $lines_before -lt `count_proc_zap_lines` ]; then check=1; fi ;;
+ esac
+ if [ "$check" != 0 ]
+ then
+ probed_modules="$probed_modules $i"
+ say " ok $i $args"
+ else
+ say " - $i $args"
+ rmmod $i
+ fi
else
say " - $i $args"
fi
@@ -474,20 +484,21 @@ wait_for_xpp() {
if [ -d /proc/xpp ] && \
[ "`cat /sys/module/xpp/parameters/zap_autoreg`" = 'Y' ]
then
- out_on_timeout=0
# wait for the XPDs to register:
+ # TODO: replace this loop with 'cat /proc/xpp/XBUS-*/waitfor_xpds
+ success=0
for i in `seq 30`; do
- sleep 1
if ! grep -q 0 /proc/xpp/*/*/zt_registration 2>/dev/null
then
# There are either no XPDs or all of them are
# registered. Nothing to do
- out_on_timeout=1
+ success=1
break
fi
+ sleep 1
done
- if [ "$out_on_timeout" != 0 ]
- then echo >&2 "Warning: time out waiting for xpp init."
+ if [ "$success" = 0 ]; then
+ echo 1>&2 "$0: WARNING: some XPD's are not registered yet (timeout)"
fi
fi
}
@@ -643,7 +654,7 @@ EOF
# in case this is a real channel.
chan_num=`echo $line |awk '{print $1}'`
case "$line" in
- *WCTDM/*|*/WRTDM/*)
+ *WCTDM/*|*/WRTDM/*|*OPVXA1200/*)
# this can be either FXS or FXO
maybe_fxs=0
maybe_fxo=0
@@ -772,7 +783,7 @@ EOF
# NT is the same as FXS for us and TE is the same as FXO
if [ "$span_termtype" = 'nt' ]
then
- #echo "callerid=\"Channel $chan\" <$exten>"
+ echo "callerid=\"Channels $span_begin - $span_end\" <$span_begin>"
#echo "mailbox=$exten"
if [ "$group_manual" != "yes" ]
then
@@ -783,7 +794,7 @@ EOF
echo "context=$context_phones"
fi
else # we have may have set it. So reset it:
- #echo "callerid=\"\" <0>"
+ echo "callerid=asrecieved"
#echo "mailbox="
if [ "$group_manual" != "yes" ]
then
diff --git a/xpp/utils/hexfile.c b/xpp/utils/hexfile.c
index 9862ecc..f6e4149 100644
--- a/xpp/utils/hexfile.c
+++ b/xpp/utils/hexfile.c
@@ -230,12 +230,12 @@ int dump_hexfile2(struct hexdata *hexdata, FILE *outfile, uint8_t maxwidth)
}
ll = line->d.content.header.ll;
bytesleft = ll;
- // split the line into several lines
+ /* split the line into several lines */
tt = line->d.content.header.tt;
while (bytesleft > 0) {
this_line = (bytesleft >= maxwidth) ? maxwidth : bytesleft;
allocsize = sizeof(struct hexline) + this_line + 1;
- // generate the new line
+ /* generate the new line */
if((extraline = (struct hexline *)malloc(allocsize)) == NULL) {
if(report_func)
report_func(LOG_ERR, "No more memory for hexfile lines\n");
@@ -247,14 +247,14 @@ int dump_hexfile2(struct hexdata *hexdata, FILE *outfile, uint8_t maxwidth)
extraline->d.content.header.tt = tt;
memcpy( extraline->d.content.tt_data.data, line->d.content.tt_data.data+extra_offset, this_line);
new_chksum = 0xFF - checksum(extraline) + 1;
- // print it
+ /* print it */
data = extraline->d.content.tt_data.data;
fprintf(outfile, ":%02X%04X%02X", extraline->d.content.header.ll, extraline->d.content.header.offset, tt);
for(j = 0; j < this_line; j++) {
fprintf(outfile, "%02X", data[j]);
}
fprintf(outfile, "%02X\n", new_chksum);
- // cleanups
+ /* cleanups */
free( extraline);
extra_offset += this_line;
bytesleft -= this_line;
diff --git a/xpp/utils/xpp_fxloader b/xpp/utils/xpp_fxloader
index ef9f966..ca29fd2 100644
--- a/xpp/utils/xpp_fxloader
+++ b/xpp/utils/xpp_fxloader
@@ -63,7 +63,7 @@ FIRMWARE_DIR="${FIRMWARE_DIR:-/usr/share/zaptel}"
FIRM_FXS=$FIRMWARE_DIR/FPGA_FXS.hex
REENUM_SLEEP_TIME=3 # only used on manual runs
-FPGA_LOAD="/sbin/fpga_load"
+FPGA_LOAD="/usr/sbin/fpga_load"
find_dev() {
v_id=$1
@@ -84,6 +84,7 @@ load_fw() {
devices=`find_dev $v_id $p_id`
for dev in $devices
do
+ $LOGGER "USB Firmware $FIRMWARE_DIR/$fw into $dev"
do_fxload -D $dev -I $FIRMWARE_DIR/$fw || exit 1
done
@@ -98,23 +99,24 @@ hexfile_version() {
}
load_fpga() {
- dev=$1
-
+ v_id=$1
+ p_id=$2
+ fw=$3
+
+ devices=`find_dev $v_id $p_id`
+ for dev in $devices
+ do
card_ver=`$FPGA_LOAD -d -D $dev`
- firm_ver=`hexfile_version $FIRM_FXS`
-
- $LOGGER "considering fpga firmware version '$firm_ver' for $dev with version $card_ver."
- case "$card_ver" in
- 1.001)
- $LOGGER "Loading firmware '$FIRM_FXS' (version $firm_ver) into '$dev'"
- $FPGA_LOAD -D "$dev" -I "$FIRM_FXS" 2>&1 >/dev/null | $LOGGER
- status=$PIPESTATUS
- if [ $status != 0 ]; then
- echo "fpga_load failed with status $status" | $LOGGER
- exit 77
- fi
- ;;
- esac
+ firm_ver=`hexfile_version $FIRMWARE_DIR/$fw`
+
+ $LOGGER "FPGA Firmware $FIRMWARE_DIR/$fw into $dev"
+ $FPGA_LOAD -D "$dev" -I "$FIRMWARE_DIR/$fw" 2>&1 >/dev/null | $LOGGER
+ status=$PIPESTATUS
+ if [ $status != 0 ]; then
+ echo "fpga_load failed with status $status" | $LOGGER
+ exit 77
+ fi
+ done
}
#########################
@@ -124,11 +126,13 @@ load_fpga() {
# to run manually, pass the parameter 'xppdetect'
if [ "$1" = 'xppdetect' ]; then
+ echo "--------- FIRMWARE LOADING"
load_fw 04b4 8613 USB_8613.hex
load_fw e4e4 1130 USB_1130.hex
- for dev in `find_dev e4e4 1131`; do
- load_fpga $dev
- done
+ load_fpga e4e4 1131 FPGA_FXS.hex
+
+ sleep 3 # Let it stabilize
+ echo "--------- FIRMWARE IS LOADED"
exit $?
fi
@@ -140,19 +144,20 @@ fi
if [ "$ACTION" = "add" ] && [ -f "$DEVICE" ]
then
$LOGGER "Trying to find what to do for product $PRODUCT, device $DEVICE"
+ prod_id=`echo "$PRODUCT" | cut -d/ -f2`
case "$PRODUCT" in
- 4b4/8613/*)
- FIRM_USB=$FIRMWARE_DIR/USB_8613.hex
+ 4b4/8613/*|e4e4/1130/*|e4e4/1140/*)
+ FIRM_USB="$FIRMWARE_DIR/USB_$prod_id.hex"
$LOGGER "Loading firmware '$FIRM_USB' into '$DEVICE'"
do_fxload -D "$DEVICE" -I "$FIRM_USB"
;;
- e4e4/1130/*)
- FIRM_USB=$FIRMWARE_DIR/USB_1130.hex
- $LOGGER "Loading firmware '$FIRM_USB' into '$DEVICE'"
- do_fxload -D "$DEVICE" -I "$FIRM_USB"
- ;;
- e4e4/1131/*)
- load_fpga $DEVICE
+ e4e4/1131/*|e4e4/1141/*)
+ if [ "$prod_id" = 1131 ]; then
+ FIRM_FPGA="$FIRMWARE_DIR/FPGA_FXS.hex" # Legacy
+ else
+ FIRM_FPGA="$FIRMWARE_DIR/FPGA_$prod_id.hex"
+ fi
+ $FPGA_LOAD -D "$DEVICE" -I "$FIRM_FPGA" 2>&1 >/dev/null | $LOGGER
;;
esac
fi
diff --git a/xpp/xbus-core.c b/xpp/xbus-core.c
index 364d8e4..5a85f8b 100644
--- a/xpp/xbus-core.c
+++ b/xpp/xbus-core.c
@@ -30,6 +30,7 @@
#include <linux/errno.h>
#include <linux/proc_fs.h>
#include <linux/device.h>
+#include <linux/delay.h> /* for mdelay() to debug */
#include "xpd.h"
#include "xpp_zap.h"
#include "xbus-core.h"
@@ -38,13 +39,14 @@
static const char rcsid[] = "$Id$";
/* Defines */
+#define POLL_TIMEOUT (MAX_XPDS) /* in jiffies */
#define PROC_XBUSES "xbuses"
#define PROC_XBUS_SUMMARY "summary"
+#define PROC_XBUS_WAITFOR_XPDS "waitfor_xpds"
/* Command line parameters */
extern int print_dbg;
extern int max_queue_len;
-extern int ignore_xpds;
/* Forward declarations */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14)
@@ -58,10 +60,13 @@ extern int ignore_xpds;
static DEVICE_ATTR_FUNC(connector_show, dev, buf);
static DEVICE_ATTR_FUNC(status_show, dev, buf);
+static int xbus_poll(void *data);
static void xbus_release(struct device *dev);
static int xbus_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data);
+static int xbus_read_waitfor_xpds(char *page, char **start, off_t off, int count, int *eof, void *data);
/* Data structures */
+struct workqueue_struct *xpp_worker = NULL;
static spinlock_t xbuses_lock = SPIN_LOCK_UNLOCKED;
static xbus_t *xbuses_array[MAX_BUSES] = {};
static int bus_count = 0;
@@ -234,29 +239,154 @@ xpd_t *xpd_of(xbus_t *xbus, int xpd_num)
return xbus->xpds[xpd_num];
}
-static void xbus_poll(xbus_t *xbus)
+int xbus_register_xpd(xbus_t *xbus, xpd_t *xpd)
{
- int id;
- int ret;
- xpd_t **xpds;
- xpd_t *xpd;
+ unsigned int xpd_num = xpd->id;
+ unsigned long flags;
+ int ret = 0;
+
+ spin_lock_irqsave(&xbus->lock, flags);
+ if(!VALID_XPD_NUM(xpd_num)) {
+ ERR("%s: Bad xpd_num = %d\n", xbus->busname, xpd_num);
+ ret = -EINVAL;
+ goto out;
+ }
+ if(xbus->xpds[xpd_num] != NULL) {
+ xpd_t *other = xbus->xpds[xpd_num];
+
+ ERR("%s: xpd_num=%d is occupied by %p (%s)\n",
+ xbus->busname, xpd_num, other, other->xpdname);
+ ret = -EINVAL;
+ goto out;
+ }
+ xbus->xpds[xpd_num] = xpd;
+ xbus->num_xpds++;
+out:
+ spin_unlock_irqrestore(&xbus->lock, flags);
+ return ret;
+}
+
+int xbus_unregister_xpd(xbus_t *xbus, xpd_t *xpd)
+{
+ unsigned int xpd_num = xpd->id;
+ unsigned long flags;
+ int ret = 0;
+
+ spin_lock_irqsave(&xbus->lock, flags);
+ if(!VALID_XPD_NUM(xpd_num)) {
+ ERR("%s: Bad xpd_num = %d\n", xbus->busname, xpd_num);
+ ret = -EINVAL;
+ goto out;
+ }
+ if(xbus->xpds[xpd_num] != xpd) {
+ xpd_t *other = xbus->xpds[xpd_num];
+
+ ERR("%s: xpd_num=%d is occupied by %p (%s)\n",
+ xbus->busname, xpd_num, other, other->xpdname);
+ ret = -EINVAL;
+ goto out;
+ }
+ xbus->xpds[xpd_num] = NULL;
+ xbus->num_xpds--;
+ xpd->xbus = NULL;
+out:
+ spin_unlock_irqrestore(&xbus->lock, flags);
+ return ret;
+}
+
+/*
+ * This must be called from synchronous (non-interrupt) context
+ * it returns only when all XPD's on the bus are detected and
+ * initialized.
+ */
+static int xbus_poll(void *data)
+{
+ int id;
+ int ret;
+ unsigned long flags;
+ struct list_head *card;
+ struct list_head *next_card;
+ struct list_head removal_list;
+ struct list_head additions_list;
+ int count_removed;
+ int count_added;
+ int xpd_num;
+ xbus_t *xbus = data;
+ spin_lock_irqsave(&xbus->lock, flags);
DBG("%s\n", xbus->busname);
- xpds = xbus->xpds;
+
+ /*
+ * Send out the polls
+ */
+ atomic_set(&xbus->count_poll_answers, 0);
for(id = 0; id < MAX_XPDS; id++) {
if(!xbus->hardware_exists)
break;
- xpd = xpd_of(xbus, id);
- if(IS_SET(ignore_xpds, id)) { /* skip xpds */
- DBG(" Ignoring XPD #%d\n", id);
- continue;
- }
- DBG(" Polling slot %d %s\n", id, xbus->busname);
+ // DBG(" Polling slot %d %s\n", id, xbus->busname);
+ spin_unlock_irqrestore(&xbus->lock, flags);
ret = CALL_PROTO(GLOBAL, DESC_REQ, xbus, NULL, id);
+ spin_lock_irqsave(&xbus->lock, flags);
if(ret < 0) {
NOTICE("xpp: %s: Failed sending DESC_REQ to XPD #%d\n", __FUNCTION__, id);
+ break;
+ }
+ mdelay(1); /* FIXME: debugging for Dima */
+ }
+ spin_unlock_irqrestore(&xbus->lock, flags);
+ DBG("%s: Polled %d XPD's. Waiting for replies\n", xbus->busname, MAX_XPDS);
+ ret = wait_event_timeout(xbus->wait_for_polls, atomic_read(&xbus->count_poll_answers) >= MAX_XPDS, POLL_TIMEOUT);
+ if(ret < 0) {
+ ERR("%s: Poll timeout %d\n", xbus->busname, ret);
+ return ret;
+ }
+ DBG("%s: Poll finished. Start processing.\n", xbus->busname);
+ spin_lock_irqsave(&xbus->lock, flags);
+ INIT_LIST_HEAD(&removal_list);
+ INIT_LIST_HEAD(&additions_list);
+ count_removed = 0;
+ count_added = 0;
+ list_for_each_safe(card, next_card, &xbus->poll_results) {
+ struct card_desc_struct *card_desc = list_entry(card, struct card_desc_struct, card_list);
+ byte type = card_desc->type;
+ xpd_t *xpd;
+
+ BUG_ON(card_desc->magic != CARD_DESC_MAGIC);
+ xpd_num = xpd_addr2num(&card_desc->xpd_addr);
+ xpd = xpd_of(xbus, xpd_num);
+
+ if(xpd && type == XPD_TYPE_NOMODULE) { /* card removal */
+ list_move_tail(card, &removal_list);
+ count_removed++;
+ } else if(!xpd && type != XPD_TYPE_NOMODULE) { /* card detection */
+ list_move_tail(card, &additions_list);
+ count_added++;
+ } else { /* same same */
+ list_del(card);
+ kfree(card_desc);
}
}
+ spin_unlock_irqrestore(&xbus->lock, flags);
+ INFO("%s: Poll results: removals=%d additions=%d\n", xbus->busname, count_removed, count_added);
+ list_for_each_safe(card, next_card, &removal_list) {
+ struct card_desc_struct *card_desc = list_entry(card, struct card_desc_struct, card_list);
+ xpd_t *xpd;
+
+ list_del(card);
+ xpd_num = xpd_addr2num(&card_desc->xpd_addr);
+ xpd = xpd_of(xbus, xpd_num);
+ if(xpd)
+ xpd_disconnect(xpd);
+ kfree(card);
+ }
+ list_for_each_safe(card, next_card, &additions_list) {
+ struct card_desc_struct *card_desc = list_entry(card, struct card_desc_struct, card_list);
+
+ list_del(card);
+ card_detected(card_desc);
+ }
+ complete_all(&xbus->xpds_initialized);
+ return 0;
}
@@ -274,7 +404,11 @@ void xbus_activate(xbus_t *xbus)
xbus->hardware_exists = 1;
DBG("Activating: %s\n", xbus->busname);
/* Poll it */
- xbus_poll(xbus);
+ INIT_WORK(&xbus->xpds_init_work, (void (*)(void *))xbus_poll, (void *)xbus);
+ if(!queue_work(xpp_worker, &xbus->xpds_init_work)) {
+ ERR("Failed to queue xpd initialization work\n");
+ /* FIXME: need to return error */
+ }
}
void xbus_disconnect(xbus_t *xbus)
@@ -348,6 +482,11 @@ static void xbus_free(xbus_t *xbus)
remove_proc_entry(PROC_XBUS_SUMMARY, xbus->proc_xbus_dir);
xbus->proc_xbus_summary = NULL;
}
+ if(xbus->proc_xbus_waitfor_xpds) {
+ DBG("Removing proc '%s' for %s\n", PROC_XBUS_WAITFOR_XPDS, xbus->busname);
+ remove_proc_entry(PROC_XBUS_WAITFOR_XPDS, xbus->proc_xbus_dir);
+ xbus->proc_xbus_waitfor_xpds = NULL;
+ }
DBG("Removing proc directory %s\n", xbus->busname);
remove_proc_entry(xbus->busname, xpp_proc_toplevel);
xbus->proc_xbus_dir = NULL;
@@ -385,7 +524,11 @@ xbus_t *xbus_new(xbus_ops_t *ops)
INFO("New xbus: %s\n", xbus->busname);
init_waitqueue_head(&xbus->packet_cache_empty);
atomic_set(&xbus->packet_counter, 0);
+ atomic_set(&xbus->count_poll_answers, 0);
+ init_waitqueue_head(&xbus->wait_for_polls);
init_rwsem(&xbus->in_use);
+ INIT_LIST_HEAD(&xbus->poll_results);
+ init_completion(&xbus->xpds_initialized);
xbus->num_xpds = 0;
xbus_reset_counters(xbus);
@@ -425,6 +568,15 @@ xbus_t *xbus_new(xbus_ops_t *ops)
err = -EIO;
goto nobus;
}
+ xbus->proc_xbus_summary->owner = THIS_MODULE;
+ xbus->proc_xbus_waitfor_xpds = create_proc_read_entry(PROC_XBUS_WAITFOR_XPDS, 0444, xbus->proc_xbus_dir,
+ xbus_read_waitfor_xpds, xbus);
+ if (!xbus->proc_xbus_waitfor_xpds) {
+ ERR("Failed to create '%s' proc file for xbus %s\n", PROC_XBUS_WAITFOR_XPDS, xbus->busname);
+ err = -EIO;
+ goto nobus;
+ }
+ xbus->proc_xbus_waitfor_xpds->owner = THIS_MODULE;
#endif
/* Sanity checks */
if(!ops->packet_send) {
@@ -507,7 +659,9 @@ static int xbus_read_proc(char *page, char **start, off_t off, int count, int *e
(xbus->hardware_exists) ? "connected" : "missing",
xbus->bus_type
);
- len += sprintf(page + len, "max_packet_size=%d open_counter=%d packet_count=%d\n",
+ len += sprintf(page + len, "POLLS: %d/%d\n", atomic_read(&xbus->count_poll_answers), MAX_XPDS);
+ len += sprintf(page + len, "XPDS_READY: %s\n", (xbus->xpds_initialized.done) ? "YES" : "NO");
+ len += sprintf(page + len, "\nmax_packet_size=%d open_counter=%d packet_count=%d\n",
xbus->max_packet_size,
xbus->open_counter,
atomic_read(&xbus->packet_counter)
@@ -532,6 +686,36 @@ out:
}
+static int xbus_read_waitfor_xpds(char *page, char **start, off_t off, int count, int *eof, void *data)
+{
+ int len = 0;
+ unsigned long flags;
+ xbus_t *xbus = data;
+ int i;
+
+ if(!xbus)
+ goto out;
+ i = wait_for_completion_interruptible_timeout(&xbus->xpds_initialized, 40*HZ);
+ if(i < 0) {
+ NOTICE("PID=%d waiting for XPDS initialization failed: %d\n", current->pid, i);
+ return i;
+ }
+ spin_lock_irqsave(&xbus->lock, flags);
+ len += sprintf(page + len, "XPDS_READY: %s\n", (xbus->xpds_initialized.done) ? "YES" : "NO");
+ spin_unlock_irqrestore(&xbus->lock, flags);
+out:
+ if (len <= off+count)
+ *eof = 1;
+ *start = page + off;
+ len -= off;
+ if (len > count)
+ len = count;
+ if (len < 0)
+ len = 0;
+ return len;
+
+}
+
static int read_proc_xbuses(char *page, char **start, off_t off, int count, int *eof, void *data)
{
int len = 0;
@@ -611,14 +795,19 @@ static int xbus_hotplug(struct device *device, char **envp, int envnum, char *bu
struct bus_type xbus_bus_type = {
.name = "xbus",
.match = xbus_match,
+/* FIXME: Hotplug replaced with uevent in 2.6.16 */
#if 0
-/* Hotplug replaced with uevent in 2.6.16 */
.hotplug = xbus_hotplug,
#endif
};
static void xbus_core_cleanup(void)
{
+ if (xpp_worker) {
+ flush_workqueue(xpp_worker);
+ destroy_workqueue(xpp_worker);
+ xpp_worker = NULL;
+ }
#ifdef CONFIG_PROC_FS
if(proc_xbuses)
remove_proc_entry(PROC_XBUSES, xpp_proc_toplevel);
@@ -638,12 +827,20 @@ int __init xbus_core_init(void)
if(!packet_cache) {
return -ENOMEM;
}
+ xpp_worker = create_singlethread_workqueue("xppworker");
+ if(!xpp_worker) {
+ ERR("Failed to create card detector workqueue.\n");
+ xbus_core_cleanup();
+ return -ENOMEM;
+ }
#ifdef CONFIG_PROC_FS
proc_xbuses = create_proc_read_entry(PROC_XBUSES, 0444, xpp_proc_toplevel, read_proc_xbuses, 0);
if (!proc_xbuses) {
+ ERR("Failed to create proc file %s\n", PROC_XBUSES);
xbus_core_cleanup();
return -EFAULT;
}
+ proc_xbuses->owner = THIS_MODULE;
#endif
ret = bus_register(&xbus_bus_type);
if(ret) {
diff --git a/xpp/xbus-core.h b/xpp/xbus-core.h
index dd01971..780c1b6 100644
--- a/xpp/xbus-core.h
+++ b/xpp/xbus-core.h
@@ -49,5 +49,8 @@ void xbus_disconnect(xbus_t *xbus);
void xbus_reset_counters(xbus_t *xbus);
+int xbus_register_xpd(xbus_t *xbus, xpd_t *xpd);
+int xbus_unregister_xpd(xbus_t *xbus, xpd_t *xpd);
+
#endif /* XBUS_CORE_H */
diff --git a/xpp/xdefs.h b/xpp/xdefs.h
index c69b8a9..491e7b6 100644
--- a/xpp/xdefs.h
+++ b/xpp/xdefs.h
@@ -45,6 +45,48 @@ struct list_head { struct list_head *next; struct list_head *prev; };
#endif
+#define PACKED __attribute__((packed))
+
+#define ALL_LINES ((lineno_t)-1)
+
+#define BIT(i) (1 << (i))
+#define BIT_SET(x,i) ((x) |= BIT(i))
+#define BIT_CLR(x,i) ((x) &= ~BIT(i))
+#define IS_SET(x,i) (((x) & BIT(i)) != 0)
+#define BITMASK(i) (BIT(i) - 1)
+
+#define CHANNELS_PERXPD 30 /* Depends on xpp_line_t and protocol fields */
+
+#define MAX_SPANNAME 20 /* From zaptel.h */
+#define MAX_SPANDESC 40 /* From zaptel.h */
+#define MAX_CHANNAME 40 /* From zaptel.h */
+
+#define XPD_NAMELEN 10 /* must be <= from maximal workqueue name */
+#define XPD_DESCLEN 20
+#define XBUS_NAMELEN 20 /* must be <= from maximal workqueue name */
+#define XBUS_DESCLEN 40
+
+#define UNIT_BITS 4 /* Bit for Astribank unit number */
+#define SUBUNIT_BITS 4 /* Bit for Astribank subunit number */
+
+#define MAX_UNIT 4 /* 1 FXS + 3 FXS/FXO */
+#define MAX_SUBUNIT 1 /* Firmware does not support subunits yet */
+
+/*
+ * Compile time sanity checks
+ */
+#if MAX_UNIT > BIT(UNIT_BITS)
+#error "MAX_UNIT too large"
+#endif
+
+#if MAX_SUBUNIT > BIT(SUBUNIT_BITS)
+#error "MAX_SUBUNIT too large"
+#endif
+
+#define MAX_XPDS (MAX_UNIT*MAX_SUBUNIT)
+
+#define VALID_XPD_NUM(x) ((x) < MAX_XPDS && (x) >= 0)
+
typedef char *charp;
typedef unsigned char byte;
typedef int bool;
@@ -56,13 +98,5 @@ typedef struct xops xops_t;
typedef __u32 xpp_line_t; /* at most 31 lines for E1 */
typedef int lineno_t;
-#define ALL_LINES ((lineno_t)-1)
-
-#define BIT(i) (1 << (i))
-#define BIT_SET(x,i) ((x) |= BIT(i))
-#define BIT_CLR(x,i) ((x) &= ~BIT(i))
-#define IS_SET(x,i) (((x) & BIT(i)) != 0)
-
-#define CHANNELS_PERXPD 30 /* Depends on xpp_line_t and protocol fields */
#endif /* XDEFS_H */
diff --git a/xpp/xpd.h b/xpp/xpd.h
index f7efaf1..4de2510 100644
--- a/xpp/xpd.h
+++ b/xpp/xpd.h
@@ -62,20 +62,6 @@
#endif // __KERNEL__
-#define MAX_SPANNAME 20 /* From zaptel.h */
-#define MAX_SPANDESC 40 /* From zaptel.h */
-#define MAX_CHANNAME 40 /* From zaptel.h */
-
-#define XPD_NAMELEN 10 /* must be <= from maximal workqueue name */
-#define XPD_DESCLEN 20
-#define XBUS_NAMELEN 20 /* must be <= from maximal workqueue name */
-#define XBUS_DESCLEN 40
-
-/* Hardware does not check bank_num yet. So only 4 cards can be used */
-#define MAX_XPDS 4 // 1 FXS + 2 E1/T1 + 1 (Quad * E1/T1)
-
-#define VALID_XPD_NUM(x) ((x) < MAX_XPDS && (x) >= 0)
-
typedef struct xbus_ops xbus_ops_t;
typedef enum xbus_type {
@@ -106,13 +92,12 @@ struct xbus_ops {
*/
enum {
XBUS_N_DESC_REQ,
- XBUS_N_DEV_DESC,
+ XBUS_N_DEV_DESC_FULL,
+ XBUS_N_DEV_DESC_EMPTY,
XBUS_N_PCM_WRITE,
XBUS_N_PCM_READ,
XBUS_N_TX_BYTES,
XBUS_N_RX_BYTES,
- XBUS_N_SOFTSIM_PACKETS,
- XBUS_N_SIM_PACKETS,
};
#define XBUS_COUNTER(xbus, counter) ((xbus)->counters[XBUS_N_ ## counter])
@@ -124,51 +109,72 @@ static struct xbus_counters {
char *name;
} xbus_counters[] = {
C_(DESC_REQ),
- C_(DEV_DESC),
+ C_(DEV_DESC_FULL),
+ C_(DEV_DESC_EMPTY),
C_(PCM_WRITE),
C_(PCM_READ),
C_(TX_BYTES),
C_(RX_BYTES),
- C_(SOFTSIM_PACKETS),
- C_(SIM_PACKETS),
};
#undef C_
#define XBUS_COUNTER_MAX ARRAY_SIZE(xbus_counters)
+#define CARD_DESC_MAGIC 0xca9dde5c
+
+struct card_desc_struct {
+ struct list_head card_list;
+ u32 magic;
+ xbus_t *xbus;
+ byte rev; /* Revision number */
+ byte type; /* LSB: 1 - to_phone, 0 - to_line */
+ xpd_addr_t xpd_addr;
+};
+
+
/*
* An xbus is a transport layer for Xorcom Protocol commands
*/
struct xbus {
- char busname[XBUS_NAMELEN]; /* only xbus_new set this */
- char busdesc[XBUS_DESCLEN]; /* lowlevel drivers set this */
- int num;
- xbus_ops_t *ops;
- struct xpd *xpds[MAX_XPDS];
- int max_packet_size;
+ char busname[XBUS_NAMELEN]; /* only xbus_new set this */
+ char busdesc[XBUS_DESCLEN]; /* lowlevel drivers set this */
+ int num;
+ xbus_ops_t *ops;
+ struct xpd *xpds[MAX_XPDS];
+ int max_packet_size;
/* Device-Model */
- struct device the_bus;
+ struct device the_bus;
/* Simulator data */
- xbus_type_t bus_type;
-
- spinlock_t lock;
+ xbus_type_t bus_type;
- bool hardware_exists; /* Hardware is functional */
- int open_counter; /* Number of open channels */
- atomic_t packet_counter; /* Allocated packets */
- wait_queue_head_t packet_cache_empty;
+ spinlock_t lock;
- struct timer_list poll_timer;
- struct rw_semaphore in_use;
- int num_xpds;
- void *priv; /* Pointer to transport level data structures */
+ bool hardware_exists; /* Hardware is functional */
+ int open_counter; /* Number of open channels */
+ atomic_t packet_counter; /* Allocated packets */
+ wait_queue_head_t packet_cache_empty;
+
+ struct timer_list poll_timer;
+ /*
+ * Bus scanning
+ */
+ atomic_t count_poll_answers;
+ struct list_head poll_results;
+ wait_queue_head_t wait_for_polls;
+ struct work_struct xpds_init_work;
+ struct completion xpds_initialized;
+
+ struct rw_semaphore in_use;
+ int num_xpds;
+ void *priv; /* Pointer to transport level data structures */
#ifdef CONFIG_PROC_FS
struct proc_dir_entry *proc_xbus_dir;
struct proc_dir_entry *proc_xbus_summary;
+ struct proc_dir_entry *proc_xbus_waitfor_xpds;
#endif
/* statistics */
@@ -236,9 +242,9 @@ struct xpd {
xpd_type_t type;
byte revision; /* Card revision */
xpd_direction_t direction; /* TO_PHONE, TO_PSTN */
- xpp_line_t enabled_chans; /* hardware activation: 0 - off, 1 - on */
xpp_line_t no_pcm; /* Temporary: disable PCM (for USB-1) */
xpp_line_t hookstate; /* Actual chip state: 0 - ONHOOK, 1 - OFHOOK */
+ xpp_line_t cid_on;
xpp_line_t digital_outputs; /* 0 - no, 1 - yes */
xpp_line_t digital_inputs; /* 0 - no, 1 - yes */
@@ -276,6 +282,7 @@ struct xpd {
unsigned int seq_errors;
unsigned long last_response; /* in jiffies */
unsigned id;
+ xpd_addr_t addr;
struct list_head xpd_list;
unsigned int timer_count;
volatile u_char *writechunk; /* Double-word aligned write memory */
@@ -288,10 +295,6 @@ struct xpd {
#define for_each_line(xpd,i) \
for((i) = 0; (i) < (xpd)->channels; (i)++)
-#define for_each_enabled_line(xpd,i) \
- for((i) = 0; (i) < (xpd)->channels; (i)++) \
- if(IS_SET((xpd)->enabled_chans,(i)))
-
#endif
#endif /* XPD_H */
diff --git a/xpp/xpp_usb.c b/xpp/xpp_usb.c
index 4b67299..4f81680 100644
--- a/xpp/xpp_usb.c
+++ b/xpp/xpp_usb.c
@@ -115,6 +115,8 @@ static struct xusb_counters {
#define XUSB_COUNTER_MAX ARRAY_SIZE(xusb_counters)
+#define MAX_PENDING_WRITES 100
+
enum xusb_dir {
XUSB_RECV = 0,
XUSB_SEND = 1,
@@ -138,6 +140,7 @@ typedef struct xpp_usb_bus {
int present; /* if the device is not disconnected */
int reading; /* is the read_urb reading (listening) */
+ atomic_t pending_writes; /* submited but not out yet */
struct semaphore sem; /* locks this structure */
int counters[XUSB_COUNTER_MAX];
} xusb_t;
@@ -311,6 +314,14 @@ static int xusb_packet_send(xbus_t *xbus, xpacket_t *pack)
ret = -EBADF;
goto out;
}
+ atomic_inc(&xusb->pending_writes);
+ if(atomic_read(&xusb->pending_writes) > MAX_PENDING_WRITES) {
+ static int rate_limit;
+
+ if((rate_limit++ % 1000) < 10)
+ ERR("%s: %s: more than %d pending writes. Dropping.\n", __FUNCTION__, xbus->busname, MAX_PENDING_WRITES);
+ ret = -ENODEV;
+ }
if(pack->content.opcode == XPROTO_NAME(GLOBAL,PCM_WRITE))
XUSB_COUNTER(xusb, PCM_WRITES)++;
out:
@@ -395,14 +406,8 @@ static const struct xusb_model_info {
/* table of devices that work with this driver */
static const struct usb_device_id xusb_table [] = {
// { USB_DEVICE(0x04B4, 0x8613) }, // default of cypress
- { USB_DEVICE(0x0547, 0x1002), .driver_info=(kernel_ulong_t)&model_table[0] }, // bulkloop.hex
-// { USB_DEVICE(0x04B4, 0x1004), .driver_info=(kernel_ulong_t)&model_table[1] }, // FPGA_bulkloop.hex
-// { USB_DEVICE(0x04B4, 0x1004), .driver_info=(kernel_ulong_t)&model_table[2] }, // FIXME: temporary test for Dima
{ USB_DEVICE(0xE4E4, 0x2211), .driver_info=(kernel_ulong_t)&model_table[2] }, // FPGA_XPD.hex
{ USB_DEVICE(0xE4E4, 0x1132), .driver_info=(kernel_ulong_t)&model_table[2] }, // FPGA_XPD.hex
-// { USB_DEVICE(0x04B4, 0x1004), .driver_info=(kernel_ulong_t)&model_table[2] }, // TEST ONLY
- //{ USB_DEVICE(0x0548, 0x1) },
- //{ USB_DEVICE(0x062a, 0x0) },
/* "Gadget Zero" firmware runs under Linux */
//{ USB_DEVICE(0x0525, 0xa4a0) },
{ } /* Terminating entry */
@@ -556,6 +561,7 @@ static int xusb_probe(struct usb_interface *interface, const struct usb_device_i
memset(xusb, 0, sizeof(xusb_t));
init_MUTEX (&xusb->sem);
+ atomic_set(&xusb->pending_writes, 0);
xusb->udev = udev;
xusb->interface = interface;
xusb->model_info = model_info;
@@ -631,6 +637,7 @@ static int xusb_probe(struct usb_interface *interface, const struct usb_device_i
retval = -EIO;
goto probe_failed;
}
+ procsummary->owner = THIS_MODULE;
#endif
bus_count++;
retval = usb_submit_urb(xusb->read_urb, GFP_ATOMIC);
@@ -732,6 +739,7 @@ static void xpp_send_callback(struct urb *urb, struct pt_regs *regs)
xbus_t *xbus = xusb->xbus;
BUG_ON(!xbus);
+ atomic_dec(&xusb->pending_writes);
/* sync/async unlink faults aren't errors */
if (urb->status && !(urb->status == -ENOENT || urb->status == -ECONNRESET)) {
static int rate_limit;
@@ -739,11 +747,11 @@ static void xpp_send_callback(struct urb *urb, struct pt_regs *regs)
DBG("nonzero read bulk status received: %d\n", urb->status);
XUSB_COUNTER(xusb, TX_ERRORS)++;
}
+ xpp_urb_delete(urb);
if(!xusb->present) {
ERR("A packet from non-connected device?\n");
return;
}
- xpp_urb_delete(urb);
/* allow device read, write and ioctl */
XUSB_COUNTER(xusb, TX_PACKETS)++;
}
@@ -875,6 +883,7 @@ static int xusb_read_proc(char *page, char **start, off_t off, int count, int *e
xusb->endpoints[XUSB_SEND].ep_addr,
xusb->endpoints[XUSB_SEND].max_size
);
+ len += sprintf(page + len, "\npending_writes=%d\n", atomic_read(&xusb->pending_writes));
#ifdef DEBUG_PCM_TIMING
len += sprintf(page + len, "\nstamp_last_pcm_read=%lld accumulate_diff=%lld\n", stamp_last_pcm_read, accumulate_diff);
#endif
diff --git a/xpp/xpp_zap.c b/xpp/xpp_zap.c
index 4c8d3e9..4209fda 100644
--- a/xpp/xpp_zap.c
+++ b/xpp/xpp_zap.c
@@ -40,7 +40,7 @@
#include <linux/proc_fs.h>
#ifdef STANDALONE_ZAPATA
-#include "zaptel.h"
+#include "../zaptel.h"
#else
#include <zaptel/zaptel.h>
#endif
@@ -69,25 +69,20 @@ static struct timer_list xpp_timer;
static xpd_t *sync_master = NULL; // Start with host based sync
static unsigned int xpp_timer_count = 0;
static unsigned int xpp_last_jiffies = 0;
-struct workqueue_struct *xpp_worker = NULL;
-
-static LIST_HEAD(xpd_list);
DEF_PARM(int, print_dbg, 0, "Print DBG statements");
DEF_PARM(int, max_queue_len, MAX_QUEUE_LEN, "Maximum Queue Length.");
-DEF_PARM(int, ignore_xpds, 0, "a bitmask of xpd numbers to ignore");
-DEF_PARM(int, xbus_err_disable_bus, 1000, "Number of errors needed to disable bus"); // FIXME: unused now.
-DEF_PARM(ulong, pcm_gen, 0, "a bitmask of line numbers for hardware tone generator");
DEF_PARM(bool, have_sync_bus, 0, "True if all Astribank(TM) devices are connected via a sync-cable");
DEF_PARM(bool, zap_autoreg, 1, "Register spans automatically (1) or not (0)");
-DEF_ARRAY(ulong, enabled_channels, MAX_XPDS, ~0, "Enabled channels for each xpd");
-
#include "zap_debug.h"
+#ifdef XPP_EC_CHUNK
+#include "echo_supress/ec_xpp.h"
+#endif
-static int xpd_zaptel_register(xpd_t *xpd);
-static int xpd_zaptel_unregister(xpd_t *xpd);
+static int zaptel_register_xpd(xpd_t *xpd);
+static int zaptel_unregister_xpd(xpd_t *xpd);
static void xpp_ring_generate(xpd_t *xpd);
static void xpp_transmitprep(xpd_t *xpd);
static void xpp_receiveprep(xpd_t *xpd);
@@ -207,7 +202,10 @@ static void xpd_free(xpd_t *xpd)
if(!xpd)
return;
xbus = xpd->xbus;
+ if(!xbus)
+ return;
DBG("%s/%s\n", xbus->busname, xpd->xpdname);
+ xbus_unregister_xpd(xbus, xpd);
#ifdef CONFIG_PROC_FS
if(xpd->proc_xpd_dir) {
if(xpd->proc_xpd_summary) {
@@ -227,23 +225,42 @@ static void xpd_free(xpd_t *xpd)
#endif
if(xpd->writechunk)
kfree((void *)xpd->writechunk);
+ xpd->writechunk = NULL;
if(xpd->xproto)
xproto_put(xpd->xproto);
+ xpd->xproto = NULL;
kfree(xpd);
}
/*------------------------- XPD Management -------------------------*/
+#define REV(x,y) (10 * (x) + (y))
+static byte good_revs[] = {
+ REV(1,9),
+ REV(2,0),
+};
+#undef REV
+
+static bool good_rev(byte rev)
+{
+ int i;
+
+ for(i = 0; i < ARRAY_SIZE(good_revs); i++) {
+ if(good_revs[i] == rev)
+ return 1;
+ }
+ return 0;
+}
+
/*
* Synchronous part of XPD detection.
- * Called from xpp_worker workqueue.
+ * Called from xbus_poll()
*/
-void card_detected(void *data)
+void card_detected(struct card_desc_struct *card_desc)
{
- struct card_desc_struct *card_desc = (struct card_desc_struct *)data;
xbus_t *xbus;
- xpd_t *xpd;
+ xpd_t *xpd = NULL;
int xpd_num;
byte type;
byte rev;
@@ -254,16 +271,24 @@ void card_detected(void *data)
BUG_ON(!card_desc);
BUG_ON(card_desc->magic != CARD_DESC_MAGIC);
xbus = card_desc->xbus;
- xpd_num = card_desc->xpd_num;
+ xpd_num = xpd_addr2num(&card_desc->xpd_addr);
type = card_desc->type;
rev = card_desc->rev;
BUG_ON(!xbus);
- DBG("%s: xpd_num=%d type=%d rev=%d\n", xbus->busname, xpd_num, type, rev);
+ if(!good_rev(rev)) {
+ NOTICE("%s: New XPD #%d (%d-%d) type=%d has bad firmware revision %d.%d\n", xbus->busname,
+ xpd_num, card_desc->xpd_addr.unit, card_desc->xpd_addr.subunit,
+ type, rev / 10, rev % 10);
+ goto err;
+ }
+ INFO("%s: New XPD #%d (%d-%d) type=%d Revision %d.%d\n", xbus->busname,
+ xpd_num, card_desc->xpd_addr.unit, card_desc->xpd_addr.subunit,
+ type, rev / 10, rev % 10);
xpd = xpd_of(xbus, xpd_num);
if(xpd) {
if(type == XPD_TYPE_NOMODULE) {
NOTICE("%s: xpd #%d: removed\n", __FUNCTION__, xpd_num);
- xpd_disconnect(xpd);
+ BUG();
goto out;
}
NOTICE("%s: xpd #%d: already exists\n", __FUNCTION__, xpd_num);
@@ -285,13 +310,14 @@ void card_detected(void *data)
NOTICE("card_new(%s,%d,%d,%d) failed. Ignored.\n", xbus->busname, xpd_num, proto_table->type, rev);
goto err;
}
+ xpd->addr = card_desc->xpd_addr;
/* For USB-1 disable some channels */
if(xbus->max_packet_size < RPACKET_SIZE(GLOBAL, PCM_WRITE)) {
xpp_line_t no_pcm;
no_pcm = 0x7F | xpd->digital_outputs | xpd->digital_inputs;
- xpd->no_pcm = no_pcm & xpd->enabled_chans;
+ xpd->no_pcm = no_pcm;
NOTICE("%s: max packet size = %d, disabling some PCM channels. no_pcm=0x%04X\n",
xbus->busname, xbus->max_packet_size, xpd->no_pcm);
}
@@ -308,28 +334,28 @@ void card_detected(void *data)
ERR("Failed to create proc '%s' for %s/%s\n", PROC_XPD_SUMMARY, xbus->busname, xpd->xpdname);
goto err;
}
+ xpd->proc_xpd_summary->owner = THIS_MODULE;
xpd->proc_xpd_ztregister = create_proc_entry(PROC_XPD_ZTREGISTER, 0644, xpd->proc_xpd_dir);
if (!xpd->proc_xpd_ztregister) {
ERR("Failed to create proc '%s' for %s/%s\n", PROC_XPD_ZTREGISTER, xbus->busname, xpd->xpdname);
goto err;
}
+ xpd->proc_xpd_ztregister->owner = THIS_MODULE;
xpd->proc_xpd_ztregister->data = xpd;
xpd->proc_xpd_ztregister->read_proc = proc_xpd_ztregister_read;
xpd->proc_xpd_ztregister->write_proc = proc_xpd_ztregister_write;
#endif
+ xbus_register_xpd(xbus, xpd);
if(CALL_XMETHOD(card_init, xbus, xpd) < 0)
goto err;
- list_add(&xpd->xpd_list, &xpd_list);
- xbus->xpds[xpd->id] = xpd;
- xbus->num_xpds++;
// Turn off all channels
CALL_XMETHOD(CHAN_ENABLE, xbus, xpd, ~0, 0);
xpd->card_present = 1;
- // Turn on enabled channels
- CALL_XMETHOD(CHAN_ENABLE, xbus, xpd, xpd->enabled_chans, 1);
+ // Turn on all channels
+ CALL_XMETHOD(CHAN_ENABLE, xbus, xpd, ALL_LINES, 1);
if(zap_autoreg)
- xpd_zaptel_register(xpd);
+ zaptel_register_xpd(xpd);
out:
memset(card_desc, 0, sizeof(struct card_desc_struct));
kfree(card_desc);
@@ -372,10 +398,6 @@ static int xpd_read_proc(char *page, char **start, off_t off, int count, int *eo
xpd->timer_count, xpd->span.mainttimer
);
len += sprintf(page + len, "STATES:");
- len += sprintf(page + len, "\n\t%-17s: ", "enabled");
- for_each_line(xpd, i) {
- len += sprintf(page + len, "%d ", IS_SET(xpd->enabled_chans, i));
- }
len += sprintf(page + len, "\n\t%-17s: ", "output_relays");
for_each_line(xpd, i) {
len += sprintf(page + len, "%d ", IS_SET(xpd->digital_outputs, i));
@@ -469,8 +491,7 @@ xpd_t *xpd_alloc(size_t privsize, xbus_t *xbus, int xpd_num, const xproto_table_
size_t alloc_size = sizeof(xpd_t) + privsize;
int i;
- INFO("New XPD #%d (Revision %d.%d) detected on xbus %s\n",
- xpd_num, revision / 10, revision % 10, xbus->busname);
+ DBG("%s: xpd #%d\n", xbus->busname, xpd_num);
if(!VALID_XPD_NUM(xpd_num)) {
ERR("%s: illegal xpd id = %d\n", __FUNCTION__, xpd_num);
goto err;
@@ -498,7 +519,6 @@ xpd_t *xpd_alloc(size_t privsize, xbus_t *xbus, int xpd_num, const xproto_table_
xpd->type = proto_table->type;
xpd->xproto = proto_table;
xpd->xops = &proto_table->xops;
- xpd->enabled_chans = enabled_channels[xpd_num];
xpd->digital_outputs = 0;
xpd->digital_inputs = 0;
@@ -535,6 +555,13 @@ err:
return NULL;
}
+/* FIXME: this should be removed once digium patch their zaptel.h
+ * I simply wish to avoid changing zaptel.h in the xpp patches.
+ */
+#ifndef ZT_EVENT_REMOVED
+#define ZT_EVENT_REMOVED (20)
+#endif
+
void xpd_disconnect(xpd_t *xpd)
{
unsigned long flags;
@@ -550,8 +577,15 @@ void xpd_disconnect(xpd_t *xpd)
if(!xpd->card_present) /* Multiple reports */
goto out;
xpd->card_present = 0;
- if(SPAN_REGISTERED(xpd))
+ if(SPAN_REGISTERED(xpd)) {
+ int i;
+
update_xpd_status(xpd, ZT_ALARM_NOTOPEN);
+ /* TODO: Should this be done before releasing the spinlock? */
+ DBG("Queuing ZT_EVENT_REMOVED on all channels to ask user to release them\n");
+ for (i=0; i<xpd->span.channels; i++)
+ zt_qevent_lock(&xpd->chans[i],ZT_EVENT_REMOVED);
+ }
out:
spin_unlock_irqrestore(&xpd->lock, flags);
}
@@ -562,12 +596,9 @@ void xpd_remove(xpd_t *xpd)
BUG_ON(!xpd);
xbus = xpd->xbus;
- INFO("Remove XPD #%d from xbus=%s\n", xpd->id, xbus->busname);
+ INFO("%s: Remove XPD #%d from\n", xbus->busname, xpd->id);
- xpd_zaptel_unregister(xpd);
- xbus->xpds[xpd->id] = NULL;
- list_del(&xpd->xpd_list);
- xbus->num_xpds--;
+ zaptel_unregister_xpd(xpd);
CALL_XMETHOD(card_remove, xbus, xpd);
xpd_free(xpd);
}
@@ -595,6 +626,18 @@ void update_xpd_status(xpd_t *xpd, int alarm_flag)
DBG("Update XPD alarms: %s -> %02X\n", xpd->span.name, alarm_flag);
}
+void update_line_status(xpd_t *xpd, int pos, bool good)
+{
+ struct zt_chan *chan;
+
+ BUG_ON(!xpd);
+ chan = &xpd->chans[pos];
+ if(good)
+ zt_hooksig(chan, ZT_RXSIG_OFFHOOK);
+ else
+ zt_hooksig(chan, ZT_RXSIG_ONHOOK);
+}
+
static void xpp_ring_generate(xpd_t *xpd)
{
int i;
@@ -616,7 +659,7 @@ static void xpp_ring_generate(xpd_t *xpd)
* Ring detect logic:
* fxo_power is toggled
*/
- for_each_enabled_line(xpd, i) {
+ for_each_line(xpd, i) {
if(xpd->ringing[i] || xpd->ringer_on[i]) {
// ring state is only changed once per second:
if((xpd->timer_count % 1000) == 0) {
@@ -764,9 +807,9 @@ static int proc_xpd_ztregister_write(struct file *file, const char __user *buffe
DBG("%s: %s/%s %s\n", __FUNCTION__,
xpd->xbus->busname, xpd->xpdname, (zt_reg) ? "register" : "unregister");
if(zt_reg)
- ret = xpd_zaptel_register(xpd);
+ ret = zaptel_register_xpd(xpd);
else
- ret = xpd_zaptel_unregister(xpd);
+ ret = zaptel_unregister_xpd(xpd);
return (ret < 0) ? ret : count;
}
@@ -870,14 +913,14 @@ static void xpp_transmitprep(xpd_t *xpd)
wake_up_interruptible(&xpd->txstateq[i]);
}
}
- if(IS_SET(xpd->hookstate, i)) {
+ if(IS_SET(xpd->hookstate, i) || IS_SET(xpd->cid_on, i)) {
memcpy((u_char *)w, chans[i].writechunk, ZT_CHUNKSIZE);
// fill_beep((u_char *)w, 5);
}
w += ZT_CHUNKSIZE;
}
// if(xpd->hookstate != 0 || sync_master != xpd) {
- ret = CALL_XMETHOD(PCM_WRITE, xpd->xbus, xpd, xpd->hookstate, writechunk);
+ ret = CALL_XMETHOD(PCM_WRITE, xpd->xbus, xpd, xpd->hookstate | xpd->cid_on, writechunk);
if(ret < 0) {
DBG("failed to write PCM %d\n", ret);
}
@@ -918,7 +961,7 @@ static inline void xpp_ec_chunk(struct zt_chan *chan, unsigned char *rxchunk, co
spin_lock_irqsave(&chan->lock, flags);
for (x=0;x<ZT_CHUNKSIZE;x++) {
rxlin = ZT_XLAW(rxchunk[x], chan);
- rxlin = echo_can_update(chan->ec, ZT_XLAW(txchunk[x], chan), rxlin);
+ rxlin = xpp_echo_can_update(chan->ec, ZT_XLAW(txchunk[x], chan), rxlin);
rxchunk[x] = ZT_LIN2X((int)rxlin, chan);
}
spin_unlock_irqrestore(&chan->lock, flags);
@@ -950,6 +993,8 @@ static void xpp_receiveprep(xpd_t *xpd)
// memset((u_char *)readchunk, 0x5A, ZT_CHUNKSIZE); // DEBUG
// fill_beep((u_char *)readchunk, 1); // DEBUG: BEEP
memcpy(chans[i].readchunk, (u_char *)readchunk, ZT_CHUNKSIZE);
+ } else {
+ memset(chans[i].readchunk, 0x7F, ZT_CHUNKSIZE); // SILENCE
}
readchunk += ZT_CHUNKSIZE;
}
@@ -1051,7 +1096,7 @@ int xpp_ioctl(struct zt_chan *chan, unsigned int cmd, unsigned long arg)
xpd->idletxhookstate[pos] = FXS_LINE_CID; /* OHT mode when idle */
if (xpd->lasttxhook[pos] == FXS_LINE_ENABLED) {
/* Apply the change if appropriate */
- CALL_XMETHOD(CHAN_CID, xpd->xbus, xpd, BIT(pos)); // CALLER ID
+ CALL_XMETHOD(CHAN_CID, xpd->xbus, xpd, pos); // CALLER ID
}
DBG("xpd=%d: ZT_ONHOOKTRANSFER (%d millis) chan=%d\n", xpd->id, x, pos);
return -ENOTTY;
@@ -1062,6 +1107,13 @@ int xpp_ioctl(struct zt_chan *chan, unsigned int cmd, unsigned long arg)
xpd->id, pos, (x & ZT_TONEDETECT_ON), (x & ZT_TONEDETECT_MUTE));
return -ENOTTY;
default:
+ /* Some span-specific commands before we give up: */
+ if (xpd->xops->card_ioctl != NULL) {
+ x = xpd->xops->card_ioctl(xpd, pos, cmd, arg);
+ if (x != -ENOTTY)
+ return x;
+ }
+
DBG("ENOTTY: chan=%d cmd=0x%x\n", pos, cmd);
DBG(" IOC_TYPE=0x%02X\n", _IOC_TYPE(cmd));
DBG(" IOC_DIR=0x%02X\n", _IOC_DIR(cmd));
@@ -1078,85 +1130,12 @@ static int xpp_hooksig(struct zt_chan *chan, zt_txsig_t txsig)
xpd_t *xpd = chan->pvt;
xbus_t *xbus;
int pos = chan->chanpos - 1;
- int ret = 0;
BUG_ON(!xpd);
xbus = xpd->xbus;
BUG_ON(!xbus);
-
DBG("Setting %s to %s (%d)\n", chan->name, txsig2str(txsig), txsig);
- if(xpd->direction == TO_PSTN) {
- /* XXX Enable hooksig for FXO XXX */
- switch(txsig) {
- case ZT_TXSIG_START:
- // DBG("%s: ZT_TXSIG_START (drop through.)\n", chan->name);
- case ZT_TXSIG_OFFHOOK:
- // DBG("%s: ZT_TXSIG_OFFHOOK\n", chan->name);
- do_sethook(xpd, pos, 1);
- break;
- case ZT_TXSIG_ONHOOK:
- // DBG("%s: ZT_TXSIG_ONHOOK\n", chan->name);
- do_sethook(xpd, pos, 0);
- break;
- default:
- NOTICE("Can't set tx state to %s (%d)\n", txsig2str(txsig), txsig);
- return -EINVAL;
- }
- } else { /* TO_PHONE */
- switch(txsig) {
- case ZT_TXSIG_ONHOOK:
- // DBG("%s: ZT_TXSIG_ONHOOK\n", chan->name);
- xpd->ringing[pos] = 0;
- ret = CALL_XMETHOD(RING, xbus, xpd, pos, 0); // RING off
- switch(chan->sig) {
- case ZT_SIG_EM:
- case ZT_SIG_FXOKS:
- case ZT_SIG_FXOLS:
- xpd->lasttxhook[pos] = xpd->idletxhookstate[pos];
- break;
- case ZT_SIG_FXOGS:
- xpd->lasttxhook[pos] = FXS_LINE_TIPOPEN;
- break;
- }
- break;
- case ZT_TXSIG_OFFHOOK:
- // DBG("%s: ZT_TXSIG_OFFHOOK\n", chan->name);
- xpd->ringing[pos] = 0;
- ret = CALL_XMETHOD(RING, xbus, xpd, pos, 0); // RING off
- switch(chan->sig) {
- case ZT_SIG_EM:
- xpd->lasttxhook[pos] = FXS_LINE_REV_ACTIVE;
- break;
- default:
- xpd->lasttxhook[pos] = xpd->idletxhookstate[pos];
- break;
- }
- break;
- case ZT_TXSIG_START:
- // DBG("%s: ZT_TXSIG_START\n", chan->name);
- xpd->lasttxhook[pos] = FXS_LINE_RING;
- xpd->ringing[pos] = 1;
- if(IS_SET(xpd->digital_inputs, pos)) {
- NOTICE("%s: Trying to RING a digital input channel %d. Ignoring\n", __FUNCTION__, pos);
- return -EINVAL;
- }
- if(IS_SET(xpd->digital_outputs, pos)) {
- DBG("ZT_RING %s digital output ON\n", chan->name);
- ret = CALL_XMETHOD(RELAY_OUT, xpd->xbus, xpd, pos-8, 1);
- return ret;
- }
- ret = CALL_XMETHOD(RING, xbus, xpd, pos, 1); // RING on
- break;
- case ZT_TXSIG_KEWL:
- // DBG("%s: ZT_TXSIG_KEWL\n", chan->name);
- xpd->lasttxhook[pos] = FXS_LINE_DISABLED;
- break;
- default:
- NOTICE("%s: Can't set tx state to %s (%d)\n", __FUNCTION__, txsig2str(txsig), txsig);
- return -EINVAL;
- }
- }
- return 0;
+ return CALL_XMETHOD(card_hooksig, xbus, xpd, pos, txsig);
}
#else
@@ -1254,6 +1233,29 @@ int (*hooksig)(struct zt_chan *chan, zt_txsig_t hookstate);
int (*sethook)(struct zt_chan *chan, int hookstate);
#endif
+#ifdef XPP_EC_CHUNK
+static int xpp_echocan(struct zt_chan *chan, int len)
+{
+ if(len == 0) { /* shut down */
+ /* zaptel calls this also during channel initialization */
+ if(chan->ec) {
+ xpp_echo_can_free(chan->ec);
+ }
+ return 0;
+ }
+ if(chan->ec) {
+ ERR("%s: Trying to override an existing EC (%p)\n", __FUNCTION__, chan->ec);
+ return -EINVAL;
+ }
+ chan->ec = xpp_echo_can_create(len, 0);
+ if(!chan->ec) {
+ ERR("%s: Failed creating xpp EC (len=%d)\n", __FUNCTION__, len);
+ return -EINVAL;
+ }
+ return 0;
+}
+#endif
+
#ifdef CONFIG_ZAPTEL_WATCHDOG
/*
* If the watchdog detects no received data, it will call the
@@ -1280,7 +1282,7 @@ static int xpp_watchdog(struct zt_span *span, int cause)
* - User action through /proc
* - During xpd_remove()
*/
-static int xpd_zaptel_unregister(xpd_t *xpd)
+static int zaptel_unregister_xpd(xpd_t *xpd)
{
unsigned long flags;
@@ -1303,18 +1305,17 @@ static int xpd_zaptel_unregister(xpd_t *xpd)
mdelay(2); // FIXME: This is to give chance for transmit/receiveprep to finish.
spin_unlock_irqrestore(&xpd->lock, flags);
if(xpd->card_present)
- xpd->xops->card_zaptel_registration(xpd, 0);
+ xpd->xops->card_zaptel_preregistration(xpd, 0);
zt_unregister(&xpd->span);
+ if(xpd->card_present)
+ xpd->xops->card_zaptel_postregistration(xpd, 0);
return 0;
}
-static int xpd_zaptel_register(xpd_t *xpd)
+static int zaptel_register_xpd(xpd_t *xpd)
{
- struct zt_chan *cur_chan;
struct zt_span *span;
xbus_t *xbus;
- int sigfxs;
- int i;
int cn;
const xops_t *xops;
@@ -1325,7 +1326,6 @@ static int xpd_zaptel_register(xpd_t *xpd)
ERR("xpd %s already registered\n", xpd->xpdname);
return -EEXIST;
}
- sigfxs = ! (xpd->direction == TO_PHONE); /* signaling is opposite */
cn = xpd->channels;
DBG("Initializing span: xpd %d have %d channels.\n", xpd->id, cn);
@@ -1334,46 +1334,7 @@ static int xpd_zaptel_register(xpd_t *xpd)
span = &xpd->span;
xbus = xpd->xbus;
- snprintf(span->name, MAX_SPANNAME, "%s/%s",
- xbus->busname, xpd->xpdname);
- snprintf(span->desc, MAX_SPANDESC, "Xorcom XPD #%d/%d: %s",
- xbus->num, xpd->id,
- (xpd->direction == TO_PHONE) ? "FXS" : "FXO"
- );
- for(i = 0; i < cn; i++) {
-
- cur_chan = &xpd->chans[i];
- DBG("setting channel %d (sigfxs=%d)\n", i, sigfxs);
- if(IS_SET(xpd->digital_outputs, i)) {
- snprintf(cur_chan->name, MAX_CHANNAME, "XPP_OUT/%d/%d/%d", xbus->num, xpd->id, i);
- } else if(IS_SET(xpd->digital_inputs, i)) {
- snprintf(cur_chan->name, MAX_CHANNAME, "XPP_IN/%d/%d/%d", xbus->num, xpd->id, i);
- } else {
- snprintf(cur_chan->name, MAX_CHANNAME, "XPP_%s/%d/%d/%d", (sigfxs) ? "FXO" : "FXS", xbus->num, xpd->id, i);
- }
- cur_chan->chanpos = i + 1;
- cur_chan->pvt = xpd;
- if (sigfxs)
- cur_chan->sigcap =
-#if 1
- ZT_SIG_FXSKS |
- ZT_SIG_FXSLS |
-#else
- ZT_SIG_SF |
-#endif
- 0;
- else
- cur_chan->sigcap =
-#if 1
- ZT_SIG_FXOKS |
- ZT_SIG_FXOLS |
- ZT_SIG_FXOGS |
-#else
- ZT_SIG_SF |
- ZT_SIG_EM |
-#endif
- 0;
- }
+ snprintf(span->name, MAX_SPANNAME, "%s/%s", xbus->busname, xpd->xpdname);
span->deflaw = ZT_LAW_MULAW;
init_waitqueue_head(&span->maintq);
span->pvt = xpd;
@@ -1394,22 +1355,21 @@ static int xpd_zaptel_register(xpd_t *xpd)
#endif
span->ioctl = xpp_ioctl;
span->maint = xpp_maint;
+#ifdef XPP_EC_CHUNK
+ span->echocan = xpp_echocan;
+#endif
#ifdef CONFIG_ZAPTEL_WATCHDOG
span->watchdog = xpp_watchdog;
#endif
- DBG("Finished span_load: ZT_FLAG_RUNNING=%d\n", span->flags & ZT_FLAG_RUNNING);
-
DBG("Registering span of %s.\n", xpd->xpdname);
+ xpd->xops->card_zaptel_preregistration(xpd, 1);
if(zt_register(&xpd->span, 1)) {
xbus_t *xbus = xpd->xbus;
- ERR("Failed to zt_register of span of xpd %s.\n", xpd->xpdname);
- xbus->xpds[xpd->id] = NULL;
- list_del(&xpd->xpd_list);
- xbus->num_xpds--;
+ ERR("%s/%s: Failed to zt_register span\n", xbus->busname, xpd->xpdname);
return -ENODEV;
}
- xpd->xops->card_zaptel_registration(xpd, 1);
+ xpd->xops->card_zaptel_postregistration(xpd, 1);
return 0;
}
@@ -1498,7 +1458,7 @@ static ssize_t xpp_sys_write (struct file * file, const char __user * buf,
if (copy_from_user (pack_tx->content.raw, buf, count)) {
return -EFAULT;
}
- XPD_ADDR_SET(pack_tx->content.addr, xpdnum);
+ xpd_set_addr(&pack_tx->content.addr, xpdnum);
pack_tx->datalen = count;
// pack_tx->flags |= XPP_PACKET_FIREANDFORGET;
DBG("sending op=%d to %d\n", pack_tx->content.opcode, xpdnum);
@@ -1528,11 +1488,6 @@ static void do_cleanup(void)
{
if(timer_pending(&xpp_timer))
del_timer_sync(&xpp_timer);
- if (xpp_worker) {
- flush_workqueue(xpp_worker);
- destroy_workqueue(xpp_worker);
- xpp_worker = NULL;
- }
#if 0
unregister_chrdev(XPP_CTL_MAJOR, THIS_MODULE->name);
#endif
@@ -1582,12 +1537,6 @@ int __init xpp_zap_init(void)
ent->write_proc = proc_sync_write;
ent->data = NULL;
#endif
- xpp_worker = create_singlethread_workqueue("xppworker");
- if(!xpp_worker) {
- ERR("Failed to create card detector workqueue.\n");
- do_cleanup();
- return -ENOMEM;
- }
ret = xbus_core_init();
if(ret) {
ERR("xbus_core_init failed (%d)\n", ret);
@@ -1621,6 +1570,7 @@ EXPORT_SYMBOL(xpd_alloc);
EXPORT_SYMBOL(xpd_disconnect);
EXPORT_SYMBOL(packet_send);
EXPORT_SYMBOL(update_xpd_status);
+EXPORT_SYMBOL(update_line_status);
EXPORT_SYMBOL(fill_beep);
EXPORT_SYMBOL(xpp_tick);
EXPORT_SYMBOL(xpp_open);
diff --git a/xpp/xpp_zap.h b/xpp/xpp_zap.h
index 38b3521..4d884ad 100644
--- a/xpp/xpp_zap.h
+++ b/xpp/xpp_zap.h
@@ -28,10 +28,11 @@
void xpd_disconnect(xpd_t *xpd);
int packet_send(xbus_t *xbus, xpacket_t *pack_tx);
-void card_detected(void *data);
+void card_detected(struct card_desc_struct *card_desc);
xpd_t *xpd_alloc(size_t privsize, xbus_t *xbus, int xpd_num, const xproto_table_t *proto_table, int channels, byte revision);
void xpd_remove(xpd_t *xpd);
void update_xpd_status(xpd_t *xpd, int alarm_flag);
+void update_line_status(xpd_t *xpd, int pos, bool good);
void fill_beep(u_char *buf, int duration);
void xpp_tick(unsigned long param);
int xpp_open(struct zt_chan *chan);
@@ -40,16 +41,6 @@ int xpp_ioctl(struct zt_chan *chan, unsigned int cmd, unsigned long arg);
int xpp_maint(struct zt_span *span, int cmd);
void sync_master_is(xpd_t *xpd);
-#define CARD_DESC_MAGIC 0xca9dde5c
-
-struct card_desc_struct {
- struct work_struct work;
- u32 magic;
- xbus_t *xbus;
- byte rev; /* Revision number */
- byte type; /* LSB: 1 - to_phone, 0 - to_line */
- byte xpd_num;
-};
extern struct workqueue_struct *xpp_worker;
#ifdef CONFIG_PROC_FS
diff --git a/xpp/xproto.c b/xpp/xproto.c
index 1fb28c5..7e6dd56 100644
--- a/xpp/xproto.c
+++ b/xpp/xproto.c
@@ -34,26 +34,25 @@ static int packet_process(xbus_t *xbus, int xpd_num, xpacket_t *pack);
static const xproto_table_t *xprotocol_tables[XPD_TYPE_NOMODULE];
+#if MAX_UNIT*MAX_SUBUNIT > MAX_XPDS
+#error MAX_XPDS is too small
+#endif
+
bool valid_xpd_addr(const xpd_addr_t *addr)
{
- return ((addr->bank_num & ~0x1) == 0) && ((addr->card_id & ~0x3) == 0);
+ return ((addr->subunit & ~0x1) == 0) && ((addr->unit & ~0x3) == 0);
}
int xpd_addr2num(const xpd_addr_t *addr)
{
BUG_ON(!valid_xpd_addr(addr));
- return addr->bank_num * 4 + addr->card_id;
+ return addr->unit + addr->subunit * MAX_UNIT;
}
void xpd_set_addr(xpd_addr_t *addr, int xpd_num)
{
- if(xpd_num < 4) {
- addr->card_id = xpd_num;
- addr->bank_num = 0;
- } else {
- addr->card_id = xpd_num % 4;
- addr->bank_num = xpd_num / 4;
- }
+ addr->unit = xpd_num % MAX_UNIT;
+ addr->subunit = xpd_num / MAX_UNIT;
}
@@ -195,7 +194,8 @@ static int packet_process(xbus_t *xbus, int xpd_num, xpacket_t *pack)
xe = find_xproto_entry(xpd, op);
/*-------- Validations -----------*/
if(!xe) {
- ERR("xpp: %s -- bad command op=0x%02X\n", __FUNCTION__, op);
+ ERR("xpp: %s: %s unit #%d: bad command op=0x%02X\n",
+ __FUNCTION__, xbus->busname, xpd_num, op);
dump_packet("packet_process -- bad command", pack, print_dbg);
ret = -EPROTO;
goto out;
@@ -227,10 +227,10 @@ void dump_packet(const char *msg, xpacket_t *packet, bool print_dbg)
if(!print_dbg)
return;
- DBG("%s: @0x%1X%1X OP=0x%02X LEN=%d\n",
+ DBG("%s: U=0x%1X S=0x%1X OP=0x%02X LEN=%d\n",
msg,
- packet->content.addr.bank_num,
- packet->content.addr.card_id,
+ packet->content.addr.unit,
+ packet->content.addr.subunit,
op,
(byte)packet->datalen);
#if VERBOSE_DEBUG
@@ -296,8 +296,14 @@ int xproto_register(const xproto_table_t *proto_table)
CHECK_XOP(card_init);
CHECK_XOP(card_remove);
CHECK_XOP(card_tick);
- CHECK_XOP(card_zaptel_registration);
+ CHECK_XOP(card_zaptel_preregistration);
+ CHECK_XOP(card_zaptel_postregistration);
+#ifdef WITH_RBS
+ CHECK_XOP(card_hooksig);
+#else
CHECK_XOP(card_sethook);
+#endif
+ // CHECK_XOP(card_ioctl); // optional method -- call after testing
CHECK_XOP(SYNC_SOURCE);
CHECK_XOP(PCM_WRITE);
CHECK_XOP(CHAN_ENABLE);
diff --git a/xpp/xproto.h b/xpp/xproto.h
index 0cae398..4fcc81a 100644
--- a/xpp/xproto.h
+++ b/xpp/xproto.h
@@ -26,12 +26,18 @@
#ifdef __KERNEL__
#include <linux/list.h>
+#include <zaptel.h>
#endif
#define PROTO_TABLE(n) n ## _protocol_table
-#define XPD_TYPE_FXS 3
-#define XPD_TYPE_FXO 4
+/*
+ * The LSB of the type number signifies:
+ * 0 - TO_PSTN
+ * 1 - TO_PHONE
+ */
+#define XPD_TYPE_FXS 3 // TO_PHONE
+#define XPD_TYPE_FXO 4 // TO_PSTN
#define XPD_TYPE_NOMODULE 15
typedef byte xpd_type_t;
@@ -44,16 +50,15 @@ typedef byte xpd_type_t;
#define PCM_CHUNKSIZE (CHANNELS_PERXPD * 8) /* samples of 8 bytes */
typedef struct xpd_addr {
- byte card_id:4;
- byte bank_num:4;
-} __attribute__((packed)) xpd_addr_t;
+ byte unit:UNIT_BITS;
+ byte subunit:SUBUNIT_BITS;
+} PACKED xpd_addr_t;
bool valid_xpd_addr(const xpd_addr_t *addr);
int xpd_addr2num(const xpd_addr_t *addr);
void xpd_set_addr(xpd_addr_t *addr, int xpd_num);
#define XPD_NUM(x) xpd_addr2num(&x)
-#define XPD_ADDR_SET(x,val) xpd_set_addr(&x, val)
#define MAX_XPACKET_DATALEN 100
#define XPROTO_NAME(card,op) card ## _ ## op
@@ -85,11 +90,12 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num);
byte opcode; \
xpd_addr_t addr; \
__VA_ARGS__ \
- } __attribute__((packed))
+ } PACKED
#define RPACKET_CAST(p,card,op) ((RPACKET_TYPE(card,op) *)p)
#define RPACKET_FIELD(p,card,op,field) (RPACKET_CAST(p,card,op)->field)
#define RPACKET_SIZE(card,op) sizeof(RPACKET_TYPE(card,op))
+#define RPACKET_DATALEN(card,op) (RPACKET_SIZE(card,op) - sizeof(xpd_addr_t) - 1)
#define PACKET_LEN(p) \
((p)->datalen + sizeof(xpd_addr_t) + 1)
@@ -97,7 +103,7 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num);
#define XENTRY(card,op) \
[ XPROTO_NAME(card,op) ] { \
.handler = XPROTO_HANDLER(card,op), \
- .datalen = RPACKET_SIZE(card,op), \
+ .datalen = RPACKET_DATALEN(card,op), \
.name = #op, \
.table = &PROTO_TABLE(card) \
}
@@ -106,7 +112,7 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num);
#define XPACKET_INIT(p, card, op) \
do { \
p->content.opcode = XPROTO_NAME(card,op); \
- p->datalen = RPACKET_SIZE(card,op); \
+ p->datalen = RPACKET_DATALEN(card,op); \
} while(0)
#define XPACKET_NEW(p, xbus, card, op, to) \
@@ -115,7 +121,7 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num);
if(!p) \
return -ENOMEM; \
XPACKET_INIT(p, card, op); \
- XPD_ADDR_SET(p->content.addr, to); \
+ xpd_set_addr(&p->content.addr, to); \
} while(0);
typedef struct xproto_entry xproto_entry_t;
@@ -143,14 +149,20 @@ struct xops {
int (*card_init)(xbus_t *xbus, xpd_t *xpd);
int (*card_remove)(xbus_t *xbus, xpd_t *xpd);
int (*card_tick)(xbus_t *xbus, xpd_t *xpd);
- int (*card_zaptel_registration)(xpd_t *xpd, bool on);
+ int (*card_zaptel_preregistration)(xpd_t *xpd, bool on);
+ int (*card_zaptel_postregistration)(xpd_t *xpd, bool on);
+#ifdef WITH_RBS
+ int (*card_hooksig)(xbus_t *xbus, xpd_t *xpd, int pos, zt_txsig_t txsig);
+#else
int (*card_sethook)(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate);
+#endif
+ int (*card_ioctl)(xpd_t *xpd, int pos, unsigned int cmd, unsigned long arg);
int (*SYNC_SOURCE)(xbus_t *xbus, xpd_t *xpd, bool setit, bool is_master);
int (*PCM_WRITE)(xbus_t *xbus, xpd_t *xpd, xpp_line_t hookstate, volatile byte *buf);
int (*CHAN_ENABLE)(xbus_t *xbus, xpd_t *xpd, xpp_line_t lines, bool on);
- int (*CHAN_CID)(xbus_t *xbus, xpd_t *xpd, xpp_line_t lines);
+ int (*CHAN_CID)(xbus_t *xbus, xpd_t *xpd, int pos);
int (*RING)(xbus_t *xbus, xpd_t *xpd, int pos, bool on);
int (*SETHOOK)(xbus_t *xbus, xpd_t *xpd, int pos, bool offhook);
int (*RELAY_OUT)(xbus_t *xbus, xpd_t *xpd, byte which, bool on);
@@ -178,6 +190,7 @@ struct xproto_table {
#include "card_fxo.h"
enum opcodes {
+ XPROTO_NAME(GLOBAL, NULL_REPLY) = 0xFE,
XPROTO_NAME(GLOBAL, DESC_REQ) = 0x04,
XPROTO_NAME(GLOBAL, DEV_DESC) = 0x05,
/**/
@@ -195,6 +208,7 @@ struct xpacket_raw {
byte opcode;
xpd_addr_t addr;
union {
+ MEMBER(GLOBAL, NULL_REPLY);
MEMBER(GLOBAL, DESC_REQ);
MEMBER(GLOBAL, DEV_DESC);
MEMBER(GLOBAL, PCM_WRITE);
@@ -203,17 +217,15 @@ struct xpacket_raw {
MEMBER(FXS, SIG_CHANGED);
MEMBER(FXS, SLIC_REPLY);
- MEMBER(FXS, SLIC_INIT);
MEMBER(FXS, SLIC_WRITE);
MEMBER(FXO, SIG_CHANGED);
MEMBER(FXO, DAA_REPLY);
- MEMBER(FXO, DAA_INIT);
MEMBER(FXO, DAA_WRITE);
byte data[0];
};
-} __attribute__((packed));
+} PACKED;
struct xpacket {
xpacket_raw_t content;
diff --git a/xpp/zap_debug.c b/xpp/zap_debug.c
index 8134e8f..59eb0a8 100644
--- a/xpp/zap_debug.c
+++ b/xpp/zap_debug.c
@@ -28,7 +28,7 @@
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/module.h>
-#include <zaptel/zaptel.h>
+#include <zaptel.h>
#include "zap_debug.h"
static const char rcsid[] = "$Id$";
diff --git a/xpp/zap_debug.h b/xpp/zap_debug.h
index 3c31352..6d8ac36 100644
--- a/xpp/zap_debug.h
+++ b/xpp/zap_debug.h
@@ -23,11 +23,9 @@
*/
/* Debugging Macros */
-#define DBG(fmt, ...) \
- do { \
- if (print_dbg) \
- printk(KERN_DEBUG "DBG-%s: %s: " fmt, THIS_MODULE->name, __FUNCTION__, ## __VA_ARGS__); \
- } while (0)
+#define DBG(fmt, ...) \
+ ((void)((print_dbg) && printk(KERN_DEBUG "DBG-%s: %s: " fmt, \
+ THIS_MODULE->name, __FUNCTION__, ## __VA_ARGS__)))
#define INFO(fmt, ...) printk(KERN_INFO "INFO-%s: " fmt, THIS_MODULE->name, ## __VA_ARGS__)
#define NOTICE(fmt, ...) printk(KERN_NOTICE "NOTICE-%s: " fmt, THIS_MODULE->name, ## __VA_ARGS__)
#define WARN(fmt, ...) printk(KERN_WARNING "WARN-%s: %s: " fmt, THIS_MODULE->name, __FUNCTION__, ## __VA_ARGS__)