Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 1198 → Rev 1197

/demos/tags/rel_1_2/bca/scenario.c
File deleted
/demos/tags/rel_1_2/bca/initfile.c
File deleted
/demos/tags/rel_1_2/bca/missile.c
File deleted
/demos/tags/rel_1_2/bca/bca_lib.c
File deleted
/demos/tags/rel_1_2/bca/readme
File deleted
/demos/tags/rel_1_2/bca/bca_raw/esplo5.raw
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/bca/bca_raw/missile2.raw
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/bca/bca_raw/sfondo.raw
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/bca/bca_raw/aereo1.raw
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/bca/bca_raw/cannon.raw
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/bca/bca_raw/aereo2.raw
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/bca/bca_raw/aereo1_h.raw
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/bca/bca_raw/cannon_h.raw
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/bca/bca_raw/esplo1.raw
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/bca/bca_raw/aereo2_h.raw
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/bca/bca_raw/esplo2.raw
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/bca/bca_raw/esplo3.raw
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/bca/bca_raw/bca.raw
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/bca/bca_raw/esplo4.raw
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/bca/bca_raw/missile1.raw
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/bca/fab_lib.c
File deleted
/demos/tags/rel_1_2/bca/control.c
File deleted
/demos/tags/rel_1_2/bca/cannone.c
File deleted
/demos/tags/rel_1_2/bca/esplo.c
File deleted
/demos/tags/rel_1_2/bca/bca.c
File deleted
/demos/tags/rel_1_2/bca/bca.h
File deleted
/demos/tags/rel_1_2/bca/aereo.c
File deleted
/demos/tags/rel_1_2/bca/dummy.c
File deleted
/demos/tags/rel_1_2/bca/makefile
File deleted
/demos/tags/rel_1_2/bca/fab_lib/fab_tool.h
File deleted
/demos/tags/rel_1_2/bca/fab_lib/fab_grx.h
File deleted
/demos/tags/rel_1_2/bca/fab_lib/fab_show.h
File deleted
/demos/tags/rel_1_2/bca/fab_lib/fab_msg.h
File deleted
/demos/tags/rel_1_2/bca/fab_lib/fab_grx.sys
File deleted
/demos/tags/rel_1_2/biliardo/biliardo.c
File deleted
/demos/tags/rel_1_2/biliardo/jetctrl.c
File deleted
/demos/tags/rel_1_2/biliardo/demo.h
File deleted
/demos/tags/rel_1_2/biliardo/palla.c
File deleted
/demos/tags/rel_1_2/biliardo/biliardo.h
File deleted
/demos/tags/rel_1_2/biliardo/makefile
File deleted
/demos/tags/rel_1_2/biliardo/posizion.h
File deleted
/demos/tags/rel_1_2/biliardo/initfil1.c
File deleted
/demos/tags/rel_1_2/edfact/edfact.c
File deleted
/demos/tags/rel_1_2/edfact/testact.c
File deleted
/demos/tags/rel_1_2/edfact/edfact.h
File deleted
/demos/tags/rel_1_2/edfact/readme
File deleted
/demos/tags/rel_1_2/edfact/makefile
File deleted
/demos/tags/rel_1_2/edfact/initfile.c
File deleted
/demos/tags/rel_1_2/static/static.c
File deleted
/demos/tags/rel_1_2/static/test1st.c
File deleted
/demos/tags/rel_1_2/static/static.h
File deleted
/demos/tags/rel_1_2/static/readme
File deleted
/demos/tags/rel_1_2/static/makefile
File deleted
/demos/tags/rel_1_2/static/initfile.c
File deleted
/demos/tags/rel_1_2/astro/rock.c
File deleted
/demos/tags/rel_1_2/astro/asteroid.h
File deleted
/demos/tags/rel_1_2/astro/initfile.c
File deleted
/demos/tags/rel_1_2/astro/astro.c
File deleted
/demos/tags/rel_1_2/astro/asteroid.c
File deleted
/demos/tags/rel_1_2/astro/stat.c
File deleted
/demos/tags/rel_1_2/astro/makefile
File deleted
/demos/tags/rel_1_2/pngdemo/test.png
File deleted
\ No newline at end of file
/demos/tags/rel_1_2/pngdemo/initfile.c
File deleted
/demos/tags/rel_1_2/pngdemo/pngdemo.c
File deleted
/demos/tags/rel_1_2/pngdemo/readme.txt
File deleted
/demos/tags/rel_1_2/pngdemo/makefile
File deleted
/demos/tags/rel_1_2/mesademo/makefile
File deleted
/demos/tags/rel_1_2/mesademo/initfile.c
File deleted
/demos/tags/rel_1_2/mesademo/mesademo.c
File deleted
/demos/tags/rel_1_2/mesademo/readme.txt
File deleted
/demos/tags/rel_1_2/lights/initfile.c
File deleted
/demos/tags/rel_1_2/lights/param.dat
File deleted
/demos/tags/rel_1_2/lights/readme.txt
File deleted
/demos/tags/rel_1_2/lights/makefile
File deleted
/demos/tags/rel_1_2/lights/simlight.c
File deleted
/demos/tags/rel_1_2/lights/blaster.h
File deleted
/demos/tags/rel_1_2/perf/initfile.c
File deleted
/demos/tags/rel_1_2/perf/readme
File deleted
/demos/tags/rel_1_2/perf/makefile
File deleted
/demos/tags/rel_1_2/perf/perf1.c
File deleted
/demos/tags/rel_1_2/perf/perf2.c
File deleted
/demos/tags/rel_1_2/perf/perf3.c
File deleted
/demos/tags/rel_1_2/perf/perf4.c
File deleted
/demos/tags/rel_1_2/pci6025e/test_bec.c
File deleted
/demos/tags/rel_1_2/pci6025e/test_dio.c
File deleted
/demos/tags/rel_1_2/pci6025e/readme
File deleted
/demos/tags/rel_1_2/pci6025e/makefile
File deleted
/demos/tags/rel_1_2/pci6025e/test_bms.c
File deleted
/demos/tags/rel_1_2/pci6025e/wave.c
File deleted
/demos/tags/rel_1_2/pci6025e/initfile.c
File deleted
/demos/tags/rel_1_2/pci6025e/test_mes.c
File deleted
/demos/tags/rel_1_2/pci6025e/test_ec.c
File deleted
/demos/tags/rel_1_2/pci6025e/test_dac.c
File deleted
/demos/tags/rel_1_2/pci6025e/test_ppi.c
File deleted
/demos/tags/rel_1_2/servo/servo.c
File deleted
/demos/tags/rel_1_2/servo/initfile.c
File deleted
Property changes:
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: rel_1_2/servo/makefile
===================================================================
--- rel_1_2/servo/makefile (revision 1198)
+++ rel_1_2/servo/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS = servo
-
-include $(BASE)/config/example.mk
-
-servo:
- make -f $(SUBMAKE) APP=servo INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __SERVO__"
-
/rel_1_2/servo/makefile
Property changes:
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: rel_1_2/telesco/makefile
===================================================================
--- rel_1_2/telesco/makefile (revision 1198)
+++ rel_1_2/telesco/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= tel
-
-include $(BASE)/config/example.mk
-
-tel:
- make -f $(SUBMAKE) APP=tel INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
-
Index: rel_1_2/telesco/moon.h
===================================================================
--- rel_1_2/telesco/moon.h (revision 1198)
+++ rel_1_2/telesco/moon.h (nonexistent)
@@ -1,43 +0,0 @@
-// Immagine luna
-BYTE luna[900]={
-0, 0 , 0, 0, 0, 0, 0, 0, 4, 57, 212, 228, 204, 214, 235, 237, 208, 190, 179, 197, 229, 89, 4, 0,
-0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 208, 213, 178, 155, 139, 129, 123, 169, 170, 173, 157,
-191, 209, 236, 215, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 36, 103, 146, 116, 93, 143, 119, 96,
-134, 123, 117, 120, 113, 102, 93, 156, 210, 184, 66, 4, 0, 0, 0, 0, 0, 0, 0, 0, 2, 64, 83, 88,
-72, 156, 144, 127, 99, 87, 91, 156, 158, 124, 144, 120, 109, 119, 175, 167, 180, 119, 3, 0,
-0, 0, 0, 0, 0, 5, 56, 59, 63, 58, 138, 104, 71, 46, 55, 68, 79, 89, 172, 146, 141, 152, 110, 126,
-134, 179, 148, 145, 134, 4, 0, 0, 0, 0, 4, 32, 58, 50, 49, 56, 105, 58, 38, 42, 45, 69, 64, 93,
-144, 155, 157, 147, 95, 111, 122, 158, 162, 174, 171, 79, 4, 0, 0, 0, 4, 67, 49, 47, 54, 63,
-51, 55, 43, 38, 48, 62, 55, 86, 89, 145, 92, 60, 99, 72, 97, 130, 184, 169, 195, 171, 3, 0, 0,
-3, 77, 52, 37, 51, 72, 54, 63, 48, 46, 46, 48, 55, 54, 92, 95, 80, 55, 47, 47, 52, 56, 170, 187,
-196, 190, 177, 190, 6, 0, 45, 84, 38, 40, 79, 73, 56, 43, 41, 46, 45, 51, 74, 98, 89, 68, 89,
-46, 40, 48, 45, 38, 171, 176, 152, 165, 133, 157, 107, 3, 154, 42, 34, 42, 68, 66, 47, 52, 62,
-55, 60, 50, 56, 50, 106, 127, 74, 38, 39, 58, 38, 42, 116, 87, 128, 148, 69, 59, 170, 2, 100,
-41, 31, 38, 41, 53, 53, 62, 63, 64, 62, 65, 63, 58, 105, 71, 60, 57, 44, 43, 38, 36, 81, 58, 125,
-205, 61, 43, 130, 37, 88, 39, 31, 33, 43, 52, 76, 66, 97, 116, 101, 96, 90, 56, 76, 47, 43, 135,
-46, 87, 40, 30, 33, 37, 84, 152, 86, 43, 131, 81, 131, 36, 35, 33, 36, 53, 91, 73, 124, 145,
-132, 95, 80, 50, 45, 45, 35, 49, 70, 59, 32, 30, 30, 30, 39, 75, 158, 92, 133, 138, 151, 41,
-39, 38, 39, 82, 125, 59, 89, 98, 84, 64, 68, 40, 104, 107, 85, 78, 115, 75, 34, 43, 39, 36, 47,
-78, 98, 142, 104, 122, 155, 49, 32, 36, 32, 57, 71, 58, 85, 97, 69, 49, 53, 40, 88, 124, 133,
-169, 141, 94, 40, 40, 46, 53, 52, 81, 49, 77, 107, 122, 146, 79, 31, 38, 31, 37, 37, 51, 64,
-59, 84, 72, 64, 96, 88, 132, 153, 158, 154, 149, 140, 109, 77, 125, 120, 54, 51, 59, 123, 86,
-111, 122, 35, 44, 35, 34, 38, 63, 55, 55, 87, 76, 103, 133, 148, 146, 160, 151, 145, 163, 194,
-92, 104, 136, 109, 54, 46, 65, 123, 53, 160, 144, 56, 46, 41, 39, 39, 91, 41, 47, 70, 75, 57,
-112, 116, 140, 168, 179, 161, 164, 188, 123, 100, 145, 162, 87, 51, 111, 140, 5, 172, 148,
-134, 86, 72, 75, 48, 50, 40, 45, 53, 106, 60, 108, 137, 135, 160, 157, 152, 169, 179, 191,
-109, 70, 150, 122, 94, 104, 128, 4, 167, 144, 140, 103, 98, 116, 64, 56, 84, 62, 60, 59, 48,
-80, 150, 143, 151, 187, 161, 147, 178, 219, 79, 69, 163, 132, 87, 108, 128, 0, 83, 195, 195,
-125, 138, 67, 35, 106, 98, 90, 58, 44, 60, 131, 161, 152, 178, 157, 149, 164, 164, 177, 107,
-119, 129, 119, 145, 133, 104, 0, 5, 181, 233, 190, 150, 78, 43, 62, 63, 87, 50, 53, 46, 81,
-157, 187, 155, 181, 189, 145, 166, 211, 170, 137, 166, 189, 188, 164, 5, 0, 0, 5, 167, 175,
-193, 193, 108, 114, 63, 118, 139, 125, 130, 202, 209, 221, 213, 180, 172, 201, 170, 175,
-186, 177, 210, 236, 204, 14, 0, 0, 0, 3, 62, 166, 183, 166, 106, 139, 102, 129, 179, 206, 212,
-240, 232, 224, 210, 208, 196, 173, 179, 177, 186, 191, 227, 185, 100, 2, 0, 0, 0, 0, 5, 125,
-196, 143, 163, 169, 169, 152, 181, 212, 239, 241, 237, 234, 217, 180, 206, 188, 199, 188,
-194, 202, 164, 120, 4, 0, 0, 0, 0, 0, 0, 5, 123, 180, 145, 147, 184, 184, 197, 223, 232, 224,
-227, 227, 220, 190, 179, 192, 192, 197, 204, 165, 120, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 74, 162,
-135, 153, 176, 178, 204, 235, 232, 235, 231, 212, 201, 190, 189, 196, 202, 189, 70, 4, 0,
-0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 182, 167, 170, 184, 208, 218, 215, 206, 209, 179, 205, 196, 188,
-184, 193, 12, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 103, 202, 197, 201, 208, 235, 217, 203,
-197, 188, 185, 217, 131, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 89, 130, 218,
-195, 179, 165, 102, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Index: rel_1_2/telesco/initfile.c
===================================================================
--- rel_1_2/telesco/initfile.c (revision 1198)
+++ rel_1_2/telesco/initfile.c (nonexistent)
@@ -1,133 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: initfile.c,v 1.1 2003-06-04 09:41:01 giacomo Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2003-06-04 09:41:01 $
- ------------
-
- System initialization file
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- NRT_TASK_MODEL at level 2
-
- This file is similar to the configuration of kernel/init/hartik3.c
-
- TICK is set to 0 (one-shot timer is used)
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-int argc;
-char *argv[100];
-
-void read_cfg_file(int argc, char **argv);
-
-int main(int argc, char **argv);
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- __compute_args__(mb, &argc, argv);
-
- read_cfg_file(argc, argv);
-
- //read_cfg_file(argc, argv);
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- //__call_main__(mb);
- return (void *)main(argc,argv);
- //return (void *)0;
-}
-
Index: rel_1_2/telesco/tel.c
===================================================================
--- rel_1_2/telesco/tel.c (revision 1198)
+++ rel_1_2/telesco/tel.c (nonexistent)
@@ -1,709 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Bera Marco mbera@libero.it
- * Varasio Gabriele varasio@odino.unipv.it
- *
- * Universita' degli studi di Pavia
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: tel.c,v 1.1 2003-06-04 09:41:01 giacomo Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2003-06-04 09:41:01 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/****************************************************************/
-/* PERIODIC PROCESS TEST */
-/****************************************************************/
-
-#include <ll/i386/x-dos.h>
-#include <kernel/kern.h>
-#include <modules/cabs.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <math.h>
-#include <semaphore.h>
-#include <stdlib.h>
-#include "moon.h"
-
-
-#define N_MAX_TELESCOPI 5
-#define X0 10
-#define pi 3.14
-#define ex 2.71
-#define NCAB N_MAX_TELESCOPI+1
-#define dim_msg 8
-#define dim_x 49
-#define dim_y 49
-#define radius 9
-#define Y_TELESCOPI 300
-/* task periods */
-#define PERIOD_T1 80000
-#define PERIOD_T4 100000
-#define PERIOD_T5 100000
-#define WCET_T 5000
-int period_t1=0;
-#define SOGLIA 8
-
-char *cname[NCAB] = {"cab1", "cab2", "cab3", "cab4","cab5","cab6"};
-
-// posizioni dei telescopi e rispettivi poli
-
-int x[5] = {100, 200, 300, 400,500};
-//double poli[5]={-50,-30,-1, -20, -5};
-double poli[5];
-// guadagno proporzionale
-double kp=0.0;
-// flag per rilevare la pressione del tasto spazio
-int numero_telescopi=0;
-int flag=0;
-KEY_EVT move_tasto;
-// Immagini ausiliarie per il disegno della luna
-BYTE lunabkg[900];
-BYTE lunadest[900];
-
-
-/* A semaphore used to access Video Cards in mutual exclusion */
-sem_t mutex;
-sem_t mutex_tasto;
-
-/***************************************************************/
-
-// cab necessari allo scambio delle coordinate dell'oggetto e delle
-// immagini dei rispettivi telescopi
-
-CAB cid[NCAB];
-
-// vettori per memorizzare le immagini
-BYTE videobuf[dim_x*dim_y];
-BYTE videobuf1[dim_x*dim_y];
-BYTE videobuf2[dim_x*dim_y];
-BYTE videobuf3[dim_x*dim_y];
-BYTE videobuf4[dim_x*dim_y];
-BYTE videobuf5[dim_x*dim_y];
-
- // Variabili per il disegno delle stelle sullo sfondo
- int num_p;
- int y_p[7];
- int x_p[7];
- int dim_p[7];
- int col_p[7];
-
-
-
-TASK media(void *arg)
-{
-char *p;
-
-int i=0;
-int j=0;
-while(1)
-{
- p = cab_getmes(cid[1]);
- memcpy(videobuf,p,dim_x*dim_y*sizeof(BYTE));
- cab_unget(cid[1], p);
- p = cab_getmes(cid[2]);
- memcpy(videobuf1,p,dim_x*dim_y*sizeof(BYTE));
- cab_unget(cid[2], p);
- p = cab_getmes(cid[3]);
- memcpy(videobuf2,p,dim_x*dim_y*sizeof(BYTE));
- cab_unget(cid[3], p);
- p = cab_getmes(cid[4]);
- memcpy(videobuf4,p,dim_x*dim_y*sizeof(BYTE));
- cab_unget(cid[4], p);
-
- p = cab_getmes(cid[5]);
- memcpy(videobuf5,p,dim_x*dim_y*sizeof(BYTE));
- cab_unget(cid[5], p);
-
- // calcolo media
-
- for (i=0;i<dim_x;i++)
-
- {
- for(j=0;j<dim_y;j++)
- {
- videobuf3[i*dim_x+j]=(double)(videobuf[i*dim_x+j]+videobuf1[i*dim_x+j]+videobuf2[i*dim_x+j]+videobuf4[i*dim_x+j]+videobuf5[i*dim_x+j])/numero_telescopi;
- }
- }
-
- // visualizza immagine mediata
- sem_wait(&mutex);
- grx_putimage(570,10,570+dim_x-1,10+dim_y-1,videobuf3);
- sem_post(&mutex);
- task_endcycle();
- }
-}
-
-TASK move(void *arg)
-{
-//int i = (int)arg;
-char *p;
-int x_object=300; // posizione dell'oggetto da rilevare
-int y_object=200;
-// variabile contatore
-int z=0;
-char coord_x[dim_msg];
-p = cab_reserve(cid[0]);
-sprintf(coord_x,"%d %d",x_object,y_object);
-memcpy(p,coord_x,dim_msg*sizeof(char));
-cab_putmes(cid[0], p);
-
- //Normalizzazione
- for(z=0;z<900;z++)
- {
- if (luna[z]>0)
- {
- luna[z]=((luna[z])*16.0/255.0)+16;
- }
-
- }
-
-
- task_endcycle();
- while (1)
- {
-
- // Cancellazione Luna
- sem_wait(&mutex);
- grx_box(x_object-15,y_object-15,x_object+14,y_object+14,0);
- sem_post(&mutex);
- if (keyb_getcode(&move_tasto,NON_BLOCK))
- {
- if (move_tasto.ascii=='4')
- x_object=x_object-5;
- if (move_tasto.ascii=='6')
- x_object=x_object+5;
- if (move_tasto.ascii=='2')
- y_object=y_object+5;
- if (move_tasto.ascii=='8')
- y_object=y_object-5;
- if (move_tasto.ascii=='9'){
- y_object=y_object-5;
- x_object=x_object+5; }
- if (move_tasto.ascii=='1'){
- y_object=y_object+5;
- x_object=x_object-5; }
- if (move_tasto.ascii=='7'){
- y_object=y_object-5;
- x_object=x_object-5; }
- if (move_tasto.ascii=='3'){
- y_object=y_object+5;
- x_object=x_object+5;}
- if (move_tasto.ascii==' '){
- sem_wait(&mutex_tasto);
- flag=1;
- if(numero_telescopi<N_MAX_TELESCOPI)
- {
- numero_telescopi++;
- }
- sem_post(&mutex_tasto);
- }
- //CONTROLLI SULLA POSIZIONE
- if(y_object<(dim_y/2+70)) y_object=dim_y/2+70;
- if(y_object>(240-dim_y/2)) y_object=(240-dim_y/2);
- if(x_object<(dim_x/2+20 )) x_object=dim_x/2+20;
- if(x_object>(630-dim_x/2-10)) x_object=(630-dim_x/2-10);
- }
- p = cab_reserve(cid[0]);
- sprintf(coord_x,"%d %d",x_object,y_object);
- memcpy(p,coord_x,dim_msg*sizeof(char));
- cab_putmes(cid[0], p);
-
- for(z=0;z<7;z++)
- {
- if (sqrt(pow((x_object-x_p[z]),2)+pow((y_object-y_p[z]),2))<20+dim_p[z]+radius)
- grx_disc(x_p[z],y_p[z],dim_p[z],col_p[z]);
- }
-
-
- sem_wait(&mutex);
- // Gestione sfondo
- grx_getimage(x_object-15,y_object-15,x_object+14, y_object+14,lunabkg);
- for(z=0;z<900;z++)
- {
- if( luna[z]==0 && lunabkg!=0 )
- {
- lunadest[z]=lunabkg[z];
- }
- else
- {
- lunadest[z]=luna[z];
- }
- }
- grx_putimage(x_object-15,y_object-15,x_object+14, y_object+14,lunadest);
- sem_post(&mutex);
- task_endcycle();
- }
-}
-
-
-TASK tele(void *arg)
-{
-int i = (int)arg;
-int passi;
-char s[100];
-int x_object=300; // posizione dell'oggetto da rilevare
-int y_object=200;
-int x_start=500; // posizione iniziale dei telescopi
-int y_start=190;
-int x_current=x_start; // posizione corrente dei telescopi
-int y_current=y_start;
-int x_current_d[9];
-int y_current_d[9];
-int y= Y_TELESCOPI; // coordinata y dei telescopi
-double alpha_new=atan((y-(double)y_current)/((x[i]-(double)x_current)));
-double alpha=alpha_new;
-double distance=0.0;
-double alpha_target=0.0;
-double tc=0.1;
-double u=0.0;
-double u_old=0.0;
-double errore=0.0;
-double delta_x=0;
-double delta_y=0;
-
-char *p;
-//int j=0;
-// indice matrice per aggiunta di rumore
-int k=0;
-int q=0;
-double polo=poli[i];
-int val=0;
-
-
-
-BYTE videobuf[dim_x*dim_y];
-
- passi = 0;
- //srand(i);
- //srand(i+sys_gettime(NULL));
- alpha_target=atan((y-(double)y_object)/((double)x_object-x[i]));
-
- sem_wait(&mutex);
- grx_text("targ",4,340,12,0);
- sprintf(s,"%f",poli[i]);
- grx_text(s,x[i],y+60,12,0);
- grx_text("polo",4,y+60,12,0);
- grx_text("new",4,y+50,12,0);
- sprintf(s,"%1.6f",alpha_target);
- grx_text(s, x[i]-25,y+50,12,0);
- grx_rect(x[i]-40,y+25,x[i]+40,y+85,2);
- grx_rect(x[i]-40,y+90,x[i]+40,y+150,2);
- sem_post(&mutex);
-
- // Disegno telescopio
- grx_disc(x[i],y,19,i+1);
- grx_box( x[i]-19,y,x[i]+19,y+20,i+1);
-
-
- task_endcycle();
-
- while (1) {
- // legge di controllo
- passi++;
- //sprintf(s,"%d",passi);
- //grx_text(s, 50,110,12,0);
- p = cab_getmes(cid[0]);
- sscanf(p,"%d %d",&val,&y_object);
- cab_unget(cid[0], p);
- x_object=val;
- alpha_target=atan((y-(double)y_object)/((double)x_object-x[i]));
- if (alpha_target <0)
- {
- alpha_target=3.14+alpha_target;
- }
-
- errore=alpha_target-alpha_new;
- u=u_old+kp*tc*errore;
- //alpha_new=0.13*alpha+0.87*u;
- alpha_new=(exp(polo*tc))*alpha+(1-exp(polo*tc))*u;
- u_old=u;
- alpha=alpha_new;
-
- // implementazione dei limiti degli attuattori
- if (alpha_new > 3.14)
- alpha_new=3.14;
- if (alpha_new <0)
- alpha_new=0;
-
- distance=sqrt(((y-y_object)*(y-y_object))+((x_object-x[i])*(x_object-x[i])));
-
- sem_wait(&mutex);
- // Cancello braccio telescopio
- if (passi>1)
- {
- for (k=0; k<9 ; k++)
- {
- grx_line(delta_x,delta_y,x_current_d[k],y_current_d[k],0);
- }
- }
- x_current=x[i]+distance*cos(alpha_new);
- y_current=300-distance*sin(alpha_new);
-
- // lettura immagine
-
- grx_getimage(x_current-(dim_x/2),y_current-(dim_y/2),x_current+(dim_x/2),y_current+(dim_y/2),videobuf);
-
- //aggiunta rumore
-
- sem_post(&mutex);
- for (k=0;k<dim_x;k++)
- {
- for(q=0;q<dim_y;q++)
- {
- int num=0;
- num=rand();
- num=(num%10)+1;
- if (num>SOGLIA)
- {
- videobuf[k*dim_x+q]=videobuf[k*dim_x+q]+1;
- }
- }
- }
- sem_wait(&mutex);
-
- grx_putimage(x[i]-25,y+92,x[i]-25+dim_x-1,y+92+dim_y-1,videobuf);
-
- sprintf(s,"%3.4f",(180*(alpha_target/pi)));
- grx_text(s, x[i]-25,y+40,12,0);
- sprintf(s,"%3.4f",180*(alpha_new/pi));
- grx_text(s, x[i]-25,y+50,12,0);
-
- delta_x=x[i]+20*cos(alpha_new);
- delta_y=y-20*sin(alpha_new);
-
- for ( k=0; k<9 ; k++) {
- x_current_d[k]=x[i]+50*cos(alpha_new+(k-4)*0.01);
- y_current_d[k]=300-50*sin(alpha_new+(k-4)*0.01); }
-
- // Disegno braccio telescopio
- for(k=0 ; k<9 ; k++)
- grx_line(delta_x,delta_y,x_current_d[k],y_current_d[k],i+1);
-
- sem_post(&mutex);
-
- // scrive immagine nel cab
- p = cab_reserve(cid[i+1]);
- memcpy(p,videobuf,dim_x*dim_y*sizeof(BYTE));
- cab_putmes(cid[i+1], p);
-
- task_endcycle();
-
- }
-
-}
-
-
-/****************************************************************/
-
-/* This is the exception handler. It is called when an exception
- is raised.
- It exits from the graphical mode, then it prints a message and
- shutdown the kernel using sys_abort()
-*/
-
-void demo_exc_handler(int signo, siginfo_t *info, void *extra)
-{
- struct timespec t;
-
- grx_close();
-
- /* Default action for an kern exception is */
- kern_cli();
- ll_gettime(TIME_EXACT, &t),
- kern_printf("\nS.Ha.R.K. Exception raised!!!"
- "\nTime (s:ns) :%ld:%ld"
- "\nException number:%d (numbers in include/bits/errno.h)"
- "\nPID :%d\n",
- t.tv_sec, t.tv_nsec, info->si_value.sival_int,
- info->si_task);
- sys_abort(1);
-}
-
-/******************************************************************/
-
-/* This function is called when Alt-X is pressed.
- It simply shutdown the system using sys_end.
- Note that the byebye() function is called only if we exit from
- the system using sys_end()!!!!
-*/
-void my_end(KEY_EVT* e)
-{
- sys_end();
-}
-
-/******************************************************************/
-
-/* This function is called when the system exit correctly after Alt-X.
- It exits from the graphic mode and then it prints a small greeting.
- Note that:
- - The function calls grx_exit, so it must be registered using
- RUNLEVEL_BEFORE_EXIT (RUNLEVEL_AFTER_EXIT does not work because
- at that point the kernel is already returned in real mode!!!)
- - When an exception is raised, the exception handler is called.
- Since the exception handler already exits from the graphic mode,
- this funcion has not to be called. For this reason:
- . we registered byebye using the flag NO_AT_ABORT
- . the exception handler exits using sys_abort; in that way byebye is
- NOT called
-*/
-
-void byebye(void *arg)
-{
- grx_close();
- kern_printf("Bye Bye!\n");
-}
-
-/****************************** MAIN ******************************/
-
-int main(int argc, char **argv)
-{
- PID pid1, pid4,pid5;
- KEY_EVT emerg;
- int i=0;
- int z=0; // contatore per disegno dei pianeti
- HARD_TASK_MODEL m1, m4,m5;
- //FILE *fp;
-
- struct sigaction action;
-
- cid[0] = cab_create(cname[0], dim_msg, 5);
- cid[1] = cab_create(cname[1], dim_x*dim_y, 3);
- cid[2] = cab_create(cname[2], dim_x*dim_y, 3);
- cid[3] = cab_create(cname[3], dim_x*dim_y, 3);
- cid[4] = cab_create(cname[4], dim_x*dim_y, 4);
- cid[5] = cab_create(cname[5], dim_x*dim_y, 3);
- cid[6] = cab_create(cname[6], dim_x*dim_y, 3);
-
- /*fp=fopen("file.txt","r");
- fscanf(fp,"%d",a);
- fclose(fp);
- */
-
- /* Init the standard S.Ha.R.K. exception handler */
- action.sa_flags = SA_SIGINFO; /* Set the signal action */
- action.sa_sigaction = demo_exc_handler;
- action.sa_handler = 0;
- sigfillset(&action.sa_mask); /* we block all the other signals... */
-
- if (sigaction(SIGHEXC, &action, NULL) == -1) { /* set the signal */
- perror("Error initializing signals...");
- sys_end();
- }
-
- /* Set the closing function */
- sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT|NO_AT_ABORT);
-
- /* Initializes the semaphore */
- sem_init(&mutex,0,1);
-
- /* graphic card Initialization */
- if (grx_init() < 1) {
- sys_abort(1);
- }
-
- if (grx_open(640, 480, 8) < 0) {
- kern_printf("GRX Err\n");
- sys_abort(1);
- }
- kern_printf("Video card ok!\n");
-
-
-
- /* set the keyboard handler to exit correctly */
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,my_end);
-
- srand(i+sys_gettime(NULL));
-
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTR_BIT;
- keyb_hook(emerg,my_end);
- sem_wait(&mutex);
- /* a small banner */
- grx_clear(0);
-
- grx_text("REALTIME TELESCOPES di Marco Bera e Gabriele Varasio",8,8,WHITE,0);
- grx_text("Premere Spazio per creare un telescopio",8,22,WHITE,0);
- grx_text("Premere Alt-X per uscire",8,32,WHITE,0);
- grx_text("Usare il tastierino numerico per muovere l'oggetto",8,42,WHITE,0);
-
- // DISEGNARE BORDI
- grx_rect(1,1,638,478,2);
- grx_rect(558,1,638,61,2);
- grx_rect(1,1,638,61,2);
-
-
- // Disegno sfondo
- for(z=0;z<7;z++)
- {
- num_p=rand();
- y_p[z]=100+((num_p%130)+1);
- x_p[z]=50+((num_p%540)+1);
- dim_p[z]=2+((num_p%5)+1);
- col_p[z]=((num_p%10)+1);
- grx_disc(x_p[z],y_p[z],dim_p[z],col_p[z]);
- }
- sem_post(&mutex);
-
-
- hard_task_default_model(m4);
- hard_task_def_ctrl_jet (m4);
- hard_task_def_arg (m4, (void *)3);
- hard_task_def_wcet (m4, 19000);
- hard_task_def_mit (m4, PERIOD_T4);
- hard_task_def_group (m4,1);
- pid4 = task_create("move", move, &m4, NULL);
- if (pid4 == NIL) {
- grx_close();
- perror("Could not create task <move>");
- sys_abort(1);
- }
- task_activate(pid4);
- hard_task_default_model(m5);
- hard_task_def_ctrl_jet (m5);
- hard_task_def_arg (m5, (void *)3);
- hard_task_def_wcet (m5, 19000);
- hard_task_def_mit (m5, PERIOD_T5);
- hard_task_def_group (m5,1);
- pid5 = task_create("media", media, &m5, NULL);
-
- if (pid5 == NIL) {
- grx_close();
- perror("Could not create task <move>");
- sys_abort(1);
- }
- task_activate(pid5);
- /* and finally we activate the three threads... */
-
-
-
- do {
- int val_flag=0;
- sem_wait(&mutex_tasto);
- val_flag=flag;
- sem_post(&mutex_tasto);
-
- if ((val_flag==1) && (i < N_MAX_TELESCOPI))
- {
- flag=0;
- hard_task_default_model(m1);
- hard_task_def_ctrl_jet (m1);
- hard_task_def_arg (m1, (void *)i);
- hard_task_def_wcet (m1, WCET_T);
-// hard_task_def_mit (m1, PERIOD_T1);
- hard_task_def_mit (m1, period_t1);
-
- hard_task_def_group (m1,1);
- pid1 = task_create("tele1", tele, &m1, NULL);
- if (pid1 == NIL)
- {
- grx_close();
- perror("Could not create task <tele1>");
- sys_abort(1);
- }
- task_activate(pid1);
- i++;
- }
- } while (1);
-
- /*
- now the task main ends, but the system does not shutdown because
- there are others.
-
- The demo will finish if a Alt-X key is pressed.
- */
-
- return 0;
-}
-/*********** lettura da file ********************/
-void read_cfg_file(int argc, char **argv)
-{
- int err;
- DOS_FILE *fp;
- char myfilebuf[1000];
- int myfilebuf_length;
-
-
-
- if (2)
- {
- fp = DOS_fopen("dati.cnf","r");
-
- if (fp)
- {
- /* read up to 1000 chars */
- myfilebuf_length = DOS_fread(&myfilebuf,1,1000,fp);
-
- /* check for errors */
- err = DOS_error();
-
- cprintf("Read %d bytes...\n", myfilebuf_length);
-
- if (err)
- {
- cprintf("Error %d reading file...Using default values\n", err);
- }
- else
- {
- //geti(myfilebuf, &pos, &NMouses); // Number of Mouses
- sscanf(myfilebuf,"%lf %lf %lf %lf %lf %lf %d",&poli[0],&poli[1],&poli[2],&poli[3],&poli[4],&kp,&period_t1);
- }
-
- DOS_fclose(fp);
- return;
-
- }
- else {
- /* error!! */
- err = DOS_error();
- /* note that if you call DOS_error() here, it return 0!!! */
- cprintf("Error %d opening myfile.txt...Using default values\n", err);
- }
-
- }
- else {
- cprintf("Wrong number of arguments...\n");
- l1_exit(0);
- }
-}
-
-
-/****************************************************************/
Index: rel_1_2/telesco/dati.cnf
===================================================================
--- rel_1_2/telesco/dati.cnf (revision 1198)
+++ rel_1_2/telesco/dati.cnf (nonexistent)
@@ -1,3 +0,0 @@
--1 -20 -30 -40 -50 0.5 100000
-# 5 poli kp(guadagno) periodo telescopio
-
Index: rel_1_2/cbs_ft/cbs_ft.c
===================================================================
--- rel_1_2/cbs_ft/cbs_ft.c (revision 1198)
+++ rel_1_2/cbs_ft/cbs_ft.c (nonexistent)
@@ -1,812 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@hartik.sssup.it>
- *
- * Authors : Marco Caccamo and Paolo Gai
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: cbs_ft.c,v 1.4 2003-01-07 17:10:16 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.4 $
- Last update: $Date: 2003-01-07 17:10:16 $
- ------------
-
- This file contains the server CBS_FT
-
- Read CBS_FT.h for further details.
-
-**/
-
-/*
- * Copyright (C) 2000 Marco Caccamo and Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#include "cbs_ft.h"
-
-/*+ Status used in the level +*/
-#define CBS_FT_IDLE APER_STATUS_BASE /*+ waiting the activation +*/
-#define CBS_FT_ZOMBIE APER_STATUS_BASE+1 /*+ waiting the period end +*/
-
-/* structure of an element of the capacity queue */
-struct cap_queue {
- int cap;
- struct timespec dead;
- struct cap_queue *next;
-};
-
-/*+ the level redefinition for the CBS_FT level +*/
-typedef struct {
- level_des l; /*+ the standard level descriptor +*/
-
- /* The wcet are stored in the task descriptor, but we need
- an array for the deadlines. We can't use the timespec_priority
- field because it is used by the master level!!!...
- Notice that however the use of the timespec_priority field
- does not cause any problem... */
-
- struct timespec cbs_ft_dline[MAX_PROC]; /*+ CBS_FT deadlines +*/
-
-
- TIME period[MAX_PROC]; /*+ CBS_FT activation period +*/
-
-
- int maxcap[MAX_PROC]; /* amount of capacity reserved to a primary+backup
- couple */
-
- PID backup[MAX_PROC]; /* Backup task pointers, defined for primary tasks */
-
- char CP[MAX_PROC]; /* checkpoint flag */
-
- char P_or_B[MAX_PROC]; /* Type of task: PRIMARY or BACKUP */
-
-
- struct timespec reactivation_time[MAX_PROC];
- /*+ the time at witch the reactivation timer is post +*/
-
- int reactivation_timer[MAX_PROC]; /*+ the recativation timer +*/
-
- struct cap_queue *queue; /* pointer to the spare capacity queue */
-
- int flags; /*+ the init flags... +*/
-
- bandwidth_t U; /*+ the used bandwidth by the server +*/
-
- int idle; /* the idle flag... */
-
- struct timespec start_idle; /*gives the start time of the last idle period */
-
- LEVEL scheduling_level;
-
-} CBS_FT_level_des;
-
-
-
-/* insert a capacity in the queue capacity ordering by deadline */
-
-static int c_insert(struct timespec dead, int cap, struct cap_queue **que,
- PID p)
-{
- struct cap_queue *prev, *n, *new;
-
- prev = NULL;
- n = *que;
-
- while ((n != NULL) &&
- !TIMESPEC_A_LT_B(&dead, &n->dead)) {
- prev = n;
- n = n->next;
- }
-
-
- new = (struct cap_queue *)kern_alloc(sizeof(struct cap_queue));
- if (new == NULL) {
- kern_printf("\nNew cash_queue element failed\n");
- kern_raise(XINVALID_TASK, p);
- return -1;
- }
- new->next = NULL;
- new->cap = cap;
- new->dead = dead;
-
- if (prev != NULL)
- prev->next = new;
- else
- *que = new;
-
- if (n != NULL)
- new->next = n;
- return 0;
-
-}
-
-/* extract the first element from the capacity queue */
-
-int c_extractfirst(struct cap_queue **que)
-{
- struct cap_queue *p = *que;
-
-
- if (*que == NULL) return(-1);
-
- *que = (*que)->next;
-
- kern_free(p, sizeof(struct cap_queue));
- return(1);
-}
-
-/* read data of the first element from the capacity queue */
-
-static void c_readfirst(struct timespec *d, int *c, struct cap_queue *que)
-{
- *d = que->dead;
- *c = que->cap;
-}
-
-/* write data of the first element from the capacity queue */
-
-static void c_writefirst(struct timespec dead, int cap, struct cap_queue *que)
-{
- que->dead = dead;
- que->cap = cap;
-}
-
-
-static void CBS_FT_activation(CBS_FT_level_des *lev,
- PID p,
- struct timespec *acttime)
-{
- JOB_TASK_MODEL job;
- int capacity;
-
- /* This rule is used when we recharge the budget at initial task activation
- and each time a new task instance must be activated */
-
- if (TIMESPEC_A_GT_B(acttime, &lev->cbs_ft_dline[p])) {
- /* we modify the deadline ... */
- TIMESPEC_ASSIGN(&lev->cbs_ft_dline[p], acttime);
- }
-
-
- if (proc_table[p].avail_time > 0)
- proc_table[p].avail_time = 0;
-
-
-
- /* A spare capacity is inserted in the capacity queue!! */
- ADDUSEC2TIMESPEC(lev->period[p], &lev->cbs_ft_dline[p]);
- capacity = lev->maxcap[p] - proc_table[ lev->backup[p] ].wcet;
- c_insert(lev->cbs_ft_dline[p], capacity, &lev->queue, p);
-
-
- /* it exploits available capacities from the capacity queue */
- while (proc_table[p].avail_time < proc_table[p].wcet &&
- lev->queue != NULL) {
- struct timespec dead;
- int cap, delta;
- delta = proc_table[p].wcet - proc_table[p].avail_time;
- c_readfirst(&dead, &cap, lev->queue);
- if (!TIMESPEC_A_GT_B(&dead, &lev->cbs_ft_dline[p])) {
- if (cap > delta) {
- proc_table[p].avail_time += delta;
- c_writefirst(dead, cap - delta, lev->queue);
- }
- else {
- proc_table[p].avail_time += cap;
- c_extractfirst(&lev->queue);
- }
- }
- else
- break;
- }
-
- /* If the budget is still less than 0, an exception is raised */
- if (proc_table[p].avail_time <= 0) {
- kern_printf("\nnegative value for the budget!\n");
- kern_raise(XINVALID_TASK, p);
- return;
- }
-
-
-
- /*if (p==6)
- kern_printf("(act_time:%d dead:%d av_time:%d)\n",
- acttime->tv_sec*1000000+
- acttime->tv_nsec/1000,
- lev->cbs_ft_dline[p].tv_sec*1000000+
- lev->cbs_ft_dline[p].tv_nsec/1000,
- proc_table[p].avail_time); */
-
-
-
-
-
-
-#ifdef TESTG
- if (starttime && p == 3) {
- oldx = x;
- x = ((lev->cbs_ft_dline[p].tv_sec*1000000+lev->cbs_ft_dline[p].tv_nsec/1000)/5000 - starttime) + 20;
- // kern_printf("(a%d)",lev->cbs_ft_dline[p].tv_sec*1000000+lev->cbs_ft_dline[p].tv_nsec/1000);
- if (oldx > x) sys_end();
- if (x<640)
- grx_plot(x, 15, 8);
- }
-#endif
-
- /* and, finally, we reinsert the task in the master level */
- job_task_default_model(job, lev->cbs_ft_dline[p]);
- job_task_def_yesexc(job);
- level_table[ lev->scheduling_level ]->
- private_insert(lev->scheduling_level, p, (TASK_MODEL *)&job);
-}
-
-
-/* this is the periodic reactivation of the task... */
-static void CBS_FT_timer_reactivate(void *par)
-{
- PID p = (PID) par;
- CBS_FT_level_des *lev;
- struct timespec t;
-
- lev = (CBS_FT_level_des *)level_table[proc_table[p].task_level];
-
- if (proc_table[p].status == CBS_FT_IDLE) {
- /* the task has finished the current activation and must be
- reactivated */
-
- /* request_time represents the time of the last instance release!! */
- TIMESPEC_ASSIGN(&t, &lev->reactivation_time[p]);
-
- /* If idle=1, then we have to discharge the capacities stored in
- the capacity queue up to the length of the idle interval */
- if (lev->idle == 1) {
- TIME interval;
- struct timespec delta;
- lev->idle = 0;
- SUBTIMESPEC(&t, &lev->start_idle, &delta);
- /* length of the idle interval expressed in usec! */
- interval = TIMESPEC2NANOSEC(&delta) / 1000;
-
- /* it discharges the available capacities from the capacity queue */
- while (interval > 0 && lev->queue != NULL) {
- struct timespec dead;
- int cap;
- c_readfirst(&dead, &cap, lev->queue);
- if (cap > interval) {
- c_writefirst(dead, cap - interval, lev->queue);
- interval = 0;
- }
- else {
- interval -= cap;
- c_extractfirst(&lev->queue);
- }
- }
- }
-
- CBS_FT_activation(lev,p,&lev->reactivation_time[p]);
-
-
- /* Set the reactivation timer */
- TIMESPEC_ASSIGN(&lev->reactivation_time[p], &lev->cbs_ft_dline[p]);
- lev->reactivation_timer[p] = kern_event_post(&lev->reactivation_time[p],
- CBS_FT_timer_reactivate,
- (void *)p);
- event_need_reschedule();
- }
- else {
- /* this situation cannot occur */
- kern_printf("\nTrying to reactivate a primary task which is not IDLE!\n");
- kern_raise(XINVALID_TASK,p);
- }
-}
-
-
-
-static void CBS_FT_avail_time_check(CBS_FT_level_des *lev, PID p)
-{
-
- /*+ if the capacity became negative the remaining computation time
- is diminuished.... +*/
- /* if (p==4)
- kern_printf("(old dead:%d av_time:%d)\n",
- lev->cbs_ft_dline[p].tv_sec*1000000+
- lev->cbs_ft_dline[p].tv_nsec/1000,
- proc_table[p].avail_time); */
-
-
- int newcap = proc_table[p].wcet / 100 * 30;
- if (newcap <= 0)
- newcap = proc_table[p].wcet;
- /* it exploits available capacities from the capacity queue */
- while (proc_table[p].avail_time < newcap
- && lev->queue != NULL) {
- struct timespec dead;
- int cap, delta;
- delta = newcap - proc_table[p].avail_time;
- c_readfirst(&dead, &cap, lev->queue);
- if (!TIMESPEC_A_GT_B(&dead, &lev->cbs_ft_dline[p])) {
- if (cap > delta) {
- proc_table[p].avail_time += delta;
- c_writefirst(dead, cap - delta, lev->queue);
- }
- else {
- proc_table[p].avail_time += cap;
- c_extractfirst(&lev->queue);
- }
- }
- else
- break;
- }
-
-
-
- /*if (p==6)
- kern_printf("(ATC dead:%d av_time:%d)\n",
- lev->cbs_ft_dline[p].tv_sec*1000000+
- lev->cbs_ft_dline[p].tv_nsec/1000,
- proc_table[p].avail_time); */
-
-
-
- /* if the budget is still empty, the backup task must be woken up.
- Remind that a short chunk of primary will go ahead executing
- before the task switch occurs */
- if (proc_table[p].avail_time <= 0) {
- lev->CP[p] = 1;
- proc_table[p].avail_time += proc_table[ lev->backup[p] ].wcet;
- }
-
-
- /*if (p==6)
- kern_printf("(ATC1 dead:%d av_time:%d)\n",
- lev->cbs_ft_dline[p].tv_sec*1000000+
- lev->cbs_ft_dline[p].tv_nsec/1000,
- proc_table[p].avail_time); */
-
-
-
-}
-
-
-/*+ this function is called when a killed or ended task reach the
- period end +*/
-static void CBS_FT_timer_zombie(void *par)
-{
- PID p = (PID) par;
- CBS_FT_level_des *lev;
-
- lev = (CBS_FT_level_des *)level_table[proc_table[p].task_level];
-
- /* we finally put the task in the FREE status */
- proc_table[p].status = FREE;
- iq_insertfirst(p,&freedesc);
-
-
- /* and free the allocated bandwidth */
- lev->U -= (MAX_BANDWIDTH / lev->period[p]) * (TIME)lev->maxcap[p];
-}
-
-static PID CBS_FT_public_scheduler(LEVEL l)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
-
- /* it stores the actual time and set the IDLE flag in order to handle
- the capacity queue discharging!!! */
- lev->idle = 1;
- kern_gettime(&lev->start_idle);
-
-
- /* the CBS_FT don't schedule anything...
- it's an EDF level or similar that do it! */
- return NIL;
-}
-
-
-/* The on-line guarantee is enabled only if the appropriate flag is set... */
-static int CBS_FT_public_guarantee(LEVEL l, bandwidth_t *freebandwidth)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
-
- if (lev->flags & CBS_FT_FAILED_GUARANTEE) {
- *freebandwidth = 0;
- kern_printf("guarantee :garanzia fallita!!!!!!\n");
- return 0;
- }
- else if (*freebandwidth >= lev->U) {
- *freebandwidth -= lev->U;
- return 1;
- }
- else {
- kern_printf("guarantee :garanzia fallita per mancanza di banda!!!!!!\n");
- kern_printf("freeband: %d request band: %d", *freebandwidth, lev->U);
- return 0;
- }
-}
-
-
-static int CBS_FT_public_create(LEVEL l, PID p, TASK_MODEL *m)
-
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
- FT_TASK_MODEL *s;
-
- if (m->pclass != FT_PCLASS) return -1;
- if (m->level != 0 && m->level != l) return -1;
- s = (FT_TASK_MODEL *) m;
- //kern_printf("accept :FAULT TOLERANT TASK found!!!!!!\n"); */
- if (!(s->type == PRIMARY && s->execP > 0 && s->budget < (int)s->period
- && s->backup != NIL)) return -1;
- if (!(s->type == BACKUP && s->wcetB > 0))
- return -1;
- /* now we know that m is a valid model */
-
- /* Enable budget check */
- proc_table[p].control |= CONTROL_CAP;
-
- proc_table[p].avail_time = 0;
- NULL_TIMESPEC(&lev->cbs_ft_dline[p]);
-
-
- if (s->type == PRIMARY) {
- proc_table[p].wcet = (int)s->execP;
- lev->period[p] = s->period;
- lev->maxcap[p] = s->budget;
- lev->backup[p] = s->backup;
- lev->CP[p] = 0;
- lev->P_or_B[p] = PRIMARY;
-
- /* update the bandwidth... */
- if (lev->flags & CBS_FT_ENABLE_GUARANTEE) {
- bandwidth_t b;
- b = (MAX_BANDWIDTH / lev->period[p]) * (TIME)lev->maxcap[p];
-
- /* really update lev->U, checking an overflow... */
- if (MAX_BANDWIDTH - lev->U > b)
- lev->U += b;
- else
- /* The task can NOT be guaranteed (U>MAX_BANDWIDTH)...
- (see EDF.c) */
- lev->flags |= CBS_FT_FAILED_GUARANTEE;
- }
- }
- else {
- proc_table[p].wcet = (int)s->wcetB;
- lev->P_or_B[p] = BACKUP;
-
- /* Backup tasks are unkillable tasks! */
- proc_table[p].control |= NO_KILL;
- }
-
- return 0; /* OK, also if the task cannot be guaranteed... */
-}
-
-
-static void CBS_FT_public_detach(LEVEL l, PID p)
-{
- /* the CBS_FT level doesn't introduce any dynamic allocated new field.
- we have only to reset the NO_GUARANTEE FIELD and decrement the allocated
- bandwidth */
-
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
-
- if (lev->flags & CBS_FT_FAILED_GUARANTEE)
- lev->flags &= ~CBS_FT_FAILED_GUARANTEE;
- else
- lev->U -= (MAX_BANDWIDTH / lev->period[p]) * (TIME)lev->maxcap[p];
-}
-
-
-static void CBS_FT_public_dispatch(LEVEL l, PID p, int nostop)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
- level_table[ lev->scheduling_level ]->
- private_dispatch(lev->scheduling_level,p,nostop);
-}
-
-static void CBS_FT_public_epilogue(LEVEL l, PID p)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
-
- /* check if the budget is finished... */
- if (proc_table[p].avail_time <= 0) {
-
- /* A backup task cannot ever exhaust its budget! */
- if (lev->P_or_B[p] == BACKUP) {
- kern_printf("\nBACKUP wcet violation!\n");
- kern_raise(XWCET_VIOLATION,p);
- /* we kill the current activation */
- level_table[ lev->scheduling_level ]->
- private_extract(lev->scheduling_level, p);
- return;
- }
-
- /* we try to recharge the budget */
- CBS_FT_avail_time_check(lev, p);
-
- /* The budget must be greater than 0! */
- if (proc_table[p].avail_time <= 0) {
- kern_printf("\nBackup task starting with exhausted budget\n");
- kern_raise(XINVALID_TASK, p);
- lev->CP[p] = 0;
- /* we kill the current activation */
- level_table[ lev->scheduling_level ]->
- private_extract(lev->scheduling_level, p);
- return;
- }
- }
-
- /* the task returns into the ready queue by
- calling the guest_epilogue... */
- level_table[ lev->scheduling_level ]->
- private_epilogue(lev->scheduling_level,p);
-}
-
-
-static void CBS_FT_public_activate(LEVEL l, PID p)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
- struct timespec t;
-
- kern_gettime(&t);
-
- if (lev->P_or_B[p] == BACKUP) {
- kern_printf("\nTrying to activate a BACKUP task!\n");
- kern_raise(XINVALID_TASK, p);
- }
- else {
-
- /* If idle=1, then we have to discharge the capacities stored in
- the capacity queue up to the length of the idle interval */
- if (lev->idle == 1) {
- TIME interval;
- struct timespec delta;
- lev->idle = 0;
- SUBTIMESPEC(&t, &lev->start_idle, &delta);
- /* length of the idle interval expressed in usec! */
- interval = TIMESPEC2NANOSEC(&delta) / 1000;
-
- /* it discharge the available capacities from the capacity queue */
- while (interval > 0 && lev->queue != NULL) {
- struct timespec dead;
- int cap;
- c_readfirst(&dead, &cap, lev->queue);
- if (cap > interval) {
- c_writefirst(dead, cap - interval, lev->queue);
- interval = 0;
- }
- else {
- interval -= cap;
- c_extractfirst(&lev->queue);
- }
- }
- }
-
- CBS_FT_activation(lev, p, &t);
-
-
- /* Set the reactivation timer */
- TIMESPEC_ASSIGN(&lev->reactivation_time[p], &lev->cbs_ft_dline[p]);
- lev->reactivation_timer[p] = kern_event_post(&lev->reactivation_time[p],
- CBS_FT_timer_reactivate,
- (void *)p);
-
- // kern_printf("act : %d %d |",lev->cbs_ft_dline[p].tv_nsec/1000,p);
- }
-}
-
-static int CBS_FT_public_message(LEVEL l, PID p, void *m)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
-
-
- level_table[ lev->scheduling_level ]->
- private_extract(lev->scheduling_level,p);
-
-
- proc_table[p].status = CBS_FT_IDLE;
-
-
- if (lev->P_or_B[p] == PRIMARY) {
- if (lev->CP[p]) {
- JOB_TASK_MODEL job;
-
- /* We have to start the backup task */
- TIMESPEC_ASSIGN(&lev->cbs_ft_dline[ lev->backup[p] ],
- &lev->cbs_ft_dline[p]);
- proc_table[ lev->backup[p] ].avail_time = proc_table[p].avail_time;
- lev->CP[p] = 0;
-
- /* and, finally, we insert the backup task in the master level */
- job_task_default_model(job, lev->cbs_ft_dline[p]);
- job_task_def_yesexc(job);
- level_table[ lev->scheduling_level ]->
- private_insert(lev->scheduling_level, lev->backup[p],
- (TASK_MODEL *)&job);
- }
- else {
- /* A spare capacity is inserted in the capacity queue!! */
- proc_table[p].avail_time += proc_table[ lev->backup[p] ].wcet;
- if (proc_table[p].avail_time > 0) {
- c_insert(lev->cbs_ft_dline[p], proc_table[p].avail_time,
- &lev->queue, p);
- proc_table[p].avail_time = 0;
- }
- }
- }
- else {
- /* this branch is for backup tasks:
- A spare capacity is inserted in the capacity queue!! */
- if (proc_table[p].avail_time > 0) {
- c_insert(lev->cbs_ft_dline[p], proc_table[p].avail_time,
- &lev->queue, p);
- proc_table[p].avail_time = 0;
- }
- }
-
- jet_update_endcycle(); /* Update the Jet data... */
- trc_logevent(TRC_ENDCYCLE,&exec_shadow); /* tracer stuff */
-
- return 0;
-}
-
-
-static void CBS_FT_public_end(LEVEL l, PID p)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
-
- /* A backup task cannot be killed, this behaviour can be modified
- in a new release */
- if (lev->P_or_B[p] == BACKUP) {
- kern_printf("\nKilling a BACKUP task!\n");
- kern_raise(XINVALID_TASK, p);
- return;
- }
-
- /* check if the capacity becomes negative... */
- /* there is a while because if the wcet is << than the system tick
- we need to postpone the deadline many times */
- while (proc_table[p].avail_time < 0) {
- /* the CBS_FT rule for recharging the capacity */
- proc_table[p].avail_time += lev->maxcap[p];
- ADDUSEC2TIMESPEC(lev->period[p], &lev->cbs_ft_dline[p]);
- }
-
- level_table[ lev->scheduling_level ]->
- private_extract(lev->scheduling_level,p);
-
-
- /* we delete the reactivation timer */
- kern_event_delete(lev->reactivation_timer[p]);
- lev->reactivation_timer[p] = -1;
-
-
- /* Finally, we post the zombie event. when the end period is reached,
- the task descriptor and banwidth are freed */
- proc_table[p].status = CBS_FT_ZOMBIE;
- lev->reactivation_timer[p] = kern_event_post(&lev->cbs_ft_dline[p],
- CBS_FT_timer_zombie,
- (void *)p);
-}
-
-/* Registration functions */
-
-/*+ Registration function:
- int flags the init flags ... see CBS.h +*/
-LEVEL CBS_FT_register_level(int flags, LEVEL master)
-{
- LEVEL l; /* the level that we register */
- CBS_FT_level_des *lev; /* for readableness only */
- PID i; /* a counter */
-
- printk("CBS_FT_register_level\n");
-
- /* request an entry in the level_table */
- l = level_alloc_descriptor(sizeof(CBS_FT_level_des));
-
- lev = (CBS_FT_level_des *)level_table[l];
-
- printk(" lev=%d\n",(int)lev);
-
- /* fill the standard descriptor */
- lev->l.public_scheduler = CBS_FT_public_scheduler;
-
- if (flags & CBS_FT_ENABLE_GUARANTEE)
- lev->l.public_guarantee = CBS_FT_public_guarantee;
- else
- lev->l.public_guarantee = NULL;
-
- lev->l.public_create = CBS_FT_public_create;
- lev->l.public_detach = CBS_FT_public_detach;
- lev->l.public_end = CBS_FT_public_end;
- lev->l.public_dispatch = CBS_FT_public_dispatch;
- lev->l.public_epilogue = CBS_FT_public_epilogue;
- lev->l.public_activate = CBS_FT_public_activate;
- lev->l.public_message = CBS_FT_public_message;
-
- /* fill the CBS_FT descriptor part */
- for (i=0; i<MAX_PROC; i++) {
- NULL_TIMESPEC(&lev->cbs_ft_dline[i]);
- lev->period[i] = 0;
- NULL_TIMESPEC(&lev->reactivation_time[i]);
- lev->reactivation_timer[i] = -1;
- lev->maxcap[i] = 0;
- lev->backup[i] = NIL;
- lev->CP[i] = 0;
- lev->P_or_B[i] = PRIMARY;
- }
-
- lev->U = 0;
- lev->idle = 0;
- lev->queue = NULL;
-
- lev->scheduling_level = master;
-
- lev->flags = flags & 0x07;
-
- return l;
-}
-
-
-
-bandwidth_t CBS_FT_usedbandwidth(LEVEL l)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
-
- return lev->U;
-}
-
-
-
-void CBS_FT_Primary_Abort()
-{
- PID p;
- CBS_FT_level_des *lev;
-
- kern_cli();
- p = exec_shadow;
- lev = (CBS_FT_level_des *)level_table[proc_table[p].task_level];
- lev->CP[p] = 1;
- kern_sti();
-}
-
-
-char CBS_FT_Checkpoint()
-{
- char f;
- PID p;
- CBS_FT_level_des *lev;
-
- kern_cli();
- p = exec_shadow;
- lev = (CBS_FT_level_des *)level_table[proc_table[p].task_level];
- f = lev->CP[p];
- kern_sti();
- return f;
-}
-
Index: rel_1_2/cbs_ft/initfile.c
===================================================================
--- rel_1_2/cbs_ft/initfile.c (revision 1198)
+++ rel_1_2/cbs_ft/initfile.c (nonexistent)
@@ -1,112 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@hartik.sssup.it>
- *
- * Authors : Marco caccamo and Paolo Gai
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- This file contains the server CBS_FT
-
- Read CBS_FT.h for further details.
-
-**/
-
-/*
- * Copyright (C) 2000 Marco Caccamo and Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include <modules/edf.h>
-#include <modules/rr.h>
-#include "cbs_ft.h"
-#include <modules/cbs.h>
-#include <modules/dummy.h>
-#include <drivers/keyb.h>
-#include <modules/hartport.h>
-#include <modules/sem.h>
-#include <modules/cabs.h>
-
-/*+ system tick in us +*/
-#define TICK 300
-#define RRTICK 5000
-
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_FT_register_level(CBS_FT_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
- CABS_register_module();
-
- // periodic timer
- return TICK;
- // one-shot timer
- // return 0
-}
-
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Index: rel_1_2/cbs_ft/cbs_ft.h
===================================================================
--- rel_1_2/cbs_ft/cbs_ft.h (revision 1198)
+++ rel_1_2/cbs_ft/cbs_ft.h (nonexistent)
@@ -1,167 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@hartik.sssup.it>
- *
- * Authors : Marco Caccamo and Paolo Gai
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: cbs_ft.h,v 1.2 2003-01-07 17:10:16 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-01-07 17:10:16 $
- ------------
-
- This file contains the server CBS_FT
-
- Read CBS_FT.h for further details.
-
-**/
-
-/*
- * Copyright (C) 2000 Marco Caccamo and Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#ifndef __CBS_FT__
-#define __CBS_FT__
-
-
-
-#include <ll/string.h>
-#include <kernel/model.h>
-#include <kernel/descr.h>
-#include <kernel/var.h>
-#include <kernel/func.h>
-#include <kernel/trace.h>
-
-
-
-
-
-
-/*+ flags... +*/
-#define CBS_FT_ENABLE_GUARANTEE 1 /*+ Task Guarantee enabled +*/
-#define CBS_FT_ENABLE_ALL 1
-
-#define CBS_FT_FAILED_GUARANTEE 8 /*+ used in the module, unsettable
- in EDF_register_level... +*/
-
-
-#define PRIMARY 1
-#define BACKUP 2
-#define FT_PCLASS 0x0700 // Nuova classe di task, quelli fault_tolerant
-
-#define CBS_FT_LEVELNAME "CBSFT base"
-#define CBS_FT_LEVEL_CODE 110
-#define CBS_FT_LEVEL_VERSION 1
-
-
-/* The Fault-Tolerant Task model extends the base task model
- This model cannot be APERIODIC, only PERIODIC tasks are allowed.
- A faut-tolerant application is composed by two different tasks (primary and
- backup). The backup task is characterized by its WCET and its type (BACKUP).
- The primary task must define the task period, its average execution time
- (used as sort of prediction in order to recharge the budget using the
- capacity cash queue!), the budget (budget / period = U that is, the
- bandwidth assigned to the fault-tolerant application), its type (PRIMARY)
- and finally the PID of the corresponding backup task. */
-
-typedef struct {
- TASK_MODEL t;
-
- TIME wcetB; // WCET of the backup job (BACKUP TASK ONLY)
-
- TIME execP; // average exec. time of the primary job (PRIMARY TASK ONLY)
-
- TIME period; // period of the fault-tolerant task (PRIMARY TASK ONLY)
-
- int budget; // amount of guaranteed capacity (PRIMARY TASK ONLY)
-
- char type; // PRIMARY or BACKUP
-
- PID backup; // (PRIMARY TASK ONLY)
-
-} FT_TASK_MODEL;
-
-
-#define ft_task_default_model(m) \
- task_default_model((m).t,FT_PCLASS), \
- (m).period = 0, \
- (m).wcetB = 0, \
- (m).execP = 0, \
- (m).budget = 0, \
- (m).type = BACKUP, \
- (m).backup = NIL
-
-#define ft_task_def_level(m,l) task_def_level((m).t,l)
-#define ft_task_def_arg(m,a) task_def_arg((m).t,a)
-#define ft_task_def_stack(m,s) task_def_stack((m).t,s)
-#define ft_task_def_stackaddr(m,s) task_def_stackaddr((m).t,s)
-#define ft_task_def_usemath(m) task_def_usemath((m).t)
-#define ft_task_def_ctrl_jet(m) task_def_ctrl_jet((m).t)
-#define ft_task_def_group(m,g) task_def_group((m).t,g)
-#define ft_task_def_period(m,o) (m).period = (o)
-#define ft_task_def_budget(m,o) (m).budget = (o)
-#define ft_task_def_backup(m) (m).type = BACKUP
-#define ft_task_def_primary(m) (m).type = PRIMARY
-#define ft_task_def_backup_task(m,b) (m).backup = b
-#define ft_task_def_backup_wcet(m,b) (m).wcetB = b
-#define ft_task_def_primary_exec(m,b) (m).execP = b
-
-/************************************************************************/
-LEVEL CBS_FT_register_level(int flags, LEVEL master);
-
-
-bandwidth_t CBS_FT_usedbandwidth(LEVEL l);
-
-
-
-/* This function notifies to a primary task that the task itself has to
- suspend its execution (the task has to suspend itself with a
- task_endcycle() */
-char CBS_FT_Checkpoint(void);
-
-
-
-/* This function sets the checkpoint flag! hence, at the next checkpoint,
- that is:
-
- if (CBS_FT_Checkpoint()) {
- task_endcycle();
- continue;
- }
-
- the primary task will suspend itself switching to the backup task */
-void CBS_FT_Primary_Abort(void);
-
-/***************************************************************************/
-
-
-
-
-#endif
Index: rel_1_2/cbs_ft/prova.c
===================================================================
--- rel_1_2/cbs_ft/prova.c (revision 1198)
+++ rel_1_2/cbs_ft/prova.c (nonexistent)
@@ -1,429 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@hartik.sssup.it>
- *
- * Authors : Marco Caccamo and Paolo Gai
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: prova.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- testcash.c
- test for the CASH Module, directly derived from Test Number 13 (D)
-
-**/
-
-/*
- * Copyright (C) 2000 Marco Caccamo and Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#include <modules/edf.h>
-#include "cbs_ft.h"
-#include <math.h>
-#include <stdlib.h>
-
-#define ASTER_LIM 60
-#define DISPLAY_MAX 15
-
-#define STAT_Y 9
-
-#define INPUT 0.5
-
-
-
-#define MAX_STAT 10000
-#define RVAL 1
-#define XVAL 2
-#define DVAL 3
-
-
-struct statistic {
- TIME r_time;
- TIME ex_time;
- long dead_post;
-};
-
-
-
- struct statistic stat[MAX_STAT];
- TIME val[MAX_STAT];
-
-int n_stat = 0;
-
-TASK hard_aster1p(void)
-{
- int i;
- int y = 1;
- int load1,j;
-
- char s[2];
-
- s[0] = 'P'; s[1] = 0;
-
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 20000; //+ rand() % 25000;
- for (j=0; j<load1; j++) {
- if (CBS_FT_Checkpoint())
- break;
- puts_xy(i,y,rand()%15+1,s);
- }
- //kern_cli();
- //stat[n_stat].r_time = CBSGHD_get_response_time(1, exec_shadow);
- //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
- //kern_sti();
- //n_stat++;
- task_endcycle();
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
-}
-
-
-TASK hard_aster1b(void)
-{
- int i;
- int y = 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = 'B'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 20000;// + rand()%4000;
- for (j=0; j<load1; j++) {
- puts_xy(i,y,rand()%15+1,s);
- }
- //kern_cli();
- //stat[n_stat].r_time = CBSGHD_get_response_time(1, exec_shadow);
- //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
- //kern_sti();
- //n_stat++;
- task_endcycle();
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
-}
-
-
-TASK hard_aster2p(void)
-{
- int i;
- int y = 3;
-
- int load1,j;
-
- char s[2];
-
- s[0] = 'P'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 20000 + rand() % 20000;
- for (j=0; j<load1; j++) {
- if (CBS_FT_Checkpoint())
- break;
- puts_xy(i,y,rand()%15+1,s);
- }
- //kern_cli();
- //stat[n_stat].r_time = CBSGHD_get_response_time(5, exec_shadow);
- //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
- //kern_sti();
- //n_stat++;
- task_endcycle();
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
-}
-
-TASK hard_aster2b(void)
-{
- int i;
- int y = 3;
-
- int load1,j;
-
- char s[2];
-
- s[0] = 'T'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 20000;
- for (j=0; j<load1; j++) {
- puts_xy(i,y,rand()%15+1,s);
- }
- //kern_cli();
- //stat[n_stat].r_time = CBSGHD_get_response_time(5, exec_shadow);
- //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
- //kern_sti();
- //n_stat++;
- task_endcycle();
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
-}
-
-
-TASK clock()
-{
- int s = 0, m = 0;
-
- while(1) {
- printf_xy(62,1,WHITE,"%2d:%2d",m,s);
- printf_xy(62,2,WHITE,"Utot=%12u",MAX_BANDWIDTH);
- printf_xy(62,3,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
- printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_FT_usedbandwidth(1));
- task_endcycle();
-
- if (++s > 59) {
- s = 0;
- m++;
- }
- printf_xy(62,1,WHITE,"%2d:%2d",m,s);
- printf_xy(62,2,WHITE,"Utot=%12u",MAX_BANDWIDTH);
- printf_xy(62,3,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
- printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_FT_usedbandwidth(1));
- task_endcycle();
- }
-}
-
-
-
-/* we consider the first ASTER_MAX + 2 tasks from the PID 2
- and plot on the screen the elapsed times... */
-TASK jetcontrol()
-{
- int i; /* a counter */
- TIME sum, max, curr, last[5];
- int nact;
- int j; /* the elements set by jet_gettable */
- PID p;
-
-
- kern_cli();
- printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
- kern_sti();
-
- for (;;) {
- for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
- if (jet_getstat(p, &sum, &max, &nact, &curr) == -1) continue;
-
- for (j=0; j<5; j++) last[j] = 0;
- jet_gettable(p, &last[0], 5);
- kern_cli();
- printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6ld ³ %-6ld ³ %-4d ³ %-7ld ³ %-5ld ³ %-5ld ³ %-5ld ³ %-5ld ³ %-5ld", p, sum/(nact==0 ? 1 : nact), max,
- nact, curr, last[0], last[1], last[2], last[3], last[4]);
- kern_sti();
- i++;
- }
- task_endcycle();
- }
-}
-
-
-void save_stat(struct statistic p[], int n, char *name, int type)
-{
- DOS_FILE *f;
- int i;
- char outstring[500];
-
-
- for(i = 0; i < 500; i++)
- outstring[i] = '0';
-
- f = DOS_fopen(name, "w");
- if (!f) {
- cprintf("Cannot open %s!!!", name);
- goto end1;
- }
-
- for(i = 0; i < n; i++) {
- if (type == RVAL)
- val[i] = p[i].r_time;
- if (type == XVAL)
- val[i] = p[i].ex_time;
- if (type == DVAL)
- val[i] = p[i].dead_post;
- }
-
- memset(outstring, 0, 300);
- sprintf(outstring, "%ld \n", (long int)n);
- cprintf("%s", outstring);
- DOS_fwrite(outstring, 1, strlen(outstring), f);
-
- for(i = 0; i < n; i++) {
- memset(outstring, 0, 300);
- sprintf(outstring, "%ld %lu\n", (long int)i, val[i]);
- //cprintf("%s", outstring);
- DOS_fwrite(outstring, 1, strlen(outstring), f);
- }
- DOS_fclose(f);
-end1:cprintf("OK?");
-}
-
-
-void result_save(void *p)
-{
- save_stat(stat, n_stat, "stat1.tim", RVAL);
-}
-
-
-void fine()
-{
- ll_abort(666);
-}
-
-int main(int argc, char **argv)
-{
- PID p1,p2,p3, p4, p5, p6;
-
- HARD_TASK_MODEL m;
- FT_TASK_MODEL ftb;
- FT_TASK_MODEL ftp;
-
- // int i;
- struct timespec fineprg;
-
-
- //sys_atrunlevel(result_save, NULL, RUNLEVEL_AFTER_EXIT);
- srand(7);
-
- hard_task_default_model(m);
- hard_task_def_wcet(m,500);
- hard_task_def_mit(m,500000);
- hard_task_def_periodic(m);
- hard_task_def_group(m,1);
- hard_task_def_ctrl_jet(m);
-
-
- p1 = task_create("Clock",clock,&m,NULL);
- if (p1 == -1) {
- perror("testhd.c(main): Could not create task <Clock> ...");
- sys_end();
- }
-
-
- hard_task_def_wcet(m,500);
- hard_task_def_periodic(m);
- hard_task_def_mit(m,100000);
-
-
- p2 = task_create("JetControl",jetcontrol,&m,NULL);
- if (p2 == -1) {
- perror("testhd.c(main): Could not create task <JetControl> ...");
- sys_end();
- }
-
-
- ft_task_default_model(ftb);
- ft_task_def_usemath(ftb);
- ft_task_def_backup(ftb);
- ft_task_def_ctrl_jet(ftb);
- ft_task_def_backup_wcet(ftb, 7000);
-
-
-
- p3 = task_create("Hard_aster1b", hard_aster1b, &ftb,NULL);
- if (p3 == -1) {
- perror("testhd.c(main): Could not create task <aster1b> ...");
- sys_end();
- }
-
- ft_task_default_model(ftp);
- ft_task_def_usemath(ftp);
- ft_task_def_ctrl_jet(ftp);
- ft_task_def_group(ftp, 1);
- ft_task_def_period(ftp, 50000);
- ft_task_def_budget(ftp, 15000);
- ft_task_def_primary_exec(ftp, 7300);
- ft_task_def_primary(ftp);
- ft_task_def_backup_task(ftp, p3);
-
-
- p4 = task_create("Hard_aster1p", hard_aster1p, &ftp, NULL);
- if (p4 == -1) {
- perror("testhd.c(main): Could not create task <aster1p> ...");
- sys_end();
- }
-
-
- ft_task_def_backup_wcet(ftb, 6700);
-
-
- p5 = task_create("Hard_aster2b", hard_aster2b, &ftb, NULL);
- if (p5 == -1) {
- perror("testhd.c(main): Could not create task <aster2b> ...");
- sys_end();
- }
-
-
- ft_task_def_period(ftp, 100000);
- ft_task_def_budget(ftp, 8000);
- ft_task_def_primary_exec(ftp, 11000);
- ft_task_def_backup_task(ftp, p5);
-
-
- p6 = task_create("Hard_aster2p", hard_aster2p, &ftp, NULL);
- if (p6 == -1) {
- perror("testhd.c(main): Could not create task <aster2p> ...");
- sys_end();
- }
-
-
- printf_xy(0,STAT_Y + 15,WHITE,"Hard asteroide PID= %-3d ",p3);
- printf_xy(0,STAT_Y + 17,WHITE,"Clock PID= %-3d ",p1);
- printf_xy(0,STAT_Y + 18,WHITE,"JetControl PID= %-3d ",p2);
-
-
-
- task_nopreempt();
- fineprg.tv_sec = 10;
- fineprg.tv_nsec = 0;
- kern_event_post(&fineprg,fine,NULL);
- group_activate(1);
- return 0;
-}
-
Index: rel_1_2/cbs_ft/readme.txt
===================================================================
--- rel_1_2/cbs_ft/readme.txt (revision 1198)
+++ rel_1_2/cbs_ft/readme.txt (nonexistent)
@@ -1,6 +0,0 @@
-This Example has been made by Marco Caccamo.
-
-There is not a lot of documentation available, so if you have problems please
-send an e-mail to Marco ( http://gandalf.sssup.it/~caccamo/ )
-
-Paolo
Index: rel_1_2/cbs_ft/makefile
===================================================================
--- rel_1_2/cbs_ft/makefile (revision 1198)
+++ rel_1_2/cbs_ft/makefile (nonexistent)
@@ -1,17 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= prova
-
-include $(BASE)/config/example.mk
-
-prova:
- make -f $(SUBMAKE) APP=prova INIT= OTHEROBJS="initfile.o cbs_ft.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
-
-
Index: rel_1_2/autostr/makefile
===================================================================
--- rel_1_2/autostr/makefile (revision 1198)
+++ rel_1_2/autostr/makefile (nonexistent)
@@ -1,17 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= autostr
-
-include $(BASE)/config/example.mk
-
-autostr:
- make -f $(SUBMAKE) APP=autostr INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
-
-
Index: rel_1_2/autostr/autostr.c
===================================================================
--- rel_1_2/autostr/autostr.c (revision 1198)
+++ rel_1_2/autostr/autostr.c (nonexistent)
@@ -1,1171 +0,0 @@
-/***************************************************************************
- **************************************************************************
- *** Universita' di Pavia ***
- *** Corso : Informatoca Industriale ***
- **************************************************************************
- *** Progetto : MONITORAGGIO AUTOSTRADA ***
- **************************************************************************
- *** Realizzato da : Nino Verzellesi e Quadrubbi Giacomo ***
- **************************************************************************
- ***************************************************************************/
-
-
-/* ----------------------------------------------------------------------------- */
-
-#include <kernel/kern.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <semaphore.h>
-#include <stdlib.h>
-#include <math.h>
-
-/* ----------------------------------------------------------------------------- */
-
-
-/********************* DEFINIZIONE DELLE COSTANTI **************************/
-
-#define ESC 27 /* codice ASCII del tasto ESCAPE */
-#define MAX_V 35 /* massimo numero di veicoli */
-#define GRUPPO 1
-#define LUNGCAMION 40 /* lunghezza del camion */
-#define LARGCAMION 10 /* larghezza del camion */
-#define LUNGLENTA 16 /* lunghezza della macchina lenta */
-#define LARGLENTA 8 /* larghezza della macchina lenta */
-#define LUNGVELOCE 20 /* lunghezza della macchina veloce */
-#define LARGVELOCE 8 /* larghezza della macchina veloce */
-#define DT 0.04 /* passo del campionamento */
-#define CENTROCORSIA1 477 /* coordinata del centro della corsia 1 */
-#define CENTROCORSIA2 459 /* coordinata del centro della corsia 2 */
-#define CENTROCARREGGIATA 469 /* coordinata del centro della carreggiata */
-
-
-/* ----------------------------------------------------------------------------- */
-
-
-/****************** DEFINIZIONE DELLE VARIABILI GLOBALI ********************/
-
-double tick = 1.0; /* system tick = 1 ms */
-int periodo = 40000; /* periodo */
-int wcet = 1000; /* deadline */
-PID pid;
-sem_t mutex; /* semaforo per la grafica */
-sem_t strada; /* semaforo per le variabili corsia1 e corsia2 */
-int MAX_X; /* dimensione x della modalita' di visualizzazione dello schermo */
-int MAX_Y; /* dimensione y della modalita' di visualizzazione dello schermo */
-short corsia1[40000]; /* vettore della corsia1 */
-short corsia2[40000]; /* vettore della corsia2 */
-int xelic; /* cordinata dell'elicottero */
-char c; /* carattere da tastiera */
-
-
-/* ----------------------------------------------------------------------------- */
-
-
-/****************** FUNZIONE CHE DISEGNA I VEICOLI *************************/
-
-void draw_veicolo(int x, int y, int colore,int lunghezza,int larghezza)
-{
- int u; /* indice di ciclo */
- int v; /* variabile ausiliaria per la ricostruzione della segnaletica */
- int xreal; /* coordinata di fine veicolo */
-
- xreal=x-lunghezza; /* calcola la coordinata di fine veicolo */
- if (xreal<0) /* la pone a zero nel caso in cui sia minore di zero (veicolo non ancora interamente entrato in autostrada) */
- xreal=0;
-
- /* disegna il veicolo nella posizione indicata e con il colore indicato */
- sem_wait(&mutex);
- grx_box(xreal,(int)(y-larghezza/2),x,(int)(y+larghezza/2),colore);
- sem_post(&mutex);
-
- /* ricostruisce la segnaletica orrizzontale della strada nel caso in cui si sta' cancellando il veicolo dalla posizione precedente (ridisegna solo quella parte che e' stata cancellata) */
- if (colore==0)
- for (u=xreal;u<x;u++)
- {
- v=u%8;
- if ((v==0) || (v==1))
- {
- sem_wait(&mutex);
- grx_plot(u,CENTROCARREGGIATA,rgb16(255,255,255));
- sem_post(&mutex);
- }
- }
-}
-
-
-/* ----------------------------------------------------------------------------- */
-
-
-/** FUNZIONE CHE CALCOLA LA DISTANZA DAL VEICOLO CHE PRECEDE SULLA CORSIA **/
-
-int dist_ant(int pos_x,int pos_y,int distsic)
-{
- int libero; /* variabile che indica se l'attuale posizione puntata dal veicolo e' libera */
- int distant; /* distanza dal veicolo che ci precede */
- int fine; /* variabile ausiliaria per capire se sto' arrivando alla fine della strada */
-
- /* inizializzazione delle variabili */
- libero=0;
- distant=0;
-
- /* calcola la distanza da un eventuale veicolo che ci precede */
- sem_wait(&strada);
- if (pos_y<CENTROCARREGGIATA) /* controlla se il veicolo e' nella prima corsia, altrimenti e' in seconda corsia */
- while (libero==0 && distant<distsic) /* il calcolo della distanza da un veicolo che ci precede termina quando viene trovato un veicolo o si raggiunge la lunghezza massima di visione del sensore */
- {
- fine=pos_x+distant; /* nel caso in cui il veicolo si giunto alla fine dell'autostrada si assume che il sensore ritorni un valore come nel caso in cui non sia preceduto da nessun veicolo */
- if (fine>40000)
- distant=distsic;
- else
- if (corsia2[fine]!=0) /* se la strada e' occupata da un'altro veicolo pongo la variabile libero ad uno (strada occupata), altrimenti in caso contrario incremento la distanza analizzata dal sensore */
- libero=1;
- else
- distant++;
- }
- else /* il veicolo e' nella seconda corsia */
- while (libero==0 && distant<distsic) /* il calcolo della distanza da un veicolo che ci precede termina quando viene trovato un veicolo o si raggiunge la lunghezza massima di visione del sensore */
- {
- fine=pos_x+distant; /* nel caso in cui il veicolo si giunto alla fine dell'autostrada si assume che il sensore ritorni un valore come nel caso in cui non sia preceduto da nessun veicolo */
- if (fine>40000)
- distant=distsic;
- else
- if (corsia1[fine]!=0) /* se la strada e' occupata da un'altro veicolo pongo la variabile libero ad uno (strada occupata), altrimenti in caso contrario incremento la distanza analizzata dal sensore */
- libero=1;
- else
- distant++;
- }
- sem_post(&strada);
-
- return(distant); /* ritorna il valore della distanza misurata dal sensore , se non ha trovato nessun veicolo tale distanza e' pari alla massima lunghezza a cui puo' arrivare il sensore */
-}
-
-
-/* ----------------------------------------------------------------------------- */
-
-
-/** FUNZIONE CHE CALCOLA LA DISTANZA ANTERIORE DESTRA DI UN VEICOLO CHE PRECEDE **/
-
-int dist_ant_dx(int pos_x,int pos_y,int distsicdx)
-{
- int distantdx; /* distanza dal veicolo che ci precede a destra */
- int libero; /* variabile che indica se l'attuale posizione puntata dal veicolo e' libera */
- int fine; /* variabile ausiliaria per capire se sto' arrivando alla fine della strada */
-
- /* inizializzazione delle variabili */
- libero=0;
- distantdx=0;
-
- sem_wait(&strada);
- while (libero==0 && distantdx<distsicdx) /* il calcolo della distanza da un veicolo che ci precede a destra termina quando viene trovato un veicolo o si raggiunge la lunghezza massima di visione del sensore */
- {
- fine=pos_x+distantdx; /* nel caso in cui il veicolo sia giunto alla fine dell'autostrada si assume che il sensore ritorni un valore come nel caso in cui non sia preceduto da nessun veicolo */
- if (fine>40000)
- distantdx=distsicdx;
- else
- if (corsia1[fine]!=0) /* se la strada e' occupata da un'altro veicolo pongo la variabile libero ad uno (strada occupata), altrimenti in caso contrario incremento la distanza analizzata dal sensore */
- libero=1;
- else
- distantdx++;
- }
- sem_post(&strada);
-
- return(distantdx); /* ritorna il valore della distanza misurata dal sensore , se non ha trovato nessun veicolo tale distanza e' pari alla massima lunghezza a cui puo' arrivare il sensore */
-}
-
-
-/* ----------------------------------------------------------------------------- */
-
-
-/** FUNZIONE CHE CALCOLA LA DISTANZA ANTERIORE SINISTRA DI UN VEICOLO CHE PRECEDE **/
-
-int dist_ant_sx(int pos_x,int pos_y,int distsicsx)
-{
- int distantsx; /* distanza dal veicolo che ci precede a sinistra */
- int libero; /* variabile che indica se l'attuale posizione puntata dal veicolo e' libera */
- int fine; /* variabile ausiliaria per capire se sto' arrivando alla fine della strada */
-
- /* inizializzazione delle variabili */
- libero=0;
- distantsx=0;
-
- sem_wait(&strada);
- while (libero==0 && distantsx<distsicsx) /* il calcolo della distanza da un veicolo che ci precede a sinistra termina quando viene trovato un veicolo o si raggiunge la lunghezza massima di visione del sensore */
- {
- fine=pos_x+distantsx; /* nel caso in cui il veicolo si giunto alla fine dell'autostrada si assume che il sensore ritorni un valore come nel caso in cui non sia preceduto da nessun veicolo */
- if (fine>40000)
- distantsx=distsicsx;
- else
- if (corsia2[fine]!=0) /* se la strada e' occupata da un'altro veicolo pongo la variabile libero ad uno (strada occupata), altrimenti in caso contrario incremento la distanza analizzata dal sensore */
- libero=1;
- else
- distantsx++;
- }
- sem_post(&strada);
-
- return(distantsx); /* ritorna il valore della distanza misurata dal sensore , se non ha trovato nessun veicolo tale distanza e' pari alla massima lunghezza a cui puo' arrivare il sensore */
-}
-
-
-/* ----------------------------------------------------------------------------- */
-
-
-/** FUNZIONE CHE CALCOLA LA DISTANZA POSTERIORE SINISTRA DI UN VEICOLO CHE INSEGUE **/
-
-int dist_postsx (int pos_x,int pos_y,int distsorp)
-{
- int distpostsx; /* distanza dal veicolo che ci insegue a sinistra */
- int libero; /* variabile che indica se l'attuale posizione puntata dal veicolo e' libera */
- int inizio; /* variabile ausiliaria per capire se sono all'inizio della strada */
-
- /* inizializzazione delle variabili */
- distpostsx=0;
- libero=0;
-
- sem_wait(&strada);
- while (libero==0 && distpostsx<distsorp) /* il calcolo della distanza da un veicolo che ci insegue a sinistra termina quando viene trovato un veicolo o si raggiunge la lunghezza massima di visione del sensore */
- {
- inizio=pos_x-distpostsx; /* nel caso in cui il veicolo si giunto alla fine dell'autostrada si assume che il sensore ritorni un valore come nel caso in cui non sia insuguito da nessun veicolo */
- if (inizio<0)
- distpostsx=distsorp;
- else
- if (corsia2[inizio]!=0) /* se la strada e' occupata da un'altro veicolo pongo la variabile libero ad uno (strada occupata), altrimenti in caso contrario incremento la distanza analizzata dal sensore */
- libero=1;
- else
- distpostsx++;
- }
- sem_post(&strada);
-
- return(distpostsx); /* ritorna il valore della distanza misurata dal sensore , se non ha trovato nessun veicolo tale distanza e' pari alla massima lunghezza a cui puo' arrivare il sensore */
-}
-
-
-/* ----------------------------------------------------------------------------- */
-
-
-/** FUNZIONE CHE CALCOLA LA DISTANZA POSTERIORE DESTRA DI UN VEICOLO CHE INSEGUE **/
-
-int dist_postdx (int pos_x,int pos_y,int distrientro)
-{
- int distpostdx; /* distanza dal veicolo che ci insegue a destra */
- int libero; /* variabile che indica se l'attuale posizione puntata dal veicolo e' libera */
- int inizio; /* variabile ausiliaria per capire se sono all'inizio della strada */
-
- /* inizializzazione delle variabili */
- libero=0;
- distpostdx=0;
-
- sem_wait(&strada);
- while (libero==0 && distpostdx<distrientro) /* il calcolo della distanza da un veicolo che ci insegue a destra termina quando viene trovato un veicolo o si raggiunge la lunghezza massima di visione del sensore */
- {
- inizio=pos_x-distpostdx; /* nel caso in cui il veicolo si giunto alla fine dell'autostrada si assume che il sensore ritorni un valore come nel caso in cui non sia inseguito da nessun veicolo */
- if (inizio<0)
- distpostdx=distrientro;
- else
- if (corsia1[inizio]!=0) /* se la strada e' occupata da un'altro veicolo pongo la variabile libero ad uno (strada occupata), altrimenti in caso contrario incremento la distanza analizzata dal sensore */
- libero=1;
- else
- distpostdx++;
- }
- sem_post(&strada);
-
- return(distpostdx); /* ritorna il valore della distanza misurata dal sensore , se non ha trovato nessun veicolo tale distanza e' pari alla massima lunghezza a cui puo' arrivare il sensore */
-}
-
-
-/* ----------------------------------------------------------------------------- */
-
-
-/**************************** TASK AUTO LENTA ******************************/
-
-TASK auto_lenta(void *arg)
-{
- int x; /* posizione x assunta dal veicolo */
- int y; /* posizione y assunta dal veicolo */
- int oxelic; /* posizione vecchia dell'elicottero */
- int ox; /* posizione vecchia x dall'auto lenta */
- int oy; /* posizione vecchia y dall'auto lenta */
- int k; /* indice di ciclo */
- int estremo; /* distanza massima a cui ci possiamo spostare dall'elicottero (sia a destra che a sinistra) */
- int sorpasso; /* indica se il veicolo e' in fase di sorpasso */
- int rientro; /* indica se il veicolo e' in fase di rientro */
- int precedentedritto; /* distanza anteriore da un veicolo */
- int od; /* vecchia distanza anteriore da un veicolo */
- int tot; /* distanza massima raggiungibile del sensore posteriore sinistro */
- int tot3; /* distanza massima raggiungibile del sensore anteriore destro */
- int tot2; /* distanza massima raggiungibile del sensore posteriore destro */
- int i = (int)arg;
- int sensore_ant=200; /* distanza massima raggiungibile del sensore anteriore */
- char stri[22]; /* vettore di caratteri */
- char ostri[22]; /* vettore di caratteri */
- float vcrociera; /* velocita' desiderata */
- float vmax2=35.0; /* velocita' massima raggiungibile in seconda corsia */
- float vmax1=25.0; /* velocita' massima raggiungibile in prima corsia */
- float frenata=-7.0; /* valore massimo della frenata */
- float amax=10.0; /* valore massimo dell'accellerazione */
- float v; /* velocita' attuale */
- float a; /* accellerazione attuale */
- float ov; /* velocita' precedente */
- float oa; /* accellerazione precedente */
-
- /* inizializzazione delle variabili */
- v=5.0;
- a=0.0;
- x=LUNGLENTA;
- y=CENTROCORSIA1;
- sorpasso=0;
- rientro=0;
- tot=100;
- tot2=150;
- tot3=100;
- vcrociera=vmax1;
- oa=a;
- ov=v;
- od=0;
- oxelic=xelic;
- estremo=(int)((MAX_X/2)-1);
-
- while (1)
- {
- /* cancella il veicolo se era presente sull'autostrada vista dall'elicottero */
- if (abs(oxelic-ox)<estremo)
- draw_veicolo(ox-oxelic+estremo, oy, 0,LUNGLENTA,LARGLENTA);
-
- /* salva le vecchie coordinate */
- ox = x;
- oy = y;
-
- /* cancella il veicolo dalla vecchia posizione sulla corsia , andando a cancellarlo nel vettore della corsia in cui si trovava */
- sem_wait(&strada);
- for (k=0;k<LUNGLENTA;k++)
- {
- if ((oy<CENTROCORSIA1) && (oy>CENTROCORSIA2))
- {
- corsia1[ox-k]=0;
- corsia2[ox-k]=0;
- }
- else
- if (oy==CENTROCORSIA1)
- corsia1[ox-k]=0;
- else
- if (oy==CENTROCORSIA2)
- corsia2[ox-k]=0;
- }
- sem_post(&strada);
-
- /* cancella tutte le vecchie informazioni che compaiono sullo schermo */
- sprintf(stri,"posizione %d",(int)(ox*0.25));
- sem_wait(&mutex);
- grx_text(stri,70,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(ostri,"a %nf",oa);
- sem_wait(&mutex);
- grx_text(ostri,300,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(ostri,"v %nf",ov);
- sem_wait(&mutex);
- grx_text(ostri,200,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
- sem_post(&mutex);
-
- /* legge la distanza dal sensore anteriore e nel caso in cui sia attaccato alla macchina che precede vengo eliminato */
- precedentedritto=dist_ant(x,y,sensore_ant);
- if (precedentedritto==1)
- task_abort(i);
-
- /* disegna il veicolo nella nuova posizione */
- if (abs(xelic-x)<estremo)
- draw_veicolo(x-xelic+estremo, y, rgb16(255,0,0),LUNGLENTA,LARGLENTA);
-
- /* varia la massima distanza vista dal sensore posteriore sinistro a seconda della velocita' */
- tot=(int)(v*4);
- if (tot<50)
- tot=50;
-
- if (precedentedritto<100) /* ci siamo avvicinando troppo alla macchina che ci precede */
- if ((sorpasso==0) && (dist_postsx(x,y,200)>tot)&&(dist_ant_sx(x,y,50)>40))
- {
- /* c'e' uno davanti e non sopraggiunge nessuno sulla corsia di sorpasso */
- sorpasso=1;
- rientro=0;
- vcrociera=vmax2;
- }
- else
- a=frenata; /* c'e qualcuno davanti ,ma non possiamo sorpassare */
- else /* siamo lontani da un veicolo che ci precede o non ci precede nessuno */
- if (v<vcrociera) /* accelleriamo gradualmente fino a portarci alla velocita' di crociera desiderata */
- a=amax-(amax/vcrociera)*v;
- else
- if(v>vcrociera) /* freniamo per portarci al valore della velocita'di crociera */
- a=frenata/3;
- else
- a=0.0; /* siamo alla velocita' di crociera */
-
- /* controlla se e' possibile la manovra di rientro dal sorpasso, aggiustando tutti i parametri nel modo corretto */
- if ((dist_postdx(x,y,200)>tot2) && (dist_ant_dx(x,y,200)>tot3) && (sorpasso==1))
- {
- rientro=1;
- sorpasso=0;
- vcrociera=vmax1;
- }
-
- /* aggiusta la cordinata y per far visualizzare il sorpasso o il rientro della macchina in modo graduale */
- if(y>CENTROCORSIA2 && sorpasso==1)
- y=y-1;
-
- if(y<CENTROCORSIA1 && rientro==1)
- y=y+1;
-
- /* calcola la velocita' e nel caso di v elocita' negative la pone a zero (non sono permesse le retromarcie) */
- v=v+a*DT;
- if (v<0)
- v=0.0;
-
- /* calcola la cordinata x a cui si trova la macchina */
- x=x+(int)((v*DT)/0.25);
-
- /* scrive a video i nuovi parametri appena calcolati */
- sprintf(stri,"posizione %d",(int)(x*0.25));
- sem_wait(&mutex);
- grx_text(stri,70,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(ostri,"v %nf",v);
- sem_wait(&mutex);
- grx_text(ostri,200,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(ostri,"a %nf",a);
- sem_wait(&mutex);
- grx_text(ostri,300,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- /* quando il veicolo arriva alla fine dell'autostrada viene eliminato */
- if (x>=40000)
- task_abort(i);
-
- /* salva la nuova posizione del veicolo */
- sem_wait(&strada);
- for (k=0;k<LUNGLENTA;k++)
- {
- if ((y<CENTROCORSIA1) && (y>CENTROCORSIA2))
- {
- corsia2[x-k]=1;
- corsia1[x-k]=1;
- }
- else
- if (y==CENTROCORSIA1)
- corsia1[x-k]=1;
- else
- if (y==CENTROCORSIA2)
- corsia2[x-k]=1;
- }
- sem_post(&strada);
-
- /* salvo i parametri che occorrono per il prossimo ciclo */
- oxelic=xelic;
- od=precedentedritto;
- ov=v;
- oa=a;
-
- task_endcycle(); /* termina le operazioni che il task deve eseguire */
- }
-}
-
-
-/* ----------------------------------------------------------------------------- */
-
-
-/************************** TASK AUTO VELOCE *******************************/
-
-TASK auto_veloce(void *arg)
-{
- int x; /* posizione x assunta dal veicolo */
- int y; /* posizione y assunta dal veicolo */
- int oxelic; /* posizione vecchia dell'elicottero */
- int ox; /* posizione vecchia x dall'auto veloce */
- int oy; /* posizione vecchia y dall'auto veloce */
- int k; /* indice di ciclo */
- int estremo; /* distanza massima a cui ci possiamo spostare dall'elicottero (sia a destra che a sinistra) */
- int sorpasso; /* indica se il veicolo e' in fase di sorpasso */
- int rientro; /* indica se il veicolo e' in fase di rientro */
- int precedentedritto; /* distanza anteriore da un veicolo */
- int od; /* vecchia distanza anteriore da un veicolo */
- int tot; /* distanza massima raggiungibile del sensore posteriore sinistro */
- int tot3; /* distanza massima raggiungibile del sensore anteriore destro */
- int tot2; /* distanza massima raggiungibile del sensore posteriore destro */
- int i = (int)arg;
- int sensore_ant=200; /* distanza massima raggiungibile del sensore anteriore */
- char stri[22]; /* vettore di caratteri */
- char ostri[22]; /* vettore di caratteri */
- float vcrociera; /* velocita' desiderata */
- float vmax1=35.0; /* velocita' massima raggiungibile in prima corsia */
- float vmax2=40.0; /* velocita' massima raggiungibile in seconda corsia */
- float frenata=-7.0; /* valore massimo della frenata */
- float amax=15.0; /* valore massimo del'accellerazione */
- float v; /* velocita' attuale */
- float a; /* accellerazione attuale */
- float ov; /* velocita' precedente */
- float oa; /* accellerazione precedente */
-
- /* inizializzazione delle variabili */
- v=5.0;
- a=0.0;
- x=LUNGVELOCE;
- y=CENTROCORSIA1;
- sorpasso=0;
- rientro=0;
- tot=100;
- tot2=150;
- tot3=100;
- oa=a;
- vcrociera=vmax1;
- ov=v;
- od=0;
- oxelic=xelic;
- estremo=(int)((MAX_X/2)-1);
-
- while (1)
- {
- /* cancella il veicolo se era presente sull'autostrada vista dall'elicottero */
- if (abs(oxelic-ox)<estremo)
- draw_veicolo(ox-oxelic+estremo, oy, 0,LUNGVELOCE,LARGVELOCE);
-
- /* salva le vecchie coordinate */
- ox = x;
- oy = y;
-
- /* cancella il veicolo dalla vecchia posizione sulla corsia , andando a cancellarlo nel vettore della corsia in cui si trovava */
- sem_wait(&strada);
- for (k=0;k<LUNGVELOCE;k++)
- {
- if ((oy<CENTROCORSIA1) && (oy>CENTROCORSIA2))
- {
- corsia1[ox-k]=0;
- corsia2[ox-k]=0;
- }
- else
- if (oy==CENTROCORSIA1)
- corsia1[ox-k]=0;
- else
- if (oy==CENTROCORSIA2)
- corsia2[ox-k]=0;
- }
- sem_post(&strada);
-
- /* cancella tutte le vecchie informazioni che compaiono sullo schermo */
- sprintf(stri,"posizione %d",(int)(ox*0.25));
- sem_wait(&mutex);
- grx_text(stri,70,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(ostri,"v %nf",ov);
- sem_wait(&mutex);
- grx_text(ostri,200,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(ostri,"a %nf",oa);
- sem_wait(&mutex);
- grx_text(ostri,300,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
- sem_post(&mutex);
-
- /* legge la distanza dal sensore anteriore e nel caso in cui sia attaccato alla macchina che precede vengo eliminato */
- precedentedritto=dist_ant(x,y,sensore_ant);
- if (precedentedritto==1)
- task_abort(i);
-
- /* disegna il veicolo nella nuova posizione */
- if (abs(xelic-x)<estremo)
- draw_veicolo(x-xelic+estremo, y, rgb16(0,255,0),LUNGVELOCE,LARGVELOCE);
-
-
- /* varia la massima distanza vista dal sensore posteriore sinistro a seconda della velocita' */
- tot=(int)(v*4);
- if (tot<50)
- tot=50;
-
- if (precedentedritto<150) /* ci siamo avvicinando troppo alla macchina che ci precede */
- if ((sorpasso==0) && (dist_postsx(x,y,200)>tot)&&(dist_ant_sx(x,y,50)>40))
- {
- /* c'e' uno davanti e non sopraggiunge nessuno sulla corsia di sorpasso */
- sorpasso=1;
- rientro=0;
- vcrociera=vmax2;
- }
- else /* c'e qualcuno davanti ,ma non possiamo sorpassare */
- a=frenata;
- else /* siamo lontani da un veicolo che ci precede o non ci precede nessuno */
- if (v<vcrociera) /* accelleriamo gradualmente fino a portarci alla velocita' di crociera desiderata */
- a=amax-(amax/vcrociera)*v;
- else
- if(v>vcrociera) /* freniamo per portarci al valore della velocita'di crociera */
- a=frenata/3;
- else
- a=0.0; /* siamo alla velocita' di crociera */
-
- /* controlla se e' possibile la manovra di rientro dal sorpasso, aggiustando tutti i parametri nel modo corretto */
- if ((dist_postdx(x,y,200)>tot2) && (dist_ant_dx(x,y,200)>tot3) && (sorpasso==1))
- {
- rientro=1;
- sorpasso=0;
- vcrociera=vmax1;
- }
-
- /* aggiusta la cordinata y per far visualizzare il sorpasso o il rientro della macchina in modo graduale */
- if(y>CENTROCORSIA2 && sorpasso==1)
- y=y-1;
-
- if(y<CENTROCORSIA1 && rientro==1)
- y=y+1;
-
- /* calcola la velocita' e nel caso di v elocita' negative la pone a zero (non sono permesse le retromarcie) */
- v=v+a*DT;
- if (v<0)
- v=0.0;
-
- /* calcola la cordinata x a cui si trova la macchina */
- x=x+(int)((v*DT)/0.25);
-
- /* scrive a video i nuovi parametri appena calcolati */
- sprintf(stri,"posizione %d",(int)(x*0.25));
- sem_wait(&mutex);
- grx_text(stri,70,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(ostri,"v %nf",v);
- sem_wait(&mutex);
- grx_text(ostri,200,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(ostri,"a %nf",a);
- sem_wait(&mutex);
- grx_text(ostri,300,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- /* quando il veicolo arriva alla fine dell'autostrada viene eliminato */
- if (x>=40000)
- task_abort(i);
-
- /* salva la nuova posizione del veicolo */
- sem_wait(&strada);
- for (k=0;k<LUNGVELOCE;k++)
- {
- if ((y<CENTROCORSIA1) && (y>CENTROCORSIA2))
- {
- corsia2[x-k]=1;
- corsia1[x-k]=1;
- }
- else
- if (y==CENTROCORSIA1)
- corsia1[x-k]=1;
- else
- if (y==CENTROCORSIA2)
- corsia2[x-k]=1;
- }
- sem_post(&strada);
-
- /* salvo i parametri che occorrono per il prossimo ciclo */
- oxelic=xelic;
- od=precedentedritto;
- ov=v;
- oa=a;
-
- task_endcycle(); /* termina le operazioni che il task deve eseguire */
- }
-}
-
-
-/* ----------------------------------------------------------------------------- */
-
-
-/***************************** TASK AUTOCARRO ******************************/
-
-TASK auto_carro(void *arg)
-{
- int x; /* posizione x assunta dal veicolo */
- int y; /* posizione y assunta dal veicolo */
- int oxelic; /* posizione vecchia dell'elicottero */
- int ox; /* posizione vecchia x assunta dal camion */
- int oy; /* posizione vecchia y assunta dal camion */
- int k; /* indice di ciclo */
- int estremo; /* distanza massima a cui ci possiamo spostare dall'elicottero (sia a destra che a sinistra) */
- int sorpasso; /* indica se il veicolo e' in fase di sorpasso */
- int rientro; /* indica se il veicolo e' in fase di rientro */
- int precedentedritto; /* distanza anteriore da un veicolo */
- int od; /* vecchia distanza anteriore da un veicolo */
- int tot; /* distanza massima raggiungibile del sensore posteriore sinistro */
- int tot3; /* distanza massima raggiungibile del sensore anteriore destro */
- int tot2; /* distanza massima raggiungibile del sensore posteriore destro */
- int i = (int)arg;
- int sensore_ant=200; /* distanza massima raggiungibile del sensore anteriore */
- char stri[22]; /* vettore di caratteri */
- char ostri[22]; /* vettore di caratteri */
- float vcrociera; /* velocita' desiderata */
- float vmax1=15.0; /* velocita' massima raggiungibile in prima corsia */
- float vmax2=20.0; /* velocita' massima raggiungibile in seconda corsia */
- float frenata=-5.0; /* valore massimo della frenata */
- float amax=3.0; /* valore massimo del'accellerazione */
- float v; /* velocita' attuale */
- float a; /* accellerazione attuale */
- float ov; /* velocita' precedente */
- float oa; /* accellerazione precedente */
-
- /* inizializzazione delle variabili */
- v=5.0;
- a=0.0;
- x=LUNGCAMION;
- y=CENTROCORSIA1;
- sorpasso=0;
- rientro=0;
- tot=100;
- tot2=150;
- tot3=100;
- oa=a;
- vcrociera=vmax1;
- ov=v;
- od=0;
- oxelic=xelic;
- estremo=(int)((MAX_X/2)-1);
-
- while (1)
- {
- /* cancella il veicolo se era presente sull'autostrada vista dall'elicottero */
- if (abs(oxelic-ox)<estremo)
- draw_veicolo(ox-oxelic+estremo, oy, 0,LUNGCAMION,LARGCAMION);
-
- /* salva le vecchie coordinate */
- ox = x;
- oy = y;
-
- /* cancella il veicolo dalla vecchia posizione sulla corsia , andando a cancellarlo nel vettore della corsia in cui si trovava */
- sem_wait(&strada);
- for (k=0;k<LUNGCAMION;k++)
- {
- if ((oy<CENTROCORSIA1) && (oy>CENTROCORSIA2))
- {
- corsia1[ox-k]=0;
- corsia2[ox-k]=0;
- }
- else
- if (oy==CENTROCORSIA1)
- corsia1[ox-k]=0;
- else
- if (oy==CENTROCORSIA2)
- corsia2[ox-k]=0;
- }
- sem_post(&strada);
-
- /* cancella tutte le vecchie informazioni che compaiono sullo schermo */
- sprintf(stri,"posizione %d",(int)(ox*0.25));
- sem_wait(&mutex);
- grx_text(stri,70,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(ostri,"v %nf",ov);
- sem_wait(&mutex);
- grx_text(ostri,200,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(ostri,"a %nf",oa);
- sem_wait(&mutex);
- grx_text(ostri,300,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
- sem_post(&mutex);
-
- /* legge la distanza dal sensore anteriore e nel caso in cui sia attaccato alla macchina che precede vengo eliminato */
- precedentedritto=dist_ant(x,y,sensore_ant);
- if (precedentedritto==1)
- task_abort(i);
-
- /* disegna il veicolo nella nuova posizione */
- if (abs(xelic-x)<estremo)
- draw_veicolo(x-xelic+estremo, y, rgb16(0,0,255),LUNGCAMION,LARGCAMION);
-
- /* varia la massima distanza vista dal sensore posteriore sinistro a seconda della velocita' */
- tot=(int)(v*4);
- if (tot<50)
- tot=50;
-
- if (precedentedritto<100) /* ci siamo avvicinando troppo alla macchina che ci precede */
- if ((sorpasso==0) && (dist_postsx(x,y,200)>tot)&&(dist_ant_sx(x,y,50)>40))
- {
- /* c'e' uno davanti e non sopraggiunge nessuno sulla corsia di sorpasso */
- sorpasso=1;
- rientro=0;
- vcrociera=vmax2;
- }
- else /* c'e qualcuno davanti ,ma non possiamo sorpassare */
- a=frenata;
- else /* siamo lontani da un veicolo che ci precede o non ci precede nessuno */
- if (v<vcrociera) /* accelleriamo gradualmente fino a portarci alla velocita' di crociera desiderata */
- a=amax-(amax/vcrociera)*v;
- else
- if(v>vcrociera) /* freniamo per portarci al valore della velocita'di crociera */
- a=frenata/3;
- else
- a=0.0; /* siamo alla velocita' di crociera */
-
- /* controlla se e' possibile la manovra di rientro dal sorpasso, aggiustando tutti i parametri nel modo corretto */
- if ((dist_postdx(x,y,200)>tot2) && (dist_ant_dx(x,y,200)>tot3) && (sorpasso==1))
- {
- rientro=1;
- sorpasso=0;
- vcrociera=vmax1;
- }
-
- /* aggiusta la cordinata y per far visualizzare il sorpasso o il rientro della macchina in modo graduale */
- if(y>CENTROCORSIA2 && sorpasso==1)
- y=y-1;
-
- if(y<CENTROCORSIA1 && rientro==1)
- y=y+1;
-
- /* calcola la velocita' e nel caso di v elocita' negative la pone a zero (non sono permesse le retromarcie) */
- v=v+a*DT;
- if (v<0)
- v=0.0;
-
- /* calcola la cordinata x a cui si trova la macchina */
- x=x+(int)((v*DT)/0.25);
-
- /* scrive a video i nuovi parametri appena calcolati */
- sprintf(stri,"posizione %d",(int)(x*0.25));
- sem_wait(&mutex);
- grx_text(stri,70,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(ostri,"v %nf",v);
- sem_wait(&mutex);
- grx_text(ostri,200,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(ostri,"a %nf",a);
- sem_wait(&mutex);
- grx_text(ostri,300,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- /* quando il veicolo arriva alla fine dell'autostrada viene eliminato */
- if (x>=40000)
- task_abort(i);
-
- /* salva la nuova posizione del veicolo */
- sem_wait(&strada);
- for (k=0;k<LUNGCAMION;k++)
- {
- if ((y<CENTROCORSIA1) && (y>CENTROCORSIA2))
- {
- corsia2[x-k]=1;
- corsia1[x-k]=1;
- }
- else
- if (y==CENTROCORSIA1)
- corsia1[x-k]=1;
- else
- if (y==CENTROCORSIA2)
- corsia2[x-k]=1;
- }
- sem_post(&strada);
-
- /* salvo i parametri che occorrono per il prossimo ciclo */
- oxelic=xelic;
- od=precedentedritto;
- ov=v;
- oa=a;
-
- task_endcycle(); /* termina le operazioni che il task deve eseguire */
- }
-}
-
-
-/* ----------------------------------------------------------------------------- */
-
-
-/***************************** TASK ELICOTTERO *****************************/
-
-TASK eli_cottero(void *arg)
-{
- int i = (int)arg;
- int oxelic; /* vecchia posizione dell'elicottero */
- char stri[22]; /* vettore di caratteri */
- char ostri[22]; /* vettore di caratteri */
-
- /* disegna le scritte per l'indicatore a barra e finestra della posizione dell'elicottero */
- sprintf(stri,"0 Km");
- sem_wait(&mutex);
- grx_text(stri,100,560,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(stri,"10 Km");
- sem_wait(&mutex);
- grx_text(stri,700,560,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- while (1)
- {
- oxelic=xelic; /* salva la posizione precedente dell'elicottero */
-
- if (c == '+') /* sposta l'elicottero a destra (verso la fine dell'autostrada */
- {
- xelic=xelic+50;
- if (xelic>40000-(int)((MAX_X/2)-1))
- xelic=40000-(int)((MAX_X/2)-1);
- }
- else
- if (c =='-') /* sposta l'elicottero a sinistra (verso l'inizio dell'autostrada */
- {
- xelic=xelic-30;
- if (xelic<(int)((MAX_X/2)-1))
- xelic=(int)((MAX_X/2)-1);
- }
-
- /* disegna le scritte innerenti all'elicottero e il valore della sua posizione (mediante scritta ed indicatore a barra con una finestra scorrevole) */
- sprintf(stri,"- <- xelic %d -> +",(int)(xelic*0.25));
- sprintf(ostri,"- <- xelic %d -> +",(int)(oxelic*0.25));
-
- sem_wait(&mutex);
- grx_text(ostri,MAX_X/2-50,500,rgb16(0,0,0),rgb16(0,0,0));
- grx_text(stri,MAX_X/2-50,500,rgb16(255,255,255),rgb16(0,0,0));
- grx_line(150,560,650,560,rgb16(255,255,255));
- grx_rect((int)((oxelic-(MAX_X/2))/80+150),540,(int)((oxelic+(MAX_X/2))/80+150) ,580 ,rgb16(0,0,0));
- grx_rect((int)((xelic-(MAX_X/2))/80+150),540,(int)((xelic+(MAX_X/2))/80+150) ,580 ,rgb16(255,255,255));
- sem_post(&mutex);
-
- c=' '; /* setta il carattere c */
-
- task_endcycle(); /* termina le operazioni che il task deve eseguire */
- }
-}
-
-
-/* -----------------------------------------------------------------------------*/
-
-
-/************* FUNZIONE DI USCITA DAL SISTEMA ******************************/
-
-void byebye(void *arg)
-{ /* questa funzione e' chiamata quando il sistema esce */
- grx_close(); /* chiude la grafica */
- kern_printf("Ciao Ciao "); /* scrive il messaggio indicato sul terminale */
-}
-
-
-/* -----------------------------------------------------------------------------*/
-
-
-/********************************* MAIN ************************************/
-
-int main(int argc, char **argv)
-{
- int n_task = 0; /* numero di task creati */
- int u;
- int v;
- char introduzione[100]; /* vettore di caratteri */
- HARD_TASK_MODEL autolenta; /* task auto lenta */
- HARD_TASK_MODEL autoveloce; /* task auto veloce */
- HARD_TASK_MODEL autocarro; /* task camion */
- HARD_TASK_MODEL elicottero; /* task elicottero */
-
-
- /* inizializza le corsie dell'autostrada */
- sem_wait(&strada);
- for (u=0;u<=40000;u++)
- {
- corsia1[u]=0;
- corsia2[u]=0;
- }
- sem_post(&strada);
-
- /* Set the exception handler */
- //set_exchandler_grx();
-
- /* Set the closing function */
- sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
-
- /* inizializzazione grafica */
- if (grx_init() < 1)
- sys_abort(1);
-
- /* scelta automatica della risoluzione applicabile con quella scheda video (scegliendola tra 800*600 e 1024*768 ) */
- if(grx_getmode(1024,768,16)==-1)
- {
- if (grx_open(800, 600, 16) < 0)
- {
- kern_printf("GRX Err\n");
- sys_abort(1);
- }
- MAX_X=800;
- MAX_Y=600;
- }
- else
- {
- if (grx_open(1024,768, 16) < 0)
- {
- kern_printf("GRX Err\n");
- sys_abort(1);
- }
- MAX_X=1024;
- MAX_Y=768;
- }
-
- kern_printf("La scheda video va'!!\n");
-
- /* posizione iniziale elicottero */
- xelic=(int)((MAX_X/2)-1);
-
- /* disegna lo scenario della strada ed il menu */
- sprintf(introduzione,"Monitoraggio dei mezzi che transitano su una autostrada.");
- sem_wait(&mutex);
- grx_text(introduzione,50,10,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(introduzione,"Sviluppato da: Verzellesi Quadrubbi");
- sem_wait(&mutex);
- grx_text(introduzione,50,20,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(introduzione,"MENU");
- sem_wait(&mutex);
- grx_text(introduzione,480,70,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(introduzione,"s = macchina sportiva");
- sem_wait(&mutex);
- grx_text(introduzione,480,80,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(introduzione,"c = mezzo pesante");
- sem_wait(&mutex);
- grx_text(introduzione,480,90,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(introduzione,"l = macchina lenta");
- sem_wait(&mutex);
- grx_text(introduzione,480,100,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(introduzione,"+ = sposta l'elicottero verso destra");
- sem_wait(&mutex);
- grx_text(introduzione,480,110,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(introduzione,"- = sposta l'elicottero verso sinistra");
- sem_wait(&mutex);
- grx_text(introduzione,480,120,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(introduzione,"esc = uscita");
- sem_wait(&mutex);
- grx_text(introduzione,480,130,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(introduzione,"NOTA");
- sem_wait(&mutex);
- grx_text(introduzione,480,140,rgb16(255,0,0),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(introduzione,"Se i veicoli tamponano ");
- sem_wait(&mutex);
- grx_text(introduzione,480,150,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- sprintf(introduzione," vengono eliminati");
- sem_wait(&mutex);
- grx_text(introduzione,480,160,rgb16(255,255,255),rgb16(0,0,0));
- sem_post(&mutex);
-
- grx_line(1,450,MAX_X,450,rgb16(255,255,255));
- grx_line(1,486,MAX_X,486,rgb16(255,255,255));
-
- for (u=0;u<MAX_X;u++)
- {
- v=u%8;
- if ((v==0) || (v==1))
- {
- sem_wait(&mutex);
- grx_plot(u,CENTROCARREGGIATA,rgb16(255,255,255));
- sem_post(&mutex);
- }
- }
-
- n_task=0; /* inizializzazione del numero dei task */
-
- /* definisce e crea il task elicottero */
- kern_printf("elicottero");
- hard_task_default_model (elicottero);
- hard_task_def_ctrl_jet (elicottero);
- hard_task_def_arg (elicottero, (void *)n_task);
- hard_task_def_wcet (elicottero,wcet);
- hard_task_def_mit (elicottero, periodo);
- hard_task_def_group (elicottero, GRUPPO);
- hard_task_def_usemath (elicottero);
- pid = task_create ("elicottero",eli_cottero, &elicottero, NULL);
- if (pid == NIL)
- {
- grx_close();
- perror("Non si puo' creare il task");
- sys_abort(1);
- }
- task_activate(pid);
-
- n_task=1; /* incremente il numero dei task (ha creato l'elicottero */
-
- /*Attesa di un carattere per creare un veicolo */
- c = keyb_getch(BLOCK);
- do {
- if (((c == 'c')||(c=='s')||(c=='l')) && (n_task < MAX_V)) /* in base al tasto premuto crea il task opportuno */
- {
- if (c == 'l') /* definisce e crea il task autolenta */
- {
- kern_printf("lenta");
- hard_task_default_model (autolenta);
- hard_task_def_ctrl_jet (autolenta);
- hard_task_def_arg (autolenta, (void *)n_task);
- hard_task_def_wcet (autolenta, wcet);
- hard_task_def_mit (autolenta, periodo);
- hard_task_def_group (autolenta, GRUPPO);
- hard_task_def_usemath (autolenta);
- pid = task_create ("autolenta",auto_lenta, &autolenta, NULL);
- }
- else
- if (c == 's') /* definisce e crea il task autoveloce */
- {
- hard_task_default_model (autoveloce);
- hard_task_def_ctrl_jet (autoveloce);
- hard_task_def_arg (autoveloce, (void *)n_task);
- hard_task_def_wcet (autoveloce, wcet);
- hard_task_def_mit (autoveloce, periodo);
- hard_task_def_group (autoveloce, GRUPPO);
- hard_task_def_usemath (autoveloce);
- pid = task_create ("autoveloce",auto_veloce, &autoveloce, NULL);
- }
- else
- if (c == 'c') /* definisce e crea il task autocarro */
- {
- hard_task_default_model (autocarro);
- hard_task_def_ctrl_jet (autocarro);
- hard_task_def_arg (autocarro, (void *)n_task);
- hard_task_def_wcet (autocarro, wcet);
- hard_task_def_mit (autocarro, periodo);
- hard_task_def_group (autocarro, GRUPPO);
- hard_task_def_usemath (autocarro);
- pid = task_create ("camion",auto_carro, &autocarro, NULL);
- }
-
- if (pid == NIL) /* nel caso in non si possano creare dei task chiude la grafica e con un messaggio segnala l'errore */
- {
- grx_close();
- perror("Non si puo' creare il task");
- sys_abort(1);
- }
-
- task_activate(pid); /* attiva i task */
- n_task++; /* incrementa il numero dei task creati */
- }
-
- c = keyb_getch(BLOCK);
-
- } while (c != ESC); /* termino il tutto solo quando e' stato premuto il tasto esc */
-
- sys_end(); /* esco dal sistema */
-
- return 0;
-}
Index: rel_1_2/autostr/initfile.c
===================================================================
--- rel_1_2/autostr/initfile.c (revision 1198)
+++ rel_1_2/autostr/initfile.c (nonexistent)
@@ -1,120 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: initfile.c,v 1.1 2003-06-04 09:41:15 giacomo Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2003-06-04 09:41:15 $
- ------------
-
- System initialization file
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- NRT_TASK_MODEL at level 2
-
- This file is similar to the configuration of kernel/init/hartik3.c
-
- TICK is set to 0 (one-shot timer is used)
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/svgademo/readme.txt
===================================================================
--- rel_1_2/svgademo/readme.txt (revision 1198)
+++ rel_1_2/svgademo/readme.txt (nonexistent)
@@ -1,34 +0,0 @@
---------------------------------------
-SVGA Demo
-
-by
-
-Giacomo Guidi <giacomo@gandalf.sssup.it>
-
-Last update 17/03/2003
---------------------------------------
-
-This is a simple test demo for the new graphic
-drivers ported from SVGAlib 1.9.17
-
-See drivers/svga/readme for supported cards
-
---------------------------------------
-
-The demo is composed by:
-
-MAKEFILE The makefile used to compile the application
-README.TXT This file
-INITFILE.C The init file
-SVGADEMO.C The SVGA Demo
-
---------------------------------------
-
-- To specify your card change the line
-
-#define CARD <driver name>
-
-- The demo calls the grx functions modified for the new
-drivers. The resolution must be 16 bitsperpixel (64K colors)
-and the graphic access mode must be linear.
-
Index: rel_1_2/svgademo/makefile
===================================================================
--- rel_1_2/svgademo/makefile (revision 1198)
+++ rel_1_2/svgademo/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS = svgademo
-
-include $(BASE)/config/example.mk
-
-svgademo:
- make -f $(SUBMAKE) APP=svgademo INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __SVGA__"
-
Index: rel_1_2/svgademo/initfile.c
===================================================================
--- rel_1_2/svgademo/initfile.c (revision 1198)
+++ rel_1_2/svgademo/initfile.c (nonexistent)
@@ -1,119 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: initfile.c,v 1.2 2003-04-28 11:51:11 giacomo Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-04-28 11:51:11 $
- ------------
-
- System initialization file
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- NRT_TASK_MODEL at level 2
-
- This file is similar to the configuration of kernel/init/hartik3.c
-
- TICK is set to 0 (one-shot timer is used)
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/svgademo/svgademo.c
===================================================================
--- rel_1_2/svgademo/svgademo.c (revision 1198)
+++ rel_1_2/svgademo/svgademo.c (nonexistent)
@@ -1,196 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Giacomo Guidi <giacomo@gandalf.sssup.it>
- *
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-#include <drivers/vga.h>
-#include <drivers/keyb.h>
-
-#include <math.h>
-#include <stdlib.h>
-
-#include <kernel/log.h>
-#include <kernel/kern.h>
-
-#define WIDTH 800
-#define HEIGHT 600
-#define BYTES_PP 2
-#define INITSTR G800x600x64K //SVGAlib standard mode definitions
-#define CARD VESA //Video driver
-
-unsigned char *rgb_565_buf = NULL; //RGB 16 bpp Buffer
-unsigned char *video_buf = NULL; //Video Buffer
-unsigned long int VMEMLONG = WIDTH * HEIGHT * BYTES_PP / 4; // Used by copy_videomem_16to16
-unsigned long int RGB565MEM = WIDTH * HEIGHT * BYTES_PP; // Total video mem
-
-unsigned long int PERIOD_REFRESH = 100000;
-unsigned long int PERIOD_DISEGNA = 100000;
-
-unsigned long int WCET_REFRESH, WCET_DISEGNA;
-
-TASK refesh(void);
-TASK disegna(void);
-
-PID refresh_PID, disegna_PID;
-
-static int screen(int mode)
-{
-
- vga_modeinfo *minf;
-
- vga_setmode(mode,CARD);
- minf = vga_getmodeinfo(mode);
- if(! (minf->flags & CAPABLE_LINEAR)){
- vga_setmode(TEXT,CARD);
- printk(KERN_INFO "The mode %d is not capable of linear\n",mode);
- return 1;
- }
- vga_setpage(0);
- if(vga_setlinearaddressing() == -1) {
- vga_setmode(TEXT,CARD);
- printk(KERN_INFO "Could not set linear addressing for mode %d\n",mode);
- return 1;
- }
-
- video_buf = vga_getgraphmem();
- rgb_565_buf = malloc(RGB565MEM);
-
- grx_setbuffer(rgb_565_buf, WIDTH, HEIGHT); //Init of RGBA version of grx functions
- //created to work with Mesa buffer
- return 0;
-
-}
-
-void program_end(void *arg)
-{
-
- free(rgb_565_buf);
-
- vga_setmode(TEXT,CARD);
-
- sys_end();
-
-}
-
-void program_key_end(KEY_EVT *k)
-{
-
- sys_end();
-
-}
-
-TASK refresh(void)
-{
-
- while(1) {
-
- copy_videomem_16to16(rgb_565_buf, video_buf, VMEMLONG);
- task_endcycle();
-
- }
-
- sys_end();
-
-}
-
-
-TASK disegna(void)
-{
-
- char text[100];
- TIME disegna_TIME, refresh_TIME;
-
- while(1) {
-
- jet_gettable(refresh_PID, &refresh_TIME, 1);
- jet_gettable(disegna_PID, &disegna_TIME, 1);
-
- sprintf(text,"Hard Task Refresh PER:%6d us EX:%6d us",(int)PERIOD_REFRESH,(int)refresh_TIME);
- grx_text(text,10,5,rgb16(0,0,255),0);
- sprintf(text,"Hard Task Draw PER:%6d us EX:%6d us",(int)PERIOD_DISEGNA,(int)disegna_TIME);
- grx_text(text,10,15,rgb16(0,0,255),0);
-
- grx_text("SVGADEMO", 10,25,rgb16(255,0,0), 0);
- grx_line(50,50,100,100,rgb16(0,255,0));
- grx_box(110,50,160,100,rgb16(0,0,255));
- grx_rect(170,50,220,100,rgb16(0,255,255));
-
- task_endcycle();
-
- }
-
- sys_end();
-
-}
-
-int main (int argc, char *argv[])
-{
-
- HARD_TASK_MODEL ht_refresh, ht_disegna;
-
- sys_atrunlevel(program_end,NULL, RUNLEVEL_BEFORE_EXIT);
-
- clear();
-
- WCET_REFRESH =((long int) PERIOD_REFRESH * (0.45));
- WCET_DISEGNA =((long int) PERIOD_DISEGNA * (0.45));
-
- hard_task_default_model(ht_refresh);
- hard_task_def_wcet(ht_refresh,WCET_REFRESH);
- hard_task_def_mit(ht_refresh,PERIOD_REFRESH);
- hard_task_def_usemath(ht_refresh);
- hard_task_def_group(ht_refresh,1);
- hard_task_def_ctrl_jet(ht_refresh);
-
- refresh_PID = task_create("refresh", refresh, &ht_refresh, NULL);
- if (refresh_PID == -1) {
- sys_end();
- exit(4);
- }
-
- hard_task_default_model(ht_disegna);
- hard_task_def_mit(ht_disegna,PERIOD_DISEGNA);
- hard_task_def_wcet(ht_disegna,WCET_DISEGNA);
- hard_task_def_group(ht_disegna,1);
- hard_task_def_ctrl_jet(ht_disegna);
- hard_task_def_usemath(ht_disegna);
-
- disegna_PID = task_create("disegna", disegna, &ht_disegna, NULL);
- if (disegna_PID == -1) {
- sys_end();
- exit(4);
- }
-
- {
- KEY_EVT k;
- k.flag = ALTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,program_key_end);
- }
-
- if (screen(INITSTR)) {
- printk(KERN_INFO "Graphical initialization failed !!\n");
- sys_end();
- }
-
- memset(rgb_565_buf, 0, RGB565MEM);
-
- group_activate(1);
-
- return 0;
-
-}
Index: rel_1_2/mesatex/readme.txt
===================================================================
--- rel_1_2/mesatex/readme.txt (revision 1198)
+++ rel_1_2/mesatex/readme.txt (nonexistent)
@@ -1,44 +0,0 @@
---------------------------------------
-MESA Demo (tex)
-
-by
-
-Giacomo Guidi <giacomo@gandalf.sssup.it>
-
-Last update 17/03/2003
---------------------------------------
-
-This is a simple test demo for the MESA (5.0)
-libraries, the low level graphic drivers is
-the SVGA (from the SVGAlib)
-
-See drivers/svga/readme for supported cards
-
---------------------------------------
-
-The demo is composed by:
-
-MAKEFILE The makefile used to compile the application
-README.TXT This file
-INITFILE.C The init file
-MESATEX.C The MESA Demo
-
---------------------------------------
-
-- To specify your card change the line
-
-#define CARD <driver name>
-
-- The demo calls the grx and off-screen Mesa functions.
-The resolution must be 16 bitsperpixel (64K colors) and
-the graphic access mode must be linear.
-
-- There are two buffers
-
- The video buffer (video_buf)
- The virtual buffer (rgb_565_buf)
-
- copy_videomem_16to16 links these buffers
-
-
-
Index: rel_1_2/mesatex/makefile
===================================================================
--- rel_1_2/mesatex/makefile (revision 1198)
+++ rel_1_2/mesatex/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS = mesatex
-
-include $(BASE)/config/example.mk
-
-mesatex:
- make -f $(SUBMAKE) APP=mesatex INIT= OTHEROBJS="initfile.o" SHARKOPT="__OSMESA__ __OLDCHAR__ __SVGA__"
-
Index: rel_1_2/mesatex/initfile.c
===================================================================
--- rel_1_2/mesatex/initfile.c (revision 1198)
+++ rel_1_2/mesatex/initfile.c (nonexistent)
@@ -1,119 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: initfile.c,v 1.2 2003-04-28 11:14:08 giacomo Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-04-28 11:14:08 $
- ------------
-
- System initialization file
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- NRT_TASK_MODEL at level 2
-
- This file is similar to the configuration of kernel/init/hartik3.c
-
- TICK is set to 0 (one-shot timer is used)
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/mesatex/mesatex.c
===================================================================
--- rel_1_2/mesatex/mesatex.c (revision 1198)
+++ rel_1_2/mesatex/mesatex.c (nonexistent)
@@ -1,407 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Giacomo Guidi <giacomo@gandalf.sssup.it>
- *
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-#include <drivers/vga.h>
-#include <drivers/keyb.h>
-
-#include <GL/osmesa.h>
-#include <GL/glut.h>
-
-#include <math.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <kernel/log.h>
-#include <kernel/kern.h>
-
-#ifndef M_PI
-#define M_PI 3.14159265
-#endif
-
-#define WIDTH 640
-#define HEIGHT 480
-#define BYTES_PP 2 //BytesPerPixel
-#define INITSTR G640x480x64K //SVGAlib standard mode definitions
-#define CARD VESA //Video driver
-
-OSMesaContext ctx;
-
-static GLuint TexObj[2];
-static GLfloat Angle = 0.0f;
-static GLboolean UseObj = GL_FALSE;
-
-#if defined(GL_VERSION_1_1) || defined(GL_VERSION_1_2)
-# define TEXTURE_OBJECT 1
-#elif defined(GL_EXT_texture_object)
-# define TEXTURE_OBJECT 1
-# define glBindTexture(A,B) glBindTextureEXT(A,B)
-# define glGenTextures(A,B) glGenTexturesEXT(A,B)
-# define glDeleteTextures(A,B) glDeleteTexturesEXT(A,B)
-#endif
-
-unsigned char *rgb_565_buf = NULL; //RGB 16 bpp Buffer
-unsigned char *video_buf = NULL; //Video Buffer
-
-unsigned long int VMEMLONG = WIDTH * HEIGHT * BYTES_PP / 4; // Used by copy_videomem_16to16
-unsigned long int RGB565MEM = WIDTH * HEIGHT * BYTES_PP; // Total video mem
-
-unsigned long int PERIOD_REFRESH = 60000;
-unsigned long int PERIOD_DISEGNA = 60000;
-
-unsigned long int WCET_REFRESH, WCET_DISEGNA;
-
-TASK refesh(void);
-TASK disegna(void);
-
-PID refresh_PID, disegna_PID;
-
-static void draw( void )
-{
- glDepthFunc(GL_EQUAL);
- /* glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );*/
- glClear( GL_COLOR_BUFFER_BIT );
-
- glColor3f( 1.0, 1.0, 1.0 );
-
- /* draw first polygon */
- glPushMatrix();
- glTranslatef( -1.0, 0.0, 0.0 );
- glRotatef( Angle, 0.0, 0.0, 1.0 );
- if (UseObj) {
-#ifdef TEXTURE_OBJECT
- glBindTexture( GL_TEXTURE_2D, TexObj[0] );
-#endif
- }
- else {
- glCallList( TexObj[0] );
- }
- glBegin( GL_POLYGON );
- glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 );
- glTexCoord2f( 1.0, 0.0 ); glVertex2f( 1.0, -1.0 );
- glTexCoord2f( 1.0, 1.0 ); glVertex2f( 1.0, 1.0 );
- glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1.0, 1.0 );
- glEnd();
- glPopMatrix();
-
- /* draw second polygon */
- glPushMatrix();
- glTranslatef( 1.0, 0.0, 0.0 );
- glRotatef( Angle-90.0, 0.0, 1.0, 0.0 );
- if (UseObj) {
-#ifdef TEXTURE_OBJECT
- glBindTexture( GL_TEXTURE_2D, TexObj[1] );
-#endif
- }
- else {
- glCallList( TexObj[1] );
- }
- glBegin( GL_POLYGON );
- glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 );
- glTexCoord2f( 1.0, 0.0 ); glVertex2f( 1.0, -1.0 );
- glTexCoord2f( 1.0, 1.0 ); glVertex2f( 1.0, 1.0 );
- glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1.0, 1.0 );
- glEnd();
- glPopMatrix();
-
-}
-
-
-static void gl_init()
-{
-
- static GLfloat h = (GLfloat) HEIGHT / (GLfloat) WIDTH;
- static int twidth=8, theight=8;
- static GLubyte tex1[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 1, 1, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 1, 1, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0 };
-
- static GLubyte tex2[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2, 2, 0, 0, 0,
- 0, 0, 2, 0, 0, 2, 0, 0,
- 0, 0, 0, 0, 0, 2, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0,
- 0, 0, 0, 2, 0, 0, 0, 0,
- 0, 0, 2, 2, 2, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0 };
-
- GLubyte tex[64][3];
- GLint i, j;
-
- //Create the OSMesa Context
- ctx = OSMesaCreateContext(OSMESA_RGB_565, NULL);
-
- //Make Current Context
- OSMesaMakeCurrent(ctx, rgb_565_buf, GL_UNSIGNED_SHORT_5_6_5, WIDTH, HEIGHT);
-
- UseObj = GL_TRUE;
-
- glDisable( GL_DITHER );
-
- /* Setup texturing */
- glEnable( GL_TEXTURE_2D );
- glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
- glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );
-
- /* generate texture object IDs */
- if (UseObj) {
-#ifdef TEXTURE_OBJECT
- glGenTextures( 2, TexObj );
-#endif
- }
- else {
- TexObj[0] = glGenLists(2);
- TexObj[1] = TexObj[0]+1;
- }
-
- /* setup first texture object */
- if (UseObj) {
-#ifdef TEXTURE_OBJECT
- glBindTexture( GL_TEXTURE_2D, TexObj[0] );
- assert(glIsTexture(TexObj[0]));
-#endif
- }
- else {
- glNewList( TexObj[0], GL_COMPILE );
- }
- /* red on white */
- for (i=0;i<theight;i++) {
- for (j=0;j<twidth;j++) {
- int p = i*twidth+j;
- if (tex1[(theight-i-1)*twidth+j]) {
- tex[p][0] = 255; tex[p][1] = 0; tex[p][2] = 0;
- }
- else {
- tex[p][0] = 255; tex[p][1] = 255; tex[p][2] = 255;
- }
- }
- }
-
- glTexImage2D( GL_TEXTURE_2D, 0, 3, twidth, theight, 0,
- GL_RGB, GL_UNSIGNED_BYTE, tex );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
- if (!UseObj) {
- glEndList();
- }
- /* end of texture object */
-
- /* setup second texture object */
- if (UseObj) {
-#ifdef TEXTURE_OBJECT
- glBindTexture( GL_TEXTURE_2D, TexObj[1] );
- assert(glIsTexture(TexObj[1]));
-#endif
- assert(!glIsTexture(TexObj[1] + 999));
- }
- else {
- glNewList( TexObj[1], GL_COMPILE );
- }
- /* green on blue */
- for (i=0;i<theight;i++) {
- for (j=0;j<twidth;j++) {
- int p = i*twidth+j;
- if (tex2[(theight-i-1)*twidth+j]) {
- tex[p][0] = 0; tex[p][1] = 255; tex[p][2] = 0;
- }
- else {
- tex[p][0] = 0; tex[p][1] = 0; tex[p][2] = 255;
- }
- }
- }
- glTexImage2D( GL_TEXTURE_2D, 0, 3, twidth, theight, 0,
- GL_RGB, GL_UNSIGNED_BYTE, tex );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
- if (!UseObj) {
- glEndList();
- }
- /* end texture object */
-
- glViewport(0, 0, (GLint)WIDTH, (GLint)HEIGHT);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- /* glOrtho( -3.0, 3.0, -3.0, 3.0, -10.0, 10.0 );*/
- glFrustum( -2.0, 2.0, 2.0, -2.0, 6.0, 20.0 );
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glTranslatef( 0.0, 0.0, -8.0 );
-
-}
-
-static int screen(int mode)
-{
-
- vga_modeinfo *minf;
-
- vga_setmode(mode,CARD);
- minf = vga_getmodeinfo(mode);
- if(! (minf->flags & CAPABLE_LINEAR)){
- vga_setmode(TEXT,CARD);
- printk(KERN_INFO "The mode %d is not capable of linear\n",mode);
- return 1;
- }
- vga_setpage(0);
- if(vga_setlinearaddressing() == -1) {
- vga_setmode(TEXT,CARD);
- printk(KERN_INFO "Could not set linear addressing for mode %d\n",mode);
- return 1;
- }
-
- video_buf = vga_getgraphmem();
-
- grx_setbuffer(rgb_565_buf, WIDTH, HEIGHT); //Init of RGB16 version of grx functions
- //created to work with Mesa buffer
- return 0;
-
-}
-
-void program_end(void *arg)
-{
-
- OSMesaDestroyContext(ctx);
- free(rgb_565_buf);
-
- vga_setmode(TEXT,CARD);
-
- sys_end();
-
-}
-
-void program_key_end(KEY_EVT *k)
-{
-
- sys_end();
-
-}
-
-TASK refresh(void)
-{
-
- while(1) {
-
- copy_videomem_16to16(rgb_565_buf, video_buf, VMEMLONG);
- task_endcycle();
-
- }
-
- sys_end();
-
-}
-
-
-TASK disegna(void)
-{
-
- char text[100];
- TIME disegna_TIME, refresh_TIME;
-
- while(1) {
-
- jet_gettable(refresh_PID, &refresh_TIME, 1);
- jet_gettable(disegna_PID, &disegna_TIME, 1);
-
- Angle += 2.0;
-
- draw();
-
- sprintf(text,"Hard Task Refresh PER:%6d us EX:%6d us",(int)PERIOD_REFRESH,(int)refresh_TIME);
- grx_text(text,10,5,rgb16(0,0,255),0);
- sprintf(text,"Hard Task Draw PER:%6d us EX:%6d us",(int)PERIOD_DISEGNA,(int)disegna_TIME);
- grx_text(text,10,15,rgb16(0,0,255),0);
-
- task_endcycle();
-
- }
-
- sys_end();
-
-}
-
-int main (int argc, char *argv[])
-{
-
- HARD_TASK_MODEL ht_refresh, ht_disegna;
-
- sys_atrunlevel(program_end,NULL, RUNLEVEL_BEFORE_EXIT);
-
- clear();
-
- WCET_REFRESH =((long int) PERIOD_REFRESH * (0.45));
- WCET_DISEGNA =((long int) PERIOD_DISEGNA * (0.45));
-
- hard_task_default_model(ht_refresh);
- hard_task_def_wcet(ht_refresh,WCET_REFRESH);
- hard_task_def_mit(ht_refresh,PERIOD_REFRESH);
- hard_task_def_usemath(ht_refresh);
- hard_task_def_group(ht_refresh,1);
- hard_task_def_ctrl_jet(ht_refresh);
-
- refresh_PID = task_create("refresh", refresh, &ht_refresh, NULL);
- if (refresh_PID == -1) {
- sys_end();
- exit(4);
- }
-
- hard_task_default_model(ht_disegna);
- hard_task_def_mit(ht_disegna,PERIOD_DISEGNA);
- hard_task_def_wcet(ht_disegna,WCET_DISEGNA);
- hard_task_def_group(ht_disegna,1);
- hard_task_def_ctrl_jet(ht_disegna);
- hard_task_def_usemath(ht_disegna);
- hard_task_def_stack(ht_disegna,30000);
-
- disegna_PID = task_create("disegna", disegna, &ht_disegna, NULL);
- if (disegna_PID == -1) {
- sys_end();
- exit(4);
- }
-
- {
- KEY_EVT k;
- k.flag = ALTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,program_key_end);
- }
-
- rgb_565_buf = malloc(RGB565MEM);
-
- gl_init();
-
- if (screen(INITSTR)) {
- printk(KERN_INFO "Graphical initialization failed !!\n");
- sys_end();
- }
-
- memset(rgb_565_buf, 0, RGB565MEM);
-
- group_activate(1);
-
- return 0;
-
-}
Index: rel_1_2/jumpball/readme.txt
===================================================================
--- rel_1_2/jumpball/readme.txt (revision 1198)
+++ rel_1_2/jumpball/readme.txt (nonexistent)
@@ -1,75 +0,0 @@
-----------------------------------
-Jumping Balls demo
-
-by
-
-Paolo Gai 1999-2001 - pj@sssup.it
-
-----------------------------------
-
-This demo was created to show some S.Ha.R.K. functionalities in the course
-of Informatica Industriale , University of Pavia, Italy.
-
-The demo is composed by an application (derived by the template application
-distributed on the web site) and two init files.
-
-The demo is composed by:
-
-MAKEFILE The makefile used to compile the application;
- demo is the rule to compile the application with a CBS scheduler
- demo2 is the rule to compile the application with a RR scheduler
-README.TXT This file
-DEMO.H Some constants used into the demo
-INITFIL1.C The CBS initfile
-INITFIL2.C The EDF initfile
-INITFILE.C A makefile that cover either EDF+CBS and RR
-BALL.C The Jumping balls part of the demo
-DEMO.C The main() function and some other utility function
-JETCTRL.C The JET part of the demo
-
-
-The demo works as follows:
-- It works at 640x480 16 bit colors
-- on the left, there is the jumping ball arena, on the rigth there is the
- statistics about the tasks into the system.
-
-- the tasks are guaranteed using CBS and EDF. The wcet and mean execution
- time on my portable after a few minutes are (us):
-
- JetCtrl 7400 max 7500 CBS met
- JetDummy 135 max 200 CBS met
- JetSlide 2100 max 2100 CBS met
- Balls 276 max 380 EDF wcet for hard ball,100 CBS met for soft ones
-
- The system should go overloaded with 40 soft balls.
-
-- The idea is the following:
- - first, an edf guaranteed ball is created.
- - then, create a set of soft ball using space. since their met is < than the
- real met, they posticipate the deadlines.
- - if they are killed, they remain for some seconds in the zombie state
- - if a set of soft ball arde created (i.e., 10), and after a while all the
- others are created, the bandwidth is fully used, and the task posticipate
- their deadlines. the first set of tasks stops jumping when the bandwidth
- is full utilized by the newest balls until all the tasks have similar
- deadlines.
- - Note on the left the slides that represents the relative ratio
- between the tasks.
- - Note that in overload conditions the EDF task is still guaranteed
- - Note that PI is used with EDF, also if no theory says that it is good:
- - S.Ha.R.K. allows that, it is the user that have to choose if that is
- a non-sense
- - PI is independent from the implemnentation of the scheduling modules
- - if the second init file is used, RR is used instead of EDF+CBS.
- - In overload condition RR perform differently from EDF+CBS, giving to
- each task an equal fraction of bandwidth
-
- - note also:
- - the redefinition of the standard exception handler
- - the redefinition of the keys and the initialization of the keyboard
- - the myend exit function
- - the main() that terminates
- - the two parts (ball and jet) can be excluded using a #define
-
-If You have any question, please contact the author...
-
Index: rel_1_2/jumpball/ball.c
===================================================================
--- rel_1_2/jumpball/ball.c (revision 1198)
+++ rel_1_2/jumpball/ball.c (nonexistent)
@@ -1,246 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ball.c,v 1.3 2003-05-05 09:21:55 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.3 $
- Last update: $Date: 2003-05-05 09:21:55 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*--------------------------------------------------------------*/
-/* SIMULATION OF JUMPING BALLS */
-/*--------------------------------------------------------------*/
-
-#include "demo.h"
-#include <kernel/func.h>
-#include <stdlib.h>
-
-#define R 8 /* dimension of a ball */
-#define G 9.8 /* acceleration of gravity */
-
-static int ballexit = 0;
-static int npc = 0; /* number of tasks created */
-
-/*--------------------------------------------------------------*/
-/* Delay function for jumping balls */
-/*--------------------------------------------------------------*/
-
-void my_delay(void)
-{
- int xxx;
- for (xxx=0; xxx<BALL_DELAY; xxx++);
-}
-
-/*--------------------------------------------------------------*/
-/* Periodic task for ball simulation */
-/*--------------------------------------------------------------*/
-
-TASK palla(int i)
-{
-int x, y; /* coordinate grafiche pallina */
-int ox, oy; /* vecchia posizione pallina */
-int x0, y0; /* posizione iniziale X pallina */
-float vx, vy; /* velocit… della pallina */
-float vy0; /* velocita' pallina al primo rimbalzo */
-float ty, tx; /* variabile temporale */
-float dt; /* incremento temporale */
-
- y = oy = y0 = BALL_HEIGHT;
- x = ox = x0 = BALL_XMIN;
-
- vy0= sqrt(2. * G * (float)BALL_HEIGHT);
- vy = 0;
- vx = BALL_VELX + myrand(9);
- tx = 0;
- ty = 0;
- dt = ((float)PERIOD_BALL)/100000;
-
- while (1) {
- y = y0 + vy*ty - .5*G*ty*ty;
- x = x0 + vx * tx;
-
- if (y < 0) {
- y = 0;
-
- if (vy == 0.0)
- vy = vy0;
- else if (vy < BALL_VYMIN)
- vy = vy0 * (1.0 - myrand(50)/100.0);
- else
- vy = 0.9 * vy;
-
- ty = 0.0;
- y0 = 0;
- }
-
- if (x > BALL_XMAX) {
- tx = 0.0;
- x0 = BALL_XMAX;
- vx = -vx;
- x = x0 + vx * tx;
- }
-
- if (x < BALL_XMIN) {
- tx = 0.0;
- x0 = BALL_XMIN;
- vx = -vx;
- x = x0 + vx * tx;
- }
-
- mutex_lock(&mutex);
- grx_disc(ox, oy, R, 0);
- ox = x;
- oy = BALL_Y - y;
- mutex_unlock(&mutex);
-
- if (ballexit && i!=0xFFFF) {
- npc--;
- return 0;
- }
-
- mutex_lock(&mutex);
- grx_disc(ox, oy, R, i);
- mutex_unlock(&mutex);
-
- my_delay();
-
- ty += dt;
- tx += dt;
- task_endcycle();
- }
-}
-
-void killball(KEY_EVT *k)
-{
- ballexit = 1;
-}
-
-void ballfun(KEY_EVT *k)
-{
- SOFT_TASK_MODEL mp;
- int r,g,b;
- PID pid;
- char palla_str[]="palla ";
-
- if (npc == BALL_MAX_P) return;
-
- ballexit = 0;
-
- r = 64 + myrand(190);
- g = 64 + myrand(190);
- b = 64 + myrand(190);
-
- itoa(npc,palla_str+5);
-
- soft_task_default_model(mp);
- soft_task_def_level(mp,1);
- soft_task_def_ctrl_jet(mp);
- soft_task_def_arg(mp, (void *)rgb16(r,g,b));
- soft_task_def_group(mp, BALL_GROUP);
- soft_task_def_met(mp, WCET_BALL);
- soft_task_def_period(mp,PERIOD_BALL);
- soft_task_def_usemath(mp);
- pid = task_create(palla_str, palla, &mp, NULL);
-
- if (pid != NIL) {
- task_activate(pid);
- npc++;
- }
-}
-
-void hardball()
-{
- HARD_TASK_MODEL mp;
- int r,g,b;
- PID pid;
-
- r = 255;
- g = 255;
- b = 255;
-
- hard_task_default_model(mp);
- hard_task_def_ctrl_jet(mp);
- hard_task_def_arg(mp, (void *)rgb16(r,g,b));
- hard_task_def_wcet(mp, WCET_HARD_BALL);
- hard_task_def_mit(mp,PERIOD_BALL);
- hard_task_def_usemath(mp);
- pid = task_create("pallaEDF", palla, &mp, NULL);
- if (pid == NIL) {
- sys_shutdown_message("Could not create task <pallaEDF>");
- sys_end();
- }
- else
- task_activate(pid);
-}
-
-
-/*--------------------------------------------------------------*/
-/* MAIN process */
-/*--------------------------------------------------------------*/
-
-void scenario_ball()
-{
- grx_text("Noise", 0, 45 /*BALL_Y-BALL_HEIGHT-15*/, rgb16(0,0,255), black);
- grx_line(0,55,383,55,red);
-//grx_line(0,BALL_Y-BALL_HEIGHT-6,383,BALL_Y-BALL_HEIGHT-6,red);
-
- grx_rect(BALL_XMIN-R-1, BALL_Y-BALL_HEIGHT-R-1,
- BALL_XMAX+R+1, BALL_Y+R+1, rgb16(0,200,0));
-}
-
-void init_ball(void)
-{
- KEY_EVT k;
-
- hardball();
-
- k.flag = 0;
- k.scan = KEY_SPC;
- k.ascii = ' ';
- keyb_hook(k,ballfun);
-
- k.flag = 0;
- k.scan = KEY_BKS;
- k.ascii = ' ';
- keyb_hook(k,killball);
-}
-
-/*--------------------------------------------------------------*/
Index: rel_1_2/jumpball/makefile
===================================================================
--- rel_1_2/jumpball/makefile (revision 1198)
+++ rel_1_2/jumpball/makefile (nonexistent)
@@ -1,24 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= ecp ern rrp rrn
-
-include $(BASE)/config/example.mk
-
-ecp:
- make -f $(SUBMAKE) APP=ecp INIT= OTHEROBJS="demo.o ball.o jetctrl.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
-
-ern:
- make -f $(SUBMAKE) APP=ern INIT= OTHEROBJS="demo.o ball.o jetctrl.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
-
-rrp:
- make -f $(SUBMAKE) APP=rrp INIT= OTHEROBJS="demo.o ball.o jetctrl.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
-
-rrn:
- make -f $(SUBMAKE) APP=rrn INIT= OTHEROBJS="demo.o ball.o jetctrl.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
Index: rel_1_2/jumpball/rrn.c
===================================================================
--- rel_1_2/jumpball/rrn.c (revision 1198)
+++ rel_1_2/jumpball/rrn.c (nonexistent)
@@ -1,109 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: rrn.c,v 1.1 2003-05-01 19:43:17 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2003-05-01 19:43:17 $
- ------------
-**/
-
-/*
- * Copyright (C) 2003 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/rrsoft.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/nop.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-//#define RRTICK 10000
-#define RRTICK 2000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- RR_register_level(RRTICK, RR_MAIN_NO, mb); // this module remains empty!!!
- RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
-
- SEM_register_module();
-
- CABS_register_module();
-
- NOP_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-void app_mutex_init(mutex_t *m)
-{
- NOP_mutexattr_t attr;
-
- NOP_mutexattr_default(attr);
-
- mutex_init(m, &attr);
-}
Index: rel_1_2/jumpball/rrp.c
===================================================================
--- rel_1_2/jumpball/rrp.c (revision 1198)
+++ rel_1_2/jumpball/rrp.c (nonexistent)
@@ -1,107 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: rrp.c,v 1.1 2003-05-01 19:43:17 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2003-05-01 19:43:17 $
- ------------
-**/
-
-/*
- * Copyright (C) 2003 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/rrsoft.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-//#define RRTICK 10000
-#define RRTICK 2000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD);
- RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT);
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
-
- SEM_register_module();
- CABS_register_module();
- PI_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-void app_mutex_init(mutex_t *m)
-{
- PI_mutexattr_t attr;
-
- PI_mutexattr_default(attr);
-
- mutex_init(m, &attr);
-}
Index: rel_1_2/jumpball/demo.c
===================================================================
--- rel_1_2/jumpball/demo.c (revision 1198)
+++ rel_1_2/jumpball/demo.c (nonexistent)
@@ -1,217 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: demo.c,v 1.4 2003-05-01 19:43:16 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.4 $
- Last update: $Date: 2003-05-01 19:43:16 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000-2003 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "demo.h"
-#include <kernel/func.h>
-#include <string.h>
-#include <stdlib.h>
-#include <drivers/keyb.h>
-#include <drivers/glib.h>
-
-/* graphic mutex... */
-mutex_t mutex;
-
-/* useful colors... */
-int white;
-int black;
-int red;
-int gray;
-
-void app_mutex_init(mutex_t *m);
-
-static void version( void )
-{
- cprintf( "S.Ha.R.K. Jumpball Demo 1.0\n" );
- cprintf( "---------------------------\n" );
- cprintf( "by Paolo Gai 1999-2001\n" );
- cprintf( " <pj@sssup.it>\n" );
- cprintf( "---------------------------\n" );
-}
-
-int myrand(int x)
-{
- return rand()%x;
-}
-
-void reverse(char s[])
-{
- int c, i, j;
-
- for (i = 0, j = strlen(s)-1; i<j; i++, j--)
- {
- c = s[i];
- s[i] = s[j];
- s[j] = c;
- }
-}
-
-char * itoa(int n, char *s)
-{
- int i, sign;
-
- if ((sign = n) < 0)
- n = -n;
-
- i = 0;
-
- do
- {
- s[i++] = n % 10 + '0';
- } while ((n /= 10) > 0);
-
- if (sign < 0)
- s[i++] = '-';
-
- s[i] = 0;
-
- reverse(s);
-
- return s;
-}
-
-
-void scenario()
-{
- grx_text("S.Ha.R.K. Jumpball Demo 1.0", 0, 0, rgb16(0,255,0), black );
- grx_text(" by Paolo Gai 1999-2001" , 0, 8, rgb16(0,255,0), black );
- grx_text(" pj@sssup.it" , 0,16, rgb16(0,255,0), black );
-
- grx_text("Ctrl-C, Ctrr-C, Enter: exit" ,320, 0, gray, black );
- grx_text("Alt-C : void statistics" ,320, 8, gray, black );
- grx_text("Space : create noise ball",320,16, gray, black );
- grx_text("Backspace : kill noise balls" ,320,24, gray, black );
-
-
- #ifdef JET_ON
- scenario_jetcontrol();
- #endif
-
- #ifdef BALL_ON
- scenario_ball();
- #endif
-}
-
-void my_close(void *arg)
-{
- grx_close();
- kern_printf("my_close\n");
-}
-
-
-void endfun(KEY_EVT *k)
-{
- cprintf("Ending...\n");
- sys_end();
-}
-
-void zerofun(KEY_EVT *k)
-{
- int i;
- for (i=0; i<MAX_PROC; i++) jet_delstat(i);
-}
-
-int main(int argc, char **argv)
-{
- int modenum;
-
- KEY_EVT k;
-
- srand(4);
-
- version();
-
- keyb_set_map(itaMap);
- k.flag = CNTR_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,endfun);
- k.flag = CNTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,endfun);
- k.flag = ALTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,zerofun);
- k.flag = 0;
- k.scan = KEY_ENT;
- k.ascii = 13;
- keyb_hook(k,endfun);
-
- sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT);
-
-
- grx_init();
- modenum = grx_getmode(640, 480, 16);
-
- grx_setmode(modenum);
-
- /* init the graphic mutex */
- app_mutex_init(&mutex);
-
- /* useful colors ... */
- white = rgb16(255,255,255);
- black = rgb16(0,0,0);
- red = rgb16(255,0,0);
- gray = rgb16(128,128,128);
-
- scenario();
-
- #ifdef JET_ON
- init_jetcontrol();
- #endif
-
- #ifdef BALL_ON
- init_ball();
- #endif
-
- group_activate(1);
-
- return 0;
-}
-
-
Index: rel_1_2/jumpball/ern.c
===================================================================
--- rel_1_2/jumpball/ern.c (revision 1198)
+++ rel_1_2/jumpball/ern.c (nonexistent)
@@ -1,108 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ern.c,v 1.1 2003-05-01 19:43:16 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2003-05-01 19:43:16 $
- ------------
-**/
-
-/*
- * Copyright (C) 2003 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/rrsoft.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/nop.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-//#define RRTICK 10000
-#define RRTICK 2000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
-
- SEM_register_module();
-
- CABS_register_module();
-
- NOP_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-void app_mutex_init(mutex_t *m)
-{
- NOP_mutexattr_t attr;
-
- NOP_mutexattr_default(attr);
-
- mutex_init(m, &attr);
-}
Index: rel_1_2/jumpball/ecp.c
===================================================================
--- rel_1_2/jumpball/ecp.c (revision 1198)
+++ rel_1_2/jumpball/ecp.c (nonexistent)
@@ -1,106 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ecp.c,v 1.1 2003-05-01 19:43:16 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2003-05-01 19:43:16 $
- ------------
-**/
-
-/*
- * Copyright (C) 2003 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-//#define RRTICK 10000
-#define RRTICK 2000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
- CABS_register_module();
- PI_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-void app_mutex_init(mutex_t *m)
-{
- PI_mutexattr_t attr;
-
- PI_mutexattr_default(attr);
-
- mutex_init(m, &attr);
-}
Index: rel_1_2/jumpball/jetctrl.c
===================================================================
--- rel_1_2/jumpball/jetctrl.c (revision 1198)
+++ rel_1_2/jumpball/jetctrl.c (nonexistent)
@@ -1,244 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: jetctrl.c,v 1.2 2003-05-01 19:43:17 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-05-01 19:43:17 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-// JetControl
-
-#include "demo.h"
-#include "kernel/func.h"
-
-TASK jetdummy_task(void *arg)
-{
- TIME now_dummy, last_dummy, diff_dummy, slice;
- struct timespec now, last, diff;
- int x = 0;
- int height;
-
- NULL_TIMESPEC(&last);
- last_dummy = 0;
- for (;;) {
- task_nopreempt();
- jet_getstat(DUMMY_PID, NULL, NULL, NULL, &now_dummy);
- sys_gettime(&now);
- task_preempt();
-
- SUBTIMESPEC(&now, &last, &diff);
- slice = diff.tv_sec * 1000000 + diff.tv_nsec/1000;
- diff_dummy = now_dummy - last_dummy;
-
- height = (int)(JET_DUMMY_HEIGHT*((float)diff_dummy)/((float)slice));
-
- TIMESPEC_ASSIGN(&last, &now);
- last_dummy = now_dummy;
-
- mutex_lock(&mutex);
- grx_line(JET_DUMMY_X+x,JET_DUMMY_Y,
- JET_DUMMY_X+x,JET_DUMMY_Y+height ,black);
- grx_line(JET_DUMMY_X+x,JET_DUMMY_Y+height,
- JET_DUMMY_X+x,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
- grx_line(JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y,
- JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y+JET_DUMMY_HEIGHT,255);
- mutex_unlock(&mutex);
-
- x = (x+1)%JET_DUMMY_WIDTH;
-
- task_endcycle();
- }
-}
-
-
-TASK jetctrl_task(void *arg)
-{
- char st[50];
- TIME sum, max;
- int n;
-
- PID i;
- int printed = 0;
-
- for (;;) {
- for (i=2, printed=0; i<MAX_PROC && printed<JET_NTASK; i++) {
- if (jet_getstat(i, &sum, &max, &n, NULL) != -1) {
- if (!n) n=1;
- sprintf(st, "%6d %6d %10s", (int)sum/n, (int)max, proc_table[i].name);
- mutex_lock(&mutex);
- grx_text(st, 384, JET_Y_NAME+16+printed*8, gray, black);
- mutex_unlock(&mutex);
- printed++;
- }
- }
- while (printed<JET_NTASK) {
- mutex_lock(&mutex);
- grx_text(" ",
- 384, JET_Y_NAME+16+printed*8, gray, black);
- mutex_unlock(&mutex);
- printed++;
- }
- task_endcycle();
- }
-}
-
-TASK jetslide_task(void *arg)
-{
- TIME sum, curr, max;
-
- TIME total[JET_NTASK];
- int slides[JET_NTASK];
-
- PID i;
- int printed = 0;
-
- for (;;) {
- // Fill the total array in a nonpreemptive section
- task_nopreempt();
- for (i=2, printed=0; i<MAX_PROC && printed<JET_NTASK; i++) {
- if (jet_getstat(i, &sum, NULL, NULL, &curr) != -1) {
- total[printed] = sum+curr;
- printed++;
- }
- }
- task_preempt();
-
- while (printed < JET_NTASK)
- total[printed++] = 0;
-
- // Compute the Max elapsed time
- max = 0;
- for (i=0; i<JET_NTASK; i++)
- if (total[i] > max) max = total[i];
- if (!max) max = 1;
-
- // Compute the slides width
- for (i=0; i<JET_NTASK; i++)
- slides[i] = (int)( (((float)total[i])/max) * JET_SLIDE_WIDTH);
-
- // print the data
- mutex_lock(&mutex);
- for (i=0; i<JET_NTASK; i++) {
- grx_box(JET_SLIDE_X, JET_Y_NAME+16+i*8,
- JET_SLIDE_X+slides[i], JET_Y_NAME+23+i*8, gray);
- grx_box(JET_SLIDE_X+slides[i], JET_Y_NAME+16+i*8,
- JET_SLIDE_X+JET_SLIDE_WIDTH, JET_Y_NAME+23+i*8, black);
- }
-
- while (i<JET_NTASK) {
- grx_box(JET_SLIDE_X, JET_Y_NAME+16+i*8,
- JET_SLIDE_X+JET_SLIDE_WIDTH, JET_Y_NAME+20+i*8, black);
- i++;
- }
- mutex_unlock(&mutex);
- task_endcycle();
- }
-}
-
-
-void scenario_jetcontrol(void)
-{
- grx_text("System load" , 384, 45, rgb16(0,0,255), black);
- grx_line(384,55,639,55,red);
-
- grx_text(" Mean Max Name Slide", 384, JET_Y_NAME, gray, black);
- grx_line(384,JET_Y_NAME+10,639,JET_Y_NAME+10,gray);
-
- grx_rect(JET_DUMMY_X-1, JET_DUMMY_Y-1,
- JET_DUMMY_X+JET_DUMMY_WIDTH, JET_DUMMY_Y+JET_DUMMY_HEIGHT+1, gray);
-
- grx_text("100%", JET_DUMMY_X-40, JET_DUMMY_Y, gray, black);
- grx_text(" 0%", JET_DUMMY_X-40, JET_DUMMY_Y+JET_DUMMY_HEIGHT-8, gray, black);
-
- grx_line(JET_DUMMY_X-1, JET_DUMMY_Y, JET_DUMMY_X-5, JET_DUMMY_Y, gray);
- grx_line(JET_DUMMY_X-1, JET_DUMMY_Y+JET_DUMMY_HEIGHT, JET_DUMMY_X-5, JET_DUMMY_Y+JET_DUMMY_HEIGHT, gray);
-}
-
-void init_jetcontrol(void)
-{
- SOFT_TASK_MODEL m3, m4, m5;
-
- PID p3, p4, p5;
-
- soft_task_default_model(m3);
- soft_task_def_level(m3,1);
- soft_task_def_period(m3, PERIOD_JETCTRL);
- soft_task_def_met(m3, WCET_JETCTRL);
- soft_task_def_ctrl_jet(m3);
- soft_task_def_group(m3, 1);
- p3 = task_create("jctrl", jetctrl_task, &m3, NULL);
- if (p3 == -1) {
- sys_shutdown_message("Could not create task <jetctrl> errno=%d",
- errno);
- sys_end();
- }
-
- soft_task_default_model(m4);
- soft_task_def_level(m4,1);
- soft_task_def_period(m4, PERIOD_JETDUMMY);
- soft_task_def_met(m4, WCET_JETDUMMY);
- soft_task_def_group(m4, 1);
- soft_task_def_usemath(m4);
- soft_task_def_ctrl_jet(m4);
- p4 = task_create("jdmy", jetdummy_task, &m4, NULL);
- if (p4 == -1) {
- sys_shutdown_message("Could not create task <jetdummy> errno=%d",
- errno);
- sys_end();
- }
-
- soft_task_default_model(m5);
- soft_task_def_level(m5,1);
- soft_task_def_period(m5, PERIOD_JETSLIDE);
- soft_task_def_met(m5, WCET_JETSLIDE);
- soft_task_def_group(m5, 1);
- soft_task_def_usemath(m5);
- soft_task_def_ctrl_jet(m5);
- p5 = task_create("jsli", jetslide_task, &m5, NULL);
- if (p5 == -1) {
- sys_shutdown_message("Could not create task <jetslide> errno=%d",
- errno);
- sys_end();
- }
-}
-
Index: rel_1_2/jumpball/demo.h
===================================================================
--- rel_1_2/jumpball/demo.h (revision 1198)
+++ rel_1_2/jumpball/demo.h (nonexistent)
@@ -1,171 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: demo.h,v 1.3 2003-05-05 09:21:55 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.3 $
- Last update: $Date: 2003-05-05 09:21:55 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#include <ll/ll.h>
-#include <kernel/types.h>
-#include <kernel/descr.h>
-#include <math.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-
-
-/* Subparts */
-#define JET_ON
-#define BALL_ON
-
-
-/* CPU Speed Selection
- --------------------------------------------------------------------
- 1700 - Pentium 4 1.7 GHz
- 400 - Pentium 2 400 MHz
- 133 - Pentium 1 133 MHz
-*/
-#define CPU 1700
-
-/*
- *
- * WCET, Periods and Models
- *
- */
-
-#if CPU==133
-#define WCET_JETCTRL 10000
-#define WCET_JETDUMMY 300
-#define WCET_JETSLIDE 2000
-#define WCET_BALL 250
-#define WCET_HARD_BALL 1000
-#define BALL_DELAY 10000
-#endif
-
-#if CPU==400
-#define WCET_JETCTRL 7500
-#define WCET_JETDUMMY 200
-#define WCET_JETSLIDE 2100
-#define WCET_BALL 100
-#define WCET_HARD_BALL 380
-#define BALL_DELAY 10000
-#endif
-
-#if CPU==1700
-#define WCET_JETCTRL 4500
-#define WCET_JETDUMMY 100
-#define WCET_JETSLIDE 1300
-#define WCET_BALL 100
-#define WCET_HARD_BALL 410
-#define BALL_DELAY 100000
-#endif
-
-#define PERIOD_JETCTRL 100000
-#define PERIOD_JETDUMMY 100000
-#define PERIOD_JETSLIDE 100000
-#define PERIOD_BALL 10000
-
-/*
- *
- * Global Stuffs
- *
- */
-
-/* graphic mutex... */
-extern mutex_t mutex;
-
-/* useful colors... */
-extern int white;
-extern int black;
-extern int red;
-extern int gray;
-
-void init_jetcontrol();
-void init_ball(void);
-void scenario_jetcontrol();
-void scenario_ball();
-char *itoa(int n, char *s);
-int myrand(int x);
-
-
-
-/*
- *
- * JETCONTROL stuffs
- *
- */
-
-#define JET_NTASK 35
-#define JET_Y_NAME 170
-
-#define DUMMY_PID 1
-
-#define JET_DUMMY_WIDTH 210
-#define JET_DUMMY_HEIGHT 80
-
-/* the point (x, y) is the top left corner */
-#define JET_DUMMY_X 428
-#define JET_DUMMY_Y 65
-
-#define JET_SLIDE_WIDTH 50
-#define JET_SLIDE_X 576
-
-
-
-
-/*
- *
- * BALL stuffs
- *
- */
-
-// x and y corners are specified whithout consider a border of 3 pixels
-#define BALL_Y 450 /* position of the floor */
-#define BALL_HEIGHT 385 /* initial height of the ball */
-#define BALL_XMIN 10 /* min position X of the ball */
-#define BALL_XMAX 370 /* max position X of the ball */
-#define BALL_VELX 5. /* horizontal ball velocity */
-#define BALL_VYMIN 11. /* min ground speed */
-#define BALL_MAX_P 60 /* max number of balls */
-
-#define BALL_GROUP 2 /* task group of the balls */
Index: rel_1_2/slsh/slshtest.c
===================================================================
--- rel_1_2/slsh/slshtest.c (revision 1198)
+++ rel_1_2/slsh/slshtest.c (nonexistent)
@@ -1,173 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: slshtest.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- Slot shifting test
-
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai and Tomas Lennvall
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <kernel/config.h>
-#include "kernel/kern.h"
-#include "slsh.h"
-#include "drivers/keyb.h"
-
-/* a slot length of 100 ms */
-#define SLOT_LENGTH 100000
-
-
-TASK static1(void)
-{
- int i = 0;
-
- kern_printf("Static1\n");
- while(sys_gettime(NULL) < 10000) i++;
-
- return 0;
-}
-
-TASK static2(void)
-{
- int i = 0;
-
- kern_printf("Static2\n");
- while(sys_gettime(NULL) < 10000) i++;
-
- return 0;
-}
-
-
-TASK static3(void)
-{
- kern_printf("Static3\n");
-
- return 0;
-}
-
-void my_end(KEY_EVT *e)
-{
- sys_end();
-}
-
-int main(int argc, char** argv)
-{
- STATIC_TASK_MODEL s;
- // HARD_TASK_MODEL h_aper;
- // SOFT_TASK_MODEL u;
- PID p1,p2,p3;
- struct timespec x;
-
- KEY_EVT emerg;
-
- kern_cli();
- x.tv_sec=5;
- kern_event_post(&x,(void (*)(void *))sys_end,NULL);
- kern_sti();
-
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,my_end);
-
- /* set som variables in the scheduling level */
- SLSH_set_interval(0, 0, 8, 5);
- SLSH_set_interval(0, 8, 17, 7);
- SLSH_set_interval(0, 17, 20, 1);
-
- SLSH_set_variables(0, SLOT_LENGTH);
-
- static_task_default_model(s);
- static_task_def_group(s, 1);
-
- /* define time i ms */
- /* static1 task */
- static_task_def_est(s, 0);
- static_task_def_dabs(s, 800000);
- static_task_def_wcet(s, 500000);
- static_task_def_interval(s, 0);
-
- kern_printf("In main, before task creation\n");
-
- p1 = task_create("Static 1", static1, &s, NULL);
- if(p1 == NIL)
- kern_printf("Cannot create: Static1!\n");
-
- /* Static2 task */
- static_task_def_est(s, 800000);
- static_task_def_dabs(s, 1700000);
- static_task_def_wcet(s, 700000);
- static_task_def_interval(s, 1);
-
- p2 = task_create("Static 2", static2, &s, NULL);
- if(p2 == NIL)
- kern_printf("Cannot create: Static2!\n");
-
- /* Static3 task */
- static_task_def_est(s, 1700000);
- static_task_def_dabs(s, 2000000);
- static_task_def_wcet(s, 100000);
- static_task_def_interval(s, 2);
-
-
- p3 = task_create("Static3", static3, &s, NULL);
- if(p3 == NIL)
- kern_printf("Cannot create: Static3!\n");
-
-
- /* End task */
- /*hard_task_default_model(h_aper);
-
-
- hard_task_def_wcet(h_aper, 100000);
- */
- kern_printf("After task creation\n");
-
- group_activate(1);
-
- return 0;
-}
Index: rel_1_2/slsh/slsh.c
===================================================================
--- rel_1_2/slsh/slsh.c (revision 1198)
+++ rel_1_2/slsh/slsh.c (nonexistent)
@@ -1,751 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: slsh.c,v 1.4 2003-01-07 17:10:18 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.4 $
- Last update: $Date: 2003-01-07 17:10:18 $
- ------------
-
- This file contains the scheduling module for Slot-Shifting.
-
- Read slsh.h for further details.
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#include "slsh.h"
-#include <ll/stdio.h>
-#include <ll/stdlib.h>
-#include <ll/string.h>
-#include <ll/math.h> /* for ceil(...) */
-#include <ll/ll.h> /* for memcpy(...) */
-#include <kernel/model.h>
-#include <kernel/descr.h>
-#include <kernel/var.h>
-#include <kernel/func.h>
-#include <kernel/trace.h>
-
-//#define eslsh_printf kern_printf
-#define slsh_printf printk
-
-/* Keeps information about static and guaranteed tasks */
-typedef struct {
- int est;
- int dabs;
- int interval;
-} SLSH_task;
-
-/*+ Status used in the level +*/
-#define SLSH_READY MODULE_STATUS_BASE
-#define SLSH_WAIT MODULE_STATUS_BASE + 1
-#define SLSH_IDLE MODULE_STATUS_BASE + 2
-#define SLSH_WCET_VIOLATED MODULE_STATUS_BASE + 3
-
-/*+ defines +*/
-#define MAX_INTERVALS 1000 /* 1000 intervals is max, for now */
-
-/******+ the level redefinition for the SLOT SHIFT level +*******/
-typedef struct {
- level_des l; /*+ the standard level descriptor+*/
-
- /* task lists */
- SLSH_task tasks[MAX_PROC]; /* est and dl's for static and guaranteed task */
-
- IQUEUE idle_statics; /* finished static tasks */
-
- IQUEUE unspecified; /* tasks with only a wcet */
-
- /* the Intervals list */
- SLSH_interval intervals[MAX_INTERVALS];
- int current; /* current interval */
- int last; /* last interval */
-
- int slot; /* slot shifting time */
- TIME slot_length; /* slothlength in real system time*/
- int LCM; /* length (in slots) of ofline schedule */
-
- int slot_event; /* save the event */
-} SLSH_level_des;
-
-
-/* check if some tasks are ready, return 0 if ready, -1 otherwise */
-static int SLSH_R(SLSH_task* tasks)
-{
- int s;
-
- /* for all static tasks */
- for(s = 0; tasks[s].est != -1; ++s)
- {
- if(proc_table[s].status == SLSH_READY)
- return 0;
- }
- return -1;
-}
-
-/* check if unspecified exists, return 0 if it exists, -1 otherwise */
-static int SLSH_T(IQUEUE *unspecified)
-{
- if(!iq_isempty(unspecified))
- return 0;
- else
- return -1;
-}
-
-/* return the sc in an interval */
-static int SLSH_sc(SLSH_interval* intervals, int i)
-{
- return intervals[i].sc;
-}
-/* return a static task from current interval or a guaranted task */
-static PID SLSH_staticOrGuaranteed(SLSH_level_des* lev)
-{
- int lowest_dl = 0; /* lowest dl found */
- PID pid = 0; /* static or guaranteed task */
- int t;
-
- /* Decide according to EDF, go through all static & guaranteed tasks */
- for(t = 0; t < MAX_PROC; ++t)
- {
- /* static tasks */
- if(proc_table[t].pclass == STATIC_PCLASS)
- {
- /* static task must belong to current interval */
- if(lev->tasks[t].interval == lev->current)
- {
- /* only ready tasks */
- if(proc_table[t].status == SLSH_READY)
- {
- /* a new lower dl was found */
- if(lev->tasks[t].dabs < lowest_dl)
- {
- lowest_dl = lev->tasks[t].dabs;
- pid = t;
- }
- }
- }
- } /* guaranteed tasks */
- else if(proc_table[t].pclass == HARD_PCLASS)
- {
- /* only ready tasks */
- if(proc_table[t].status == SLSH_READY)
- {
- /* a new lower dl was found */
- if(lev->tasks[t].dabs < lowest_dl)
- {
- lowest_dl = lev->tasks[t].dabs;
- pid = t;
- }
- }
- }
- }/* for all tasks */
-
- return pid;
-}
-
-/* return a static task among the candidates, all ready statics */
-static PID SLSH_candidates(SLSH_task* tasks)
-{
- int lowest_dl = 0;
- PID pid = -1;
- int t;
-
- /* Use the EDL algorithm again to decide which task to run */
- for(t = 0; t < MAX_PROC; ++t)
- {
- /* only static tasks */
- if(proc_table[t].pclass == STATIC_PCLASS)
- {
- /* only ready tasks */
- if(proc_table[t].status == SLSH_READY)
- {
- /* a new lower dl was found */
- if(tasks[t].dabs < lowest_dl)
- {
- lowest_dl = tasks[t].dabs;
- pid = t;
- }
- }/* all ready tasks */
- }/* all static tasks */
- }/* for all tasks */
-
- return pid;
-}
-
-/* decrease the sc in a interval by amount */
-void SLSH_decSc(SLSH_interval* intervals, int i, int amount)
-{
- intervals[i].sc -= amount;
-}
-
-void SLSH_incSc(SLSH_interval* intervals, int i, int amount)
-{
- intervals[i].sc += amount;
-}
-
-/* swap the sc between intervals, also consider intervals with negative sc */
-void SLSH_swapSc(SLSH_interval* intervals, int current, int task_interval)
-{
- /* decrease the sc in the current interval */
- SLSH_decSc(intervals, current, 1);
-
- /* update the other interval(s) */
- if(intervals[task_interval].sc < 0) /* negative sc */
- {
- /* special case, increase next interval sc by 1 and also current interval (borrowing) */
- if(task_interval == current + 1)
- {
- SLSH_incSc(intervals, task_interval, 1);
- SLSH_incSc(intervals, current, 1);
- }
- else /* increase every interval sc that is negative between current and task_interval */
- {
- while(task_interval > current && intervals[task_interval].sc < 0)
- {
- SLSH_incSc(intervals, task_interval, 1);
- task_interval--;
- }
- }
- }
- else /* ordinary swapping */
- SLSH_incSc(intervals, task_interval, 1);
-}
-
-/* The scheduler, decides which task to run. */
-static PID SLSH_public_scheduler(LEVEL l)
-{
- SLSH_level_des* lev = (SLSH_level_des *)(level_table[l]);
- PID pid;
-
- /* The scheduler choses among static, guaranteed (hard aperiodic) and
- unspecified (soft aperiodic) tasks */
- /* no ready tasks and no sc, execute idle task */
- if(SLSH_R(lev->tasks) == 0 && SLSH_sc(lev->intervals, lev->current) == 0)
- return NIL;
- /* must execute a static from current intervall or a guaranteed task */
- else if(SLSH_R(lev->tasks) > 0 && SLSH_sc(lev->intervals, lev->current) == 0)
- return SLSH_staticOrGuaranteed(lev);
- /* sc available... */
- else if(SLSH_R(lev->tasks) > 0 && SLSH_sc(lev->intervals, lev->current) > 0)
- {
- /* If unspecified exist, execute it according to FIFO order */
- if(SLSH_T(&lev->unspecified) == 0)
- {
- SLSH_decSc(lev->intervals, lev->current, 1); /* decrease sc by 1 */
- return iq_getfirst(&lev->unspecified);
- }
- else /* No unspecified, execute task from candidates (statics) */
- {
- pid = SLSH_candidates(lev->tasks);
-
- /* sc needs to be swapped */
- if(lev->tasks[pid].interval != lev->current)
- SLSH_swapSc(lev->intervals, lev->tasks[pid].interval, lev->current);
-
- return pid;
- }
- }
-
- kern_printf("(SLSH s)");
- return NIL;
-}
-
-/* not used, slot-shifting handles all guarantees itself, it handles all bandwidth */
-static int SLSH_public_guarantee(LEVEL l, bandwidth_t *freebandwidth)
-{
- *freebandwidth = 0;
- return 1;
-}
-
-/* get the interval that x is in */
-static int SLSH_getInterval(SLSH_interval* intervals, int x, int last)
-{
- int i;
-
- /* search through the intervals */
- for(i = 0; i <= last; ++i)
- {
- /* I is in the interval where start is smaller or equal and end is bigger */
- if(intervals[i].start <= x && x < intervals[i].end)
- return i;
- }
- return -1;
-}
-
-/* get the start of the interval I */
-static int SLSH_intervalStart(SLSH_interval* intervals, int I)
-{
- return intervals[I].start;
-}
-
-/* split interval I into two parts, slow because of copying. OBS!!! no check if there is
- enough space in the intervals array */
-static void SLSH_splitInterval(SLSH_level_des* lev, int I, int dabs)
-{
- SLSH_interval left_interval;
- int i;
-
-
- lev->last++;
-
- /* move every interval above and including I */
- for(i = lev->last; i > I; --i)
- memcpy(&lev->intervals[i], &lev->intervals[i - 1], sizeof(SLSH_interval));
-
- /* Left interval start, end and length */
- left_interval.start = lev->intervals[I].start;
- left_interval.end = dabs;
- left_interval.length = left_interval.end - left_interval.start;
-
- /* Right interval (uses old interval struct) start and length end remains as the old value */
- lev->intervals[I + 1].start = dabs;
- lev->intervals[I + 1].length = lev->intervals[I + 1].end - lev->intervals[I + 1].start;
-
- /* check if sc still exists in the right interval */
- if(lev->intervals[I + 1].length - lev->intervals[I + 1].maxt > 0)
- {
- lev->intervals[I + 1].sc = lev->intervals[I + 1].length - lev->intervals[I + 1].maxt;
- left_interval.sc = left_interval.length; /* the whole interval is free, for now... */
- }
- else /* no sc in the right interval */
- {
- lev->intervals[I + 1].maxt = lev->intervals[I + 1].length;
- left_interval.sc = lev->intervals[I + 1].sc; /* all sc in left interval */
- lev->intervals[I + 1].sc = 0;
- }
-
- /* insert the new interval */
- memcpy(&lev->intervals[I], &left_interval, sizeof(SLSH_interval));
-}
-
-/* Reduce the sc from back to front by the wcet amount, interval splitting may be neccesary */
-static void SLSH_updateSc(SLSH_level_des* lev, HARD_TASK_MODEL* h)
-{
- int dabs = ceil((lev->slot + h->drel)/lev->slot_length); /* absolute deadline of request */
- int dabs_interval = SLSH_getInterval(lev->intervals, dabs, lev->last); /* interval where dabs is */
- int C = ceil(h->wcet/lev->slot_length); /* amount of sc to reduce */
- int sc = 0;
- int i;
-
- /* check if interval splitting is neccesary */
- if(lev->intervals[dabs_interval].end != dabs)
- SLSH_splitInterval(lev, dabs_interval, dabs);
-
- /* decrease sc in all intervals that are neccesary from dabs_interval o current */
- for(i = dabs_interval; i >= lev->current && C > 0; --i)
- {
- if((sc = SLSH_sc(lev->intervals, i)) >= 0) /* only decrease where sc exists */
- {
- if(sc > C) /* the last sc dec */
- {
- SLSH_decSc(lev->intervals, i, C);
- C = 0;
- }
- else /* to little sc in this interval, decrease it to 0 */
- {
- C -= SLSH_sc(lev->intervals, i);
- SLSH_decSc(lev->intervals, i, SLSH_sc(lev->intervals, i));
- }
- }
- }/* for all intervals */
-}
-
-/* the guarantee algorithm for hard aperiodic requests */
-static int SLSH_guarantee(SLSH_level_des* lev, HARD_TASK_MODEL* h)
-{
- int total_sc = 0;
- int temp, i;
- int dabs = ceil((lev->slot + h->drel)/lev->slot_length); /* absolute deadline of request */
- int dabs_interval = SLSH_getInterval(lev->intervals, dabs, lev->last); /* interval where dabs is */
-
- /* check if the sc up until request deadline is >= request wcet */
- /* 1. the sc of the current interal */
- total_sc = SLSH_sc(lev->intervals, lev->current);
-
- /* 2. the sc for all whole intervals between current and the interval
- with the request deadline */
- for(i = (lev->current) + 1; i < dabs_interval; ++i)
- {
- if((temp = SLSH_sc(lev->intervals, i)) > 0)
- total_sc += temp;
- }
-
- /* 3. the min of sc or the execution need in the last interval */
- total_sc += min(SLSH_sc(lev->intervals, dabs_interval),
- dabs - SLSH_intervalStart(lev->intervals,
- dabs_interval));
-
- if(total_sc >= h->wcet)
- { /* update the sc in the intervals from back to front */
- SLSH_updateSc(lev, h);
- return 0;
- }
- else
- return -1;
-}
-
-/* check if task model is accepted and store nessecary parameters */
-static int SLSH_public_create(LEVEL l, PID p, TASK_MODEL *m)
-{
- SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
- STATIC_TASK_MODEL* s;
- HARD_TASK_MODEL* h;
- SOFT_TASK_MODEL* u;
-
-
- /* Check the models */
- switch(m->pclass)
- {
- case STATIC_PCLASS: /* offline scheduled tasks */
- break;
- case HARD_PCLASS: /* hard aperiodic tasks */
- h = (HARD_TASK_MODEL *) m;
- if (h->drel == 0 || h->wcet == 0) /* must be set */
- return -1;
- break;
- case SOFT_PCLASS: /* soft aperiodic tasks */
- u = (SOFT_TASK_MODEL *) m;
- if(u->wcet == 0) /* must be set */
- return -1;
- break;
- default:
- return -1;
- }
-
-
- /* if the SLSH_task_create is called, then the pclass must be a
- valid pclass. Slot-shifting accepts STATIC_TASK, HARD_TASK
- and SOFT_TASK models with some restrictions */
-
- /* est, dl and wcet is saved in slotlengths */
- switch(m->pclass)
- {
- case STATIC_PCLASS: /* offline scheduled tasks */
- s = (STATIC_TASK_MODEL *) m;
- lev->tasks[p].est = ceil(s->est/lev->slot_length);
- lev->tasks[p].dabs = ceil(s->dabs/lev->slot_length);
- lev->tasks[p].interval = s->interval;
- proc_table[p].avail_time = s->wcet;
- proc_table[p].wcet = s->wcet;
- break;
- case HARD_PCLASS: /* hard aperiodic tasks */
- h = (HARD_TASK_MODEL *) m;
- if(SLSH_guarantee(lev, h) == 0)
- {
- /* convert drel to dabs */
- lev->tasks[p].dabs = ceil((lev->slot + h->drel)/lev->slot_length);
- proc_table[p].avail_time = h->wcet;
- proc_table[p].wcet = h->wcet;
- }
- else /* task not guaranteed */
- return -1;
- break;
- case SOFT_PCLASS:
- u = (SOFT_TASK_MODEL *) m;
- proc_table[p].avail_time = u->wcet;
- proc_table[p].wcet = u->wcet;
- iq_insertlast(p, &lev->unspecified); /* respect FIFO order */
- break;
- default: /* a task model not supported */
- return -1;
- }
- /* enable wcet check in the kernel */
- proc_table[p].control |= CONTROL_CAP;
-
- return 0;
-}
-
-/************* The slot end event handler *************/
-static void SLSH_slot_end(void* p)
-{
- SLSH_level_des* lev = (SLSH_level_des *) p;
- PID pid;
- int i;
-
- /* increase slot "time" by 1 */
- if(lev->slot < lev->LCM)
- {
- lev->slot++;
- /* check if new statics are ready */
- for(i = 0; lev->tasks[i].interval != -1; ++i)
- {
- if(lev->tasks[i].est <= lev->slot && proc_table[i].status == SLSH_WAIT)
- proc_table[i].status = SLSH_READY;
- }
-
- /* check if current (interval) needs updating */
- if(lev->current < SLSH_getInterval(lev->intervals, lev->slot, lev->last))
- lev->current++;
-
- }
- else /* restart from the beginning of the offline schedule */
- {
- lev->slot = 0;
-
- while((pid = iq_getfirst(&lev->idle_statics)) != NIL)
- {
- if(lev->tasks[pid].est <= lev->slot)
- proc_table[pid].status = SLSH_READY;
- else
- proc_table[pid].status = SLSH_WAIT;
- }
- }
-
- /* call for a rescheduling, reset event flag and increase slot by 1 */
- lev->slot_event = -1;
- kern_printf("*");
- event_need_reschedule();
-}
-
-/* when a task becomes executing (EXE status) */
-static void SLSH_public_dispatch(LEVEL l, PID pid, int nostop)
-{
- SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
- struct timespec t;
-
- /* the task state is set EXE by the scheduler()
- we extract the task from the unspecified queue.
- NB: we can't assume that p is the first task in the queue!!! */
-
- if(proc_table[pid].pclass == SOFT_PCLASS)
- iq_extract(pid, &lev->unspecified);
-
- /* also start the timer for one slot length */
- lev->slot_event = kern_event_post(&TIME2TIMESPEC(lev->slot_length, t),
- SLSH_slot_end, (void*) lev);
-}
-
-/* called when task is moved from EXE status */
-static void SLSH_public_epilogue(LEVEL l, PID pid)
-{
- SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
-
- /* check if the wcet is finished... */
- if (proc_table[pid].avail_time <= 0)
- {
- /* if it is, raise a XWCET_VIOLATION exception */
- kern_raise(XWCET_VIOLATION, pid);
- proc_table[pid].status = SLSH_WCET_VIOLATED;
- }
- else /* the end of a slot. the task returns into the ready queue... */
- {
- if(proc_table[pid].pclass == SOFT_PCLASS)
- iq_insertfirst(pid,&lev->unspecified);
-
- proc_table[pid].status = SLSH_READY;
- }
-}
-
-/* when task go from SLEEP to SLSH_READY or SLSH_WAIT */
-static void SLSH_public_activate(LEVEL l, PID pid)
-{
- SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
- WORD type = proc_table[pid].pclass;
-
- /* Test if we are trying to activate a non sleeping task */
- /* Ignore this; the task is already active */
- if (proc_table[pid].status != SLEEP && proc_table[pid].status != SLSH_WCET_VIOLATED)
- return;
-
- /* make task ready or waiting, dependong on slot (the time) for static tasks only*/
- if(type == STATIC_PCLASS && lev->tasks[pid].est <= lev->slot)
- proc_table[pid].status = SLSH_READY;
- else
- proc_table[pid].status = SLSH_WAIT;
-
- if(type == HARD_PCLASS)
- proc_table[pid].status = SLSH_READY;
-
- /* insert unspecified tasks in QQUEUE and make it ready */
- if(type == SOFT_PCLASS)
- {
- iq_insertlast(pid ,&lev->unspecified);
- proc_table[pid].status = SLSH_READY;
- }
-}
-
-/* when a task i returned to module from a semaphore, mutex ... */
-static void SLSH_public_unblock(LEVEL l, PID pid)
-{
- SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
-
- /* change staus of task */
- proc_table[pid].status = SLSH_READY;
-
- if(proc_table[pid].pclass == SOFT_PCLASS)
- iq_insertfirst(pid ,&lev->unspecified);
-}
-
-/* when a semaphore, mutex ... taskes a task from module */
-static void SLSH_public_block(LEVEL l, PID pid)
-{
- /* Extract the running task from the level
- . we have already extract it from the ready queue at the dispatch time.
- . the capacity event have to be removed by the generic kernel
- . the wcet don't need modification...
- . the state of the task is set by the calling function
- . the deadline must remain...
-
- So, we do nothing!!!
- */
-}
-
-/* the task has finihed its wcet, kill task (dont kill static tasks) */
-static void SLSH_public_end(LEVEL l, PID pid)
-{
- SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
-
- if(proc_table[pid].pclass == SOFT_PCLASS)
- {
- if (proc_table[pid].status == SLSH_READY)
- iq_extract(pid, &lev->unspecified);
- }
- else if(proc_table[pid].pclass == HARD_PCLASS)
- {
- if (proc_table[pid].status == SLSH_READY)
- lev->tasks[pid].dabs = 0;
-
- }
- /* static tasks: put them in idle QUEUE, reset status and avail_time */
- else if(proc_table[pid].pclass == STATIC_PCLASS)
- {
- proc_table[pid].avail_time = proc_table[pid].wcet;
- proc_table[pid].status = SLSH_IDLE;
- iq_priority_insert(pid, &lev->idle_statics);
- }
-
- proc_table[pid].status = FREE;
-}
-
-/* called when a task should sleep but not execute for awhile, mabe a mode change */
-//static void SLSH_task_sleep(LEVEL l, PID pid)
-//{
-//
-// /* the task has terminated his job before it consume the wcet. All OK! */
-// proc_table[pid].status = SLEEP;
-//
-// /* we reset the capacity counters... only for static tasks */
-// if (proc_table[pid].pclass == STATIC_PCLASS)
-// proc_table[pid].avail_time = proc_table[pid].wcet;
-//
-//}
-
-
-/** Guest Functions, slot shifing accepts no guests, so all generates exceptions **/
-
-/******* Registration functions *******/
-
-/*+ Registration function: */
-LEVEL SLSH_register_level()
-{
- LEVEL l; /* the level that we register */
- SLSH_level_des *lev; /* for readableness only */
- PID i; /* a counter */
-
- kern_printf("SLSH_register_level\n");
-
- /* request an entry in the level_table */
- l = level_alloc_descriptor(sizeof(SLSH_level_des));
-
- lev = (SLSH_level_des *)level_table[l];
-
- printk(" lev=%d\n",(int)lev);
-
- /* fill the standard descriptor */
- lev->l.public_scheduler = SLSH_public_scheduler;
- lev->l.public_guarantee = SLSH_public_guarantee;
- lev->l.public_create = SLSH_public_create;
- lev->l.public_end = SLSH_public_end;
- lev->l.public_dispatch = SLSH_public_dispatch;
- lev->l.public_epilogue = SLSH_public_epilogue;
- lev->l.public_activate = SLSH_public_activate;
- lev->l.public_unblock = SLSH_public_unblock;
- lev->l.public_block = SLSH_public_block;
-
- /* fill the SLSH descriptor part */
- for(i = 0; i < MAX_PROC; i++)
- {
- lev->tasks[i].est = -1;
- lev->tasks[i].dabs = 0;
- lev->tasks[i].interval = -1;
- }
-
- for(i = 0; i < MAX_INTERVALS; i++)
- {
- lev->intervals[i].start = -1;
- lev->intervals[i].end = -1;
- lev->intervals[i].length = 0;
- lev->intervals[i].maxt = 0;
- lev->intervals[i].sc = 0;
- }
-
- lev->current = 0;
- lev->last = NIL;
- lev->slot = 0;
- lev->slot_length = 0;
- lev->slot_event = -1;
-
- return l;
-}
-
-
-void SLSH_set_interval(LEVEL l, int start, int end, int maxt)
-{
- SLSH_level_des* lev = (SLSH_level_des *)(level_table[l]);
- static int i = -1;
-
- i++;
- lev->intervals[i].start = start;
- lev->intervals[i].end = end;
- lev->intervals[i].length = end - start;
- lev->intervals[i].maxt = maxt;
- lev->intervals[i].sc = lev->intervals[i].length - maxt;
-
- lev->last = i;
-}
-
-void SLSH_set_variables(LEVEL l, TIME length)
-{
- SLSH_level_des* lev = (SLSH_level_des *)(level_table[l]);
-
- lev->slot_length = length;
-}
Index: rel_1_2/slsh/readme.txt
===================================================================
--- rel_1_2/slsh/readme.txt (revision 1198)
+++ rel_1_2/slsh/readme.txt (nonexistent)
@@ -1,6 +0,0 @@
-This Example has been made by Tomas Lenvall.
-
-There is not a lot of documentation available, so if you have problems please
-send an e-mail to Tomas ( mailto:tlv@mdh.se )
-
-Paolo
Index: rel_1_2/slsh/makefile
===================================================================
--- rel_1_2/slsh/makefile (revision 1198)
+++ rel_1_2/slsh/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-
-include $(BASE)/config/config.mk
-
-PROGS=slshtest
-
-include $(BASE)/config/example.mk
-
-slshtest:
- make -f $(SUBMAKE) APP=slshtest INIT= OTHEROBJS="slshinit.o slsh.o" OTHERINCL= SHARKOPT=__OLDCHAR__
Index: rel_1_2/slsh/slshinit.c
===================================================================
--- rel_1_2/slsh/slshinit.c (revision 1198)
+++ rel_1_2/slsh/slshinit.c (nonexistent)
@@ -1,117 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: slshinit.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- System initialization file
-
- The tick is set to TICK ms.
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- a Slot Shifting level
- a Dummy level
-
- It can accept these task models:
-
- STATIC_TASK_MODEL
- HARD_TASK_MODEL(aperiodic)
- SOFT_TASK_MODEL
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "slsh.h"
-#include "modules/rr2.h"
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "drivers/keyb.h"
-#include "modules/dummy.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 300
-
-/* define RR tick in us*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- SLSH_register_level();
- RR2_register_level(RRTICK, RR2_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- return TICK;
-}
-
-NRT_TASK_MODEL nrt;
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS k = BASE_KEYB;
-
- nrt_task_default_model(nrt);
- keyb_def_task(k,&nrt);
-
-
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return 0;
-}
-
-
Index: rel_1_2/slsh/slsh.h
===================================================================
--- rel_1_2/slsh/slsh.h (revision 1198)
+++ rel_1_2/slsh/slsh.h (nonexistent)
@@ -1,204 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: slsh.h,v 1.2 2003-01-07 17:10:18 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-01-07 17:10:18 $
- ------------
- Author: Tomas Lennvall, Date: Feb 2000.
-
- This file contains the scheduling module for Slot shifting.
-
- Title:
- Slot Shifting
-
- Task Models Accepted:
- STATIC_TASK_MODEL - Periodic Hard tasks that are scheduled by
- an off-line scheduler, so that all guarantees regarding precedence, mutex
- deadline violation is taken care of. The tasks are in an executione schedule,
- that is the order in when they become ready. They have the following fields:
- est (earliest start time), wcet and absolute deadline.
-
- HARD_TASK_MODEL - Hard Tasks (Hard aperiodic requests)
- wcet field and drel field must be != 0. They are used to set the wcet
- and deadline of the tasks.
- periodicity field must be APERIODIC
- mit field is ignored.
-
- SOFT_TASK_MODEL - Soft Tasks (Unspecified tasks)
- wcet field must be != 0. periodicity filed must be APERIODIC
- period and met filed is ignored.
-
- Guest Models Accepted:
- NONE - Slot shifting handles all tasks by itself (at this moment).
-
- Description:
- This module schedules the offline scheduled tasks according to the slot-
- shifting paradigm, dividing time into slots of a fixed length and assigning
- tasks to execute in those slots. Slot-shifting also keeps track of the free
- bandwidth in the schedule by using disjoint intervals and sc (spare capacity).
- Each interval has a sc nr that represents the free bandwidth in that interval,
- the sc can be used by hard aperiodic tasks, static tasks from later interval or
- soft aperiodic tasks. Hard aperiodic tasks are guaranteed an incorporated in
- the schedule by reduction of sc before they execute. No guarantee is
- performed on the soft aperiodic tasks, they are run when no other task wants
- to execute and sc is available.
-
- Description:
- This module implements the Slot shifting algorithm, by Gerhard Fohler. Slot shifting
- schedules off-line scheduled tasks and also handles hard aperiodic requests by the
- guarantee alorithm. Slot shifting can also handle soft aperiodic tasks,
- called unspecified. That is tasks without a deadline.
-
- Exceptions raised:
- These exceptions are pclass-dependent...
- XDEADLINE_MISS
- If a task miss his deadline, the exception is raised.
-
- XWCET_VIOLATION
- If a task doesn't end the current cycle before if consume the wcet,
- an exception is raised, and the task is put in the EDF_WCET_VIOLATED
- state. To reactivate it, use EDF_task_activate via task_activate or
- manage directly the EDF data structure. Note that the exception is not
- handled properly, an XDEADLINE_MISS exeeption will also be raised at
- the period end...
-
- Restrictions & special features:
- - This level doesn't manage the main task.
- - At init time we can choose if the level have to activate
- . the wcet check
- (If a task require more time than declared, it is stopped and put in
- the state EDF_WCET_VIOLATED; a XWCET_VIOLATION exception is raised)
- . the task guarantee algorithm
- (when all task are created the system will check that the task_set
- will not use more than the available bandwidth)
- - The level use the priority and timespec_priority fields.
- - A function to return the used bandwidth of a level is provided.
- - The guest tasks don't provide the guest_endcycle function
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#ifndef __SLSH_H__
-#define __SLSH_H__
-
-#include <ll/ll.h>
-#include <kernel/config.h>
-#include <sys/types.h>
-#include <kernel/types.h>
-
-#define STATIC_PCLASS 0x0500
-
-#define SLSH_LEVELNAME "Slot Shifting"
-#define SLSH_LEVEL_CODE 5
-#define SLSH_LEVEL_VERSION 1
-
-
-
-/* -----------------------------------------------------------------------
- STATIC_TASK_MODEL: offline scheduled Tasks
- ----------------------------------------------------------------------- */
-/* Offline-scheduled tasks are hard periodic tasks that have been
- scheduled before runtime. All guarantees are made by the off-
- line scheduler so the tasks are already guaranteed.
-*/
-
-typedef struct {
- TASK_MODEL t;
- TIME est;
- TIME wcet;
- TIME dabs;
- int interval; /* used in slot shifting */
-} STATIC_TASK_MODEL;
-
-#define static_task_default_model(m) \
- task_default_model((m).t,STATIC_PCLASS), \
- (m).est = -1, \
- (m).dabs = 0, \
- (m).wcet = 0, \
- (m).interval = -1;
-#define static_task_def_level(m,l) task_def_level((m).t,l)
-#define static_task_def_arg(m,a) task_def_arg((m).t,a)
-#define static_task_def_stack(m,s) task_def_stack((m).t,s)
-#define static_task_def_group(m,g) task_def_group((m).t,g)
-#define static_task_def_usemath(m) task_def_usemath((m).t)
-#define static_task_def_system(m) task_def_system((m).t)
-#define static_task_def_nokill(m) task_def_nokill((m).t)
-#define static_task_def_ctrl_jet(m) task_def_ctrl_jet((m).t)
-#define static_task_def_est(m,p) (m).est = (p)
-#define static_task_def_dabs(m,d) (m).dabs = (d)
-#define static_task_def_wcet(m,w) (m).wcet = (w)
-#define static_task_def_interval(m,i) (m).interval = (i)
-#define static_task_def_trace(m) task_def_trace((m).t)
-#define static_task_def_notrace(m) task_def_notrace((m).t)
-
-
-
-
-/*#define min(a, b) ((a) < (b) ? (a) : (b))*/
-
-#define TIME2TIMESPEC(T, TS) \
-( \
- ((TS).tv_sec = ((T)/1000000)), \
- ((TS).tv_nsec = (((T)%1000000) * 1000)), \
- (TS) \
-)
-
-/* define the interval struct */
-typedef struct {
- int start; /* start of interval */
- int end; /* end of interval */
- int length; /* Length of interval */
- int maxt; /* maximum execution time in interval */
- int sc; /* spare capacity in interval */
-} SLSH_interval;
-
-/*+ Registration function: */
-LEVEL SLSH_register_level();
-
-void SLSH_set_interval(LEVEL l, int start, int end, int maxt);
-void SLSH_set_variables(LEVEL l, TIME length);
-
-#endif
-
Index: rel_1_2/base/semdemo.c
===================================================================
--- rel_1_2/base/semdemo.c (revision 1198)
+++ rel_1_2/base/semdemo.c (nonexistent)
@@ -1,97 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: semdemo.c,v 1.1 2002-11-11 08:22:46 pj Exp $
-
- This is a really simple semaphore demo.
-
-*/
-
-#include "kernel/kern.h"
-
-#include "semaphore.h"
-
-sem_t s;
-
-void *goofy(void *a)
-{
- struct timespec t;
- char *n = proc_table[exec_shadow].name;
-
- cprintf("Task %s: Locking semaphore...\n", n);
-
- sem_wait(&s);
- cprintf("Task %s: Semaphore locked...\n", n);
-
- do {
- sys_gettime(&t);
- } while (t.tv_sec < (int)a);
-
- cprintf("Task %s: Unlocking semaphore...\n", n);
-
- sem_post(&s);
-
- cprintf("Task %s: Semaphore unlocked...\n", n);
-
- return 0;
-}
-
-int main(int argc, char **argv)
-{
- NRT_TASK_MODEL m;
- PID p2,p3;
-
- nrt_task_default_model(m);
- nrt_task_def_group(m,1);
-
- nrt_task_def_arg(m,(void *)1);
- p2 = task_create("goofy1", goofy, &m, NULL);
- if (p2 == NIL)
- { cprintf("Can't create goofy1 task...\n"); return 1; }
-
- nrt_task_def_arg(m,(void *)2);
- p3 = task_create("goofy2", goofy, &m, NULL);
- if (p3 == NIL)
- { cprintf("Can't create goofy2 task...\n"); return 1; }
-
- cprintf("Initializing semaphore...\n");
-
- sem_init(&s,0,1);
-
- group_activate(1);
-
- return 0;
-}
Index: rel_1_2/base/talk.c
===================================================================
--- rel_1_2/base/talk.c (revision 1198)
+++ rel_1_2/base/talk.c (nonexistent)
@@ -1,209 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Luca Abeni, Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: aster1.c,v 1.1 2002/10/28 08:13:37 pj Exp
-
- This is the talkdx.c Hartik's example.
-
- File: Talk.C
- Revision: 1.00
- Author: Luca Abeni
-
-
- Simple Netlib demo: nothing of seriously real-time, only another Unix
- Talk clone.
- Read it to see how the UDP/IP layers of the networ library work.
-
-*/
-
-#include <kernel/kern.h>
-#include <string.h>
-
-#include <drivers/crtwin.h>
-#include <drivers/keyb.h>
-
-#include <drivers/udpip.h>
-
-
-WIN dbg;
-BYTE esc = FALSE;
-
-char talk_myipaddr[20];
-char talk_toipaddr[20];
-
-/*
- This non real-time task reads UDP packets from the network and writes
- them in a window
-*/
-TASK scrittore(void)
-{
- char str[2000];
- UDP_ADDR from, local;
- WIN displ;
- int s,n;
-
- /* Connect on the local port #100 */
- local.s_port = 100;
- s = udp_bind(&local, NULL);
-
- /* Open the window */
- win_init(&displ,0,0,79,6);
- win_frame(&displ,BLACK,WHITE,"Remote",2);
-
- while (1) {
- /* Clear the buffer for receiving the packet...*/
- memset(str, 0, 1999);
- /*...and receive the packet (block until a packet arrives */
- n = udp_recvfrom(s, str, &from);
- win_puts(&displ, str);
- }
-}
-
-/*
- This non real-time task reads strings from the keyoard and sends them
- to the remote host
-*/
-TASK write(void)
-{
- WIN wr;
- UDP_ADDR to,local;
- char str[80];
- int s;
- IP_ADDR bindlist[5];
-
- /* Create a socket for transitting */
- ip_str2addr(talk_myipaddr,&(local.s_addr));
- local.s_port = 101;
-
- /*
- If we want the address of the remote host in the ARP table before
- begginning the transmission (to eliminate a possible source of
- unpredictability), we can use the bindlist, otherwise we set the
- second parameter of udp_bind to NULL
- */
- ip_str2addr(talk_toipaddr,&(bindlist[0]));
- memset(&(bindlist[1]), 0, sizeof(IP_ADDR));
- s = udp_bind(&local, /*bindlist*/NULL);
-
- win_init(&wr,0,7,79,6);
- win_frame(&wr,BLACK,WHITE,"Local",2);
- ip_str2addr(talk_toipaddr,&(to.s_addr));
- to.s_port = 100;
- sprintf(str,"Local IP address %d.%d.%d.%d\n", local.s_addr.ad[0],
- local.s_addr.ad[1], local.s_addr.ad[2],
- local.s_addr.ad[3]);
- win_puts(&dbg,str);
- sprintf(str,"Talk to %d.%d.%d.%d ",to.s_addr.ad[0],to.s_addr.ad[1],
- to.s_addr.ad[2],to.s_addr.ad[3]);
- win_puts(&dbg,str);
- while (1) {
- /* Get the string...*/
- win_gets(&wr,str,78);
- strcat(str,"\n");
- /*...and send it!!! */
- udp_sendto(s,str,strlen(str)+2,&to);
- }
-}
-
-/* This function is called when the user presses CTRL-C (stops the systems) */
-void esci(KEY_EVT *k)
-{
- esc = TRUE;
- cprintf("Ctrl-Brk pressed!\n");
- sys_end();
-}
-
-int main(int argc, char **argv)
-{
- KEY_EVT k;
-
- struct net_model m = net_base;
-
- NRT_TASK_MODEL m_nrt;
-
- k.flag = CNTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,esci);
- k.flag = CNTR_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,esci);
-
- clear();
- cprintf(" Hartik Talk! Ver. 1.00\n");
-
- if (argc != 3) {
- cprintf("Hartik Talk usage: talk fromIP toIP\n");
- return 0;
- }
-
- strcpy(talk_myipaddr, argv[1]);
- strcpy(talk_toipaddr, argv[2]);
-
- /* We want a task for TX mutual exclusion */
- net_setmode(m, TXTASK);
- /* We use UDP/IP stack */
- net_setudpip(m, talk_myipaddr, "255.255.255.255");
- /* OK: let's start the NetLib! */
- if (net_init(&m) == 1) {
- cprintf("Net Init OK...\n");
- } else {
- cprintf("Net Init Failed...\n");
- sys_abort(300);
- }
-
-
- //dump_irq();
-
- cprintf("\n\n\n\tPress ENTER\n");
- while (!esc) {
- keyb_getcode(&k,BLOCK);
- if (k.ascii == 13) esc = TRUE;
- }
-
- esc = FALSE;
- clear();
- win_init(&dbg,0,20,60,3);
- win_frame(&dbg,BLACK,WHITE,"Debug",2);
-
- /* Start the sender and receiver tasks...*/
- nrt_task_default_model(m_nrt);
- task_activate(task_create("aaa",scrittore,&m_nrt,NULL));
- task_activate(task_create("bbb",write,&m_nrt,NULL));
-
- return 0;
-}
Index: rel_1_2/base/makefile
===================================================================
--- rel_1_2/base/makefile (revision 1198)
+++ rel_1_2/base/makefile (nonexistent)
@@ -1,111 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS = hello sig time preempt
-PROGS += aster aster1 aster2 aster3 aster4 aster5 aster6 aster7 aster8
-PROGS += pcidemo talk mousfind keycode memtest
-PROGS += jointest condtest intsem semdemo pidemo pcdemo srpdemo mdemo
-PROGS += ego fly cabs sched
-
-include $(BASE)/config/example.mk
-
-
-# Text applications
-hello:
- make -f $(SUBMAKE) APP=hello INIT= OTHEROBJS="ihello.o" OTHERINCL=
-
-time:
- make -f $(SUBMAKE) APP=time INIT= OTHEROBJS="ihello.o" OTHERINCL=
-
-sig:
- make -f $(SUBMAKE) APP=sig INIT= OTHEROBJS="ihello.o" OTHERINCL=
-
-preempt:
- make -f $(SUBMAKE) APP=preempt INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-semdemo:
- make -f $(SUBMAKE) APP=semdemo INIT= OTHEROBJS="isemdemo.o" OTHERINCL=
-
-pidemo:
- make -f $(SUBMAKE) APP=pidemo INIT= OTHEROBJS="imdemo.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-pcdemo:
- make -f $(SUBMAKE) APP=pcdemo INIT= OTHEROBJS="imdemo.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-srpdemo:
- make -f $(SUBMAKE) APP=srpdemo INIT= OTHEROBJS="imdemo.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-mdemo:
- make -f $(SUBMAKE) APP=mdemo INIT= OTHEROBJS="imdemo.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-aster:
- make -f $(SUBMAKE) APP=aster INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-aster1:
- make -f $(SUBMAKE) APP=aster1 INIT= OTHEROBJS="iaster1.o" OTHERINCL=
-
-aster2:
- make -f $(SUBMAKE) APP=aster2 INIT= OTHEROBJS="iaster1.o" OTHERINCL=
-
-aster3:
- make -f $(SUBMAKE) APP=aster3 INIT= OTHEROBJS="iaster3.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-aster4:
- make -f $(SUBMAKE) APP=aster4 INIT= OTHEROBJS="iaster4.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-aster5:
- make -f $(SUBMAKE) APP=aster5 INIT= OTHEROBJS="imdemo.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-aster6:
- make -f $(SUBMAKE) APP=aster6 INIT= OTHEROBJS="iaster6.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-aster7:
- make -f $(SUBMAKE) APP=aster7 INIT= OTHEROBJS="iaster7.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-aster8:
- make -f $(SUBMAKE) APP=aster8 INIT= OTHEROBJS="iaster8.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-pcidemo:
- make -f $(SUBMAKE) APP=pcidemo INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-talk:
- make -f $(SUBMAKE) APP=talk INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-mousfind:
- make -f $(SUBMAKE) APP=mousfind INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-jointest:
- make -f $(SUBMAKE) APP=jointest INIT= OTHEROBJS="imdemo.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-condtest:
- make -f $(SUBMAKE) APP=condtest INIT= OTHEROBJS="imdemo.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-intsem:
- make -f $(SUBMAKE) APP=intsem INIT= OTHEROBJS="imdemo.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-keycode:
- make -f $(SUBMAKE) APP=keycode INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-memtest:
- make -f $(SUBMAKE) APP=memtest INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-# Graphical applications
-
-ego:
- make -f $(SUBMAKE) APP=ego INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
-
-fly:
- make -f $(SUBMAKE) APP=fly INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
-
-cabs:
- make -f $(SUBMAKE) APP=cabs INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
-
-sched:
- make -f $(SUBMAKE) APP=sched INIT= OTHEROBJS="isched.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
-
Index: rel_1_2/base/cabs.dat
===================================================================
--- rel_1_2/base/cabs.dat (revision 1198)
+++ rel_1_2/base/cabs.dat (nonexistent)
@@ -1,11 +0,0 @@
-----------------------------------------------------
-system tick (ms): 1
-----------------------------------------------------
-
-task periods (ticks)
-----------------------------------------------------
-producer 1: 200 consumer 1: 400
-producer 2: 100 consumer 2: 400
-producer 3: 300 consumer 3: 150
-producer 4: 800 consumer 4: 200
-----------------------------------------------------
Index: rel_1_2/base/aster1.c
===================================================================
--- rel_1_2/base/aster1.c (revision 1198)
+++ rel_1_2/base/aster1.c (nonexistent)
@@ -1,174 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: aster1.c,v 1.2 2003-01-07 17:10:15 pj Exp $
-
- this is a reduced verion of the classic Hartik demo Aster.
-
- It uses:
- - EDF module
- . periodic tasks
- - an high number of task executing concurrently
-
- The demo ends after 6 seconds.
-
-*/
-
-/*
- Well, this is only a stupid demo which intend to show many
- HARTIK+ capabilities; the application is structured in the followig
- way: there is an ASTER task wich randomly creates some ASTEROID tasks
- which are displayed into the first window; each task is HARD/PERIODIC
- and auto-kills itself when it reaches the window end!
- Finally a CLOCK task is implemented to test system clock.
- Please note that usually the HARTIK+ application is made up of a task
- group which interacts among them, while the main() function, which
- became a task itself when the kernel is activated, is suspended until
- the system is ready to terminate; the MAIN task can also be used to make
- other background activities, but it should not be killed; when the
- application terminates, the control is passed to MAIN which kills
- everybody, shut down the system and can handle other operations using
- the services available with the previou operating system (I.E. the DOS).
- If you need to manage sudden abort/exception you should install your own
- exception handler and raise it through the exc_raise() primitive to
- make the system abort safely!
- Remember that the exit functions posted through sys_atexit() will be
- executed in both cases, to allow clean system shutdown.
-*/
-
-#include "kernel/kern.h"
-
-int num_aster = 0;
-#define ASTER_LIM 67
-#define ASTER_MAX 90
-
-TASK asteroide(void)
-{
- int i = 1;
- int y = rand() % 20 + 1;
- while (i < ASTER_LIM) {
- puts_xy(i,y,WHITE,"*");
- task_endcycle();
-
- puts_xy(i,y,WHITE," ");
- i++;
- }
- num_aster--;
- return 0;
-}
-
-DWORD taskCreated = 0;
-
-TASK aster(void)
-{
- PID p;
-
- HARD_TASK_MODEL m;
- int r;
-
- hard_task_default_model(m);
- hard_task_def_wcet(m,500);
-
- srand(7);
- while (1) {
- if (num_aster < ASTER_MAX) {
- r = (rand() % 50) - 25;
-
- hard_task_def_arg(m,(void *)((rand() % 7)+1));
- hard_task_def_mit(m, (50+r)*1000);
- p = task_create("aaa",asteroide,&m,NULL);
- taskCreated++;
- task_activate(p);
- num_aster++;
- }
-
- task_endcycle();
- }
-}
-
-TASK clock()
-{
- int s = 0, m = 0;
-
- while(1) {
- printf_xy(70,1,WHITE,"%2d : %2d",m,s);
- task_endcycle();
-
- if (++s > 59) {
- s = 0;
- m++;
- }
- printf_xy(70,1,WHITE,"%2d : %2d",m,s);
- task_endcycle();
- }
-}
-
-int main(int argc, char **argv)
-{
- PID p1,p2;
- HARD_TASK_MODEL m;
- struct timespec t;
-
- clear();
-
- hard_task_default_model(m);
- hard_task_def_mit(m,10000);
- hard_task_def_wcet(m,2000);
- hard_task_def_group(m,1);
-
- p1 = task_create("Aster",aster,&m,NULL);
- if (p1 == -1) {
- perror("Aster.C(main): Could not create task <aster> ...");
- sys_end();
- }
-
- hard_task_def_mit(m,500000);
- p2 = task_create("Clock",clock,&m,NULL);
- if (p2 == -1) {
- perror("Aster.C(main): Could not create task <Clock> ...");
- sys_end();
- }
-
- group_activate(1);
-
- do {
- sys_gettime(&t);
- } while (t.tv_sec < 6);
-
- sys_end();
- return 0;
-}
-
Index: rel_1_2/base/jointest.c
===================================================================
--- rel_1_2/base/jointest.c (revision 1198)
+++ rel_1_2/base/jointest.c (nonexistent)
@@ -1,220 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Giorgio Buttazzo, Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: jointest.c,v 1.1 2002-11-11 08:22:45 pj Exp $
-
- This test verify the correctness of the task_join primitive. (that
- function is the same as pthread_join... someday I will change the
- names...)
-
- There are 4 taks, J1, J2, J3, are created as joinable, J4 as detached
-
- The main task:
- Creates J1 and J2, locks m1 (a PI mitex), creates C3.
- at t=0.8 sec it calls a task_join on J3 (that returns EDEADLK),
- it unlocks m1, then it makes task_join on J3 another time.
- Next it creates J4 as detached and finally it does a task_join on J4
- (that returns EINVAL).
-
- J1:
- at t=0.2 sec it calls task_join on J2, the it ends.
-
- J2:
- it simply waits t=0.4 sec and it ends.
-
- J3:
- First, it calls task_join on J1.
- Then, at t=0.6 sec it locks m1, then unlocks it
-
- J4:
- it simply waits t=1 sec and it ends.
-
-*/
-
-#include "kernel/kern.h"
-#include "drivers/keyb.h"
-
-
-PID j0, j1, j2, j3, j4;
-mutex_t m1;
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-TASK J1()
-{
- int err;
- void *ret;
-
- cprintf("J1: started, waiting 0.2 sec\n");
-
- while (sys_gettime(NULL) < 200000);
-
- cprintf("J1: 0.2 sec reached, joining J2\n");
-
- err = task_join(j2, &ret);
-
- cprintf("J1: join J2 returns %d error %d, exiting\n",
- (int)ret,err);
- return (void *)11;
-}
-
-TASK J2()
-{
- cprintf("J2: started, waiting 0.4 sec\n");
-
- while (sys_gettime(NULL) < 400000);
-
- cprintf("J2: 0.4 sec reached, exiting\n");
-
- return (void *)22;
-}
-
-TASK J3()
-{
- int err;
- void *ret;
-
- cprintf("J3: started, joining J1\n");
-
- err = task_join(j1, &ret);
-
- cprintf("J3: join J1 returns %d error %d, waiting 0.6sec\n", (int)ret, err);
-
- while (sys_gettime(NULL) < 600000);
-
- cprintf("J1: 0.6 sec reached, locking m1\n");
-
- mutex_lock(&m1);
-
- cprintf("J3: locked m1, unlocking m1\n");
-
- mutex_unlock(&m1);
-
- cprintf("J3: unlocked m1, exiting\n");
-
- return (void *)33;
-}
-
-TASK J4()
-{
- cprintf("J4: started, waiting 1 sec\n");
-
- while (sys_gettime(NULL) < 1000000);
-
- cprintf("J4: 1 sec reached, exiting\n");
-
- return (void *)44;
-}
-
-int main(int argc, char **argv)
-{
- NRT_TASK_MODEL m;
-
- PI_mutexattr_t a;
-
- KEY_EVT emerg;
-
- int err;
- void *ret;
-
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- j0 = exec_shadow;
- nrt_task_default_model(m);
- nrt_task_def_joinable(m);
-
- /* ---------------------------------------------------------------------
- Mutex creation
- --------------------------------------------------------------------- */
-
- PI_mutexattr_default(a);
- mutex_init(&m1,&a);
-
-
- /* ---------------------------------------------------------------------
- Let's go !!!!
- --------------------------------------------------------------------- */
-
- cprintf("main: creating J1,J2,J3, locking m1\n");
-
- j1 = task_create("J1", J1, &m, NULL);
- if (j1 == NIL) { cprintf("Can't create J1 task...\n"); return 1; }
- task_activate(j1);
-
- j2 = task_create("J2", J2, &m, NULL);
- if (j2 == NIL) { cprintf("Can't create J2 task...\n"); return 1; }
- task_activate(j2);
-
- mutex_lock(&m1);
-
- j3 = task_create("J3", J3, &m, NULL);
- if (j3 == NIL) { cprintf("Can't create J3 task...\n"); return 1; }
- task_activate(j3);
-
- cprintf("main: waiting t=0.8 sec\n");
-
- while (sys_gettime(NULL) < 800000);
-
- err = task_join(j3, NULL);
-
- cprintf("main: join J3 error %d, unlocking m1\n",err);
-
- mutex_unlock(&m1);
-
- err = task_join(j3, &ret);
-
- cprintf("main: join J3 returns %d error %d, unlocked m1, creating J4\n",
- (int)ret,err);
-
- nrt_task_def_unjoinable(m);
- j4 = task_create("J4", J4, &m, NULL);
- if (j4 == NIL) { cprintf("Can't create J4 task...\n"); return 1; }
-
- task_activate(j4);
-
- err = task_join(j4,&ret);
-
- cprintf("main: join J4 returns %d error %d, exiting\n", (int)ret, err);
-
- return 0;
-}
Index: rel_1_2/base/aster2.c
===================================================================
--- rel_1_2/base/aster2.c (revision 1198)
+++ rel_1_2/base/aster2.c (nonexistent)
@@ -1,241 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: aster2.c,v 1.2 2002-11-11 08:20:44 pj Exp $
-
- this is a part of the classic Hartik demo Aster.
-
- It checks:
- - jet functions
- - The EDF level with many task, with almost full bandwidth used
-
-*/
-
-
-#include "kernel/kern.h"
-#include "modules//edf.h"
-
-int num_aster = 0;
-#define ASTER_LIM 60
-#define DISPLAY_MAX 15
-#define ASTER_MAX 70
-#define STAT_Y 9
-
-// first numbers for wcet and periods are for a 486/25, the others for a
-// celeron 366
-
-#define PER_WCET 13000 /*6200*/
-#define CLOCK_WCET 1200 /* 100*/
-#define ASTER_WCET 1200 /* 100*/
-
-#define ASTER_MEAN_PERIOD 64 /*64*/
-
-#define END_TEST_TIME 60
-
-TASK asteroide(void)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = '*'; s[1] = 0;
-
- /*for (;;)*/ {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 1000; //10000; // 5000 + rand()%5000;
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
- puts_xy(i,y,rand()%15+1,s);
- }
-
- task_endcycle();
-
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
- num_aster--;
- return 0;
-}
-
-TASK aster()
-{
- PID p;
-
- HARD_TASK_MODEL m;
- int r;
- int x; // adaptive bandwidth...
-
- hard_task_default_model(m);
- hard_task_def_wcet(m,PER_WCET);
- hard_task_def_ctrl_jet(m);
-
- x = ASTER_MEAN_PERIOD;
-
- srand(7);
- while (1) {
- if (num_aster < ASTER_MAX) {
- r = (rand() % 200);
-
- hard_task_def_arg(m,(void *)((rand() % 7)+1));
- hard_task_def_mit(m, (x+r)*1000);
- p = task_create("aaa",asteroide,&m,NULL);
- if (p == -1)
- {
- if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
- printf_xy(62,3,WHITE,"adapt=%3u err=%d",
- iq_query_first(&freedesc),errno);
- }
- else {
- num_aster++;
- printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
- task_activate(p);
- x /= 2;
- if (x<50) x = 50;
- }
- }
- task_endcycle();
- }
-}
-
-TASK clock()
-{
- int s = 0, m = 0;
-
- while(1) {
- printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
- printf_xy(62,2,WHITE,"U=%12u",EDF_usedbandwidth(0));
- task_endcycle();
-
- if (++s > 59) {
- s = 0;
- m++;
- }
- printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
- printf_xy(62,2,WHITE,"U=%12u",EDF_usedbandwidth(0));
- task_endcycle();
- }
-}
-
-
-
-/* we consider the first ASTER_MAX + 2 tasks from the PID 2
- and plot on the screen the elapsed times... */
-TASK jetcontrol()
-{
- int i; /* a counter */
- TIME sum, max, curr, last[5];
- int nact;
- int j; /* the elements set by jet_gettable */
- PID p;
-
-
- kern_cli();
- printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
- kern_sti();
-
- for (;;) {
- for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
- if (jet_getstat(p, &sum, &max, &nact, &curr) == -1) continue;
-
- for (j=0; j<5; j++) last[j] = 0;
- jet_gettable(p, &last[0], 5);
- kern_cli();
- printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
- p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
- kern_sti();
- i++;
- }
- }
-}
-
-int main(int argc, char **argv)
-{
- PID p1,p2,p3; //,p4,p5,p6;
- HARD_TASK_MODEL m;
- NRT_TASK_MODEL m_nrt;
- struct timespec t;
-
- clear();
-
- hard_task_default_model(m);
- hard_task_def_wcet(m,ASTER_WCET);
- hard_task_def_mit(m,10000);
- hard_task_def_group(m,1);
- hard_task_def_ctrl_jet(m);
-
- nrt_task_default_model(m_nrt);
- nrt_task_def_group(m_nrt,1);
- nrt_task_def_ctrl_jet(m_nrt);
-
- p1 = task_create("Aster",aster,&m,NULL);
- if (p1 == -1) {
- perror("test7.c(main): Could not create task <aster> ...");
- sys_end();
- }
-
- hard_task_def_mit(m,500000);
- hard_task_def_wcet(m,CLOCK_WCET);
- p2 = task_create("Clock",clock,&m,NULL);
- if (p2 == -1) {
- perror("test7.c(main): Could not create task <Clock> ...");
- sys_end();
- }
-
- p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL);
- if (p2 == -1) {
- perror("test7.c(main): Could not create task <JetControl> ...");
- sys_end();
- }
-
- group_activate(1);
-
- do {
- sys_gettime(&t);
- } while (t.tv_sec < END_TEST_TIME);
-
- sys_end();
-
- return 0;
-}
-
-
-
-
Index: rel_1_2/base/aster3.c
===================================================================
--- rel_1_2/base/aster3.c (revision 1198)
+++ rel_1_2/base/aster3.c (nonexistent)
@@ -1,300 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: aster3.c,v 1.3 2003-01-07 17:10:15 pj Exp $
-
- Test Number 10 (A):
-
- this is a part of the classic Hartik demo Aster.
-
- it is based on aster2.c, with the use of TBS to serve a set of aperiodic
- tasks.
-
- There are APER_MAX tasks sleeping, and when an asteroide task finish
- the current activation, it activate also an aperiodic task chosen
- randomly (if the task chosen is already active, the task_activate do
- nothing!)
-
-
-*/
-
-#include "kernel/kern.h"
-#include "modules//edf.h"
-
-int num_aster = 0;
-#define ASTER_LIM 60
-#define DISPLAY_MAX 15
-#define ASTER_MAX 70
-#define STAT_Y 9
-
-#define APER_MAX 8
-
-/* first numbers runs on a pentium 133, second numbers on a celeron 366 */
-#define PER_WCET 30000 /* 6200 */
-#define APER_WCET 50000 /* 18400 */
-#define CLOCK_WCET 1000 /* 200 */
-#define ASTER_WCET 1000 /* 200 */
-#define MIN_PERIOD 200 /* 64, in ms */
-
-#define APER_REP 22000
-
-PID aper_table[APER_MAX];
-
-TASK asteroide(void)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = '*'; s[1] = 0;
-
- /*for (;;)*/ {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 10000; //8000 + rand()%2000;
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
- puts_xy(i,y,rand()%15+1,s);
- }
-
- task_activate(aper_table[rand()%APER_MAX]);
- task_endcycle();
-
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
- num_aster--;
- return 0;
-}
-
-TASK aper_asteroid(void *a)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
- int c;
-
- char s[2];
-
- c = (int)a;
- s[0] = '*'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = APER_REP; //8000 + rand()%2000;
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
- puts_xy(i,y,rand()%15+1,s);
- }
- s[0] = c;
- puts_xy(i,y,rand()%15+1,s);
-
- task_endcycle();
-
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
-}
-
-TASK aster()
-{
- PID p;
-
- HARD_TASK_MODEL m;
- int r;
- int x; // adaptive bandwidth...
-
- hard_task_default_model(m);
- hard_task_def_wcet(m,PER_WCET);
- hard_task_def_ctrl_jet(m);
-
- x = MIN_PERIOD;
-
- srand(7);
- while (1) {
- if (num_aster < ASTER_MAX) {
- r = (rand() % 200);
-
- hard_task_def_arg(m,(void *)((rand() % 7)+1));
- hard_task_def_mit(m, (x+r)*1000);
- p = task_create("aaa",asteroide,&m,NULL);
- if (p == -1)
- {
- if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
- printf_xy(62,3,WHITE,"adapt=%3u err=%d",
- iq_query_first(&freedesc),errno);
- }
- else {
- num_aster++;
- printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
- task_activate(p);
- x /= 2;
- if (x<50) x = 50;
- }
- }
- task_endcycle();
- }
-}
-
-TASK clock()
-{
- int s = 0, m = 0;
-
- while(1) {
- printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
- printf_xy(62,2,WHITE,"U=%12u",EDF_usedbandwidth(0));
- task_endcycle();
-
- if (++s > 59) {
- s = 0;
- m++;
- }
- printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
- printf_xy(62,2,WHITE,"U=%12u",EDF_usedbandwidth(0));
- task_endcycle();
- }
-}
-
-
-
-/* we consider the first ASTER_MAX + 2 tasks from the PID 2
- and plot on the screen the elapsed times... */
-TASK jetcontrol()
-{
- int i; /* a counter */
- TIME sum, max, curr, last[5];
- int nact;
- int j; /* the elements set by jet_gettable */
- PID p;
-
-
- kern_cli();
- printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
- kern_sti();
-
- for (;;) {
- for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
- if (jet_getstat(p, &sum, &max, &nact, &curr) == -1) continue;
-
- for (j=0; j<5; j++) last[j] = 0;
- jet_gettable(p, &last[0], 5);
- kern_cli();
- printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
- p, (int)sum/(nact==0 ? 1 : nact), (int)max, (int)nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
- kern_sti();
- i++;
- }
- task_endcycle();
- }
-}
-
-int main(int argc, char **argv)
-{
- PID p1,p2;//,p3,p4,p5,p6;
- HARD_TASK_MODEL m;
- NRT_TASK_MODEL m_nrt;
- SOFT_TASK_MODEL m_aper;
- int i;
-
- clear();
-
- hard_task_default_model(m);
- hard_task_def_wcet(m,ASTER_WCET);
- hard_task_def_mit(m,10000);
- hard_task_def_group(m,1);
- hard_task_def_ctrl_jet(m);
-
- nrt_task_default_model(m_nrt);
- nrt_task_def_group(m_nrt,1);
- nrt_task_def_ctrl_jet(m_nrt);
-
- p1 = task_create("Aster",aster,&m,NULL);
- if (p1 == -1) {
- perror("test7.c(main): Could not create task <aster> ...");
- sys_end();
- }
-
- hard_task_def_mit(m,500000);
- hard_task_def_wcet(m,CLOCK_WCET);
- p2 = task_create("Clock",clock,&m,NULL);
- if (p2 == -1) {
- perror("test7.c(main): Could not create task <Clock> ...");
- sys_end();
- }
-
- soft_task_default_model(m_aper);
- soft_task_def_wcet(m_aper,APER_WCET);
- soft_task_def_ctrl_jet(m_aper);
- soft_task_def_aperiodic(m_aper);
-
- soft_task_def_level(m_aper, 2);
- aper_table[0] = task_create("JetControl",jetcontrol,&m_aper,NULL);
- if (aper_table[0] == -1) {
- perror("test7.c(main): Could not create task <JetControl> ...");
- sys_end();
- }
-
- for (i=1; i<APER_MAX; i++) {
- soft_task_def_level(m_aper, i/4 + 2);
- soft_task_def_arg(m_aper, (void *)(i/4 ? 'Û' : '±'));
- aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
- if (aper_table[i] == -1) {
- perror("test7.c(main): Could not create task <aper> ...");
- sys_end();
- }
- }
-
-
- group_activate(1);
-
- {
- struct timespec t;
- do {
- sys_gettime(&t);
- } while (t.tv_sec < 60);
- }
-
- sys_end();
- return 0;
-}
-
Index: rel_1_2/base/mdemo.c
===================================================================
--- rel_1_2/base/mdemo.c (revision 1198)
+++ rel_1_2/base/mdemo.c (nonexistent)
@@ -1,200 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: mdemo.c,v 1.1 2002-11-11 08:22:46 pj Exp $
-
- This test verify the correctness of the NOP module. It works with the
- PI, PC, SRP module, too.
-
- The test uses one mutex
-
- the main task (NRT) creates three tasks.
-
- J1 with PC priority 0
- starts at t=0.5 sec and lock m0
-
- J2 with PC priority 1
- starts at t=1 sec and doesn't lock any mutex
-
- J3 with PC priority 2
- it starts and locks m0
- at t=2 sec it unlocks m1
-
-
- The example is similar to the scheduling diagram shown at p. 188 of the
- book "Sistemi in tempo Reale", by Giorgio Buttazzo, Pitagora Editrice
-
-*/
-
-#include "kernel/kern.h"
-#include "drivers/keyb.h"
-#include "modules/srp.h"
-
-mutex_t m0;
-
-
-void startJ(void *a)
-{
- task_activate((PID)a);
-}
-
-TASK j1()
-{
- cprintf("J1: before locking m0\n");
- mutex_lock(&m0);
- cprintf("J1: locked m0\n");
- mutex_unlock(&m0);
- cprintf("J1: unlocked m0, end task\n");
- return 0;
-}
-
-
-TASK j2()
-{
- cprintf("J2: waiting t=1.5 sec\n");
-
- while (sys_gettime(NULL) < 1500000);
-
- cprintf("J2: end task\n");
- return 0;
-}
-
-
-TASK j3()
-{
- cprintf("J3: before locking m0\n");
- mutex_lock(&m0);
- cprintf("J3: locked m0, waiting to t=2 sec\n");
-
- while (sys_gettime(NULL) < 2000000);
-
- cprintf("J3: t = 1 sec reached, unlocking m0\n");
- mutex_unlock(&m0);
- cprintf("J3: unlocked m0, end task\n");
- return 0;
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-
-int main(int argc, char **argv)
-{
- struct timespec t;
-
- HARD_TASK_MODEL m;
- PID p0,p1,p2;
-
- PC_mutexattr_t a;
- PI_mutexattr_t a2;
- NOP_mutexattr_t a3;
- SRP_mutexattr_t a4;
- NPP_mutexattr_t a5;
-
- PC_RES_MODEL r;
- SRP_RES_MODEL srp;
-
- KEY_EVT emerg;
-
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- /* ---------------------------------------------------------------------
- Mutex creation
- --------------------------------------------------------------------- */
-
- PC_mutexattr_default(a,0);
- PI_mutexattr_default(a2);
- NOP_mutexattr_default(a3);
- SRP_mutexattr_default(a4);
- NPP_mutexattr_default(a5);
- mutex_init(&m0,&a4);
-
- /* ---------------------------------------------------------------------
- Task creation
- --------------------------------------------------------------------- */
-
- hard_task_default_model(m);
- hard_task_def_wcet(m,20000);
- hard_task_def_mit(m,10000000);
- PC_res_default_model(r,0);
- SRP_res_default_model(srp,3);
- p0 = task_createn("J1", j1, (TASK_MODEL *)&m, &r, &srp, SRP_usemutex(&m0), NULL);
- if (p0 == NIL)
- { cprintf("Can't create J1 task...\n"); return 1; }
-
- hard_task_def_wcet(m,1600000);
- hard_task_def_mit(m,21000000);
- PC_res_default_model(r,1);
- SRP_res_default_model(srp,2);
- p1 = task_createn("J2", j2, (TASK_MODEL *)&m, &r, &srp, NULL);
- if (p1 == NIL)
- { cprintf("Can't create J2 task...\n"); return 1; }
-
- hard_task_def_wcet(m,3000000);
- hard_task_def_mit(m,100000000);
- PC_res_default_model(r,2);
- SRP_res_default_model(srp,1);
- p2 = task_createn("J3", j3, (TASK_MODEL *)&m, &r, &srp, SRP_usemutex(&m0), NULL);
- if (p2 == NIL)
- { cprintf("Can't create J3 task...\n"); return 1; }
-
-
- /* ---------------------------------------------------------------------
- Event post
- --------------------------------------------------------------------- */
-
- t.tv_sec = 0;
- t.tv_nsec = 500000000;
-
- kern_cli();
- kern_event_post(&t,startJ,(void *)p0);
-
- t.tv_sec = 1;
- kern_event_post(&t,startJ,(void *)p1);
- kern_sti();
-
- task_activate(p2);
-
- cprintf("END main\n");
-
- return 0;
-}
Index: rel_1_2/base/aster4.c
===================================================================
--- rel_1_2/base/aster4.c (revision 1198)
+++ rel_1_2/base/aster4.c (nonexistent)
@@ -1,399 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: aster4.c,v 1.1 2002-11-11 08:22:45 pj Exp $
-
- Test Number 13 (D):
-
- this is a part of the classic Hartik demo Aster, and it is based on aster 3.
-
- The demo creates:
- - a set of TBS tasks assigned to 2 TBS servers initialized with different bandwidth.
-
- - a set of periodic tasks, just to make noise (function asteroide)
-
- - a set of CBS tasks that are created to fill the available free
- bandwidth (function soft_aster)
-
- - a few service task (the one that creates the CBS tasks (aster), a clock,
- JET info visualization
-
- - a set of never ending "system tasks" that simulate a device driver
- task that will end only at shutdown (function aper_asteroid)
-
- - a keyboard task that will execute an hook to terminate the system
-
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "drivers/keyb.h"
-
-int num_aster = 0;
-#define ASTER_LIM 60
-#define DISPLAY_MAX 15
-#define ASTER_MAX 70
-#define STAT_Y 9
-
-#define PER_MAX 5
-#define APER_MAX 8
-
-// These numbers works on a Pentium 133 */
-#define PER_WCET 25000
-#define APER_WCET 53000
-#define CLOCK_WCET 1000
-#define ASTER_WCET 1000
-#define SOFT_MET 6300
-
-#define APER_REP 22000
-
-PID aper_table[APER_MAX];
-
-int shutting_down = 0;
-
-TASK asteroide(void)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = '*'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 10000; //8000 + rand()%2000;
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
- puts_xy(i,y,rand()%15+1,s);
- }
-
- task_activate(aper_table[rand()%APER_MAX]);
- task_endcycle();
-
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
- //num_aster--;
-}
-
-TASK aper_asteroid(void *a)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
- int c;
-
- char s[2];
-
- c = (int)a;
- s[0] = '*'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = APER_REP; //8000 + rand()%2000;
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
- puts_xy(i,y,rand()%15+1,s);
- }
- s[0] = c;
- puts_xy(i,y,rand()%15+1,s);
-
- if (shutting_down) {
- cprintf("Ending System Task %d\n",exec_shadow);
- return 0;
- }
-
- task_endcycle();
-
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
-}
-
-TASK soft_aster(void)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = '*'; s[1] = 0;
-
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 1000 + rand()%9000;
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
- puts_xy(i,y,rand()%15+1,s);
- }
- s[0] = 1;
- puts_xy(i,y,rand()%15+1,s);
-
- task_activate(aper_table[rand()%APER_MAX]);
- task_endcycle();
-
- puts_xy(i,y,WHITE," ");
- i++;
- }
- num_aster--;
- return 0;
-}
-
-TASK aster()
-{
- PID p;
-
- HARD_TASK_MODEL m;
- SOFT_TASK_MODEL m_soft;
- int r;
- int x; // adaptive bandwidth...
-
- srand(7);
-
- /* create a set of periodic tasks, just to make noise */
- hard_task_default_model(m);
- hard_task_def_wcet(m,PER_WCET);
- hard_task_def_ctrl_jet(m);
- for (x=0; x<PER_MAX; x++) {
- r = (rand() % 200);
- hard_task_def_mit(m, (64+r)*1000);
- p = task_create("per",asteroide,&m,NULL);
- if (p!=-1) task_activate(p);
- }
-
- soft_task_default_model(m_soft);
- soft_task_def_met(m_soft,SOFT_MET);
- soft_task_def_ctrl_jet(m_soft);
-
- x = 64;
-
- while (1) {
- if (num_aster < ASTER_MAX) {
- r = (rand() % 200);
-
- soft_task_def_period(m_soft, (x+r)*1000);
- p = task_create("aaa",soft_aster,&m_soft,NULL);
- if (p == -1)
- {
- if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
- printf_xy(62,3,WHITE,"adapt=%3u err=%d",
- iq_query_first(&freedesc),errno);
- }
- else {
- num_aster++;
- printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
- task_activate(p);
- x /= 2;
- if (x<50) x = 50;
- }
- }
- task_endcycle();
- }
-}
-
-TASK clock()
-{
- int s = 0, m = 0;
-
- while(1) {
- printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
- printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
- printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(4));
- task_endcycle();
-
- if (++s > 59) {
- s = 0;
- m++;
- }
- printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
- printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
- printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(4));
- task_endcycle();
- }
-}
-
-
-
-/* we consider the first ASTER_MAX + 2 tasks from the PID 2
- and plot on the screen the elapsed times... */
-TASK jetcontrol()
-{
- int i; /* a counter */
- TIME sum, max, curr, last[5];
- int nact;
- int j; /* the elements set by jet_gettable */
- PID p;
-
-
- kern_cli();
- printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
- kern_sti();
-
- for (;;) {
- for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
- if (jet_getstat(p, &sum, &max, &nact, &curr) == -1 ||
- (proc_table[p].pclass & 0xFF00) == HARD_PCLASS) continue;
-
- for (j=0; j<5; j++) last[j] = 0;
- jet_gettable(p, &last[0], 5);
- kern_cli();
- if (proc_table[p].task_level == 4)
- printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
- p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)CBS_get_nact(4,p), (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
- else
- printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
- p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
- kern_sti();
- i++;
- }
- }
-}
-
-void endfun(KEY_EVT *k)
-{
- sys_end();
-}
-
-void exiting(void *arg)
-{
- cprintf("System shut down...\n");
- shutting_down = 1;
-}
-
-int main(int argc, char **argv)
-{
- KEY_EVT k;
-
- PID p1,p2,p3;
- HARD_TASK_MODEL m;
- SOFT_TASK_MODEL m_aper;
- SOFT_TASK_MODEL m_soft;
- int i;
-
- k.flag = 0;
- k.scan = KEY_ENT;
- k.ascii = 13;
- keyb_hook(k, endfun);
-
- clear();
- cprintf("Press ENTER to end the demo...");
-
- sys_atrunlevel(exiting, NULL, RUNLEVEL_SHUTDOWN);
-
- hard_task_default_model(m);
- hard_task_def_wcet(m,ASTER_WCET);
- hard_task_def_mit(m,10000);
- hard_task_def_group(m,1);
- hard_task_def_ctrl_jet(m);
-
- soft_task_default_model(m_soft);
- soft_task_def_met(m_soft,1000);
- soft_task_def_period(m_soft,100000);
- soft_task_def_group(m_soft,1);
- soft_task_def_ctrl_jet(m_soft);
- soft_task_def_aperiodic(m_soft);
-
-
- p1 = task_create("Aster",aster,&m,NULL);
- if (p1 == -1) {
- perror("aster4.c(main): Could not create task <aster> ...");
- sys_end();
- }
-
- hard_task_def_mit(m,500000);
- hard_task_def_wcet(m,CLOCK_WCET);
- p2 = task_create("Clock",clock,&m,NULL);
- if (p2 == -1) {
- perror("aster4.c(main): Could not create task <Clock> ...");
- sys_end();
- }
-
- p3 = task_create("JetControl",jetcontrol,&m_soft,NULL);
- if (p3 == -1) {
- perror("aster4.c(main): Could not create task <JetControl> ...");
- sys_end();
- }
-
- soft_task_default_model(m_aper);
- soft_task_def_wcet(m_aper,APER_WCET);
- soft_task_def_ctrl_jet(m_aper);
- soft_task_def_system(m_aper);
- soft_task_def_aperiodic(m_aper);
-
- for (i=0; i<APER_MAX; i++) {
- soft_task_def_level(m_aper, i/4 + 2);
- soft_task_def_arg(m_aper, (void *)(i/4 ? 'Û' : '±'));
- aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
- if (aper_table[i] == -1) {
- perror("aster4.c(main): Could not create task <aper> ...");
- sys_end();
- }
- }
-
- group_activate(1);
- return 0;
-}
-
Index: rel_1_2/base/isemdemo.c
===================================================================
--- rel_1_2/base/isemdemo.c (revision 1198)
+++ rel_1_2/base/isemdemo.c (nonexistent)
@@ -1,98 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: isemdemo.c,v 1.1 2002-11-11 08:22:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2002-11-11 08:22:45 $
- ------------
-
- The simplest initialization file
-
- The tick is set to TICK ms.
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- a RR (Round Robin) level
- a Dummy level
-
- It can accept these task models:
-
- NRT_TASK_MODEL at level 0
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-#include "modules/sem.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 300
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/base/aster5.c
===================================================================
--- rel_1_2/base/aster5.c (revision 1198)
+++ rel_1_2/base/aster5.c (nonexistent)
@@ -1,490 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai, Gerardo Lamastra and Giuseppe Lipari
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: aster5.c,v 1.2 2003-01-07 17:10:15 pj Exp $
-
- this is a part of the classic Hartik demo Aster.
-
- it is based on test 13 (d), and use the CBS to serve the periodic tasks.
-
- There are not periodic tasks, only CBS tasks.
-
- The tasks use a PI, NPP or NOP mutex to access the video memory.
-
- A flag (LONGSC) is provided to try long and short critical sections.
-
- This demo is really interesting because you can note the behavior of
- the system, and the differences between the various protocols...
-
-*/
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "drivers/keyb.h"
-
-int num_aster = 0;
-#define ASTER_LIM 60
-#define DISPLAY_MAX 15
-#define ASTER_MAX 70
-#define STAT_Y 9
-
-#define PER_MAX 5
-#define APER_MAX 8
-
-#define PER_WCET 6200
-#define APER_WCET 18400
-#define JET_WCET 10000
-#define JET_PERIOD 100000
-
-#define APER_REP 22000
-
-//PID aper_table[APER_MAX];
-
-mutex_t m1;
-
-
-#define PIMUTEX
-//#define NPPMUTEX
-//#define NOPMUTEX
-
-#define LONGSC
-
-#ifdef LONGSC
-#define SOFT_MET 3000 /* 3000 12000 */
-#define CLOCK_WCET 400 /* 200 300*/
-#define ASTER_WCET 400 /* 200 300*/
-#else
-#define SOFT_MET 80000 /* 4500 */
-#define CLOCK_WCET 2000 /* 200*/
-#define ASTER_WCET 2000 /* 200*/
-#endif
-
-TASK asteroide(void)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = '*'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 10000; //8000 + rand()%2000;
-#ifdef LONGSC
- mutex_lock(&m1);
-#endif
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
-#ifndef LONGSC
- mutex_lock(&m1);
-#endif
- puts_xy(i,y,rand()%15+1,s);
-#ifndef LONGSC
- mutex_unlock(&m1);
-#endif
- }
-#ifdef LONGSC
- mutex_unlock(&m1);
-#endif
-
- // task_activate(aper_table[rand()%APER_MAX]);
- task_endcycle();
-
- mutex_lock(&m1);
- puts_xy(i,y,WHITE," ");
- mutex_unlock(&m1);
- i++;
- }
- }
- //num_aster--;
-}
-
-TASK aper_asteroid(void *a)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
- int c;
-
- char s[2];
-
- c = (int)a;
- s[0] = '*'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = APER_REP; //8000 + rand()%2000;
-#ifdef LONGSC
- mutex_lock(&m1);
-#endif
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
-#ifndef LONGSC
- mutex_lock(&m1);
-#endif
- puts_xy(i,y,rand()%15+1,s);
-#ifndef LONGSC
- mutex_unlock(&m1);
-#endif
- }
- s[0] = c;
-#ifndef LONGSC
- mutex_lock(&m1);
-#endif
- puts_xy(i,y,rand()%15+1,s);
- mutex_unlock(&m1);
-
- task_endcycle();
-
- mutex_lock(&m1);
- puts_xy(i,y,WHITE," ");
- mutex_unlock(&m1);
- i++;
- }
- }
-}
-
-TASK soft_aster(void)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = '*'; s[1] = 0;
-
- /*for (;;)*/ {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 1000 + rand()%9000;
-#ifdef LONGSC
- mutex_lock(&m1);
-#endif
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
-#ifndef LONGSC
- mutex_lock(&m1);
-#endif
- puts_xy(i,y,rand()%15+1,s);
-#ifndef LONGSC
- mutex_unlock(&m1);
-#endif
- }
- s[0] = 1;
-#ifndef LONGSC
- mutex_lock(&m1);
-#endif
- puts_xy(i,y,rand()%15+1,s);
- mutex_unlock(&m1);
-
- // task_activate(aper_table[rand()%APER_MAX]);
- task_endcycle();
-
- mutex_lock(&m1);
- puts_xy(i,y,WHITE," ");
- mutex_unlock(&m1);
- i++;
- }
- }
- num_aster--;
- return 0;
-}
-
-TASK aster()
-{
- PID p;
- // HARD_TASK_MODEL m;
- SOFT_TASK_MODEL m_soft;
- int r;
- int x; // adaptive bandwidth...
-
- srand(7);
-
- /* periodic_task_default_model(m,0,PER_WCET);
- periodic_task_def_ctrl_jet(m);
- for (x=0; x<PER_MAX; x++) {
- r = (rand() % 200);
- periodic_task_def_period(m, (64+r)*1000);
- p = task_create("per",asteroide,&m,NULL);
- if (p!=-1) task_activate(p);
- }
- */
- soft_task_default_model(m_soft);
- soft_task_def_met(m_soft,SOFT_MET);
- soft_task_def_ctrl_jet(m_soft);
-
- x = 128; //64;
-
- while (1) {
- /* {
- PID p;
- int x;
- p = level_table[0]->level_scheduler(0);
- printf_xy(1,8,WHITE," ");
-
- x = 0;
- do {
- printf_xy(3*x+1,8,WHITE,"%3d",p);
- p = proc_table[p].next;
- x++;
- } while (p != NIL);
- }
- */
- if (num_aster < ASTER_MAX) {
- r = (rand() % 200);
-
- soft_task_def_period(m_soft, (x+r)*1000);
- p = task_create("aaa",soft_aster,&m_soft,NULL);
- if (p == -1)
- {
- if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
- mutex_lock(&m1);
- printf_xy(62,3,WHITE,"adapt=%3u err=%d",
- iq_query_first(&freedesc),errno);
- mutex_unlock(&m1);
- }
- else {
- num_aster++;
- mutex_lock(&m1);
- printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
- mutex_unlock(&m1);
-
- task_activate(p);
- x /= 2;
- if (x<50) x = 50;
- }
- }
- task_endcycle();
- }
-}
-
-TASK clock()
-{
- int s = 0, m = 0;
-
- while(1) {
- mutex_lock(&m1);
- printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
- printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
- printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(2));
-
- mutex_unlock(&m1);
- task_endcycle();
-
- if (++s > 59) {
- s = 0;
- m++;
- }
- mutex_lock(&m1);
- printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
- printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
- printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(2));
- mutex_unlock(&m1);
- task_endcycle();
- }
-}
-
-
-
-/* we consider the first ASTER_MAX + 2 tasks from the PID 2
- and plot on the screen the elapsed times... */
-TASK jetcontrol()
-{
- int i; /* a counter */
- TIME sum, max, curr, last[5];
- int nact;
- int j; /* the elements set by jet_gettable */
- PID p;
-
-
- mutex_lock(&m1);
- printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
- mutex_unlock(&m1);
-
- for (;;) {
- for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
- if (jet_getstat(p, &sum, &max, &nact, &curr) == -1 /*||
- (proc_table[p].pclass & 0xFF00) == APERIODIC_PCLASS ||
- (proc_table[p].pclass & 0xFF00) == PERIODIC_PCLASS*/ ) continue;
-
- for (j=0; j<5; j++) last[j] = 0;
- jet_gettable(p, &last[0], 5);
- mutex_lock(&m1);
- if (proc_table[p].task_level == 2)
- printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³p%-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
- p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)CBS_get_nact(2,p), (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
- // p, sum/(nact==0 ? 1 : nact), max, proc_table[p].avail_time, proc_table[p].status, proc_table[p].shadow, proc_table[p].timespec_priority.tv_sec,proc_table[p].timespec_priority.tv_nsec/1000 , CBS_get_nact(2,p), last[4]);
- else
- printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
- p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
- // p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)proc_table[p].status, (int)proc_table[p].shadow, (int)proc_table[p].timespec_priority.tv_sec,(int)proc_table[p].timespec_priority.tv_nsec/1000 , (int)last[3], (int)last[4]);
- mutex_unlock(&m1);
- i++;
- }
- }
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-int main(int argc, char **argv)
-{
- PID p1,p2,p3;//,p4,p5,p6;
- HARD_TASK_MODEL m;
- // NRT_TASK_MODEL m_nrt;
- SOFT_TASK_MODEL m_aper;
- SOFT_TASK_MODEL m_soft;
- // int i;
- struct timespec fineprg;
-
-#ifdef PIMUTEX
- PI_mutexattr_t a;
-#endif
-
-#ifdef NPPMUTEX
- NPP_mutexattr_t a;
-#endif
-
-#ifdef NOPMUTEX
- NOP_mutexattr_t a;
-#endif
-
- KEY_EVT emerg;
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- clear();
-
- hard_task_default_model(m);
- hard_task_def_wcet(m,ASTER_WCET);
- hard_task_def_mit(m,100000);
- hard_task_def_group(m,1);
- hard_task_def_ctrl_jet(m);
-
- // nrt_task_default_model(m_nrt);
- // nrt_task_def_group(m_nrt,1);
- // nrt_task_def_ctrl_jet(m_nrt);
-
-
- soft_task_default_model(m_aper);
- soft_task_def_group(m_aper,1);
- soft_task_def_ctrl_jet(m_aper);
- soft_task_def_aperiodic(m_aper);
-
- soft_task_default_model(m_soft);
- soft_task_def_period(m_soft,JET_PERIOD);
- soft_task_def_met(m_soft,JET_WCET);
- soft_task_def_group(m_soft,1);
- soft_task_def_ctrl_jet(m_soft);
- soft_task_def_aperiodic(m_soft);
-
-
- p1 = task_create("Aster",aster,&m,NULL);
- if (p1 == -1) {
- perror("test7.c(main): Could not create task <aster> ...");
- sys_end();
- l1_exit(-1);
- }
-
- hard_task_def_mit(m,500000);
- hard_task_def_wcet(m,CLOCK_WCET);
- p2 = task_create("Clock",clock,&m,NULL);
- if (p2 == -1) {
- perror("test7.c(main): Could not create task <Clock> ...");
- sys_end();
- l1_exit(-1);
- }
-
- // p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL);
- p3 = task_create("JetControl",jetcontrol,&m_soft,NULL);
- if (p2 == -1) {
- perror("test7.c(main): Could not create task <JetControl> ...");
- sys_end();
- l1_exit(-1);
- }
- /*
- aperiodic_task_default_model(m_aper,APER_WCET);
- aperiodic_task_def_ctrl_jet(m_aper);
- aperiodic_task_def_system(m_aper);
-
- for (i=0; i<APER_MAX; i++) {
- aperiodic_task_def_level(m_aper, i/4 + 2);
- aperiodic_task_def_arg(m_aper, (i/4 ? 'Û' : '±'));
- aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
- if (aper_table[i] == -1) {
- perror("test7.c(main): Could not create task <aper> ...");
- sys_end();
- l1_exit(-1);
- }
- }
- */
- task_nopreempt();
-
-#ifdef PIMUTEX
- PI_mutexattr_default(a);
-#endif
-
-#ifdef NPPMUTEX
- NPP_mutexattr_default(a);
-#endif
-
-#ifdef NOPMUTEX
- NOP_mutexattr_default(a);
-#endif
-
- mutex_init(&m1, &a);
-
- fineprg.tv_sec = 1800;
- fineprg.tv_nsec = 0;
- //kern_event_post(&fineprg,(void (*)(void *))fine,NULL);
- group_activate(1);
- return 0;
-}
-
Index: rel_1_2/base/hello.c
===================================================================
--- rel_1_2/base/hello.c (revision 1198)
+++ rel_1_2/base/hello.c (nonexistent)
@@ -1,53 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-/*
- CVS : $Id: hello.c,v 1.1 2002-10-28 08:13:37 pj Exp $
-
- hello.c:
-
- This test is a simple hello world function.
-
-*/
-
-#include "kernel/kern.h"
-
-int main(int argc, char **argv)
-{
- cprintf("Hello, world!\n");
-
- return 0;
-}
Index: rel_1_2/base/aster6.c
===================================================================
--- rel_1_2/base/aster6.c (revision 1198)
+++ rel_1_2/base/aster6.c (nonexistent)
@@ -1,484 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai, Gerardo Lamastra and Giuseppe Lipari
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: aster6.c,v 1.2 2003-01-07 17:10:15 pj Exp $
-
- this is a part of the classic Hartik demo Aster.
-
- it is based on test 17 (h), and the JobControl Task uses an
- SOFT_TASK_MODEL served by a polling server
-
-*/
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "drivers/keyb.h"
-
-int num_aster = 0;
-#define ASTER_LIM 60
-#define DISPLAY_MAX 15
-#define ASTER_MAX 70
-#define STAT_Y 9
-
-#define PER_MAX 5
-#define APER_MAX 8
-
-#define PER_WCET 6200
-#define APER_WCET 18400
-#define JET_WCET 10000
-
-#define APER_REP 22000
-
-PID aper_table[APER_MAX];
-
-mutex_t m1;
-
-
-#define PIMUTEX
-//#define NPPMUTEX
-//#define NOPMUTEX
-
-#define LONGSC
-
-#ifdef LONGSC
-#define SOFT_MET 3000 /* 12000 */
-#define CLOCK_WCET 200 /* 300*/
-#define ASTER_WCET 200 /* 300*/
-#else
-#define SOFT_MET 80000 /* 4500 */
-#define CLOCK_WCET 2000 /* 200*/
-#define ASTER_WCET 2000 /* 200*/
-#endif
-
-TASK asteroide(void)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = '*'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 10000; //8000 + rand()%2000;
-#ifdef LONGSC
- mutex_lock(&m1);
-#endif
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
-#ifndef LONGSC
- mutex_lock(&m1);
-#endif
- puts_xy(i,y,rand()%15+1,s);
-#ifndef LONGSC
- mutex_unlock(&m1);
-#endif
- }
-#ifdef LONGSC
- mutex_unlock(&m1);
-#endif
-
- task_activate(aper_table[rand()%APER_MAX]);
- task_endcycle();
-
- mutex_lock(&m1);
- puts_xy(i,y,WHITE," ");
- mutex_unlock(&m1);
- i++;
- }
- }
- //num_aster--;
-}
-
-TASK aper_asteroid(void *a)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
- int c;
-
- char s[2];
-
- c = (int)a;
- s[0] = '*'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = APER_REP; //8000 + rand()%2000;
-#ifdef LONGSC
- mutex_lock(&m1);
-#endif
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
-#ifndef LONGSC
- mutex_lock(&m1);
-#endif
- puts_xy(i,y,rand()%15+1,s);
-#ifndef LONGSC
- mutex_unlock(&m1);
-#endif
- }
- s[0] = c;
-#ifndef LONGSC
- mutex_lock(&m1);
-#endif
- puts_xy(i,y,rand()%15+1,s);
- mutex_unlock(&m1);
-
- task_endcycle();
-
- mutex_lock(&m1);
- puts_xy(i,y,WHITE," ");
- mutex_unlock(&m1);
- i++;
- }
- }
-}
-
-TASK soft_aster(void)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = '*'; s[1] = 0;
-
- /*for (;;)*/ {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 1000 + rand()%9000;
-#ifdef LONGSC
- mutex_lock(&m1);
-#endif
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
-#ifndef LONGSC
- mutex_lock(&m1);
-#endif
- puts_xy(i,y,rand()%15+1,s);
-#ifndef LONGSC
- mutex_unlock(&m1);
-#endif
- }
- s[0] = 1;
-#ifndef LONGSC
- mutex_lock(&m1);
-#endif
- puts_xy(i,y,rand()%15+1,s);
- mutex_unlock(&m1);
-
- task_activate(aper_table[rand()%APER_MAX]);
- task_endcycle();
-
- mutex_lock(&m1);
- puts_xy(i,y,WHITE," ");
- mutex_unlock(&m1);
- i++;
- }
- }
- num_aster--;
- return 0;
-}
-
-TASK aster()
-{
- PID p;
-
- // HARD_TASK_MODEL m;
- SOFT_TASK_MODEL m_soft;
- int r;
- int x; // adaptive bandwidth...
-
- srand(7);
-
- /* periodic_task_default_model(m,0,PER_WCET);
- periodic_task_def_ctrl_jet(m);
- for (x=0; x<PER_MAX; x++) {
- r = (rand() % 200);
- periodic_task_def_period(m, (64+r)*1000);
- p = task_create("per",asteroide,&m,NULL);
- if (p!=-1) task_activate(p);
- }
- */
- soft_task_default_model(m_soft);
- soft_task_def_met(m_soft,SOFT_MET);
- soft_task_def_ctrl_jet(m_soft);
-
- x = 128; //64;
-
- while (1) {
- /* {
- PID p;
- int x;
- p = level_table[0]->level_scheduler(0);
- printf_xy(1,8,WHITE," ");
-
- x = 0;
- do {
- printf_xy(3*x+1,8,WHITE,"%3d",p);
- p = proc_table[p].next;
- x++;
- } while (p != NIL);
- }
- */
- if (num_aster < ASTER_MAX) {
- r = (rand() % 200);
-
- soft_task_def_period(m_soft, (x+r)*1000);
- p = task_create("aaa",soft_aster,&m_soft,NULL);
- if (p == -1)
- {
- if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
- mutex_lock(&m1);
- printf_xy(62,3,WHITE,"adapt=%3u err=%d",
- iq_query_first(&freedesc),errno);
- mutex_unlock(&m1);
- }
- else {
- num_aster++;
- mutex_lock(&m1);
- printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
- mutex_unlock(&m1);
- task_activate(p);
- x /= 2;
- if (x<50) x = 50;
- }
- }
- task_endcycle();
- }
-}
-
-TASK clock()
-{
- int s = 0, m = 0;
-
- while(1) {
- mutex_lock(&m1);
- printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
- printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
- printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(2));
-
- mutex_unlock(&m1);
-
- task_endcycle();
-
- if (++s > 59) {
- s = 0;
- m++;
- }
- mutex_lock(&m1);
- printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
- printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
- printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(2));
- mutex_unlock(&m1);
- task_endcycle();
- }
-}
-
-
-
-/* we consider the first ASTER_MAX + 2 tasks from the PID 2
- and plot on the screen the elapsed times... */
-TASK jetcontrol()
-{
- int i; /* a counter */
- TIME sum, max, curr, last[5];
- int nact;
- int j; /* the elements set by jet_gettable */
- PID p;
-
-
- mutex_lock(&m1);
- printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
- mutex_unlock(&m1);
-
- for (;;) {
- for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
- if (jet_getstat(p, &sum, &max, &nact, &curr) == -1 /*||
- (proc_table[p].pclass & 0xFF00) == APERIODIC_PCLASS ||
- (proc_table[p].pclass & 0xFF00) == PERIODIC_PCLASS*/ ) continue;
-
- for (j=0; j<5; j++) last[j] = 0;
- jet_gettable(p, &last[0], 5);
- mutex_lock(&m1);
- if (proc_table[p].task_level == 2)
- printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
- p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)CBS_get_nact(2,p), (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
- // p, sum/(nact==0 ? 1 : nact), max, proc_table[p].avail_time, proc_table[p].status, proc_table[p].shadow, proc_table[p].timespec_priority.tv_sec,proc_table[p].timespec_priority.tv_nsec/1000 , CBS_get_nact(2,p), last[4]);
- else
- printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
- p, (int)sum/(nact==0 ? 1 : nact), (int)max, (int)nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
- // p, sum/(nact==0 ? 1 : nact), max, nact, proc_table[p].status, proc_table[p].shadow, proc_table[p].timespec_priority.tv_sec,proc_table[p].timespec_priority.tv_nsec/1000 , last[3], last[4]);
- mutex_unlock(&m1);
- i++;
- }
- }
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-int main(int argc, char **argv)
-{
- PID p1,p2,p3; //,p4,p5,p6;
- HARD_TASK_MODEL m;
- // NRT_TASK_MODEL m_nrt;
- SOFT_TASK_MODEL m_aper;
- SOFT_TASK_MODEL m_soft;
- // int i;
- struct timespec fineprg;
-
-#ifdef PIMUTEX
- PI_mutexattr_t a;
-#endif
-
-#ifdef NPPMUTEX
- NPP_mutexattr_t a;
-#endif
-
-#ifdef NOPMUTEX
- NOP_mutexattr_t a;
-#endif
-
-
- KEY_EVT emerg;
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- clear();
-
- hard_task_default_model(m);
- hard_task_def_mit(m,100000);
- hard_task_def_wcet(m,ASTER_WCET);
- hard_task_def_group(m,1);
- hard_task_def_ctrl_jet(m);
-
- // nrt_task_default_model(m_nrt);
- // nrt_task_def_group(m_nrt,1);
- // nrt_task_def_ctrl_jet(m_nrt);
-
-
- soft_task_default_model(m_aper);
- soft_task_def_group(m_aper,1);
- soft_task_def_ctrl_jet(m_aper);
- soft_task_def_aperiodic(m_aper);
-
- soft_task_default_model(m_soft);
- soft_task_def_period(m_soft,100000);
- soft_task_def_met(m_soft,JET_WCET);
- soft_task_def_group(m_soft,1);
- soft_task_def_ctrl_jet(m_soft);
- soft_task_def_aperiodic(m_soft);
-
-
- p1 = task_create("Aster",aster,&m,NULL);
- if (p1 == -1) {
- perror("test7.c(main): Could not create task <aster> ...");
- sys_end();
- l1_exit(-1);
- }
-
- hard_task_def_mit(m,500000);
- hard_task_def_wcet(m,CLOCK_WCET);
- p2 = task_create("Clock",clock,&m,NULL);
- if (p2 == -1) {
- perror("test7.c(main): Could not create task <Clock> ...");
- sys_end();
- l1_exit(-1);
- }
-
- // p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL);
- p3 = task_create("JetControl",jetcontrol,&m_aper,NULL);
- if (p3 == -1) {
- perror("test7.c(main): Could not create task <JetControl> ...");
- sys_end();
- l1_exit(-1);
- }
- /*
- aperiodic_task_default_model(m_aper,APER_WCET);
- aperiodic_task_def_ctrl_jet(m_aper);
- aperiodic_task_def_system(m_aper);
-
- for (i=0; i<APER_MAX; i++) {
- aperiodic_task_def_level(m_aper, i/4 + 2);
- aperiodic_task_def_arg(m_aper, (i/4 ? 'Û' : '±'));
- aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
- if (aper_table[i] == -1) {
- perror("test7.c(main): Could not create task <aper> ...");
- sys_end();
- l1_exit(-1);
- }
- }
- */
- task_nopreempt();
-
-#ifdef PIMUTEX
- PI_mutexattr_default(a);
-#endif
-
-#ifdef NPPMUTEX
- NPP_mutexattr_default(a);
-#endif
-
-#ifdef NOPMUTEX
- NOP_mutexattr_default(a);
-#endif
-
- mutex_init(&m1, &a);
-
- fineprg.tv_sec = 1800;
- fineprg.tv_nsec = 0;
- kern_event_post(&fineprg,(void (*)(void *))fine,NULL);
- group_activate(1);
-
- return 0;
-}
-
Index: rel_1_2/base/aster7.c
===================================================================
--- rel_1_2/base/aster7.c (revision 1198)
+++ rel_1_2/base/aster7.c (nonexistent)
@@ -1,307 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Giorgio Buttazzo, Paolo Gai, Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: aster7.c,v 1.2 2003-01-07 17:10:15 pj Exp $
-
- this is a part of the classic Hartik demo Aster.
-
- it is based on test 10(A), and test the PS with RM.
-
- The JetControl is served by a dedicated Polling Server, too.
-
- There are APER_MAX tasks sleeping, and when an asteroide task finish
- the current activation, it activate also an aperiodic task chosen
- randomly (if the task chosen is already active, the task_activate do
- nothing!)
-
-*/
-
-#include "kernel/kern.h"
-#include "modules//edf.h"
-#include "drivers/keyb.h"
-
-int num_aster = 0;
-#define ASTER_LIM 60
-#define DISPLAY_MAX 15
-#define ASTER_MAX 70
-#define STAT_Y 9
-
-#define APER_MAX 8
-
-/* Pentium 133 / Celeron 366 */
-#define PER_WCET 25000 /* 7800 */
-#define APER_WCET 5500 /* 1400 */
-#define CLOCK_WCET 500 /* 200 */
-#define ASTER_WCET 500 /* 200 */
-
-#define APER_REP 2200
-
-PID aper_table[APER_MAX];
-
-TASK asteroide(void)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = '*'; s[1] = 0;
-
- /*for (;;)*/ {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 10000; //8000 + rand()%2000;
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
- puts_xy(i,y,rand()%15+1,s);
- }
-
- task_activate(aper_table[rand()%APER_MAX]);
- task_endcycle();
-
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
- num_aster--;
- return 0;
-}
-
-TASK aper_asteroid(void *a)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
- int c;
-
- char s[2];
-
- c = (int)a;
- s[0] = '*'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = APER_REP; //8000 + rand()%2000;
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
- puts_xy(i,y,rand()%15+1,s);
- }
- s[0] = c;
- puts_xy(i,y,rand()%15+1,s);
-
- task_endcycle();
-
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
-}
-
-TASK aster()
-{
- PID p;
-
- HARD_TASK_MODEL m;
- int r;
- int x; // adaptive bandwidth...
-
- hard_task_default_model(m);
- hard_task_def_wcet(m,PER_WCET);
- hard_task_def_ctrl_jet(m);
-
- x = 200;
-
- srand(7);
- while (1) {
- if (num_aster < ASTER_MAX) {
- r = (rand() % 200);
-
- hard_task_def_arg(m,(void *)((rand() % 7)+1));
- hard_task_def_mit(m, (x+r)*1000);
- p = task_create("aaa",asteroide,&m,NULL);
- if (p == -1)
- {
- if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
- printf_xy(62,3,WHITE,"adapt=%3u err=%d",
- iq_query_first(&freedesc),errno);
- }
- else {
- num_aster++;
- printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
- task_activate(p);
- x /= 2;
- if (x<50) x = 50;
- }
- }
- task_endcycle();
- }
-}
-
-TASK clock()
-{
- int s = 0, m = 0;
-
- while(1) {
- printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
- printf_xy(62,2,WHITE,"U=%12u",EDF_usedbandwidth(0));
- task_endcycle();
-
- if (++s > 59) {
- s = 0;
- m++;
- }
- printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
- printf_xy(62,2,WHITE,"U=%12u",EDF_usedbandwidth(0));
- task_endcycle();
- }
-}
-
-
-
-/* we consider the first ASTER_MAX + 2 tasks from the PID 2
- and plot on the screen the elapsed times... */
-TASK jetcontrol()
-{
- int i; /* a counter */
- TIME sum, max, curr, last[5];
- int nact;
- int j; /* the elements set by jet_gettable */
- PID p;
-
-
- kern_cli();
- printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
- kern_sti();
-
- for (;;) {
- for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
- if (jet_getstat(p, &sum, &max, &nact, &curr) == -1) continue;
-
- for (j=0; j<5; j++) last[j] = 0;
- jet_gettable(p, &last[0], 5);
- kern_cli();
- printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
- p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
- kern_sti();
- i++;
- }
- }
-}
-
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-
-int main(int argc, char **argv)
-{
- PID p1,p2,p3; //,p4,p5,p6;
- HARD_TASK_MODEL m;
- NRT_TASK_MODEL m_nrt;
- SOFT_TASK_MODEL m_aper;
- int i;
-
- KEY_EVT emerg;
-
- clear();
-
- cprintf("Press Alt-x to end the demo...");
-
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- hard_task_default_model(m);
- hard_task_def_wcet(m,ASTER_WCET);
- hard_task_def_mit(m,10000);
- hard_task_def_group(m,1);
- hard_task_def_ctrl_jet(m);
-
- nrt_task_default_model(m_nrt);
- nrt_task_def_group(m_nrt,1);
- nrt_task_def_ctrl_jet(m_nrt);
-
- p1 = task_create("Aster",aster,&m,NULL);
- if (p1 == -1) {
- perror("test7.c(main): Could not create task <aster> ...");
- sys_end();
- }
-
- hard_task_def_mit(m,500000);
- hard_task_def_wcet(m,CLOCK_WCET);
- p2 = task_create("Clock",clock,&m,NULL);
- if (p2 == -1) {
- perror("test7.c(main): Could not create task <Clock> ...");
- sys_end();
- }
-
- soft_task_default_model(m_aper);
- soft_task_def_ctrl_jet(m_aper);
- soft_task_def_level(m_aper, 1);
- soft_task_def_group(m_aper,1);
- soft_task_def_aperiodic(m_aper);
- p3 = task_create("JetControl",jetcontrol,&m_aper,NULL);
- if (p3 == -1) {
- perror("test7.c(main): Could not create task <JetControl> ...");
- sys_end();
- }
-
- soft_task_def_wcet(m_aper,APER_WCET);
- soft_task_def_ctrl_jet(m_aper);
- soft_task_def_aperiodic(m_aper);
-
- for (i=0; i<APER_MAX; i++) {
- soft_task_def_level(m_aper, i/4 + 3);
- soft_task_def_arg(m_aper, (void *)(i/4 ? 'Û' : '±'));
- aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
- if (aper_table[i] == -1) {
- perror("test7.c(main): Could not create task <aper> ...");
- sys_end();
- }
- }
-
- group_activate(1);
- return 0;
-}
-
Index: rel_1_2/base/aster8.c
===================================================================
--- rel_1_2/base/aster8.c (revision 1198)
+++ rel_1_2/base/aster8.c (nonexistent)
@@ -1,542 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Giorgio Buttazzo, Paolo Gai, Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: aster8.c,v 1.2 2003-01-07 17:10:15 pj Exp $
-
- Test for Sporadic Server (ss):
-
- this is a part of the classic Hartik demo Aster.
-
- it is based on test 17 (h), and the JobControl Task uses an
- SOFT_TASK_MODEL served by a sporadic server
- There are two "dummy" tasks that increment a counter and print
- the value. One uses a SOFT_TASK_MODEL served by sporadic server,
- the other uses a NRT_TASK_MODEL handled by RR module.
-
-*/
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/ss.h"
-#include "drivers/keyb.h"
-
-int num_aster = 0;
-#define EDF_LEV 0
-#define CBS_LEV 1
-#define SS_LEV 2
-
-#define ASTER_LIM 60
-#define DISPLAY_MAX 8
-#define ASTER_MAX 70
-#define STAT_Y 9
-
-#define PER_MAX 5
-#define APER_MAX 8
-
-#define PER_WCET 16000
-#define APER_WCET 22000
-#define JET_WCET 20000
-
-#define APER_REP 22000
-
-PID aper_table[APER_MAX];
-
-mutex_t m1;
-
-
-#define PIMUTEX
-//#define PCMUTEX
-//#define NPPMUTEX
-//#define NOPMUTEX
-
-#define LONGSC
-
-#ifdef LONGSC
-#define SOFT_MET 12000 /* 12000 */
-#define CLOCK_WCET 300 /* 300*/
-#define ASTER_WCET 300 /* 300*/
-#else
-#define SOFT_MET 5000 /* 4500 */
-#define CLOCK_WCET 2000 /* 200*/
-#define ASTER_WCET 2000 /* 200*/
-#endif
-
-PID p1,p2,p3,p4,p5;
-
-TASK asteroide(void)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = '*'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 10000; //8000 + rand()%2000;
- #ifdef LONGSC
- mutex_lock(&m1);
- #endif
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
- #ifndef LONGSC
- mutex_lock(&m1);
- #endif
- puts_xy(i,y,rand()%15+1,s);
- #ifndef LONGSC
- mutex_unlock(&m1);
- #endif
- }
- #ifdef LONGSC
- mutex_unlock(&m1);
- #endif
-
- task_activate(aper_table[rand()%APER_MAX]);
- task_endcycle();
-
- mutex_lock(&m1);
- puts_xy(i,y,WHITE," ");
- mutex_unlock(&m1);
- i++;
- }
- }
- //num_aster--;
-}
-
-TASK aper_asteroid(void *a)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
- int c;
-
- char s[2];
-
- c = (int)a;
- s[0] = '*'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = APER_REP; //8000 + rand()%2000;
- #ifdef LONGSC
- mutex_lock(&m1);
- #endif
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
- #ifndef LONGSC
- mutex_lock(&m1);
- #endif
- puts_xy(i,y,rand()%15+1,s);
- #ifndef LONGSC
- mutex_unlock(&m1);
- #endif
- }
- s[0] = c;
- #ifndef LONGSC
- mutex_unlock(&m1);
- #endif
- mutex_lock(&m1);
- puts_xy(i,y,rand()%15+1,s);
- mutex_unlock(&m1);
-
- task_endcycle();
-
- mutex_lock(&m1);
- puts_xy(i,y,WHITE," ");
- mutex_unlock(&m1);
- i++;
- }
- }
-}
-
-TASK soft_aster(void)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = '*'; s[1] = 0;
-
- /*for (;;)*/ {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 1000 + rand()%9000;
- #ifdef LONGSC
- mutex_lock(&m1);
- #endif
- for (j=0; j<load1; j++) {
- s[0] = '*' + rand() % 100;
- #ifndef LONGSC
- mutex_lock(&m1);
- #endif
- puts_xy(i,y,rand()%15+1,s);
- #ifndef LONGSC
- mutex_unlock(&m1);
- #endif
- }
- s[0] = 1;
- #ifndef LONGSC
- mutex_lock(&m1);
- #endif
- //mutex_lock(&m1);
- puts_xy(i,y,rand()%15+1,s);
- mutex_unlock(&m1);
-
- task_activate(aper_table[rand()%APER_MAX]);
- task_endcycle();
-
- mutex_lock(&m1);
- puts_xy(i,y,WHITE," ");
- mutex_unlock(&m1);
- i++;
- }
- }
- num_aster--;
- return 0;
-}
-
-TASK aster()
-{
- PID p;
-
-// HARD_TASK_MODEL m;
- SOFT_TASK_MODEL m_soft;
- int r;
- int x; // adaptive bandwidth...
-
- srand(7);
-
-/* periodic_task_default_model(m,0,PER_WCET);
- periodic_task_def_ctrl_jet(m);
- for (x=0; x<PER_MAX; x++) {
- r = (rand() % 200);
- periodic_task_def_period(m, (64+r)*1000);
- p = task_create("per",asteroide,&m,NULL);
- if (p!=-1) task_activate(p);
- }
-*/
- soft_task_default_model(m_soft);
- soft_task_def_met(m_soft,SOFT_MET);
- soft_task_def_ctrl_jet(m_soft);
-// soft_task_def_aperiodic(m_soft);
-
- x = 128; //64;
-
- while (1) {
-/* {
- PID p;
- int x;
- p = level_table[0]->level_scheduler(0);
- printf_xy(1,8,WHITE," ");
-
- x = 0;
- do {
- printf_xy(3*x+1,8,WHITE,"%3d",p);
- p = proc_table[p].next;
- x++;
- } while (p != NIL);
- }
-*/
- if (num_aster < ASTER_MAX) {
- r = (rand() % 200);
-
- soft_task_def_period(m_soft, (x+r)*1000);
- p = task_create("aaa",soft_aster,&m_soft,NULL);
- if (p == -1)
- {
- if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
- mutex_lock(&m1);
- printf_xy(62,3,WHITE,"adapt=%3u err=%d",
- iq_query_first(&freedesc), errno);
- mutex_unlock(&m1);
- }
- else {
- num_aster++;
- mutex_lock(&m1);
- printf_xy(62,3,WHITE,"adapt=%3u ",x);
- mutex_unlock(&m1);
- task_activate(p);
- x /= 2;
- if (x<50) x = 50;
- }
- }
- task_endcycle();
- }
-}
-
-TASK clock()
-{
- int s = 0, m = 0;
-
- while(1) {
- mutex_lock(&m1);
- printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
- printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(EDF_LEV));
- printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(CBS_LEV));
- printf_xy(62,5,WHITE,"CSss=%6d",SS_availCs(SS_LEV));
- mutex_unlock(&m1);
-
- task_endcycle();
-
- if (++s > 59) {
- s = 0;
- m++;
- }
- mutex_lock(&m1);
- printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
- printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(EDF_LEV));
- printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(CBS_LEV));
- printf_xy(62,5,WHITE,"CSss=%6d",SS_availCs(SS_LEV));
- mutex_unlock(&m1);
- task_endcycle();
- }
-}
-
-
-
-/* we consider the first ASTER_MAX + 2 tasks from the PID 2
- and plot on the screen the elapsed times... */
-TASK jetcontrol()
-{
- int i; /* a counter */
- TIME sum, max, curr, last[5];
- int nact;
- int j; /* the elements set by jet_gettable */
- PID p;
-
-
- mutex_lock(&m1);
- printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
- mutex_unlock(&m1);
-
- for (;;) {
- for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
- if (jet_getstat(p, &sum, &max, &nact, &curr) == -1 /*||
- (proc_table[p].pclass & 0xFF00) == APERIODIC_PCLASS ||
- (proc_table[p].pclass & 0xFF00) == PERIODIC_PCLASS*/ ) continue;
-
- for (j=0; j<5; j++) last[j] = 0;
- jet_gettable(p, &last[0], 5);
- mutex_lock(&m1);
- if (proc_table[p].task_level == 1)
- printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
- p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)CBS_get_nact(2,p), (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
-// p, sum/(nact==0 ? 1 : nact), max, proc_table[p].avail_time, proc_table[p].status, proc_table[p].shadow, proc_table[p].timespec_priority.tv_sec,proc_table[p].timespec_priority.tv_nsec/1000 , CBS_get_nact(2,p), last[4]);
- else
- printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
- p, (int)sum/(nact==0 ? 1 : nact), (int)max, (int)nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
-// p, sum/(nact==0 ? 1 : nact), max, nact, proc_table[p].status, proc_table[p].shadow, proc_table[p].timespec_priority.tv_sec,proc_table[p].timespec_priority.tv_nsec/1000 , last[3], last[4]);
- mutex_unlock(&m1);
- i++;
- task_activate(p3);
- task_endcycle();
- }
- }
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-void mydummyaper(void) {
- int i=0;
- while(1) {
- mutex_lock(&m1);
- printf_xy(1,24,RED,"dummyAPER pid=%d: %d",p4,i++);
- mutex_unlock(&m1);
- task_activate(p4);
- task_endcycle();
- }
-}
-
-void mydummynrt(void) {
- int i=0;
- while(1) {
- mutex_lock(&m1);
- printf_xy(40,24,RED,"dummyNRT pid=%d: %d",p5,i++);
- mutex_unlock(&m1);
- }
-}
-
-int main(int argc, char **argv)
-{
-// PID p1,p2,p5;
- HARD_TASK_MODEL m;
- NRT_TASK_MODEL m_nrt;
- SOFT_TASK_MODEL m_aper;
- SOFT_TASK_MODEL m_soft;
-
- #ifdef PIMUTEX
- PI_mutexattr_t a;
- #endif
-
- #ifdef PCMUTEX
- PC_mutexattr_t a;
- #endif
-
- #ifdef NPPMUTEX
- NPP_mutexattr_t a;
- #endif
-
- #ifdef NOPMUTEX
- NOP_mutexattr_t a;
- #endif
-
-
- KEY_EVT emerg;
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- clear();
-
- cprintf("Press Alt-x to end the demo...");
-
- hard_task_default_model(m);
- hard_task_def_mit(m,100000);
- hard_task_def_wcet(m,ASTER_WCET);
- hard_task_def_group(m,1);
- hard_task_def_ctrl_jet(m);
-
- nrt_task_default_model(m_nrt);
- nrt_task_def_group(m_nrt,1);
- nrt_task_def_ctrl_jet(m_nrt);
-
-
- soft_task_default_model(m_aper);
- soft_task_def_group(m_aper,1);
- soft_task_def_ctrl_jet(m_aper);
- soft_task_def_aperiodic(m_aper);
-
- soft_task_default_model(m_soft);
- soft_task_def_period(m_soft,10000);
- soft_task_def_met(m_soft,JET_WCET);
- soft_task_def_group(m_soft,1);
- soft_task_def_ctrl_jet(m_soft);
- soft_task_def_aperiodic(m_soft);
-
-
- p1 = task_create("Aster",aster,&m,NULL);
- if (p1 == -1) {
- perror("test7.c(main): Could not create task <aster> ...");
- sys_end();
- l1_exit(-1);
- }
-
- hard_task_def_mit(m,50000);
- hard_task_def_wcet(m,CLOCK_WCET);
- p2 = task_create("Clock",clock,&m,NULL);
- if (p2 == -1) {
- perror("test7.c(main): Could not create task <Clock> ...");
- sys_end();
- l1_exit(-1);
- }
-
-// p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL);
- p3 = task_create("JetControl",jetcontrol,&m_aper,NULL);
- if (p3 == -1) {
- perror("test7.c(main): Could not create task <JetControl> ...");
- sys_end();
- l1_exit(-1);
- }
-
- p4 = task_create("MyDummyAper",(void *(*)(void*))mydummyaper,&m_aper,NULL);
- if (p4 == -1) {
- perror("Could not create task <MyDummyAper> ...");
- sys_end();
- l1_exit(-1);
- }
-
- p5 = task_create("MyDummyNRT",(void *(*)(void*))mydummynrt,&m_nrt,NULL);
- if (p5 == -1) {
- perror("Could not create task <MyDummyNRT> ...");
- sys_end();
- l1_exit(-1);
- }
-/*
- aperiodic_task_default_model(m_aper,APER_WCET);
- aperiodic_task_def_ctrl_jet(m_aper);
- aperiodic_task_def_system(m_aper);
-
- for (i=0; i<APER_MAX; i++) {
- aperiodic_task_def_level(m_aper, i/4 + 2);
- aperiodic_task_def_arg(m_aper, (i/4 ? 'Û' : '±'));
- aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
- if (aper_table[i] == -1) {
- perror("test7.c(main): Could not create task <aper> ...");
- sys_end();
- l1_exit(-1);
- }
- }
-*/
-// task_nopreempt();
-
-
- #ifdef PIMUTEX
- PI_mutexattr_default(a);
- #endif
-
- #ifdef PCMUTEX
- PC_mutexattr_default(a);
- #endif
-
- #ifdef NPPMUTEX
- NPP_mutexattr_default(a);
- #endif
-
- #ifdef NOPMUTEX
- NOP_mutexattr_default(a);
- #endif
-
- mutex_init(&m1, &a);
-
- group_activate(1);
- return 0;
-}
-
Index: rel_1_2/base/cabs.c
===================================================================
--- rel_1_2/base/cabs.c (revision 1198)
+++ rel_1_2/base/cabs.c (nonexistent)
@@ -1,322 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Giorgio Buttazzo, Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: cabs.c,v 1.3 2003-01-07 17:10:15 pj Exp $
- */
-
-/*--------------------------------------------------------------*/
-/* TEST ON CABS */
-/*--------------------------------------------------------------*/
-
-#include <kernel/kern.h>
-#include <modules/cabs.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <string.h>
-
-#define NCAB 4 /* max number of CABs */
-#define NCAR 26 /* generated characters */
-
-#define YP 32 /* level of arrows */
-#define R 20 /* task radius */
-#define YY (YP+R+32) /* level of writing */
-#define DELTA (2*R+72) /* total channel hight */
-#define X1 120 /* start column for P1 */
-#define X2 360 /* start column for P2 */
-
-#define XP1 (X1+64) /* X position of task 1 */
-#define XP2 (X2+64) /* X position of task 2 */
-#define XC (XP1+96) /* X position of CAB */
-#define L 52 /* CAB rectangle length */
-
-void my_exit(KEY_EVT *k);
-void draw_channel(int i);
-void create_channel(int i);
-void get_data();
-
-TASK producer(void *arg);
-TASK consumer(void *arg);
-
-char *cname[NCAB] = {"cab1", "cab2", "cab3", "cab4"};
-char *pname1[NCAB] = {"wr1", "wr2", "wr3", "wr4"};
-char *pname2[NCAB] = {"rd1", "rd2", "rd3", "rd4"};
-
-CAB cid[NCAB]; /* CAB identifiers */
-PID p1[NCAB], p2[NCAB]; /* task identifiers */
-
-/* Task Periods */
-TIME t1[NCAB] = {200000, 100000, 300000, 800000};
-TIME t2[NCAB] = {400000, 400000, 150000, 200000};
-
-/* Task WCETS */
-TIME w1[NCAB] = {10000, 10000, 10000, 10000};
-TIME w2[NCAB] = {10000, 10000, 10000, 10000};
-
-
-/****************************************************************/
-
-/* This function is called when Alt-X is pressed.
- It simply shutdown the system using sys_end.
- Note that the byebye() function is called only if we exit from
- the system using sys_end()!!!!
-*/
-void my_end(KEY_EVT* e)
-{
- sys_end();
-}
-
-/******************************************************************/
-
-/* This function is called when the system exit correctly after Alt-X.
- It exits from the graphic mode and then it prints a small greeting.
- Note that:
- - The function calls grx_exit, so it must be registered using
- RUNLEVEL_BEFORE_EXIT (RUNLEVEL_AFTER_EXIT does not work because
- at that point the kernel is already returned in real mode!!!)
- - When an exception is raised, the exception handler is called.
- Since the exception handler already exits from the graphic mode,
- this funcion has not to be called. For this reason:
- . we registered byebye using the flag NO_AT_ABORT
- . the exception handler exits using sys_abort; in that way byebye is
- NOT called
-*/
-
-
-/*--------------------------------------------------------------*/
-/* User exit function */
-/*--------------------------------------------------------------*/
-
-void byebye(void *arg)
-{
- grx_close();
- cprintf("Bye Bye!\n");
-}
-
-/*--------------------------------------------------------------*/
-/* Main task */
-/*--------------------------------------------------------------*/
-
-
-/****************************** MAIN ******************************/
-
-int main(int argc, char **argv)
-{
- char c = 0; /* character from keyboard */
-
- /* Set the closing function */
- sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
-
- /* graphic card Initialization */
- if (grx_init() < 1) {
- sys_abort(1);
- }
-
- if (grx_open(640, 480, 8) < 0) {
- cprintf("GRX Err\n");
- sys_abort(1);
- }
-
- grx_clear(BLACK);
-
- grx_text("Press a key [1-4]", 10, 16, 7, 0);
- grx_text("to create a pair", 10, 24, 7, 0);
- grx_text("ESC to exit demo", 10, 48, 7, 0);
-
- while (c != 27) {
- c = keyb_getch(BLOCK);
- if ((c >= '1') && (c <= '1'+NCAB-1))
- create_channel(c-'1');
- }
-
- sys_end();
-
- return 0;
-}
-
-
-/*--------------------------------------------------------------*/
-/* write data in a cab */
-/*--------------------------------------------------------------*/
-
-TASK producer(void *arg)
-{
-int i = (int)arg;
-char c; /* message character */
-char *p; /* pointer to a cab buffer */
-char s[2]; /* string to display */
-int k = 0;
-int x, y;
-int col = 13;
-int ybase = YY + i*DELTA;
-
- x = X1;
- y = ybase;
- s[1] = 0;
-
- k = 0;
- while (1) {
- c = 'A' + k;
- p = cab_reserve(cid[i]);
- *p = c;
- cab_putmes(cid[i], p);
-
- s[0] = c;
- k = (k + 1) % NCAR;
- grx_text(s,x,y,col,0);
-
- x += 8;
- if (x >= (X1 + NCAR*8)) {
- x = X1;
- y = y + 8;
- if (y >= ybase+16) {
- y = ybase;
- col = col % 15 + 1;
- }
- }
-
- task_endcycle();
- }
-}
-
-/*--------------------------------------------------------------*/
-/* read data from a cab */
-/*--------------------------------------------------------------*/
-
-TASK consumer(void *arg)
-{
-int i = (int)arg;
-char *p;
-char s[2];
-int x, y;
-int col = 13;
-int ybase = YY + i*DELTA;
-
- x = X2;
- y = ybase;
- s[1] = 0;
-
- while (1) {
- p = cab_getmes(cid[i]);
- s[0] = *p - 'A' + 'a';
- cab_unget(cid[i], p);
-
- grx_text(s,x,y,col,0);
- x += 8;
-
- if (x >= (X2 + NCAR*8)) {
- x = X2;
- y = y + 8;
- if (y >= ybase+16) {
- y = ybase;
- col = col % 15 + 1;
- }
- }
- task_endcycle();
- }
-}
-
-/*--------------------------------------------------------------*/
-/* create the two tasks and a channel */
-/*--------------------------------------------------------------*/
-
-void create_channel(int i)
-{
- HARD_TASK_MODEL m;
-
- draw_channel(i);
- cid[i] = cab_create(cname[i], 1, 2);
-
- hard_task_default_model(m);
- hard_task_def_ctrl_jet (m);
- hard_task_def_arg (m, (void *)i);
- hard_task_def_wcet (m, w1[i]);
- hard_task_def_mit (m, t1[i]);
- hard_task_def_usemath (m);
- p1[i] = task_create(pname1[i], producer, &m, NULL);
- if (p1[i] == NIL) {
- grx_close();
- perror("Could not create task <producer>");
- sys_abort(1);
- }
- task_activate(p1[i]);
-
- hard_task_default_model(m);
- hard_task_def_ctrl_jet (m);
- hard_task_def_arg (m, (void *)i);
- hard_task_def_wcet (m, w2[i]);
- hard_task_def_mit (m, t2[i]);
- hard_task_def_usemath (m);
- p2[i] = task_create(pname2[i], consumer, &m, NULL);
- if (p2[i] == NIL) {
- grx_close();
- perror("Could not create task <consumer>");
- sys_abort(1);
- }
- task_activate(p2[i]);
-}
-
-/*--------------------------------------------------------------*/
-/* Disegna i processi e il canale di comunicazione */
-/*--------------------------------------------------------------*/
-
-void draw_channel(int i)
-{
-char buffer[32]; /* buffer per sprintf */
-int yc = YP + i*DELTA; /* altezza del canale */
-
- grx_circle(XP1,yc,R,2);
- grx_text("P1",XP1-8,yc-4,12,0);
-
- grx_circle(XP2,yc,R,2);
- grx_text("P2",XP2-8,yc-4,12,0);
-
- grx_rect(XC,yc-R,XC+L,yc+R,3);
- grx_text("CAB",XC+16,yc-4,12,0);
-
- grx_line(XP1+R,yc,XC,yc,4);
- grx_line(XC+L,yc,XP2-R,yc,4);
-
- grx_text("T1 = ms",X1+40,yc+R+16,14,0);
- sprintf(buffer,"%ld", t1[i]);
- grx_text(buffer,X1+88,yc+R+16,14,0);
-
- grx_text("T2 = ms",X2+40,yc+R+16,14,0);
- sprintf(buffer,"%ld", t2[i]);
- grx_text(buffer,X2+88,yc+R+16,14,0);
-}
-
-/*--------------------------------------------------------------*/
-
Index: rel_1_2/base/imdemo.c
===================================================================
--- rel_1_2/base/imdemo.c (revision 1198)
+++ rel_1_2/base/imdemo.c (nonexistent)
@@ -1,99 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: imdemo.c,v 1.1 2002-11-11 08:22:45 pj Exp $
-**/
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-//#define TICK 1000
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- PC_register_module();
- NPP_register_module();
- SRP_register_module();
- NOP_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/base/ihello.c
===================================================================
--- rel_1_2/base/ihello.c (revision 1198)
+++ rel_1_2/base/ihello.c (nonexistent)
@@ -1,95 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ihello.c,v 1.1 2002-10-28 08:13:37 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2002-10-28 08:13:37 $
- ------------
-
- The simplest initialization file
-
- The tick is set to TICK ms.
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- a RR (Round Robin) level
- a Dummy level
-
- It can accept these task models:
-
- NRT_TASK_MODEL at level 0
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 300
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/base/memtest.c
===================================================================
--- rel_1_2/base/memtest.c (revision 1198)
+++ rel_1_2/base/memtest.c (nonexistent)
@@ -1,101 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Giorgio Buttazzo, Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: memtest.c,v 1.1 2002-11-11 08:22:46 pj Exp $
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <kernel/kern.h>
-#include <stdlib.h>
-
-int main(int argc, char **argv)
-{
- void *a;
-
- clear();
-
- a = malloc(4500);
- cprintf("malloc : %ld\n", (DWORD)a);
- free(a);
-
- kern_cli(); a = DOS_alloc(4500); kern_sti();
- cprintf("below 1 M: %ld\n", (DWORD)a);
- kern_cli(); DOS_free(a,4500); kern_sti();
-
- kern_cli(); a = kern_alloc_aligned(10000,MEMORY_UNDER_16M,10,0); kern_sti();
- cprintf("below 16M: %ld\n", (DWORD)a);
- kern_cli(); kern_free(a,10000); kern_sti();
-
- kern_cli(); a = kern_alloc_aligned(10000,MEMORY_FROM_1M_TO_16M,2,0); kern_sti();
- cprintf(">1M <16M : %ld\n", (DWORD)a);
- kern_cli(); kern_free(a,10000); kern_sti();
-
- kern_cli(); a = kern_alloc(10000); kern_sti();
- cprintf("normal : %ld\n", (DWORD)a);
- kern_cli(); kern_free(a,10000); kern_sti();
-
- kern_cli(); a = kern_alloc_page(MEMORY_UNDER_1M); kern_sti();
- cprintf("page <1M : %ld\n", (DWORD)a);
- kern_cli(); kern_free_page(a); kern_sti();
-
- kern_cli(); a = kern_alloc_page(MEMORY_FROM_1M_TO_16M); kern_sti();
- cprintf("p>1<16M : %ld\n", (DWORD)a);
- kern_cli(); kern_free_page(a); kern_sti();
-
- kern_cli(); a = kern_alloc_page(0); kern_sti();
- cprintf("page : %ld\n", (DWORD)a);
- kern_cli(); kern_free_page(a); kern_sti();
-
- return 0;
-}
Index: rel_1_2/base/sched.c
===================================================================
--- rel_1_2/base/sched.c (revision 1198)
+++ rel_1_2/base/sched.c (nonexistent)
@@ -1,472 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Giorgio Buttazzo, Paolo Gai, Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: sched.c,v 1.3 2003-05-01 19:44:07 pj Exp $
-
- This demo is derived from the cbsmouse.c Hartik's example.
-
- It only prints the task scheduling in graphic mode...
-
- There is a parameter to choose the type of scheduling module
- to initialize.
-
- to init correctly the module and task bandwidth parameters, set the defines
- NUM and DEN in initg.c and testg.c and remember the "s" (soft) parameter!!!
-
- to plot the deadlines assigned by CBS or TBS, compile cbs.c or tbs.c with
- the TESTG define
- (gray dots over the mouse line are the deadlines, green dots are CBS
- shifts)
-
- Note that a lot of times the demo exits with an exception; to avoid
- these exception you have to properly tune the task parameters.
-
- On a well configured machine, you will notice the little differences
- between different servers when moving the mouse ;-)
-
-*/
-
-#include <kernel/kern.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <drivers/mouse.h>
-#include <semaphore.h>
-
-/*--------------------------------------------------------------*/
-/* TEST ON EDF SCHEDULING */
-/*--------------------------------------------------------------*/
-
-#define LMOUSE 20
-#define LM 40 /* line of main */
-#define OFFSET 20 /* initial phase */
-#define CHAR_DIM 8 /* Height of chars in pixels */
-
-#define DX (640/5-1)
-
-int col[3] = {2, 4, 14}; /* colors of timelines */
-int lev[3] = {80, 120, 160}; /* level of timelines */
-int ptime[3] = {10, 20, 25}; /* number of cycles */
-int period[3] = {40, 50,100}; /* tasks' periods */
-int tick = 1; /* system tick */
-int tscale = 1; /* time scale */
-TIME starttime = 0; /* Simulation start time (scaled) */
-
-char *title; /* used in initg.c */
-
-/* period[] is scaled with a factor of PERIODSCALE usec */
-#define PERIODSCALE 5000
-
-// update also isched.c!!!
-#define NUM 2000
-#define DEN 64000
-
-sem_t mutex; /* Semaphore for graphix*/
-
-//#define IY(y) (480 - y)
-#define IY(y) y
-
-/*
- * mouse cursor
- *
- */
-
-#define W WHITE
-#define R RED
-#define G GREEN
-#define M MAGENTA
-
-/* shape */
-
-BYTE mycursor[16*16]= {
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,W,W,W,W,0,0,0,0,0,0,W,W,W,W,0,
- 0,W,M,0,0,0,0,0,0,0,0,0,0,M,W,0,
- 0,W,0,M,0,0,0,0,0,0,0,0,M,0,W,0,
- 0,W,0,0,M,0,0,0,0,0,0,M,0,0,W,0,
- 0,0,0,0,0,M,0,0,0,0,M,0,0,0,0,0,
- 0,0,0,0,0,0,G,G,G,G,0,0,0,0,0,0,
- 0,0,0,0,0,0,G,0,0,G,0,0,0,0,0,0,
- 0,0,0,0,0,0,G,0,0,G,0,0,0,0,0,0,
- 0,0,0,0,0,0,G,0,0,G,0,0,0,0,0,0,
- 0,0,0,0,0,0,G,G,G,G,0,0,0,0,0,0,
- 0,0,0,0,0,0,M,M,M,M,0,0,0,0,0,0,
- 0,0,0,0,0,0,M,M,M,M,0,0,0,0,0,0,
- 0,0,0,0,0,M,M,M,M,M,M,0,0,0,0,0,
- 0,0,0,0,M,M,M,M,M,M,M,M,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-};
-
-#define F 0xff
-#define B 0x00
-
-/* mask */
-BYTE mybkg[16*16]= {
- B,B,B,B,B,B,F,F,F,F,B,B,B,B,B,B,
- B,0,0,0,0,B,F,F,F,F,B,0,0,0,0,B,
- B,0,0,B,B,F,F,F,F,F,B,B,B,0,0,B,
- B,0,B,0,B,F,F,F,F,F,F,B,0,B,0,B,
- B,0,B,B,0,B,F,F,F,F,B,0,B,B,0,B,
- B,B,B,F,B,0,B,B,B,B,0,B,F,B,B,B,
- F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
- F,F,F,F,F,B,0,B,B,0,B,F,F,F,F,F,
- F,F,F,F,F,B,0,B,B,0,B,F,F,F,F,F,
- F,F,F,F,F,B,0,B,B,0,B,F,F,F,F,F,
- F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
- F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
- F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
- F,F,F,F,B,0,0,0,0,0,0,B,F,F,F,F,
- F,F,F,B,0,0,0,0,0,0,0,0,B,F,F,F,
- F,F,F,B,B,B,B,B,B,B,B,B,B,F,F,F,
-};
-
-#undef B
-#define B 0xff
-
-/* bad mask */
-BYTE mybadbkg[16*16]= {
- B,B,B,B,B,B,F,F,F,F,B,B,B,B,B,B,
- B,0,0,0,0,B,F,F,F,F,B,0,0,0,0,B,
- B,0,0,B,B,F,F,F,F,F,B,B,B,0,0,B,
- B,0,B,0,B,F,F,F,F,F,F,B,0,B,0,B,
- B,0,B,B,0,B,F,F,F,F,B,0,B,B,0,B,
- B,B,B,F,B,0,B,B,B,B,0,B,F,B,B,B,
- F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
- F,F,F,F,F,B,0,B,B,0,B,F,F,F,F,F,
- F,F,F,F,F,B,0,B,B,0,B,F,F,F,F,F,
- F,F,F,F,F,B,0,B,B,0,B,F,F,F,F,F,
- F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
- F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
- F,F,F,F,F,B,0,0,0,0,B,F,F,F,F,F,
- F,F,F,F,B,0,0,0,0,0,0,B,F,F,F,F,
- F,F,F,B,0,0,0,0,0,0,0,0,B,F,F,F,
- F,F,F,B,B,B,B,B,B,B,B,B,B,F,F,F,
-};
-
-/* very bad mask */
-BYTE myverybadbkg[16*16]= {
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
- F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
-};
-
-
-/*--------------------------------------------------------------*/
-/* Prints a grid to show task periods during execution */
-/*--------------------------------------------------------------*/
-
-void print_grid()
-{
- int i;
- int a1, a2, a3;
- int temp;
-
- a1 = 0;
- a2 = 0;
- a3 = 0;
- temp = 0;
-
- grx_text(title, 0, 240-10 ,10, 0);
-
- grx_line(OFFSET, lev[0], 639, lev[0], 5);
- grx_line(OFFSET, lev[1], 639, lev[1], 5);
- grx_line(OFFSET, lev[2], 639, lev[2], 5);
- grx_text("T1", 0, lev[0]-8, 9, 0);
- grx_text("T2", 0, lev[1]-8, 9, 0);
- grx_text("T3", 0, lev[2]-8, 9, 0);
- grx_text("MA", 0, LM, 8, 0);
- grx_text("MO", 0, LMOUSE, 8, 0);
-
- for (i = OFFSET; i < 640; i++) {
- if (temp >= a1) {
- grx_line(i, lev[0] - 1, i, lev[0] - 20, 3);
- a1 += period[0];
- }
- if (temp >= a2) {
- grx_line(i, lev[1] - 1, i, lev[1] - 20, 3);
- a2 += period[1];
- }
- if (temp >= a3) {
- grx_line(i, lev[2] - 1, i, lev[2] - 20, 3);
- a3 += period[2];
- }
- temp += tick/tscale;
- }
-}
-
-/*--------------------------------------------------------------*/
-/* This function is called at system termination */
-/*--------------------------------------------------------------*/
-
-void my_end()
-{
- grx_close();
-}
-
-/*--------------------------------------------------------------*/
-/* GENERIC PERIODIC PROCESS */
-/*--------------------------------------------------------------*/
-
-TASK color(int k)
-{
- int i;
- DWORD x = OFFSET;
- TIME t;
- while ( x < 640L) {
- for (i = 0; i < ptime[k]; i++) {
-
- t = sys_gettime(NULL) / PERIODSCALE;
- x = (t - starttime) + OFFSET;
- if (x>=640) break;
- sem_wait(&mutex);
- grx_plot(x, lev[k] - 4, col[k]);
- grx_plot(x, lev[k] - 5, col[k]);
- grx_plot(x, lev[k] - 6, col[k]);
- grx_plot(x, lev[k] - 7, col[k]);
- sem_post(&mutex);
- while (sys_gettime(NULL)/PERIODSCALE == t);
- }
- task_endcycle();
- }
- return 0;
-}
-
-void my_mouse_handler(MOUSE_EVT *ev)
-{
- int x;
-
- x = (sys_gettime(NULL)/PERIODSCALE - starttime) + OFFSET;
- if (x>=640) return;
- sem_wait(&mutex);
- grx_plot(x, LMOUSE, 8);
- sem_post(&mutex);
-}
-
-/*--------------------------------------------------------------*/
-/* MAIN PROCESS */
-/*--------------------------------------------------------------*/
-
-int main(int argc, char *argv[])
-{
- int x = OFFSET;
-
- MOUSE_PARMS mouse = BASE_MOUSE;
- HARD_TASK_MODEL mouse_hard;
- SOFT_TASK_MODEL mouse_soft;
- NRT_TASK_MODEL mouse_nrt;
-
- char c;
- KEY_EVT emerg;
-
- HARD_TASK_MODEL m_per;
- int modenum;
-
- if (argc>=3)
- switch(*argv[2]) {
- case 'h':
- /* this is not correct, because it don't remember activations */
- hard_task_default_model(mouse_hard);
- hard_task_def_mit(mouse_hard,DEN);
- hard_task_def_wcet(mouse_hard,NUM);
- hard_task_def_system(mouse_hard);
- hard_task_def_nokill(mouse_hard);
- hard_task_def_aperiodic(mouse_hard);
- mouse_def_task(mouse,(TASK_MODEL *)&mouse_hard);
- break;
- case 's':
- soft_task_default_model(mouse_soft);
- soft_task_def_wcet(mouse_soft,NUM);
- soft_task_def_met(mouse_soft,NUM);
- soft_task_def_period(mouse_soft,DEN);
- soft_task_def_system(mouse_soft);
- soft_task_def_nokill(mouse_soft);
- soft_task_def_aperiodic(mouse_soft);
- mouse_def_task(mouse,(TASK_MODEL *)&mouse_soft);
- break;
- case 'n':
- /* this is not correct, because it don't remember activations */
- nrt_task_default_model(mouse_nrt);
- nrt_task_def_system(mouse_nrt);
- nrt_task_def_nokill(mouse_nrt);
- mouse_def_task(mouse,(TASK_MODEL *)&mouse_nrt);
- break;
- default:
- argc=0;
- break;
- }
-
- /* Serial mous on COM3 */
- mouse_def_ms(mouse,2);
-
- if (argc>=4) {
- period[0]=atoi(argv[3]);
- if (period[0]<ptime[0]) period[0]=ptime[0]+5;
- }
- if (argc>=5) {
- period[1]=atoi(argv[4]);
- if (period[1]<ptime[1]) period[1]=ptime[1]+5;
- }
- if (argc>=6) {
- period[2]=atoi(argv[5]);
- if (period[2]<ptime[2]) period[2]=ptime[2]+5;
- }
-
- if (argc<2) {
- cprintf("syntax: x testg <config> <mouse-task> [t1] [t2] [t3]\n");
- cprintf("where <config> can be:\n");
- cprintf("\t0 - EDF + CBS + RR\n");
- cprintf("\t1 - RM + PS ( bkg, U=1/16) + RR, no check Ulub < 0.69\n");
- cprintf("\t2 - RM + PS (nobkg, U=1/16) + RR, no check Ulub < 0.69\n");
- cprintf("\t3 - EDF + PS ( bkg, U=1/16) + RR\n");
- cprintf("\t4 - EDF + PS (nobkg, U=1/16) + RR\n");
- cprintf("\t5 - EDF + TBS( U=1/16) + RR\n");
- cprintf("\t6 - RM + DS ( bkg, U=1/16) + RR, no check Ulub < 0.69\n");
- cprintf("\t7 - RM + DS (nobkg, U=1/16) + RR, no check Ulub < 0.69\n");
- cprintf("\nwhere <mouse-task> can be:\n");
- cprintf("\th - Hard\n");
- cprintf("\ts - Soft (understimated wcet)\n");
- cprintf("\tn - NRT\n");
- sys_end();
- return -1;
- }
-
- if (grx_init() == -1) {
- sys_shutdown_message("Error initing GraphLib!!!\n");
- sys_end();
- }
- modenum = grx_getmode(640, 480, 8);
- cprintf("Modenum :%d\n", modenum);
-
- if (grx_setmode(modenum) == -1) {
- sys_shutdown_message("No SetMode!!!\n");
- sys_end();
- }
-
- /* this trick can be useful when debugging ... */
- //grx_close();
-
-
-
- print_grid();
- grx_box(DX*0,240,DX*1-1,479,GREEN);
- grx_box(DX*1,240,DX*2-1,479,WHITE);
- grx_box(DX*2,240,DX*3-1,479,RED);
- grx_box(DX*3,240,DX*4-1,479,MAGENTA);
- grx_box(DX*4,240,DX*5-1,479,BLACK);
-
-
- sys_atrunlevel(my_end, NULL, RUNLEVEL_BEFORE_EXIT);
-
- /* mutex */
- sem_init(&mutex,0,1);
-
- /* keyboard */
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,(void (*)(KEY_EVT *))sys_end);
- keyb_getchar();
-
- /* mouse */
- mouse_init(&mouse);
- mouse_limit(XMINLIMIT(640,480),
- 240,
- XMAXLIMIT(640,480),
- YMAXLIMIT(640,480));
- mouse_position(320,280);
- mouse_threshold(2);
- //grx_setcolor(255,255,255,255);
- mouse_grxshape(mycursor,mybkg);
- mouse_grxcursor(ENABLE);
- mouse_on();
- mouse_hook(my_mouse_handler);
-
- /* hard task creation */
-
- hard_task_default_model(m_per);
- hard_task_def_mit(m_per,period[0]*PERIODSCALE);
- hard_task_def_wcet(m_per,ptime[0]*PERIODSCALE);
- hard_task_def_group(m_per, 1);
- //task_def_wcet(m, ptime[0] * sys_tick);
- if (task_create("verde", color, &m_per, NULL) == -1) {
- sys_shutdown_message("Edf.C(main) Could not create <green>:");
- sys_end();
- }
- hard_task_def_arg(m_per, (void *)1);
- hard_task_def_wcet(m_per, ptime[1]*PERIODSCALE);
- hard_task_def_mit(m_per,period[1]*PERIODSCALE);
- if (task_create("red", color, &m_per, NULL) == -1) {
- sys_shutdown_message("Edf.C(main) Could not create <red>:");
- sys_end();
- }
- hard_task_def_arg(m_per, (void *)2);
- hard_task_def_wcet(m_per, ptime[2]*PERIODSCALE);
- hard_task_def_mit(m_per,period[2]*PERIODSCALE);
- if (task_create("yellow", color, &m_per, NULL) == -1) {
- sys_shutdown_message("Edf.C(main) Could not create <yellow>:");
- sys_end();
- }
- starttime = sys_gettime(NULL) / PERIODSCALE;
- group_activate(1);
-
- /* main loop */
- while (x < 640L) {
- x = (sys_gettime(NULL)/PERIODSCALE - starttime) + OFFSET;
- if (x>=640) break;
- sem_wait(&mutex);
- grx_plot(x, LM, 7);
- sem_post(&mutex);
- }
-
- c = keyb_getchar();
-
- sys_end();
- return 0;
-}
-
-/*--------------------------------------------------------------*/
Index: rel_1_2/base/fly.c
===================================================================
--- rel_1_2/base/fly.c (revision 1198)
+++ rel_1_2/base/fly.c (nonexistent)
@@ -1,216 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: fly.c,v 1.3 2003-01-07 17:10:15 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.3 $
- Last update: $Date: 2003-01-07 17:10:15 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*--------------------------------------------------------------*/
-/* SIMULATION OF RANDOM FLIES */
-/*--------------------------------------------------------------*/
-
-#include <kernel/kern.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <semaphore.h>
-#include <stdlib.h>
-#include <math.h>
-
-#define YMENU 10 /* menu level */
-#define XMIN 50
-#define XMAX 600
-#define YMIN 100
-#define YMAX 450
-#define VEL 5 /* linear velocity (def. = 5) */
-#define ANG 30 /* angolo massimo sterzata (30) */
-#define D 3 /* raggio mosca */
-#define ESC 27 /* ASCII code of ESCAPE key */
-#define MAX_P 35 /* max number of flies */
-#define FLYGROUP 1
-
-double tick = 1.0; /* system tick = 1 ms */
-int fly_period = 40000; /* task period */
-int fly_wcet = 1000; /* task wcet */
-PID pid;
-sem_t mutex;
-
-/*--------------------------------------------------------------*/
-
-void draw_fly(int x, int y, int c)
-{
- sem_wait(&mutex);
- grx_disc(x, y, D, c);
- sem_post(&mutex);
-}
-
-/******************************************************************/
-
-TASK fly(void *arg)
-{
-int x, y;
-int ox, oy;
-int dx, dy, da;
-int teta, col;
-int outx, outy;
-double r;
-int i = (int)arg;
-
- x = ox = (XMIN+XMAX)/2;
- y = oy = (YMIN+YMAX)/2;
- teta = 0;
- col = 2 + i; /* colore fly */
-
- while (1) {
-
- da = rand()%(2*ANG) - ANG; /* da = [-ANG,ANG] */
- teta += da;
-
- if (teta > 360) teta -= 360;
- if (teta < 0) teta += 360;
- r = (double)teta * PI / 180.;
-
- dx = (float)(VEL * cos(r));
- dy = (float)(VEL * sin(r));
- x += dx;
- y += dy;
-
- outx = (x >= XMAX) || (x <= XMIN);
- outy = (y >= YMAX) || (y <= YMIN);
-
- if (outx || outy) {
- x = x - dx;
- y = y - dy;
- if (outx) teta = 180 - teta;
- if (outy) teta = -teta;
- if (teta > 360) teta -= 360;
- if (teta < 0) teta += 360;
- r = (double)teta * PI / 180.;
-
- dx = (float)(VEL * cos(r));
- dy = (float)(VEL * sin(r));
-
- x += dx;
- y += dy;
- }
-
- draw_fly(ox, oy, 0);
- draw_fly(x, y, col);
- ox = x; oy = y;
-
- task_endcycle();
- }
-}
-
-/****************************************************************/
-
-/* This function is called when the system exits */
-void byebye(void *arg)
-{
- grx_close();
- cprintf("Bye Bye!\n");
-}
-
-/****************************** MAIN ******************************/
-
-int main(int argc, char **argv)
-{
- HARD_TASK_MODEL m;
-
- char c; /* character from keyboard */
- int i = 0; /* number of tasks created */
- TIME seme; /* used to init the random seed */
-
- /* Set the closing function */
- sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
-
- /* graphic card Initialization */
- if (grx_init() < 1) {
- sys_abort(1);
- }
-
- if (grx_open(640, 480, 8) < 0) {
- cprintf("GRX Err\n");
- sys_abort(1);
- }
-
- /* The scenario */
- grx_rect(XMIN-D-1, YMIN-D-1, XMAX+D+1, YMAX+D+1, 14);
- grx_text("Simulation of Random Flies", XMIN, YMENU+10, 13, 0);
- grx_text("SPACE create a fly" , XMIN, YMENU+20, 12, 0);
- grx_text("ESC exit to DOS" , XMIN, YMENU+30, 12, 0);
-
- /* The program waits a space to create a fly */
- c = keyb_getch(BLOCK);
-
- /* randomize!!!! */
- seme = sys_gettime(NULL);
- srand(seme);
-
- do {
- if ((c == ' ') && (i < MAX_P)) {
- hard_task_default_model(m);
- hard_task_def_ctrl_jet (m);
- hard_task_def_arg (m, (void *)i);
- hard_task_def_wcet (m, fly_wcet);
- hard_task_def_mit (m, fly_period);
- hard_task_def_group (m, FLYGROUP);
- hard_task_def_usemath (m);
- pid = task_create("fly", fly, &m, NULL);
- if (pid == NIL) {
- grx_close();
- perror("Could not create task <fly>");
- sys_abort(1);
- }
- task_activate(pid);
- i++;
- }
- c = keyb_getch(BLOCK);
-
- } while (c != ESC);
-
- sys_end();
-
- return 0;
-}
-
-/*--------------------------------------------------------------*/
Index: rel_1_2/base/time.c
===================================================================
--- rel_1_2/base/time.c (revision 1198)
+++ rel_1_2/base/time.c (nonexistent)
@@ -1,69 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: time.c,v 1.1 2002-10-28 08:13:37 pj Exp $
- *
- * Timer correctness test
- */
-
-#include "kernel/kern.h"
-
-#define NT 10
-
-int main(int argc, char **argv)
-{
- struct timespec t[NT];
- int i;
-
- cprintf("Timer correctness test (1 second).\n");
-
- for (i=0; i<NT; i++) NULL_TIMESPEC(&t[i]);
-
- do {
- for (i=0; i<NT-1; i++) t[i+1] = t[i];
-
- sys_gettime(&t[0]);
-
- if (TIMESPEC_A_LT_B(&t[0],&t[1])) {
- for (i=0; i<NT; i++)
- cprintf("%d %ld\n",i, t[i].tv_nsec);
- sys_end();
- }
- } while (t[0].tv_sec < 1);
-
- return 0;
-}
-
Index: rel_1_2/base/intsem.c
===================================================================
--- rel_1_2/base/intsem.c (revision 1198)
+++ rel_1_2/base/intsem.c (nonexistent)
@@ -1,101 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Giorgio Buttazzo, Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: intsem.c,v 1.1 2002-11-11 08:22:45 pj Exp $
-
- this test is a simple main() function with one other task.
-
- This test verify the correctness of the internal_sem functions.
-
-*/
-
-#include "kernel/kern.h"
-
-#include <kernel/int_sem.h>
-
-internal_sem_t s;
-
-TASK pippo(void *a)
-{
- int i=0;
- struct timespec t;
-
- do {
- sys_gettime(&t);
-
- if (i==0 && t.tv_sec == (int)a) {
- i = 1;
- cprintf("before internal_sem_wait %d\n",(int)a);
- internal_sem_wait(&s);
- cprintf("after internal_sem_wait %d\n",(int)a);
- }
-
- if (i==1 && t.tv_sec == 2+(int)a) {
- i = 2;
- cprintf("before internal_sem_post %d\n",(int)a);
- internal_sem_post(&s);
- cprintf("after internal_sem_post %d\n",(int)a);
- return 0;
- }
-
-
- } while (1);
-}
-
-int main(int argc, char **argv)
-{
- NRT_TASK_MODEL m;
- PID p2,p3;
-
- nrt_task_default_model(m);
- nrt_task_def_group(m,1);
-
- nrt_task_def_arg(m,(void *)1);
- p2 = task_create("pippo1", pippo, &m, NULL);
- if (p2 == NIL)
- { cprintf("Can't create pippo1 task...\n"); return 1; }
-
- nrt_task_def_arg(m,(void *)2);
- p3 = task_create("pippo2", pippo, &m, NULL);
- if (p3 == NIL)
- { cprintf("Can't create pippo2 task...\n"); return 1; }
-
- internal_sem_init(&s,1);
-
- group_activate(1);
-
- return 0;
-}
Index: rel_1_2/base/isched.c
===================================================================
--- rel_1_2/base/isched.c (revision 1198)
+++ rel_1_2/base/isched.c (nonexistent)
@@ -1,207 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: isched.c,v 1.1 2002-11-11 08:22:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2002-11-11 08:22:45 $
- ------------
-
- System initialization file
-
- The tick is set to TICK ms.
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- NRT_TASK_MODEL at level 1
- SOFT_TASK_MODEL (met, period) at level 2
-
- This file is similar to the configuration of Hartik 3.3.1
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-
-#include "modules/edf.h"
-#include "modules/rm.h"
-
-#include "modules/cbs.h"
-#include "modules/tbs.h"
-#include "modules/ps.h"
-#include "modules/ds.h"
-
-#include "modules/rr.h"
-#include "modules/rr2.h"
-
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 300
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-
-/* the mouse task use 160 us approx on my Celeron 366 */
-#define NUM 2000
-#define DEN 64000
-//#define DEN 8000
-
-//#undef XXX
-//#define XXX
-
-int argc;
-char *argv[100];
-
-extern char *title;
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- int conf;
-
- __compute_args__(mb,&argc, argv);
-
- if (argc < 2)
- conf = '0'; // default
- else
- conf = *argv[1];
-
- switch (conf) {
- case '1':
- RM_register_level(0); // NO GUARANTEE!!!
- PS_register_level(PS_ENABLE_BACKGROUND, 0, NUM, DEN);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- title = "1 - RM + PS ( bkg, U=1/16) + RR, no check Ulub < 0.69";
- break;
-
- case '2':
- RM_register_level(0); // NO GUARANTEE!!!
- PS_register_level(0, 0, NUM, DEN);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- title = "2 - RM + PS (nobkg, U=1/16) + RR, no check Ulub < 0.69\n";
- break;
-
- case '3':
- EDF_register_level(2);
- PS_register_level(PS_ENABLE_ALL_EDF, 0, NUM, DEN);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- title = "3 - EDF + PS ( bkg, U=1/16) + RR";
- break;
-
- case '4':
- EDF_register_level(2);
- PS_register_level(PS_ENABLE_GUARANTEE_EDF, 0, NUM, DEN);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- title = "4 - EDF + PS (nobkg, U=1/16) + RR";
- break;
-
- case '5':
- EDF_register_level(2);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- TBS_register_level(TBS_ENABLE_ALL, 0, NUM, DEN);
- title = "5 - EDF + TBS( U=1/16) + RR";
- break;
-
- case '6':
- RM_register_level(0); // NO GUARANTEE!!!
- DS_register_level(DS_ENABLE_BACKGROUND, 0, NUM, DEN);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- title = "6 - RM + DS ( bkg, U=1/16) + RR, no check Ulub < 0.69";
- break;
-
- case '7':
- RM_register_level(0); // NO GUARANTEE!!!
- DS_register_level(0, 0, NUM, DEN);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- title = "7 - RM + DS (nobkg, U=1/16) + RR, no check Ulub < 0.69\n";
- break;
-
- default: // '0'
- EDF_register_level(2);
- RR2_register_level(RRTICK, RR2_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- title = "0 - EDF + CBS + RR";
- }
-
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-int main(int argc, char **argv);
-
-TASK __init__(void *arg)
-{
-// struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- main(argc,argv);
-
- return (void *)0;
-}
-
Index: rel_1_2/base/initfile.c
===================================================================
--- rel_1_2/base/initfile.c (revision 1198)
+++ rel_1_2/base/initfile.c (nonexistent)
@@ -1,120 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- System initialization file
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- NRT_TASK_MODEL at level 2
-
- This file is similar to the configuration of kernel/init/hartik3.c
-
- TICK is set to 0 (one-shot timer is used)
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/base/pcdemo.c
===================================================================
--- rel_1_2/base/pcdemo.c (revision 1198)
+++ rel_1_2/base/pcdemo.c (nonexistent)
@@ -1,214 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: pcdemo.c,v 1.2 2003-01-07 17:10:15 pj Exp $
-
- This test verify the correctness of the PC module.
-
- The test uses 3 mutexes
- m0 with ceiling 0
- m1 with ceiling 0
- m2 with ceiling 1
-
- the main task (NRT) creates three tasks.
-
- J0 with PC priority 0
- starts at t=1.5 sec and lock m0, unlock m0, then lock and unlock m1
-
- J1 with PC priority 1
- starts at t=0.5 sec and try to lock m2
-
- J2 with PC priority 2
- it starts and locks m2
- at t=1 sec it locks m1
- at t=1.5 sec it unlocks m1
-
-
- The example is similar to the scheduling diagram shown at p. 197 of the
- book "Sistemi in tempo Reale", by Giorgio Buttazzo, Pitagora Editrice
-
-*/
-
-#include "kernel/kern.h"
-#include "drivers/keyb.h"
-
-mutex_t m0,m1,m2;
-
-
-void startJ(void *a)
-{
- task_activate((PID)a);
-}
-
-TASK j0()
-{
- cprintf("J0: before locking m0\n");
- mutex_lock(&m0);
- cprintf("J0: locked m0\n");
- mutex_unlock(&m0);
- cprintf("J0: unlocked m0, locking m1\n");
-
- mutex_lock(&m1);
- cprintf("J0: locked m1\n");
- mutex_unlock(&m1);
- cprintf("J0: unlocked m1, end task\n");
- return 0;
-}
-
-
-TASK j1()
-{
- cprintf("J1: before locking m2\n");
- mutex_lock(&m2);
- cprintf("J1: locked m2\n");
- mutex_unlock(&m2);
- cprintf("J1: unlocked m2, end task\n");
- return 0;
-}
-
-
-TASK j2()
-{
- cprintf("J2: before locking m2\n");
- mutex_lock(&m2);
- cprintf("J2: locked m2, waiting to t=1 sec\n");
-
- while (sys_gettime(NULL) < 1000000);
-
- cprintf("J2: t = 1 sec reached\n");
- mutex_lock(&m1);
- cprintf("J2: locked m1, waiting to t=2 sec\n");
-
- while (sys_gettime(NULL) < 2000000);
-
- cprintf("J2: t = 2 sec reached\n");
- mutex_unlock(&m1);
- cprintf("J2: unlocked m1\n");
-
- mutex_unlock(&m2);
- cprintf("J2: unlocked m2, end task\n");
- return 0;
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-
-int main(int argc, char **argv)
-{
- struct timespec t;
-
- HARD_TASK_MODEL m;
- PID p0,p1,p2;
-
- PC_mutexattr_t a;
- PI_mutexattr_t a2;
- PC_RES_MODEL r;
-
- KEY_EVT emerg;
-
- clear();
-
- cprintf("Priority Ceiling demo. Press Alt-X to exit the demo\n");
-
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- /* ---------------------------------------------------------------------
- Task creation
- --------------------------------------------------------------------- */
-
- hard_task_default_model(m);
- hard_task_def_mit(m, 1000000);
- hard_task_def_wcet(m, 20000);
- PC_res_default_model(r,0);
- p0 = task_create("J0", j0, &m, &r);
- if (p0 == NIL)
- { cprintf("Can't create J0 task...\n"); return 1; }
-
- hard_task_default_model(m);
- hard_task_def_mit(m, 2100000);
- hard_task_def_wcet(m, 20000);
- PC_res_default_model(r,1);
- p1 = task_create("J1", j1, &m, &r);
- if (p1 == NIL)
- { cprintf("Can't create J1 task...\n"); return 1; }
-
- hard_task_default_model(m);
- hard_task_def_mit(m, 10000000);
- hard_task_def_wcet(m, 3000000);
- PC_res_default_model(r,2);
- p2 = task_create("J2", j2, &m, &r);
- if (p2 == NIL)
- { cprintf("Can't create J2 task...\n"); return 1; }
-
- /* ---------------------------------------------------------------------
- Mutex creation
- --------------------------------------------------------------------- */
-
- PI_mutexattr_default(a2);
- PC_mutexattr_default(a,0);
- mutex_init(&m0,(mutexattr_t *)&a);
- mutex_init(&m1,(mutexattr_t *)&a);
-
- PC_mutexattr_default(a,1);
- mutex_init(&m2,(mutexattr_t *)&a);
-
- /* ---------------------------------------------------------------------
- Event post
- --------------------------------------------------------------------- */
-
- t.tv_sec = 0;
- t.tv_nsec = 500000000;
-
- kern_cli();
- kern_event_post(&t,startJ,(void *)p1);
-
- t.tv_sec = 1;
- kern_event_post(&t,startJ,(void *)p0);
- kern_sti();
-
- task_activate(p2);
-
- cprintf("END main\n");
-
- return 0;
-}
Index: rel_1_2/base/iaster1.c
===================================================================
--- rel_1_2/base/iaster1.c (revision 1198)
+++ rel_1_2/base/iaster1.c (nonexistent)
@@ -1,99 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: iaster1.c,v 1.2 2003-04-15 10:21:22 giacomo Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-04-15 10:21:22 $
- ------------
-
- System initialization file
-
- The tick is set to TICK ms.
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a Dummy level
-
- It can accept these task models (into () the mandatory fields):
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- NRT_TASK_MODEL at level 1
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/base/srpdemo.c
===================================================================
--- rel_1_2/base/srpdemo.c (revision 1198)
+++ rel_1_2/base/srpdemo.c (nonexistent)
@@ -1,246 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: srpdemo.c,v 1.2 2003-01-07 17:10:16 pj Exp $
-
- This test verify the correctness of the SRP module.
-
- There are 3 taks, Jh, Jm, Jl that uses 3 mutexes m1, m2, m3
-
- the main task (NRT) creates the three tasks.
-
- Jh with preemption level 3
- starts at t=1.5 sec and lock m3, lock m1, unlock m1, unlock m3
-
- Jm with preemption level 2
- starts at t=0.5 sec and lock m3, lock m2, unlock m2, unlock m3
- then lock and unlock m1
-
- Jl with preemption level 1
- it starts and locks m2
- at t=1 sec it locks m1
- at t=1.5 sec it unlocks m1
- then it unlocks m2, and finally it locks and unlocks m3
-
-
- The example is similar to the scheduling diagram shown at p. 210 of the
- book "Sistemi in tempo Reale", by Giorgio Buttazzo, Pitagora Editrice
-
-*/
-
-#include "kernel/kern.h"
-#include "drivers/keyb.h"
-
-#include "modules/srp.h"
-
-mutex_t m1,m2,m3;
-
-void startJ(void *a)
-{
- task_activate((PID)a);
-}
-
-TASK Jlobby()
-{
- cprintf("(*) JLobby!!!\n");
- return 0;
-}
-
-TASK Jh()
-{
- PID l;
- HARD_TASK_MODEL m;
- SRP_RES_MODEL r;
-
- cprintf("JH: creating Jy before locking m3\n");
-
- hard_task_default_model(m);
- hard_task_def_mit(m,30000);
- hard_task_def_wcet(m,1000);
- SRP_res_default_model(r,4);
- l = task_create("Jlobby",Jlobby,&m,&r);
- task_activate(l);
-
- mutex_lock(&m3);
- cprintf("JH: locked m3, locking m1\n");
- mutex_lock(&m1);
- cprintf("JH: locked m1, unlocking m1\n");
- mutex_unlock(&m1);
- cprintf("JH: unlocked m1, unlocking m3\n");
- mutex_unlock(&m3);
- cprintf("JH: unlocked m3, end task\n");
- return 0;
-}
-
-
-TASK Jm()
-{
- cprintf("JM: before locking m3\n");
- mutex_lock(&m3);
- cprintf("JM: locked m3, locking m2\n");
- mutex_lock(&m2);
- cprintf("JM: locked m2, unlocking m2\n");
- mutex_unlock(&m2);
- cprintf("JM: unlocked m2, unlocking m3\n");
- mutex_unlock(&m3);
- cprintf("JM: unlocked m3, locking m1\n");
- mutex_lock(&m1);
- cprintf("JM: locked m1, unlocking m1\n");
- mutex_unlock(&m1);
- cprintf("JM: unlocked m1, end task\n");
- return 0;
-}
-
-
-TASK Jl()
-{
- cprintf("JL: before locking m2\n");
- mutex_lock(&m2);
- cprintf("JL: locked m2, waiting to t=1 sec\n");
-
- while (sys_gettime(NULL) < 1000000);
-
- cprintf("JL: t = 1 sec reached, locking m1\n");
- mutex_lock(&m1);
- cprintf("JL: locked m1, waiting to t=2 sec\n");
-
- while (sys_gettime(NULL) < 2000000);
-
- cprintf("JL: t = 2 sec reached, unlocking m1\n");
- mutex_unlock(&m1);
- cprintf("JL: unlocked m1, unlocking m2\n");
-
- mutex_unlock(&m2);
-
- cprintf("JL: unlocked m2, locking m3\n");
- mutex_lock(&m3);
- cprintf("JL: locked m3, unlocking m3\n");
- mutex_unlock(&m3);
- cprintf("JL: unlocked m3, end task\n");
- return 0;
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-
-int main(int argc, char **argv)
-{
- struct timespec t;
-
- HARD_TASK_MODEL m;
- PID p0,p1,p2;
-
- SRP_mutexattr_t a;
- SRP_RES_MODEL r;
-
- PI_mutexattr_t a2;
-
- KEY_EVT emerg;
-
- clear();
-
- cprintf("Stack resource Policy demo. Press Alt-X to exit the demo\n");
-
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- /* ---------------------------------------------------------------------
- Mutex creation
- --------------------------------------------------------------------- */
-
- PI_mutexattr_default(a2);
- SRP_mutexattr_default(a);
- mutex_init(&m1,&a);
- mutex_init(&m2,&a);
- mutex_init(&m3,&a);
-
-
- /* ---------------------------------------------------------------------
- Task creation
- --------------------------------------------------------------------- */
-
- hard_task_default_model(m);
- hard_task_def_mit(m, 1000000);
- hard_task_def_wcet(m, 80000);
- SRP_res_default_model(r, 3);
- p0 = task_createn("JH", Jh, (TASK_MODEL *)&m, &r, SRP_usemutex(&m3), SRP_usemutex(&m1), NULL);
- if (p0 == NIL)
- { cprintf("Can't create JH task...\n"); return 1; }
-
- hard_task_default_model(m);
- hard_task_def_mit(m, 2100000);
- hard_task_def_wcet(m, 80000);
- SRP_res_default_model(r, 2);
- p1 = task_createn("JM", Jm, (TASK_MODEL *)&m, &r, SRP_usemutex(&m3), SRP_usemutex(&m1),
- SRP_usemutex(&m2), NULL);
- if (p1 == NIL)
- { cprintf("Can't create JM task...\n"); return 1; }
-
- hard_task_default_model(m);
- hard_task_def_mit(m, 10000000);
- hard_task_def_wcet(m, 3000000);
- SRP_res_default_model(r, 1);
- p2 = task_createn("JL", Jl, (TASK_MODEL *)&m, &r, SRP_usemutex(&m3), SRP_usemutex(&m1),
- SRP_usemutex(&m2), NULL);
- if (p2 == NIL)
- { cprintf("Can't create JL task...\n"); return 1; }
-
- /* ---------------------------------------------------------------------
- Event post
- --------------------------------------------------------------------- */
-
- t.tv_sec = 0;
- t.tv_nsec = 500000000;
-
- kern_cli();
- kern_event_post(&t,startJ,(void *)p1);
-
- t.tv_sec = 1;
- kern_event_post(&t,startJ,(void *)p0);
- kern_sti();
-
- task_activate(p2);
-
- cprintf("END main\n");
-
- return 0;
-}
Index: rel_1_2/base/iaster3.c
===================================================================
--- rel_1_2/base/iaster3.c (revision 1198)
+++ rel_1_2/base/iaster3.c (nonexistent)
@@ -1,111 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: iaster3.c,v 1.1 2002-10-28 08:13:37 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2002-10-28 08:13:37 $
- ------------
-
- System initialization file
-
- The tick is set to TICK ms.
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a TBS (Total Bandwidth Server) level 0.1 Us
- a TBS (Total Bandwidth Server) level 0.3 Us
- a Dummy level
-
- The TBS bandwidth is TBS_NUM/TBS_DEN
-
-
- It can accept these task models (into () the mandatory fields):
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- NRT_TASK_MODEL at level 1
- SOFT_TASK_MODEL (wcet, periodicity=APERIODIC) at level 2,3
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/tbs.h"
-#include "modules/dummy.h"
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 1200
-
-#define RRTICK 5000
-#define TBS_NUM 1
-#define TBS_DEN 10
-
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- TBS_register_level(TBS_ENABLE_ALL, 0, TBS_NUM, TBS_DEN);
- TBS_register_level(TBS_ENABLE_ALL, 0, TBS_NUM*3, TBS_DEN);
- dummy_register_level();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/base/ego.c
===================================================================
--- rel_1_2/base/ego.c (revision 1198)
+++ rel_1_2/base/ego.c (nonexistent)
@@ -1,240 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ego.c,v 1.3 2003-01-07 17:10:15 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.3 $
- Last update: $Date: 2003-01-07 17:10:15 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/****************************************************************/
-/* PERIODIC PROCESS TEST */
-/****************************************************************/
-
-#include <kernel/kern.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-
-#include <semaphore.h>
-
-#define X0 10
-
-/* task periods */
-#define PERIOD_T1 100000
-#define PERIOD_T2 200000
-#define PERIOD_T3 300000
-
-/* X position of the text printed by each task */
-int y[3] = {100, 180, 260};
-
-/* text printed by each task */
-char talk[3][50] = { "I am ego1 and I print a character every 100 ms",
- "I am ego2 and I print a character every 200 ms",
- "I am ego3 and I print a character every 300 ms"};
-
-/* A semaphore used to access Video Cards in mutual exclusion */
-sem_t mutex;
-
-/***************************************************************/
-
-TASK ego(void *arg)
-{
-int i = (int)arg;
-int leng;
-char s[2];
-int x;
-int j = 0;
-
- /* compute the length of the string to print */
- leng = 0;
- while (talk[i][leng] != 0) leng++;
-
- x = X0;
- s[1] = 0;
- task_endcycle();
-
- while (1) {
- s[0] = talk[i][j];
- sem_wait(&mutex);
- /* grx_text("TEST", 100,100,12,0); */
- grx_text(s,x,y[i],12+i,0);
- sem_post(&mutex);
- x += 8;
- if (++j == leng) {
- j = 0;
- x = X0;
- y[i] += 8;
- if (y[i]>340) y[i]=100;
- }
- task_endcycle();
- }
-}
-
-
-/****************************************************************/
-
-/* This function is called when Alt-X is pressed.
- It simply shutdown the system using sys_end.
- Note that the byebye() function is called only if we exit from
- the system using sys_end()!!!!
-*/
-void my_end(KEY_EVT* e)
-{
- sys_end();
-}
-
-/******************************************************************/
-
-/* This function is called when the system exit correctly after Alt-X.
- It exits from the graphic mode and then it prints a small greeting.
- Note that:
- - The function calls grx_exit, so it must be registered using
- RUNLEVEL_BEFORE_EXIT (RUNLEVEL_AFTER_EXIT does not work because
- at that point the kernel is already returned in real mode!!!)
- - When an exception is raised, the exception handler is called.
- Since the exception handler already exits from the graphic mode,
- this funcion has not to be called. For this reason:
- . we registered byebye using the flag NO_AT_ABORT
- . the exception handler exits using sys_abort; in that way byebye is
- NOT called
-*/
-
-void byebye(void *arg)
-{
- grx_close();
- cprintf("Bye Bye!\n");
-}
-
-/****************************** MAIN ******************************/
-
-int main(int argc, char **argv)
-{
- PID pid1, pid2, pid3;
- KEY_EVT emerg;
- HARD_TASK_MODEL m1, m2, m3;
-
- /* Set the closing function */
- sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
-
- /* Initializes the semaphore */
- sem_init(&mutex,0,1);
-
- /* graphic card Initialization */
- if (grx_init() < 1) {
- sys_abort(1);
- }
-
- if (grx_open(640, 480, 8) < 0) {
- cprintf("GRX Err\n");
- sys_abort(1);
- }
-
- /* set the keyboard handler to exit correctly */
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,my_end);
-
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTR_BIT;
- keyb_hook(emerg,my_end);
-
- /* a small banner */
- grx_text("EGO Test",8,8,WHITE,0);
- grx_text("Press Alt-X to exit",8,16,WHITE,0);
-
- /* ego1 creation */
- hard_task_default_model(m1);
- hard_task_def_ctrl_jet (m1);
- hard_task_def_arg (m1, (void *)0);
- hard_task_def_wcet (m1, 5000);
- hard_task_def_mit (m1, PERIOD_T1);
- hard_task_def_group (m1,1);
- pid1 = task_create("ego1", ego, &m1, NULL);
- if (pid1 == NIL) {
- grx_close();
- perror("Could not create task <ego1>");
- sys_abort(1);
- }
-
- /* ego2 creation */
- hard_task_default_model(m2);
- hard_task_def_ctrl_jet (m2);
- hard_task_def_arg (m2, (void *)1);
- hard_task_def_wcet (m2, 5000);
- hard_task_def_mit (m2, PERIOD_T2);
- hard_task_def_group (m2,1);
- pid2 = task_create("ego2", ego, &m2, NULL);
- if (pid2 == NIL) {
- grx_close();
- perror("Could not create task <ego2>");
- sys_abort(1);
- }
-
- /* ego3 creation */
- hard_task_default_model(m3);
- hard_task_def_ctrl_jet (m3);
- hard_task_def_arg (m3, (void *)2);
- hard_task_def_wcet (m3, 5000);
- hard_task_def_mit (m3, PERIOD_T3);
- hard_task_def_group (m3,1);
- pid3 = task_create("ego3", ego, &m3, NULL);
- if (pid3 == NIL) {
- grx_close();
- perror("Could not create task <ego3>");
- sys_abort(1);
- }
-
- /* and finally we activate the three threads... */
- group_activate(1);
-
- /*
- now the task main ends, but the system does not shutdown because
- there are the three task ego1, ego2, and ego3 running.
-
- The demo will finish if a Alt-X key is pressed.
- */
-
- return 0;
-}
-
-/****************************************************************/
Index: rel_1_2/base/iaster4.c
===================================================================
--- rel_1_2/base/iaster4.c (revision 1198)
+++ rel_1_2/base/iaster4.c (nonexistent)
@@ -1,133 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: iaster4.c,v 1.1 2002-11-11 08:22:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2002-11-11 08:22:45 $
- ------------
-
- System initialization file
-
- The tick is set to TICK ms.
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a TBS (Total Bandwidth Server) level 0.1 Us
- a TBS (Total Bandwidth Server) level 0.3 Us
- a CBS (Constant Bandwidth Server) level
- a Dummy level
-
- The TBS bandwidth is TBS_NUM/TBS_DEN
-
-
- It can accept these task models (into () the mandatory fields):
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- NRT_TASK_MODEL at level 1
- SOFT_TASK_MODEL (wcet, periodicity=APERIODIC) at level 2,3
- SOFT_TASK_MODEL (met,period) at level 4
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/tbs.h"
-#include "modules/cbs.h"
-#include "modules/rrsoft.h"
-#include "modules/dummy.h"
-#include "drivers/keyb.h"
-#include "modules/sem.h"
-#include "modules/hartport.h"
-
-/*+ sysyem tick in us +*/
-//#define TICK 300
-#define TICK 0
-
-#define RRTICK 5000
-#define TBS_NUM 1
-#define TBS_DEN 10
-
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- TBS_register_level(TBS_ENABLE_ALL, 0, TBS_NUM, TBS_DEN);
- TBS_register_level(TBS_ENABLE_ALL, 0, TBS_NUM*3, TBS_DEN);
- CBS_register_level(CBS_ENABLE_ALL, 0);
-
-/* RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD);
- RR_register_level(RRTICK, RR_MAIN_NO, mb);
- RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //cbs
- RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //tbs
- RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //tbs
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
-*/
-
- dummy_register_level();
-
- SEM_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/base/preempt.c
===================================================================
--- rel_1_2/base/preempt.c (revision 1198)
+++ rel_1_2/base/preempt.c (nonexistent)
@@ -1,149 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: preempt.c,v 1.2 2003-01-07 17:10:15 pj Exp $
-
- CBS test with preemption disabling
-
-*/
-
-#include "kernel/kern.h"
-
-void *periodic(void *arg)
-{
- int i;
- int y = (int)arg;
-
- for (i = 19; i < 60; i++) {
- puts_xy(i,y,7,"*");
-
- task_endcycle();
- }
-
- cprintf("Periodic: Task %d end.\n", exec_shadow);
-
- return 0;
-}
-
-void *blocker(void *arg)
-{
- struct timespec t;
-
- task_nopreempt();
- cprintf("Blocker: Task nopreempt\n");
-
- do {
- sys_gettime(&t);
- } while (t.tv_sec < 5);
-
- cprintf("Blocker: Task preempt\n");
- task_preempt();
-
- cprintf("Blocker: end\n");
-
- return 0;
-}
-
-
-
-int main(int argc, char **argv)
-{
- struct timespec t;
- NRT_TASK_MODEL m;
- SOFT_TASK_MODEL m_aper;
- PID p;
-
- clear();
- cprintf("Preemption Test.\n");
- cprintf("Start time: two periodic tasks and a blocker are created and activated.\n");
- cprintf("2 seconds : blocker calls task_nopreempt.\n");
- cprintf("5 seconds : task_preempt is called.\n");
- cprintf(" The blocked task exec its pending activations.\n");
- cprintf("10 seconds: the test stops.\n");
- puts_xy(1,20,7,"save task:");
- puts_xy(1,21,7,"skip task:");
-
- nrt_task_default_model(m);
-
- soft_task_default_model(m_aper);
- soft_task_def_met(m_aper,10000);
- soft_task_def_period(m_aper,200000);
- soft_task_def_group(m_aper,1);
- soft_task_def_arg(m_aper, (void *)20);
- soft_task_def_periodic(m_aper);
-
- p = task_create("save", periodic, &m_aper, NULL);
- if (p == NIL)
- {
- perror("Can't create save task...\n");
- sys_end();
- }
-
- soft_task_def_skip_arrivals(m_aper);
- soft_task_def_arg(m_aper, (void *)21);
-
- p = task_create("skip", periodic, &m_aper, NULL);
- if (p == NIL)
- {
- perror("Can't create skip task...\n");
- sys_end();
- }
-
- p = task_create("blocker", blocker, &m, NULL);
- if (p == NIL)
- {
- perror("Can't create blocker task...\n");
- sys_end();
- }
-
- cprintf("main : save & skip tasks activated.\n");
- group_activate(1);
-
- do {
- sys_gettime(&t);
- } while (t.tv_sec < 2);
-
- cprintf("main : blocker activated.\n");
- task_activate(p);
-
- do {
- sys_gettime(&t);
- } while (t.tv_sec < 10);
-
- cprintf("main : End!!!\n");
-
- return 0;
-}
Index: rel_1_2/base/readme
===================================================================
--- rel_1_2/base/readme (revision 1198)
+++ rel_1_2/base/readme (nonexistent)
@@ -1,50 +0,0 @@
-This directory contains a set of simple examples, useful to understand
-How to make a Shark application.
-
-Text mode demos:
-- hello.c --> a hello world application
-- timer.c --> tests if the time reads are always increasing
- (useful for debugging purposes)
-- sig.c --> simple example that sends signals
-- semdemo.c --> simple example that uses a semaphore for mutual exclusion
-- pidemo.c --> simple example that uses PI mutexes between NRT and Hard tasks
-- pcdemo.c --> simple example that uses PC mutexes between NRT and Hard tasks
-- srpdemo.c --> simple example that uses SRP mutexes between NRT and Hard tasks
-- mdemo.c --> simple example that uses a mutex, initialized with whatever
- protocol you want ;-)
-- aster.c --> Wow! the original Hartik ASTER demo!!! (EDF, CABs, ...)
-- aster1.c --> a -lot- of periodic tasks that are created and then die
- (6 seconds demo)
-- aster2.c --> a simple stress test: a lot of tasks are created until Utot=1;
- uses jet functions to dump statistics. (60 seconds demo)
-- aster3.c --> aster2 + 8 tasks handled by 2 different TBS servers
-- aster4.c --> aster3 + CBS tasks + Shutdown demo with system tasks
-- aster5.c --> aster3 + only CBS tasks + mutexes... Really interesting!
-- aster6.c --> aster5 + Polling Server to serve the JetCtrl task
-- aster7.c --> another aster clone with Rate monotonic and Polling server
-- aster8.c --> aster5 + Sporadic Server
-- preempt.c --> simple test for CBS, task_preempt, task_nopreempt, and
- save/skip arrivals
-- pcidemo.c --> PCI Bus scan
-- talk.c --> UDP Unix Talk clone (useful to understand the network driver)
-- mousfind.c--> Simple text mouse protocol finder
-- jointest.c--> Simple test that uses the task_join primitive
-- condtest.c--> Simple test that uses condition variables
-- intsem.c --> Simple test that uses internal semaphores
-- keycode.c --> Prints Keyboard Keycodes on the screen
-- memtest.c --> Do you need to use malloc, kern_alloc & co?
-
-Graphical demos:
-- fly.c --> Random flies going around the screen
-- ego.c --> Periodic tasks that writes a phrease on the screen
-- cabs.c --> Example that uses cabs
-- sched.c --> Scheduling example (mouse, EDF, RM, DS, PS, TBS)
-
-Note on the init files:
-- ihello.c (RR+dummy)
-- isemdemo.c (iaster1+Semaphores)
-- iaster1.c (EDF+RR+dummy)
-- iaster3.c (EDF+RR+TBS(0.1)+TBS(0.3)+dummy)
-- iaster4.c (iaster3+CBS)
-- initfile.c (EDF+CBS+RR+dummy, SEMaphores, CABS, HARTPORTs and Keyboard)
-- isched.c (Configurable scheduling architecture)
Index: rel_1_2/base/iaster6.c
===================================================================
--- rel_1_2/base/iaster6.c (revision 1198)
+++ rel_1_2/base/iaster6.c (nonexistent)
@@ -1,130 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: iaster6.c,v 1.1 2002-11-11 08:22:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2002-11-11 08:22:45 $
- ------------
-
- System initialization file
-
- h3pips.c
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a PS (Polling Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- NRT_TASK_MODEL at level 1
- SOFT_TASK_MODEL (met, period) at level 2
- SOFT_TASK_MODEL (periodicity=APERIODIC) at level 3
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-#include "modules/ps.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- PS_register_level(2 /*PS_ENABLE_ALL_EDF*/,0,500,100000);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- PC_register_module();
- NPP_register_module();
- SRP_register_module();
- NOP_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/base/pidemo.c
===================================================================
--- rel_1_2/base/pidemo.c (revision 1198)
+++ rel_1_2/base/pidemo.c (nonexistent)
@@ -1,114 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: pidemo.c,v 1.2 2003-01-07 17:10:15 pj Exp $
-
- This test verify the correctness of the PI module.
-
- the main task (NRT) lock a PI mutex.
- then 2 tasks arrives, with priority higher than the main
-
- the first try to lock the mutex, but it can't, so the main inherit
- his priority. The second simply prints a string.
-
- If all works, the string of the second task is printed after the end of
- the first task.
-
-*/
-
-#include "kernel/kern.h"
-
-mutex_t m1;
-
-
-TASK goofy1(void *a)
-{
- cprintf("goofy1 before mutex_lock\n");
- mutex_lock(&m1);
- cprintf("goofy1 after mutex_lock\n");
-
- mutex_unlock(&m1);
- cprintf("goofy1 after mutex_unlock\n");
-
- return 0;
-}
-
-TASK goofy2()
-{
- cprintf("goofy2 inside goofy2\n");
- return 0;
-}
-
-int main(int argc, char **argv)
-{
- HARD_TASK_MODEL m;
- PID p2,p3;
-
- PI_mutexattr_t a;
-
- hard_task_default_model(m);
- hard_task_def_mit(m,50000);
- hard_task_def_wcet(m,20000);
- hard_task_def_group(m,1);
-
- hard_task_def_arg(m,(void *)1);
- p2 = task_create("goofy1", goofy1, &m, NULL);
- if (p2 == NIL)
- { cprintf("Can't create goofy1 task...\n"); return 1; }
-
- hard_task_def_mit(m,100000);
- p3 = task_create("goofy2", goofy2, &m, NULL);
- if (p3 == NIL)
- { cprintf("Can't create goofy2 task...\n"); return 1; }
-
- PI_mutexattr_default(a);
- mutex_init(&m1,&a);
-
- cprintf("main before mutex_lock\n");
- mutex_lock(&m1);
- cprintf("main after mutex_lock\n");
-
- group_activate(1);
-
- cprintf("main after group_activate\n");
- mutex_unlock(&m1);
- cprintf("main after mutex_unlock\n");
-
- mutex_destroy(&m1);
- cprintf("main after mutex_destroy\n");
-
- return 0;
-}
Index: rel_1_2/base/iaster7.c
===================================================================
--- rel_1_2/base/iaster7.c (revision 1198)
+++ rel_1_2/base/iaster7.c (nonexistent)
@@ -1,144 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: iaster7.c,v 1.1 2002-11-11 08:22:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2002-11-11 08:22:45 $
- ------------
-
- System initialization file
-
- The tick is set to TICK ms.
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register a set of scheduling modules, in a fixed or
- dynamic priority way...
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (periodicity=APERIODIC) at level 1
- NRT_TASK_MODEL at level 2
- SOFT_TASK_MODEL (periodicity=APERIODIC, wcet (only if TBS) ) at level 3,4
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/tbs.h"
-
-#include "modules/rm.h"
-#include "modules/rr.h"
-#include "modules/ps.h"
-
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-
-#include "drivers/keyb.h"
-
-#include <ll/stdio.h>
-
-
-/*+ sysyem tick in us +*/
-#define TICK 300
-
-#define RRTICK 5000
-
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
-// EDF_register_level(EDF_ENABLE_ALL);
-// PS_register_level(2 /*PS_ENABLE_ALL_EDF*/,0,1000,100000);
-// RR_register_level(RRTICK, RR_MAIN_YES, mb);
-// TBS_register_level(TBS_ENABLE_ALL, 0, 1, 10);
-// PS_register_level(2,0,3000,10000);
-// TBS_register_level(TBS_ENABLE_ALL, 0, 3, 10);
-
-
- RM_register_level(RM_ENABLE_ALL);
- PS_register_level(PS_ENABLE_ALL_RM,0,1000,100000);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- PS_register_level(4,0,10000,100000);
- PS_register_level(4,0,30000,100000);
-
-
-
- dummy_register_level();
-
- SEM_register_module();
-
- return TICK;
-}
-
-SOFT_TASK_MODEL m;
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- KEYB_PARMS k = BASE_KEYB;
-
- soft_task_default_model(m);
- soft_task_def_wcet(m,2000);
- soft_task_def_met(m,800);
- soft_task_def_period(m,25000);
- soft_task_def_system(m);
- soft_task_def_nokill(m);
- soft_task_def_aperiodic(m);
- soft_task_def_level(m,4);
- keyb_def_task(k,&m);
-
- HARTPORT_init();
-
- if (KEYB_init(&k) < 0)
- cprintf("Error during the init of the Keyboard!!!");
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/base/aster.c
===================================================================
--- rel_1_2/base/aster.c (revision 1198)
+++ rel_1_2/base/aster.c (nonexistent)
@@ -1,413 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai, Gerardo Lamastra and Giuseppe Lipari
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: aster.c,v 1.2 2003-01-07 17:10:15 pj Exp $
-
- Author: Gerardo Lamastra
- Giuseppe Lipari
- Date: 1/10/96
-
- File: Aster.C
- Revision: 1.6
-
-*/
-
-/*
- Well, this is only a stupid demo which intend to show many
- HARTIK+ capabilities; the application is structured in the followig
- way: there is an ASTER task wich randomly creates some ASTEROID tasks
- which are displayed into the first window; each task is HARD/PERIODIC
- and auto-kills itself when it reaches the window end!
- An other couple of tasks, TITLE & PUT give an example of port
- communication facility; the server task creates the port, the client
- task connect to it and uses the server to accomplish some stuff.
- Port can be declared READ/WRITE and can model ONE-TO-ONE communication
- or MANY-TO-ONE communication.
- Finally a second couple of tasks realizes a communiation through CABs;
- each time a key is pressed, the ascii code is posted into the CAB by the
- CCC task while the second task, WRITE, displays it on the screen and
- perform other silly actions.
- Finally a CLOCK task is implemented to test system clock.
- Please note that usually the HARTIK+ application is made up of a task
- group which interacts among them, while the main() function, which
- became a task itself when the kernel is activated, is suspended until
- the system is ready to terminate; the MAIN task can also be used to make
- other background activities, but it should not be killed; when the
- application terminates, the control is passed to MAIN which kills
- everybody, shut down the system and can handle other operations using
- the services available with the previou operating system (I.E. the DOS).
- If you need to manage sudden abort/exception you should install your own
- exception handler and raise it through the exc_raise() primitive to
- make the system abort safely!
- Remember that the exit functions posted through sys_atexit() will be
- executed in both cases, to allow clean system shutdown.
-*/
-
-//#include <string.h>
-//#include <stdlib.h>
-
-#include <kernel/kern.h>
-#include <modules/sem.h>
-#include <modules/hartport.h>
-#include <modules/cabs.h>
-#include <drivers/keyb.h>
-#include <string.h>
-
-
-#define __VPAGING__
-
-#include <drivers/keyb.h>
-#include <drivers/crtwin.h>
-
-int num_aster = 0;
-#define ASTER_LIM 67
-
-CAB cc;
-BYTE esc = FALSE;
-
-TASK asteroide(void)
-{
- int i = 1;
- int y = rand() % 7 + 1;
- while (i < ASTER_LIM) {
- puts_xy(i,y,WHITE,"*");
- task_endcycle();
-
- puts_xy(i,y,WHITE," ");
- i++;
- }
- num_aster--;
- return 0;
-}
-
-DWORD taskCreated = 0;
-
-TASK aster(void)
-{
- PID p;
- SOFT_TASK_MODEL m_soft;
- int r;
- WIN w;
-
- win_init(&w,0,0,ASTER_LIM,8);
- win_frame(&w,BLACK,WHITE,"Asteroids",2);
-
- soft_task_default_model(m_soft);
- soft_task_def_met(m_soft,2000);
- soft_task_def_ctrl_jet(m_soft);
-
- srand(7);
- while (1) {
- if (num_aster < 5) {
- r = (rand() % 50) - 25;
- soft_task_def_arg(m_soft,(void *)((rand() % 7)+1));
- soft_task_def_period(m_soft,(50 + r)*1000);
- p = task_create("aaa",asteroide,(TASK_MODEL *)&m_soft,NULL);
- taskCreated++;
- task_activate(p);
- num_aster++;
- }
-
- task_endcycle();
- }
-}
-
-TASK clock()
-{
- WIN w;
- int s = 0, m = 0;
-
- win_init(&w,68,0,11,2);
- win_frame(&w,BLACK,WHITE,"Clk",1);
-
- while(1) {
- printf_xy(70,1,WHITE,"%2d : %2d",m,s);
- task_endcycle();
-
- if (++s > 59) {
- s = 0;
- m++;
- }
- printf_xy(70,1,WHITE,"%2d : %2d",m,s);
- task_endcycle();
- }
-}
-
-TASK title()
-{
- PORT t;
- WIN w;
- int i,pos = 77;
- char msg[85],tmp[85],ss[2];
- BYTE c;
-
- win_init(&w,0,9,79,2);
- win_frame(&w,BLACK,WHITE,"Title",2);
-
- for (i=0; i < 77; i++) msg[i] = ' ';
- msg[77] = 0;
-
- t = port_connect("title",1,STREAM,READ);
-
- while (1) {
- port_receive(t,&c,BLOCK);
- ss[0] = c;
- ss[1] = 0;
- strcat(msg,ss);
- puts_xy(1,10,WHITE,msg);
- pos++;
- if (pos > 77) {
- strcpy(tmp,&(msg[1]));
- tmp[pos-1] = 0;
- pos -= 1;
- strcpy(msg,tmp);
- }
- task_endcycle();
- }
-}
-
-#define STR "..................... Hartik+ ....................."\
- " Guarantees hard tasks "\
- " Includes soft periodic tasks "\
- "TB server for decrementing the aperiodic response time "\
- "SRP for both hard & soft aperiodic tasks "\
- "Portability toward other compilers/system "\
- "Support for different C compiler: Watcom C 16 bit & 32 bit"\
- " -- GNU C (32 bit) -- Borland C (16 bit) -- MS C (16 bit)"\
- " "\
- "Programmers : Gerardo Lamastra (lamastra@sssup2.sssup.it) "\
- " Giuseppe Lipari (lipari@sssup2.sssup.it) "\
- "Alpha AXP PCI-33 porting by Antonino Casile "\
- "(casile@sssup1.sssup.it) "\
- "Research coordinator: Giorgio Buttazzo (giorgio@sssup1.sssup.it)"\
- " "\
- " "\
- " "
-
-static char GreetMsg[1600];
-
-TASK put(void)
-{
- PORT p;
-
- strcpy(GreetMsg,STR);
-
- p = port_create("title",strlen(GreetMsg),1,STREAM,WRITE);
- while(1) {
- port_send(p,GreetMsg,BLOCK);
- task_endcycle();
- }
-}
-
-TASK ccc(void)
-{
- WIN w;
- char *m;
-
- win_init(&w,68,3,10,3);
- win_frame(&w,BLACK,WHITE,"CCC",2);
- puts_xy(70,4,WHITE,"Cab");
-
- while(1) {
- m = cab_getmes(cc);
- puts_xy(72,5,WHITE,m);
- cab_unget(cc,m);
- task_endcycle();
- }
-}
-
-
-TASK write_keyb()
-{
- BYTE c;
- char *msg;
-
- while (1) {
- c = keyb_getchar();
- if (c == ESC) {
- esc = TRUE;
- task_endcycle();
- }
- else {
-#ifdef __VPAGING__
- if (c == 's') {
- if (get_visual_page() == 0) set_visual_page(1);
- else if (get_visual_page() == 1) set_visual_page(0);
- }
-#endif
- msg = cab_reserve(cc);
- msg[0] = c;
- msg[1] = 0;
- cab_putmes(cc,msg);
- }
- }
-}
-
-#define DELTA 200000.0
-double carico(double rif,BYTE init)
-{
- double i;
- DWORD t1 = 0,t2 = 1000;
- double u;
-
- i = 0.0;
- do {
- i += 1;
- } while (i <= DELTA);
-
- u = i / ((double) (t2 - t1));
-
- if (init) return u;
- else return (1.0 - u/rif);
-}
-
-void my_end(KEY_EVT *e)
-{
- set_active_page(0);
- set_visual_page(0);
- cprintf("Ctrl-Brk pressed!\n");
- sys_end();
-}
-
-int main(int argc, char **argv)
-{
- PID p1,p2,p3,p4,p5,p6;
-
- HARD_TASK_MODEL m_per;
- SOFT_TASK_MODEL m_soft;
- NRT_TASK_MODEL m_nrt;
-
- KEY_EVT emerg;
- // double rif;
- struct timespec t;
-
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,my_end);
-
-#ifdef __VPAGING__
- set_active_page(1);
- set_visual_page(1);
-#endif
-
-
- CRSR_OFF();
- clear();
- puts_xy(0,20,WHITE,"Press ESC to exit demo.");
- cc = cab_create("Cab",2,2);
-
- soft_task_default_model(m_soft);
- soft_task_def_period(m_soft,500000);
- soft_task_def_met(m_soft,1000);
- soft_task_def_group(m_soft, 1);
- p1 = task_create("Aster",aster,&m_soft,NULL);
- if (p1 == -1) {
- perror("Aster.C(main): Could not create task <aster>");
- sys_abort(-1);
- }
-
- hard_task_default_model(m_per);
- hard_task_def_mit(m_per,500000);
- hard_task_def_wcet(m_per,1000);
- hard_task_def_group(m_per, 1);
- p2 = task_create("Clock",clock,&m_per,NULL);
- if (p2 == -1) {
- perror("Aster.C(main): Could not create task <Clock>");
- sys_abort(-1);
- }
-
- soft_task_def_period(m_soft, 50000);
- p3 = task_create("Title",title,&m_soft, NULL);
- if (p3 == -1) {
- perror("Aster.C(main): Could not create task <Title>");
- sys_abort(-1);
- }
-
- soft_task_def_period(m_soft, 1000000);
- p4 = task_create("Put",put,&m_soft, NULL);
- if (p4 == -1) {
- perror("Aster.C(main): Could not create task <Put>");
- sys_abort(-1);
- }
-
- nrt_task_default_model(m_nrt);
- nrt_task_def_group(m_nrt, 1);
- p5 = task_create("Write",write_keyb,&m_nrt,NULL);
- if (p5 == -1) {
- perror("Aster.C(main): Could not create task <Write>");
- sys_abort(-1);
- }
-
- hard_task_def_mit(m_per, 50000);
- p6 = task_create("CabTask",ccc,&m_per,NULL);
- if (p6 == -1) {
- perror("Aster.C(main): Could not create task <CabTask>\n");
- sys_abort(-1);
- }
-
- /*
- task_activate(p1);
- task_activate(p2);
- task_activate(p3);
- task_activate(p4);
- task_activate(p5);
- task_activate(p6);
- */
- group_activate(1);
-
- while (!esc) {
- sys_gettime(&t);
- printf_xy(0,21,WHITE,"Clock : %-9ds %-9dns",(int)t.tv_sec, (int)t.tv_nsec);
- }
-
- group_kill(1);
- clear();
- CRSR_STD();
-#ifdef __VPAGING__
- set_active_page(0);
- set_visual_page(0);
-#endif
- cprintf("System closed\n");
- sys_end();
- /*
- sys_status(NORM_STATUS|BLOCKED_STATUS|SLEEP_STATUS|IDLE_STATUS);
- sys_status(NORM_STATUS|SLEEP_STATUS);
- */
- return 0;
-}
-
Index: rel_1_2/base/iaster8.c
===================================================================
--- rel_1_2/base/iaster8.c (revision 1198)
+++ rel_1_2/base/iaster8.c (nonexistent)
@@ -1,128 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: iaster8.c,v 1.1 2002-11-11 08:22:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2002-11-11 08:22:45 $
- ------------
-
- System initialization file
-
- h3piss.c
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a CBS (Costant Bandwidth Server) level
- a SS (Sporadic Server) level
- a RR (Round Robin) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- SOFT_TASK_MODEL (periodicity=APERIODIC) at level 2
- NRT_TASK_MODEL at level 3
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "modules/rm.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-#include "modules/ss.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ system tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- SS_register_level(SS_ENABLE_GUARANTEE_EDF,0,5000,20000);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- PC_register_module();
- PI_register_module();
- NPP_register_module();
- SRP_register_module();
- NOP_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
- KEYB_init(NULL);
- __call_main__(mb);
- return (void *)0;
-}
-
Index: rel_1_2/base/pcidemo.c
===================================================================
--- rel_1_2/base/pcidemo.c (revision 1198)
+++ rel_1_2/base/pcidemo.c (nonexistent)
@@ -1,86 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai, Luca Abeni
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: pcidemo.c,v 1.1 2002-11-11 08:22:46 pj Exp $
-
- This is the pcitest Hartik's example.
-
-*/
-
-#include "kernel/kern.h"
-#include "drivers/keyb.h"
-
-#include "drivers/llpci.h"
-#include "drivers/pci.h"
-
-void scan()
-{
- BYTE bus, dev;
-
- /* Scan the devices connected to the PCI bus */
- if (pci_init() == 1) {
- clear();
- pci_show();
- bus = 0; dev = 0;
- if (pcibios_find_device(0x8086, 0x7000, 0, &bus, &dev) == NULL)
- cprintf("Not found... %d %d\n", bus, dev);
- else cprintf("Found: %d \t %d\n", bus, dev);
-
- if (pcibios_find_class(0x300, 0, &bus, &dev) == NULL)
- cprintf("Not found... %d %d\n", bus, dev);
- else cprintf("Found: %d \t %d\n", bus, dev);
- } else cprintf("PCI not found!!!\n");
-}
-
-void endfun(KEY_EVT *k)
-{
- sys_end();
-}
-
-int main (int argc, char *argv[])
-{
- KEY_EVT k;
-
- k.flag = CNTR_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,endfun);
-
- scan();
-
- sys_end();
- return 0;
-}
Index: rel_1_2/base/sig.c
===================================================================
--- rel_1_2/base/sig.c (revision 1198)
+++ rel_1_2/base/sig.c (nonexistent)
@@ -1,168 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: sig.c,v 1.3 2003-01-07 17:10:15 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.3 $
- Last update: $Date: 2003-01-07 17:10:15 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- Test Number 5:
-
- this test is a simple main() function with one other task
-
- This test can be useful to test functions like:
-
- sys_gettime
- sigemptyset
- sigaddset
- hartik_deliver_pending_signals
- sys_end
- task_sigmask
- sigaction
- sigqueue
- task_signal
-*/
-
-#include "kernel/kern.h"
-
-
-TASK goofy(void *arg)
-{
- struct timespec t;
-
- cprintf("Goofy: waiting 2 secs...\n");
-
- do {
- sys_gettime(&t);
- } while (t.tv_sec < 2); // wait until 2 sec
-
- cprintf("Goofy: ok, I'm ready :-)\n");
-
- return 0;
-}
-
-void catchit_RT(int signo, siginfo_t *info, void *extra)
-{
- cprintf("RT signal: Current Running Task = %d signo=%d code=%d value=%d from pid=%d\n",
- exec_shadow,
- info->si_signo, info->si_code,
- info->si_value.sival_int, info->si_task);
-}
-
-void catchit(int signo)
-{
- cprintf("RT signal: Current Running Task = %d signo=%d\n",
- exec_shadow, signo);
-}
-
-int main(int argc, char **argv)
-{
- struct timespec t;
- NRT_TASK_MODEL m;
- PID p2;
-
- sigset_t newmask;
- sigset_t oldmask;
- struct sigaction action;
- union sigval sval;
-
- clear();
-
- /* Set the signal action */
- action.sa_flags = SA_SIGINFO;
- action.sa_sigaction = catchit_RT;
- action.sa_handler = 0;
- action.sa_mask = 0;
-
- if (sigaction(SIGUSR1, &action, NULL) == -1) {
- perror("Error using sigaction.");
- return -1;
- }
-
- action.sa_flags = 0;
- action.sa_handler = (void (*)(int))catchit;
-
- if (sigaction(SIGILL, &action, NULL) == -1) {
- perror("Error using sigaction.");
- return -1;
- }
-
- /* create another task */
- nrt_task_default_model(m);
- nrt_task_def_group(m,1);
-
- p2 = task_create("goofy", goofy, &m, NULL);
- if (p2 == NIL)
- {
- cprintf("Can't create goofy task...\n");
- return 1;
- }
-
- group_activate(1);
-
- /* block the signal for the main task */
- sigemptyset(&newmask);
- sigaddset(&newmask,SIGUSR1);
- task_sigmask(SIG_BLOCK, &newmask, &oldmask); // pthread_sigmask
-
- cprintf("main: Sending 2 signals ...\n");
-
- sval.sival_int = 123;
- sigqueue(0,SIGUSR1,sval);
- sval.sival_int = 999;
- sigqueue(0,SIGUSR1,sval);
-
- cprintf("main: Now sending a signal to myself,"
- " then wait until 4 secs...\n");
-
- task_signal(0 /* main */, SIGILL); // pthread_kill
-
- NULL_TIMESPEC(&t);
- do {
- sys_gettime(&t);
- } while (t.tv_sec < 4); // wait until 4 s
-
- cprintf("main: ending...\n");
-
- return 0;
-}
Index: rel_1_2/base/condtest.c
===================================================================
--- rel_1_2/base/condtest.c (revision 1198)
+++ rel_1_2/base/condtest.c (nonexistent)
@@ -1,222 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Giorgio Buttazzo, Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: condtest.c,v 1.1 2002-11-11 08:22:45 pj Exp $
-
- This test verify the correctness of the condition variables.
- (... it doesn't test all...)
-
- The test uses 1 mutex
-
- the main task (NRT) creates three tasks.
-
- J0, J1, J3
- starts, lock the mutex, and wait on a condition variable
-
- J2
- at t = 0.5 lock the mutex and call cond_signal
- at t = 1 lock the mutex and call cond_signal
-
-*/
-
-#include "kernel/kern.h"
-#include "drivers/keyb.h"
-
-
-mutex_t m0;
-cond_t c0;
-
-int number = 0;
-
-PID p0,p1,p2,p3;
-
-TASK j0()
-{
- cprintf("J0: before locking m0\n");
- mutex_lock(&m0);
- cprintf("J0: locked m0, waiting on c0, number =%d\n", number);
- while (!number) {
- cond_wait(&c0,&m0);
- cprintf("J0: number = %d, if >0 unlocking m0\n",number);
- }
- number--;
- mutex_unlock(&m0);
- cprintf("J0: unlocked m0, end task\n");
- return 0;
-}
-
-
-TASK j1()
-{
- cprintf("J1: before locking m0\n");
- mutex_lock(&m0);
- cprintf("J1: locked m0, waiting on c0, number =%d\n", number);
- while (!number) {
- cond_wait(&c0,&m0);
- cprintf("J1: number = %d, if >0 unlocking m0\n",number);
- }
- number--;
- mutex_unlock(&m0);
- cprintf("J1: unlocked m0, end task\n");
- return 0;
-}
-
-
-TASK j2()
-{
-// struct timespec t;
-
- cprintf("J2: started, waiting t=0.5 sec\n");
- while (sys_gettime(NULL) < 500000);
-
- cprintf("J2: before locking m0\n");
- mutex_lock(&m0);
- cprintf("J2: locked m0, number++ (was %d), cond_signal\n", number);
-
- number++;
- cond_signal(&c0);
-// cond_broadcast(&c0);
-
- cprintf("J2: unlocking m0\n");
- mutex_unlock(&m0);
-
- cprintf("J2: waiting t=1 sec\n");
- while (sys_gettime(NULL) < 1000000);
-
- cprintf("J2: Killing J3\n");
- task_kill(p3);
- cprintf("J2: before locking m0\n");
- mutex_lock(&m0);
- cprintf("J2: locked m0, number++ (was %d), cond_signal\n", number);
-
- number++;
- cond_signal(&c0);
-// cond_broadcast(&c0);
-
- cprintf("J2: unlocking m0\n");
- mutex_unlock(&m0);
- cprintf("J2: unlocked m0, end task\n");
- return 0;
-}
-
-void cleanup_lock(void *arg)
-{
- cprintf("J3: KILL!!!\n");
- mutex_unlock(&m0);
- cprintf("J3: unlocked m0 by the cleanup function\n");
-}
-
-TASK j3()
-{
- cprintf("J3: before locking m0\n");
- mutex_lock(&m0);
- cprintf("J3: locked m0, waiting on c0, number =%d\n", number);
- task_cleanup_push(cleanup_lock, (void *)&m0);
- while (!number) {
- cond_wait(&c0,&m0);
- cprintf("J3: number = %d, if >0 unlocking m0\n",number);
- }
- task_cleanup_pop(0);
- // I hope this task never reach this point... it is killed by J2!!!
- number--;
- mutex_unlock(&m0);
- cprintf("J3: unlocked m0, end task\n");
- return 0;
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-
-int main(int argc, char **argv)
-{
-// struct timespec t;
-
- NRT_TASK_MODEL m;
-
- PI_mutexattr_t a;
-
- KEY_EVT emerg;
-
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- /* ---------------------------------------------------------------------
- Task creation
- --------------------------------------------------------------------- */
-
- nrt_task_default_model(m);
- nrt_task_def_group(m,1);
- p0 = task_create("J0", j0, &m, NULL);
- if (p0 == NIL)
- { cprintf("Can't create J0 task...\n"); return 1; }
-
- p1 = task_create("J1", j1, &m, NULL);
- if (p1 == NIL)
- { cprintf("Can't create J1 task...\n"); return 1; }
-
- p2 = task_create("J2", j2, &m, NULL);
- if (p2 == NIL)
- { cprintf("Can't create J2 task...\n"); return 1; }
-
- p3 = task_create("J3", j3, &m, NULL);
- if (p3 == NIL)
- { cprintf("Can't create J3 task...\n"); return 1; }
-
- /* ---------------------------------------------------------------------
- Mutex creation
- --------------------------------------------------------------------- */
-
- PI_mutexattr_default(a);
- mutex_init(&m0,&a);
-
- cond_init(&c0);
-
- /* ---------------------------------------------------------------------
- Event post
- --------------------------------------------------------------------- */
-
- group_activate(1);
-
- cprintf("END main\n");
-
- return 0;
-}
Index: rel_1_2/base/keycode.c
===================================================================
--- rel_1_2/base/keycode.c (revision 1198)
+++ rel_1_2/base/keycode.c (nonexistent)
@@ -1,80 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Giorgio Buttazzo, Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: keycode.c,v 1.1 2002-11-11 08:22:46 pj Exp $
- */
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-int main(int argc, char **argv)
-{
- KEY_EVT k;
-
- clear();
- k.ascii = 0;
-
- cprintf("Press ESC to end the demo, 2 for itamap, 3 for engmap\n");
- while (k.ascii != ESC) {
- keyb_getcode(&k,BLOCK);
- if (k.ascii == '2') {
- keyb_set_map(itaMap);
- cprintf("\nItalian Keymap set\n");
- }
- if (k.ascii == '3') {
- keyb_set_map(engMap);
- cprintf("\nEnglish Keymap set\n");
- }
- if (isLeftCtrl(k)) putc_xy(72+0,0,RED,'L');
- else putc_xy(72+0,0,RED,' ');
- if (isRightCtrl(k)) putc_xy(72+1,0,RED,'R');
- else putc_xy(72+1,0,RED,' ');
- if (isLeftAlt(k)) putc_xy(72+2,0,GREEN,'L');
- else putc_xy(72+2,0,RED,' ');
- if (isRightAlt(k)) putc_xy(72+3,0,GREEN,'R');
- else putc_xy(72+3,0,RED,' ');
- if (isLeftShift(k)) putc_xy(72+4,0,YELLOW,'L');
- else putc_xy(72+4,0,RED,' ');
- if (isRightShift(k)) putc_xy(72+5,0,YELLOW,'R');
- else putc_xy(72+5,0,RED,' ');
-
- cprintf("%d [%c]\t",k.scan,k.ascii);
-
- }
-
- sys_end();
- return 0;
-}
Index: rel_1_2/base/mousfind.c
===================================================================
--- rel_1_2/base/mousfind.c (revision 1198)
+++ rel_1_2/base/mousfind.c (nonexistent)
@@ -1,216 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Giorgio Buttazzo, Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * CVS : $Id: mousfind.c,v 1.2 2003-03-24 11:18:19 pj Exp $
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai, Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <kernel/kern.h>
-#include <drivers/mouse.h>
-#include <drivers/keyb.h>
-
-/* don't include this into real applications!!! */
-#include <../drivers/oldchar/_mouse.h>
-
-int done;
-
-void my_mouse_hook(MOUSE_EVT *m)
-{
- static int buttons=-1;
- if (buttons!=m->buttons) {
- buttons=m->buttons;
- //mouse_off();
- if (isLeftButton(*m)) puts_xy(9,22,RED,"active");
- else puts_xy(9,22,RED," ");
- if (isCentralButton(*m)) puts_xy(9,23,RED,"active");
- else puts_xy(9,23,RED," ");
- if (isRightButton(*m)) puts_xy(9,24,RED,"active");
- else puts_xy(9,24,RED," ");
- //mouse_on();
- }
-
-
- /*
- if (tindex>20&&first) {
- int i;
- cprintf("\nSTART\n");
- for (i=0;i<tindex;i++) {
- cprintf("%i\n",(int)tdata[i]);
- }
- for (i=1;i<tindex;i++) {
- cprintf("%i ",(int)(tdata[i]-tdata[i-1]));
- }
- first=0;
- }
- */
-
-}
-
-int main(int argc,char *argv[])
-{
- MOUSE_PARMS mouse=BASE_MOUSE;
- int ch,running,nm;
- int sens=5;
-
- /* screen */
- clear();
-
- nm=0;
- while (*vmouse[nm].name!='\0') {
- cprintf("%c %s:\t %s\n",(char)('a'+nm),vmouse[nm].name,vmouse[nm].desc);
- nm++;
- }
-
- cprintf("\n[a-%c]\t select a mouse server\n",(char)(nm+'a'-1));
- cprintf("[z]\t decrement mouse threshold\n");
- cprintf("[x]\t incremnet mouse threshold\n");
- cprintf("[1-4]\t COM port\n");
- cprintf("[ENTER]\t exit\n");
- place(0,20);
- cputs("mouse server:\n");
- cputs("threshold:\n");
- cputs("left :\n");
- cputs("central:\n");
- cputs("right :");
- CRSR_OFF();
-
- /* main loop */
- running=done=0;
-
- mouse_def_ms(mouse,0);
-
- while (!done) {
- ch=keyb_getch(TRUE);
- switch(ch) {
-
- /* exit demo */
-
- case ENTER:
- done = 1;
- break;
-
- /* decrement threshold */
-
- case 'z':
- sens--;
- if (sens<2) sens=2;
- mouse_threshold(sens);
- /* threshold */
- place(11,21);
- cprintf("%i ",sens);
- break;
-
- /* increment threshold */
-
- case 'x':
- sens++;
- if (sens>100) sens=100;
- mouse_threshold(sens);
- /* threshold */
- place(11,21);
- cprintf("%i ",sens);
- break;
-
- /* change mouse protocol */
-
- default:
- if (ch>='a'&&ch<='a'+nm-1) {
- /* don't use this method to change a mouse protocol */
- /* use mouse_def_???? macros instead */
- mouse.type=ch-'a';
- } else
- if (ch>='1'&&ch<='4') {
- /* don't use this method to change a mouse com port */
- /* use mouse_def_???? macros instead */
- mouse.port = ch-'1';
- }
- else
- break;
-
- /* check if a mouse server is running... */
- if (running) {
- /* disable autocursor */
- mouse_txtcursor(DISABLE);
- /* destroy actual mouse server */
- mouse_end();
- }
- /* mouse server name */
- puts_xy(14,20,GREEN," ");
- puts_xy(14,20,GREEN,vmouse[mouse.type].name);
- /* threshold */
- place(11,21);
- cprintf("%i ",sens);
- /* start a new server */
- running=(mouse_init(&mouse)==0?1:0);
- /* if running ...*/
- if (running) {
- /* set mouse limit */
- mouse_limit(0,0,cons_columns-1,cons_rows-1);
- /* enable autocursor */
- mouse_txtcursor(ENABLE|AUTOOFF);
- /* hook my function */
- mouse_hook(my_mouse_hook);
- /* show mouse cursor */
- mouse_on();
- }
- break;
-
- }
- }
-
- CRSR_STD();
- clear();
- sys_end();
- return 0;
-}
Index: rel_1_2/kalm3d/readme.txt
===================================================================
--- rel_1_2/kalm3d/readme.txt (revision 1198)
+++ rel_1_2/kalm3d/readme.txt (nonexistent)
@@ -1,51 +0,0 @@
---------------------------------------
-Inverted Pendulum Demo with Mesa
-
-by
-
-Giacomo Guidi <giacomo@gandalf.sssup.it>
-
-Last update 17/03/2003
---------------------------------------
-
-This is the old Inverted Pendulum control
-demo rewrited usigng the Mesa support
-
-The demo needs a PCL812 card present and
-the inv.pendulum hardware
-
-The graphic cards actually supported are:
-
-GEFORCE TNT TNT2 - driver name NV3
-RAGE128 RADEON - driver name R128
-SAVAGE VIRGE - driver neme SAVAGE
-
---------------------------------------
-
-The demo is composed by:
-
-MAKEFILE The makefile used to compile the application
-README.TXT This file
-INITFILE.C The init file
-KALM3D.C The Inv.Pendulum Demo
-CARRELLO.C The control task
-
---------------------------------------
-
-- To specify your card change the line
-
-#define CARD <driver name>
-
-- The demo calls the grx and off-screen Mesa functions.
-The resolution must be 16 bitsperpixel (64K colors) and
-the graphic access mode must be linear.
-
-- There are two buffers
-
- The video buffer (video_buf)
- The virtual buffer (rgb_565_buf)
-
- copy_videomem_16to16 links these buffers
-
-
-
Index: rel_1_2/kalm3d/const.h
===================================================================
--- rel_1_2/kalm3d/const.h (revision 1198)
+++ rel_1_2/kalm3d/const.h (nonexistent)
@@ -1,36 +0,0 @@
-#ifndef __CONST__
-#define __CONST__
-
-extern unsigned long int PERIOD_CARRELLO;
-extern unsigned long int PERIOD_DISEGNA;
-
-#define DEADSECX(x) (x * 1.0e-6 )
-#define DEADSECTH(x) (x * 1.0e-6 )
-
-#define PARAM {{ 1. , 300 , 0.79 , 23 },0.70 ,2.5 ,20.,20., 0.1, 1 , 1, 0.}
-
-#define LUNGH 35.0
-#define THETAMAX 45.0
-#define FCA 57.29578
-#define AVR 10
-#define VDANG 2.4
-#define NMAX 300
-#define SEC_ID 7.0
-#define MAXRUN_ID 9 //16
-
-struct Parametri{
- float GUAD[4];
- float COST;
- float NOISE;
- float WCUT;
- float WCUT1;
- float OFFSVAL;
- int DEADLINE;
- int SCAN;
- float XTRASL;
-};
-
-extern struct Parametri prm;
-extern float vmax, vmin, vmaxth, vminth;
-
-#endif
Index: rel_1_2/kalm3d/kalm3d.c
===================================================================
--- rel_1_2/kalm3d/kalm3d.c (revision 1198)
+++ rel_1_2/kalm3d/kalm3d.c (nonexistent)
@@ -1,454 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Giacomo Guidi <giacomo@gandalf.sssup.it>
- *
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-#include <ll/i386/defs.h>
-
-#include <drivers/vga.h>
-#include <drivers/pclab.h>
-
-#include <math.h>
-#include <stdlib.h>
-#include <kernel/log.h>
-#include <GL/osmesa.h>
-#include <GL/glut.h>
-
-#include <modules/hartport.h>
-#include <kernel/kern.h>
-#include <kernel/func.h>
-#include <ll/i386/x-dos.h>
-#include <drivers/keyb.h>
-
-#include "const.h"
-
-#define WIDTH 640
-#define HEIGHT 480
-#define BYTES_PP 2
-#define INITSTR G640x480x64K
-#define CARD SAVAGE
-
-unsigned long int PERIOD_CARRELLO = 10000;
-unsigned long int PERIOD_DISEGNA = 80000;
-struct Parametri prm=PARAM;
-
-unsigned long int WCET_CARRELLO, WCET_DISEGNA;
-
-TASK carrello(void *);
-
-PID carrello_PID, disegna_PID;
-
-unsigned char *buffers = NULL;
-unsigned char *vbuf = NULL;
-OSMesaContext ctx;
-
-static GLfloat view_rotx = 170.0, view_roty = -200.0, view_rotz = 0.0;
-static GLfloat angle;
-
-GLUquadricObj *quadratic;
-
-static GLfloat SUP_W = 110.0;
-static GLfloat SUP_P = 30.0;
-
-extern void da_motor(float v);
-
-#ifndef M_PI
-#define M_PI 3.14159265
-#endif
-
-void program_end(void)
-{
-
- da_motor(0.0);
-
- OSMesaDestroyContext(ctx);
- free(buffers);
-
- vga_setmode(TEXT,CARD);
-
- sys_end();
-
-}
-
-void program_key_end(KEY_EVT *k)
-{
-
- sys_end();
-
-}
-
-static void draw_box(GLfloat p1x, GLfloat p1y ,GLfloat p1z, GLfloat p2x, GLfloat p2y, GLfloat p2z) {
-
- glBegin(GL_QUADS);
-
- // Front Face
- glVertex3f(p1x, p1y, p1z);
- glVertex3f(p2x, p1y, p1z);
- glVertex3f(p2x, p2y, p1z);
- glVertex3f(p1x, p2y, p1z);
-
- // Back Face
- glVertex3f(p1x, p1y, p2z);
- glVertex3f(p1x, p2y, p2z);
- glVertex3f(p2x, p2y, p2z);
- glVertex3f(p2x, p1y, p2z);
-
- // Top Face
- glVertex3f(p1x, p2y, p2z);
- glVertex3f(p1x, p2y, p1z);
- glVertex3f(p2x, p2y, p1z);
- glVertex3f(p2x, p2y, p2z);
-
- // Bottom Face
- glVertex3f(p1x, p1y, p2z);
- glVertex3f(p2x, p1y, p2z);
- glVertex3f(p2x, p1y, p1z);
- glVertex3f(p1x, p1y, p1z);
-
- // Right face
- glVertex3f(p2x, p1y, p2z);
- glVertex3f(p2x, p2y, p2z);
- glVertex3f(p2x, p2y, p1z);
- glVertex3f(p2x, p1y, p1z);
-
- // Left Face
- glVertex3f(p1x, p1y, p2z);
- glVertex3f(p1x, p1y, p1z);
- glVertex3f(p1x, p2y, p1z);
- glVertex3f(p1x, p2y, p2z);
-
- glEnd();
-
-}
-
-static void draw_carrello(GLfloat x_scene, GLfloat angle_scene) {
-
- static GLfloat gl_white[3] = {1.0f, 1.0f, 1.0f};
- static GLfloat gl_dark_gray[3] = {0.3f, 0.3f, 0.3f};
- static GLfloat gl_gray[3] = {0.7f, 0.7f, 0.7f};
-
- glPushMatrix();
-
- glColor3fv(gl_dark_gray);
-
- glShadeModel(GL_FLAT);
-
- glTranslatef(x_scene, 0.0f, 0.0f);
-
- draw_box(-6.0f, -6.0f, 9.0f, 6.0f, -2.0f, -9.0f);
- draw_box(-6.0f, -2.0f, 9.0f, 6.0f, -1.0f, 4.0f);
-
- glColor3fv(gl_white);
-
- draw_box(-8.0f, -2.0f, -3.0f, 8.0f, -1.0f, -10.0f);
-
- glColor3fv(gl_dark_gray);
-
- draw_box(-5.0f, 1.0f, 8.0f, 5.0f, 9.0f, 6.0f);
- draw_box(-5.0f,1.0f,-6.0f,5.0f,9.0f,-8.0f);
- draw_box(-5.0f,-1.0f,8.0f,5.0f,1.0f,-8.0f);
-
- glShadeModel(GL_SMOOTH);
-
- glColor3fv(gl_white);
-
- glTranslatef(0.0f, 4.5f, -6.0f);
- gluCylinder(quadratic, 2.2f, 2.2f, 12.0f, 16, 16);
-
- glColor3fv(gl_gray);
-
- glTranslatef(0.0f, 0.0f, 6.0f);
- glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
- glRotatef(angle_scene, 0.0f, 1.0f, 0.0f);
- gluCylinder(quadratic, 1.3f, 1.3f, 160.0f, 16, 16);
- glRotatef(-angle_scene, 0.0f, 1.0f, 0.0f);
- glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
-
- glTranslatef(-4.0f, -2.5f, -6.0f);
- gluCylinder(quadratic, 0.5f, 0.5f, 12.0f, 16, 16);
-
- glTranslatef(8.0f, 0.0f, 0.0f);
- gluCylinder(quadratic, 0.5f, 0.5f, 12.0f, 16, 16);
-
- glPopMatrix();
-
-}
-
-static void draw_support() {
-
- static GLfloat gl_dark_gray[3] = {0.3f, 0.3f, 0.3f};
- static GLfloat gl_gray[3] = {0.7f, 0.7f, 0.7f};
-
- glPushMatrix();
-
- glColor3fv(gl_gray);
-
- glShadeModel(GL_FLAT);
-
- draw_box(-SUP_W/2, -0.1f, SUP_P/2, SUP_W/2, 0.1f, -SUP_P/2);
-
- glColor3fv(gl_dark_gray);
-
- draw_box(-SUP_W/2-3.0f, -0.1f, SUP_P/2, -SUP_W/2, 14.0f, -SUP_P/2-0.2f);
- draw_box(SUP_W/2, -0.1f, SUP_P/2, SUP_W/2+3.0f, 14.0f, -SUP_P/2-0.2f);
-
- glShadeModel(GL_SMOOTH);
-
- glColor3fv(gl_gray);
-
- glTranslatef(-SUP_W/2, 6.0f, 0.0f);
- glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
- gluCylinder(quadratic, 1.5f, 1.5f, SUP_W, 16, 16);
-
- glPopMatrix();
-
-}
-
-static void draw(GLfloat prm_x, GLfloat prm_th)
-{
-
- prm_x = -prm_x / LUNGH * (SUP_W-20.0f);
- prm_th = -prm_th * FCA;
-
- glPushMatrix();
-
- glRotatef(view_rotx, 1.0f, 0.0f, 0.0f);
- glRotatef(view_roty, 0.0f, 1.0f, 0.0f);
- glRotatef(view_rotz, 0.0f, 0.0f, 1.0f);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glRotatef(angle, 0.0f, 1.0f, 0.0f);
-
- draw_support();
- glTranslatef(0.0f, 10.0f, -4.0f);
- draw_carrello(prm_x,prm_th);
-
- glPopMatrix();
-
- glFinish();
-
-}
-
-static void init_gl()
-{
-
- static GLfloat pos0[4] = {40.0f, -70.0f, 180.0f, 1.0f};
-
- glClearColor(0.8f, 0.8f, 0.8f, 1.0f);
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos0);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glViewport(0, 0, (GLint) WIDTH, (GLint) HEIGHT);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(45.0f,(GLfloat)WIDTH/(GLfloat)HEIGHT,0.1f,250.0f);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glTranslatef(0.0f, 30.0f, -120.0f);
-
- glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
-
- quadratic=gluNewQuadric();
-
- glEnable(GL_AUTO_NORMAL);
- glEnable(GL_COLOR_MATERIAL);
- glEnable(GL_NORMALIZE);
- glDepthFunc(GL_LEQUAL);
-
-}
-
-TASK disegna(void)
-{
-
- PORT pr_x, pr_th;
- float prm_x, prm_th;
-
- char text[100];
- TIME disegna_TIME, carrello_TIME;
-
- static unsigned long int count = WIDTH * HEIGHT / 2;
-
- pr_x = port_connect("porta1",sizeof(float),STICK,READ);
- pr_th = port_connect("porta2",sizeof(float),STICK,READ);
-
- //vbuf = malloc(WIDTH * HEIGHT * 2); //Debug line
-
- while(1) {
-
- port_receive(pr_x, &prm_x, BLOCK);
- port_receive(pr_th, &prm_th, BLOCK);
-
- angle += 0.2;
-
- draw(prm_x,prm_th);
-
- jet_gettable(carrello_PID, &carrello_TIME, 1);
- jet_gettable(disegna_PID, &disegna_TIME, 1);
-
- sprintf(text,"Hard Task Control PER:%6d us EX:%6d us",(int)PERIOD_CARRELLO,(int)carrello_TIME);
- grx_text(text,10,5,rgb16(0,0,255),rgb16(255,255,255));
- sprintf(text,"Hard Task Draw PER:%6d us EX:%6d us",(int)PERIOD_DISEGNA,(int)disegna_TIME);
- grx_text(text,10,15,rgb16(0,0,255),rgb16(255,255,255));
-
- copy_videomem_16to16(buffers,vbuf,count);
-
- task_endcycle();
-
- }
-
- port_disconnect(pr_x);
- port_disconnect(pr_th);
-
- sys_end();
-
-}
-
-static void screen(int mode)
-{
- vga_modeinfo *minf;
- int mem;
-
- vga_setmode(mode,CARD);
- minf = vga_getmodeinfo(mode);
- if(! (minf->flags & CAPABLE_LINEAR)){
- vga_setmode(TEXT,CARD);
- printk(KERN_INFO "The mode %d is not capable of linear\n",mode);
- return;
- }
- vga_setpage(0);
- if(vga_setlinearaddressing() == -1) {
- vga_setmode(TEXT,CARD);
- printk(KERN_INFO "Could not set linear addressing for mode %d\n",mode);
- return;
- }
-
- mem = minf->linewidth*minf->height;
-
- vbuf = vga_getgraphmem();
- printk(KERN_INFO "Memory mapped to %08x. Mode = %d.\n",(int) vbuf,mode);
- memset(vbuf,0,mem);
-
-}
-
-void waitenter() {
-
- KEY_EVT k;
- char esc = FALSE;
-
- while(!esc) {
- keyb_getcode(&k,BLOCK);
- if (k.ascii == 13) esc = TRUE;
- }
-
-}
-
-
-void init_motor(void)
-{
-
- da_motor(0.0);
-
- cprintf("Calibrazione pendolo inverso...\n");
-
- cprintf("Carr a sx e premi enter\n");
- waitenter();
- vmin=ad_conv(11);
-
- cprintf("Carr a dx e premi enter\n");
- waitenter();
- vmax=ad_conv(11);
-
- cprintf("Asta a sx e premi enter\n");
- waitenter();
- vminth=ad_conv(10);
-
- cprintf("Asta a dx e premi enter\n");
- waitenter();
- vmaxth=ad_conv(10);
-
- cprintf("Vxmax:%f Vxmin:%f Vthmax:%f Vthmin:%f\n",vmax,vmin,vmaxth,vminth);
- waitenter();
-
-}
-
-int main (int argc, char *argv[])
-{
- HARD_TASK_MODEL ht_carrello, ht_disegna;
-
- WCET_CARRELLO =((long int) PERIOD_CARRELLO * (0.05));
- WCET_DISEGNA =((long int) PERIOD_DISEGNA * (0.875));
-
- clear();
-
- sys_atrunlevel((void *) program_end,NULL, RUNLEVEL_BEFORE_EXIT);
-
- hard_task_default_model(ht_carrello);
- hard_task_def_wcet(ht_carrello,WCET_CARRELLO);
- hard_task_def_mit(ht_carrello,PERIOD_CARRELLO);
- hard_task_def_usemath(ht_carrello);
- hard_task_def_group(ht_carrello,1);
- hard_task_def_ctrl_jet(ht_carrello);
-
- carrello_PID = task_create("carrello", carrello, &ht_carrello, NULL);
- if (carrello_PID == -1) {
- sys_end();
- exit(4);
- }
-
- hard_task_default_model(ht_disegna);
- hard_task_def_mit(ht_disegna,PERIOD_DISEGNA);
- hard_task_def_wcet(ht_disegna,WCET_DISEGNA);
- hard_task_def_group(ht_disegna,1);
- hard_task_def_ctrl_jet(ht_disegna);
- hard_task_def_usemath(ht_disegna);
- hard_task_def_stack(ht_disegna,60000);
-
- disegna_PID = task_create("disegna", disegna, &ht_disegna, NULL);
- if (disegna_PID == -1) {
- sys_end();
- exit(4);
- }
-
- {
- KEY_EVT k;
- k.flag = ALTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,program_key_end);
- }
-
- init_motor();
-
- screen(INITSTR);
-
- ctx = OSMesaCreateContext(OSMESA_RGB_565, NULL );
- buffers = malloc(WIDTH * HEIGHT * 2);
-
- grx_setbuffer(buffers, WIDTH, HEIGHT);
- OSMesaMakeCurrent(ctx, buffers, GL_UNSIGNED_SHORT_5_6_5, WIDTH, HEIGHT);
-
- init_gl();
-
- group_activate(1);
-
- return 0;
-
-}
Index: rel_1_2/kalm3d/makefile
===================================================================
--- rel_1_2/kalm3d/makefile (revision 1198)
+++ rel_1_2/kalm3d/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS = kalm3d
-
-include $(BASE)/config/example.mk
-
-kalm3d:
- make -f $(SUBMAKE) APP=kalm3d INIT= OTHEROBJS="initfile.o carrello.o" SHARKOPT="__OSMESA__ __PCLAB__ __OLDCHAR__ __SVGA__"
-
Index: rel_1_2/kalm3d/carrello.c
===================================================================
--- rel_1_2/kalm3d/carrello.c (revision 1198)
+++ rel_1_2/kalm3d/carrello.c (nonexistent)
@@ -1,198 +0,0 @@
-#include <math.h>
-
-#include <modules/hartport.h>
-#include <kernel/kern.h>
-#include <kernel/func.h>
-#include <ll/i386/x-dos.h>
-
-#include "drivers/pclab.h"
-
-#include "const.h"
-
-float vmax = 0.0, vmin = 0.0, vmaxth = 0.0, vminth = 0.0;
-
-int da_motor(float v)
-{
-
- da_conv( 2.5 , 2 );
- da_conv( v + 2.5 , 1 );
-
- return(0);
-
-}
-
-float v2x(float v)
-{
- float x;
-
- x= LUNGH * (v-(vmax+vmin)/2 ) / (vmax-vmin);
-
- return x;
-
-}
-
-float v2theta(float v)
-{
- float theta;
-
- theta=2.0*(THETAMAX/FCA) * (v-(vmaxth+vminth)/2 ) / (vmaxth-vminth);
-
- return theta;
-
-}
-
-float bass1(float u)
-{
- float y;
- static float oldy=0;
-
- y=(oldy + prm.WCUT * DEADSECX(PERIOD_CARRELLO) *u)/(1+ prm.WCUT * DEADSECX(PERIOD_CARRELLO));
- oldy=y;
-
- return y;
-
-}
-
-float bass2(float u)
-{
- float y;
- static float oldy=0;
-
- y=(oldy + prm.WCUT1 * DEADSECX(PERIOD_CARRELLO) *u)/(1+ prm.WCUT1 * DEADSECX(PERIOD_CARRELLO));
- oldy=y;
-
- return y;
-
-}
-
-float bass3(float u)
-{
- float y;
- static float oldy=0;
-
- y=(oldy + prm.WCUT * DEADSECTH(PERIOD_CARRELLO) *u)/(1+ prm.WCUT * DEADSECTH(PERIOD_CARRELLO));
- oldy=y;
-
- return y;
-
-}
-
-float bass4(float u)
-{
- float y;
- static float oldy=0;
-
- y=(oldy + prm.WCUT1 * DEADSECTH(PERIOD_CARRELLO) *u)/(1+ prm.WCUT1 * DEADSECTH(PERIOD_CARRELLO));
- oldy=y;
-
- return y;
-
-}
-
-float dx(float u)
-{
- static float oldu=0;
- float y;
-
- y=(u-oldu)/DEADSECX(PERIOD_CARRELLO);
- oldu=u;
-
- return y;
-
-}
-
-float dth(float u)
-{
- static float oldu=0;
- float y;
-
- y=(u-oldu)/DEADSECTH(PERIOD_CARRELLO);
- oldu=u;
-
- return y;
-
-}
-
-TASK carrello(void)
-{
- float y[2]={0,0}, yp[2]={0,0};
- PORT px, pth;
-
- float th_input = 0.0,arr_th_input[AVR],th_eff,av_th_input;
- float x_input = 0.0,arr_x_input[AVR],x_eff,av_x_input;
-
- int flag_th=1,flag_x=1,index_th=0,index_x=0;
-
- int i;
- float offset,vout,vout_total;
-
- px = port_create("porta1",sizeof(float),1,STICK,WRITE);
- pth = port_create("porta2",sizeof(float),1,STICK,WRITE);
-
- while (1) {
-
- task_nopreempt();
- th_input=ad_conv(10);
- task_preempt();
-
- if(flag_th==1) {
- for(i=0; i<AVR;++i) arr_th_input[i] = th_input;
- flag_th=0;
- }
- av_th_input=0;
- for(i=0;i<AVR;++i) av_th_input += arr_th_input[i];
- av_th_input /= AVR ;
-
- if(fabs(th_input-av_th_input)>=prm.NOISE) th_input=av_th_input;
-
- arr_th_input[index_th]=th_input;
- index_th = (index_th+1) % AVR ;
-
- th_eff = v2theta(th_input);
- y[1] = bass3(th_eff);
- yp[1] = bass4(dth(y[1]));
-
- task_nopreempt();
- x_input=ad_conv(11);
- task_preempt();
-
- if(flag_x==1) {
- for(i=0; i<AVR;++i) arr_x_input[i] = x_input;
- flag_x=0;
- }
- av_x_input=0;
- for(i=0;i<AVR;++i) av_x_input += arr_x_input[i];
- av_x_input /= AVR;
- if(fabs(x_input-av_x_input)>=prm.NOISE) x_input = av_x_input;
-
- arr_x_input[index_x] = x_input;
- index_x = (index_x+1) % AVR ;
-
- x_eff = v2x(x_input);
- y[0] = bass1(x_eff);
- yp[0] = bass2(dx(y[0]));
-
- vout = prm.COST * (prm.GUAD[0] * (y[0]-v2x((vmax+vmin)/2)) + prm.GUAD[1] * th_eff\
- + prm.GUAD[2] * yp[0] + prm.GUAD[3] * yp[1]);
-
- if(vout >= 0) offset=prm.OFFSVAL;
- else offset=-prm.OFFSVAL;
-
- vout_total = vout + offset;
-
- if(vout_total >= VDANG ) vout_total = VDANG ;
- if(vout_total <= -VDANG ) vout_total = -VDANG ;
-
- da_motor(vout_total);
-
- port_send(px, &y[0], NON_BLOCK);
- port_send(pth, &y[1], NON_BLOCK);
-
- task_endcycle();
-
- }
-
- port_delete(px);
- port_delete(pth);
-
-} /* FINE DEL TASK CARRELLO */
Index: rel_1_2/kalm3d/initfile.c
===================================================================
--- rel_1_2/kalm3d/initfile.c (revision 1198)
+++ rel_1_2/kalm3d/initfile.c (nonexistent)
@@ -1,120 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: initfile.c,v 1.1 2003-03-13 13:11:40 giacomo Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2003-03-13 13:11:40 $
- ------------
-
- System initialization file
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- NRT_TASK_MODEL at level 2
-
- This file is similar to the configuration of kernel/init/hartik3.c
-
- TICK is set to 0 (one-shot timer is used)
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/readme.txt
===================================================================
--- rel_1_2/readme.txt (revision 1198)
+++ rel_1_2/readme.txt (nonexistent)
@@ -1,7 +0,0 @@
-Hi, these are the S.Ha.R.K. demos...
-
-the old examples directory is now called demos/oldexamples...
-
-Enjoy
-
-PJ
Index: rel_1_2/advtimer/readme.txt
===================================================================
--- rel_1_2/advtimer/readme.txt (revision 1198)
+++ rel_1_2/advtimer/readme.txt (nonexistent)
@@ -1,39 +0,0 @@
---------------------------------------
-Advanced Timer Demo
-
-by
-
-Giacomo Guidi <giacomo@gandalf.sssup.it>
-
-Last update 23/04/2003
---------------------------------------
-
-This demo shows the new timer management
-code of S.Ha.R.K.
-
---------------------------------------
-
-The demo is composed by:
-
-MAKEFILE The makefile used to compile the application
-README.TXT This file
-INITFILE.C The init file
-ADVTIMER.C The Advanced Timer Demo
-
---------------------------------------
-
-To change the timer mode, you have to
-modify two global variable in:
-
-oslib/kl/advtimer.c
-
-use_tsc (BOOL)
-use_cmos (BOOL)
-
-and to recompile.
-
-The default setting is
-
-use_tsc = 1;
-use_cmos = 0;
-
Index: rel_1_2/advtimer/advtimer.c
===================================================================
--- rel_1_2/advtimer/advtimer.c (revision 1198)
+++ rel_1_2/advtimer/advtimer.c (nonexistent)
@@ -1,189 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Giacomo Guidi <giacomo@gandalf.sssup.it>
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-/*
- * Advanced Timer Demo
- *
- */
-
-#include "kernel/kern.h"
-#include "ll/i386/cons.h"
-
-#include "ll/i386/advtimer.h"
-
-#include "drivers/keyb.h"
-
-#define UPDATE_PERIOD 10000
-#define UPDATE_WCET 1000
-
-extern signed long long clk_per_msec;
-
-extern signed long last_delta_clk_per_msec;
-extern signed long total_delta_clk_per_msec;
-
-extern unsigned char use_tsc;
-extern unsigned char use_cmos;
-
-void program_key_end(KEY_EVT *k)
-{
-
- sys_end();
-
-}
-
-TASK Update(void *arg)
-{
- struct timespec actual_timer;
-
- long nsec,sec,min,hrs,day;
- long mean_delay,tot_delay,num_delay;
- long total_percent;
-
- signed long long start,end,res;
- struct timespec s_test,startts,endts;
-
- task_nopreempt();
-
- num_delay = tot_delay = mean_delay = 0;
-
- while (1) {
-
- if (clk_per_msec != 0) {
-
- rdtscll(start);
- sys_gettime(&actual_timer);
- rdtscll(end);
- res = end - start;
- rdtscll(start);
- rdtscll(end);
- res -= (end - start);
- s_test.tv_nsec = res * 1000000 / clk_per_msec;
-
-
- } else {
-
- sys_gettime(&startts);
- sys_gettime(&actual_timer);
- sys_gettime(&endts);
- SUBTIMESPEC(&endts,&startts,&s_test);
- sys_gettime(&startts);
- sys_gettime(&endts);
- SUBTIMESPEC(&endts,&startts,&endts);
- SUBTIMESPEC(&s_test,&endts,&s_test);
-
- }
-
- if (tot_delay < 1000000000) {
- tot_delay += s_test.tv_nsec;
- num_delay ++;
- mean_delay = tot_delay / num_delay;
- }
-
- nsec = actual_timer.tv_nsec;
- sec = actual_timer.tv_sec;
- min = sec / 60;
- sec %= 60;
- hrs = min / 60;
- min %= 60;
- day = hrs / 24;
- hrs %= 24;
-
- if (use_tsc)
- if (use_cmos)
- printf_xy(0,4,WHITE,"Timer Mode: TSC + CMOS");
- else
- printf_xy(0,4,WHITE,"Timer Mode: TSC");
- else
- printf_xy(0,4,WHITE,"Timer Mode: 8254");
-
- printf_xy(0,5,WHITE,"Actual Clk/msec: %12ld",(long)clk_per_msec);
- printf_xy(0,6,WHITE,"Actual Timer: %2ld d %2ld h %2ld m %2ld s %12ld ns",day,hrs,min,sec,(long)nsec);
-
- printf_xy(0,8,WHITE,"CMOS Adjustement setting");
- printf_xy(0,9,WHITE,"CMOS last delta Clk/msec: %12ld",(long)last_delta_clk_per_msec);
-
- if (total_delta_clk_per_msec != 0)
- total_percent = clk_per_msec / abs(total_delta_clk_per_msec);
- else
- total_percent = 0;
-
- printf_xy(0,10,WHITE,"CMOS total delta Clk/msec: %12ld (1/%ld)",(long)total_delta_clk_per_msec,total_percent);
-
- printf_xy(0,12,WHITE,"Timer Access Delay: %12ld ns",mean_delay);
-
- task_endcycle();
-
- }
-
- sys_end();
-
-}
-
-void set_screen()
-{
-
- printf_xy(20,0,WHITE," Advanced Timer Demo ");
- printf_xy(20,1,WHITE,"Giacomo Guidi <giacomo@gandalf.sssup.it>");
- printf_xy(20,2,WHITE," Press Alt + c to exit ");
-
-}
-
-
-int main(int argc, char **argv)
-{
-
- HARD_TASK_MODEL mp; //Show current setting
- PID update;
- KEY_EVT k;
-
- k.flag = ALTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,program_key_end);
-
- set_screen();
-
- hard_task_default_model(mp);
- hard_task_def_ctrl_jet(mp);
- hard_task_def_group(mp, 1);
- hard_task_def_wcet(mp,UPDATE_WCET);
- hard_task_def_mit(mp,UPDATE_PERIOD);
- hard_task_def_usemath(mp);
- update = task_create("Update", Update, &mp, NULL);
- if (update != NIL) task_activate(update);
-
- return 0;
-
-}
Index: rel_1_2/advtimer/makefile
===================================================================
--- rel_1_2/advtimer/makefile (revision 1198)
+++ rel_1_2/advtimer/makefile (nonexistent)
@@ -1,18 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS = advtimer
-
-include $(BASE)/config/example.mk
-
-# Text applications
-advtimer:
- make -f $(SUBMAKE) APP=advtimer INIT= OTHEROBJS="initfile.o" SHARKOPT="__OLDCHAR__"
-
-
Index: rel_1_2/advtimer/initfile.c
===================================================================
--- rel_1_2/advtimer/initfile.c (revision 1198)
+++ rel_1_2/advtimer/initfile.c (nonexistent)
@@ -1,120 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: initfile.c,v 1.1 2003-04-23 09:15:48 giacomo Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2003-04-23 09:15:48 $
- ------------
-
- System initialization file
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- NRT_TASK_MODEL at level 2
-
- This file is similar to the configuration of kernel/init/hartik3.c
-
- TICK is set to 0 (one-shot timer is used)
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/base_cpp/hello.cpp
===================================================================
--- rel_1_2/base_cpp/hello.cpp (revision 1198)
+++ rel_1_2/base_cpp/hello.cpp (nonexistent)
@@ -1,72 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2003 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-/*
- CVS : $Id: hello.cpp,v 1.1 2003-03-17 09:29:39 pj Exp $
-
- hello.c:
-
- This test is a simple hello world function.
-
-*/
-
-#include "kernel/kern.h"
-
-class myHello {
- int i;
-public:
-
- myHello(int anumber)
- {
- i = anumber;
- }
-
- void myprint(void)
- {
- cprintf("myHello objecy prints %d.", i);
- }
-};
-
-int main(int argc, char **argv)
-{
- cprintf("Hello, world!\n");
-
- myHello h(1234);
-
- h.myprint();
-
- return 0;
-}
Index: rel_1_2/base_cpp/readme
===================================================================
--- rel_1_2/base_cpp/readme (revision 1198)
+++ rel_1_2/base_cpp/readme (nonexistent)
@@ -1,8 +0,0 @@
-This directory contains a few C++ demos:
-
-- hello.cpp - this is a simple hello world written in C++, similar to that in demos/base
-
-
-Initialization files:
-
-- ihello.c - same as in demos/base
Index: rel_1_2/base_cpp/ihello.c
===================================================================
--- rel_1_2/base_cpp/ihello.c (revision 1198)
+++ rel_1_2/base_cpp/ihello.c (nonexistent)
@@ -1,95 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ihello.c,v 1.1 2003-03-17 09:29:39 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2003-03-17 09:29:39 $
- ------------
-
- The simplest initialization file
-
- The tick is set to TICK ms.
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- a RR (Round Robin) level
- a Dummy level
-
- It can accept these task models:
-
- NRT_TASK_MODEL at level 0
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 300
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/base_cpp/makefile
===================================================================
--- rel_1_2/base_cpp/makefile (revision 1198)
+++ rel_1_2/base_cpp/makefile (nonexistent)
@@ -1,13 +0,0 @@
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS = hello
-
-include $(BASE)/config/example.mk
-
-
-# Text applications
-hello:
- make -f $(SUBMAKE) APP=hello INIT= OTHEROBJS="ihello.o" OTHERINCL=
Index: rel_1_2/makefile
===================================================================
--- rel_1_2/makefile (revision 1198)
+++ rel_1_2/makefile (nonexistent)
@@ -1,22 +0,0 @@
-
-dirs := $(filter-out CVS cvs base_cpp makefile readme.txt README.TXT, $(wildcard *))
-p_all := $(addprefix prefixall_, $(dirs))
-p_install := $(addprefix prefixinstall_, $(dirs))
-p_clean := $(addprefix prefixclean_, $(dirs))
-pcleanall := $(addprefix prefixcleanall_, $(dirs))
-pdepend := $(addprefix prefixdepend_, $(dirs))
-
-
-.PHONY: all clean
-
-
-
-all: $(p_all)
-
-clean: $(p_clean)
-
-prefixall_%:
- make -C $*
-
-prefixclean_%:
- make -C $* clean
Index: rel_1_2/fsf/test3.c
===================================================================
--- rel_1_2/fsf/test3.c (revision 1198)
+++ rel_1_2/fsf/test3.c (nonexistent)
@@ -1,376 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Giacomo Guidi <giacomo@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-
-#include "modules/edf.h"
-#include "modules/cbs.h"
-
-#include "pthread.h"
-#include "modules/posix.h"
-
-#include "fsf_contract.h"
-#include "fsf_server.h"
-
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-#include <stdlib.h>
-
-// --------------------------------------------------
-// --------------------------------------------------
-// Init Part
-// --------------------------------------------------
-// --------------------------------------------------
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-int grubstar_level;
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- POSIX_register_level(RRTICK, 1, mb, 32);
- grubstar_level = GRUBSTAR_register_level(5, 0);
- FSF_register_module(grubstar_level);
- dummy_register_level();
-
- // for the keyboard...
- CBS_register_level(CBS_ENABLE_ALL, 0);
-
- PI_register_module();
- PC_register_module();
-
- SEM_register_module();
-
- PTHREAD_register_module(1, 0, 1);
-
- return TICK;
-}
-
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-
-}
-
-// --------------------------------------------------
-// --------------------------------------------------
-// The Test
-// --------------------------------------------------
-// --------------------------------------------------
-
-pthread_t jposix = -1;
-pthread_t j1 = -1;
-pthread_t j2 = -1;
-pthread_t j3 = -1;
-pthread_t j4 = -1;
-fsf_server_id_t server1 = -1;
-fsf_server_id_t server2 = -1;
-fsf_server_id_t server3 = -1;
-fsf_server_id_t server4 = -1;
-fsf_contract_parameters_t contract;
-
-pthread_mutex_t mux;
-
-void *posix(void *arg)
-{
- struct timespec actual,end;
- int actpersecond,act;
- int cycle;
-
- act = 0;
- actpersecond = 0;
- cycle = 0;
- for (;;) {
-
- cycle++;
- kern_gettime(&actual);
-
- if (act == 0) {
- TIMESPEC_ASSIGN(&end,&actual);
- end.tv_sec++;
- }
-
- if (TIMESPEC_A_LT_B(&actual,&end)) {
- act++;
- } else {
- actpersecond = act;
- act = 0;
- }
-
- pthread_mutex_lock(&mux);
- printf_xy(0,exec_shadow,GREEN,"Thread %3d Act_per_Second = %8d cycle = %8d",
- exec_shadow,actpersecond,cycle);
- pthread_mutex_unlock(&mux);
-
- }
-
- return NULL;
-
-}
-
-void *star(void *arg)
-{
- struct timespec actual,end;
- int actpersecond,act;
- int cycle,rec;
-
- act = 0;
- actpersecond = 0;
- cycle = 0;
- rec = 0;
- for (;;) {
-
- cycle++;
- kern_gettime(&actual);
- rec = SERVER_get_last_reclaiming(grubstar_level,exec_shadow);
-
- if (act == 0) {
- TIMESPEC_ASSIGN(&end,&actual);
- end.tv_sec++;
- }
-
- if (TIMESPEC_A_LT_B(&actual,&end)) {
- act++;
- } else {
- actpersecond = act;
- act = 0;
- }
-
- pthread_mutex_lock(&mux);
- printf_xy(0,exec_shadow,WHITE,"Thread %3d Act_per_Second = %8d cycle = %8d rec = %8d",
- exec_shadow,actpersecond,cycle,rec);
- pthread_mutex_unlock(&mux);
-
- }
-
- return NULL;
-
-}
-
-void *periodic_star(void *arg)
-{
- struct timespec actual,end;
- int actpersecond,act;
- int cycle,rec;
-
- act = 0;
- actpersecond = 0;
- cycle = 0;
- rec = 0;
- for (;;) {
-
- cycle++;
- kern_gettime(&actual);
- rec = SERVER_get_last_reclaiming(grubstar_level,exec_shadow);
-
- if (act == 0) {
- TIMESPEC_ASSIGN(&end,&actual);
- end.tv_sec++;
- }
-
- if (TIMESPEC_A_LT_B(&actual,&end)) {
- act++;
- } else {
- actpersecond = act;
- act = 0;
- }
-
- pthread_mutex_lock(&mux);
- printf_xy(0,exec_shadow,RED,"Thread %3d Act_per_Second = %8d cycle = %8d rec = %8d",
- exec_shadow,actpersecond,cycle,rec);
- pthread_mutex_unlock(&mux);
-
- task_endcycle();
-
- }
-
- return NULL;
-
-}
-
-int keyinc = 5;
-
-void *edftask(void *arg)
-{
- long long j;
- while(1) {
- for (j=0; j<10000*keyinc; j++);
- task_endcycle();
- }
-
- return NULL;
-}
-
-
-void create()
-{
- HARD_TASK_MODEL mhard;
- int err;
-
- struct timespec period1 = {0,90000000}; //30%
- struct timespec period2 = {0,300000000}; //20%
- struct timespec period3 = {0,300000000}; //10%
- struct timespec budget1 = {0,30000000};
- struct timespec budget2 = {0,60000000};
- struct timespec budget3 = {0,30000000};
-
- PID t1, t2;
-
- kern_printf("(Start Create)");
-
- hard_task_default_model(mhard);
- hard_task_def_ctrl_jet(mhard);
- hard_task_def_mit(mhard,30000); //5%
- hard_task_def_wcet(mhard,1500);
- hard_task_def_arg(mhard,(void *)"X");
- hard_task_def_group(mhard,1);
- hard_task_def_periodic(mhard);
- hard_task_def_level(mhard,0);
-
- t1 = task_create("X", edftask, &mhard, NULL);
- if (t1 == NIL) {
- perror("Could not create task X ...");
- sys_end();
- }
-
- hard_task_def_mit(mhard,30000); //5%
- hard_task_def_wcet(mhard,1500);
- hard_task_def_arg(mhard,(void *)"Y");
- t2 = task_create("Y", edftask, &mhard, NULL);
- if (t2 == NIL) {
- perror("Could not create task Y ...");
- sys_end();
- }
-
- group_activate(1);
-
- fsf_initialize_contract(&contract);
-
- fsf_set_contract_basic_parameters(&contract,&budget1,&period1,NULL,NULL,FSF_DEFAULT_WORKLOAD);
- fsf_negotiate_contract(&contract,&server1);
-
- fsf_set_contract_basic_parameters(&contract,&budget2,&period2,NULL,NULL,FSF_DEFAULT_WORKLOAD);
- fsf_negotiate_contract(&contract,&server2);
-
- fsf_set_contract_basic_parameters(&contract,&budget3,&period3,NULL,NULL,FSF_DEFAULT_WORKLOAD);
- fsf_negotiate_contract(&contract,&server3);
-
- fsf_set_contract_basic_parameters(&contract,&budget2,&period2,NULL,NULL,FSF_DEFAULT_WORKLOAD);
- fsf_set_local_scheduler_parameter(&contract, FSF_SCHEDULER_EDF);
- fsf_negotiate_contract(&contract,&server4);
-
- err = pthread_create(&jposix, NULL, posix, NULL);
- if (err) kern_printf("(Error creating posix task)");
-
- kern_printf("(End Create)");
-
-}
-
-int main(int argc, char **argv)
-{
-
- int err;
- HARD_TASK_MODEL ht;
- struct timespec endtimer;
-
- pthread_mutex_init(&mux,NULL);
-
- srand(kern_gettime(NULL));
- create();
-
- kern_gettime(&endtimer);
- endtimer.tv_sec += 20;
- kern_event_post(&endtimer, (void (*)(void *))(sys_end), NULL);
-
- err = fsf_create_thread(server1,&j1,NULL,star,NULL,NULL);
- kern_printf("(%d)",err);
-
- err = fsf_create_thread(server2,&j2,NULL,star,NULL,NULL);
- kern_printf("(%d)",err);
-
- err = fsf_create_thread(server3,&j3,NULL,star,NULL,NULL);
- kern_printf("(%d)",err);
-
- hard_task_default_model(ht);
- hard_task_def_mit(ht,200000);
- hard_task_def_wcet(ht,50000);
- err = fsf_create_thread(server4,&j4,NULL,periodic_star,NULL,&ht);
- kern_printf("(%d)",err);
-
-/* hard_task_default_model(ht);
- hard_task_def_mit(ht,159000);
- hard_task_def_wcet(ht,50000);
- err = fsf_create_thread(server4,&j4,NULL,periodic_star,NULL,&ht);
- kern_printf("(%d)",err);
-*/
- err = fsf_create_thread(server1,&j1,NULL,star,NULL,NULL);
- kern_printf("(%d)",err);
-
- err = fsf_create_thread(server2,&j2,NULL,star,NULL,NULL);
- kern_printf("(%d)",err);
-
- err = fsf_create_thread(server3,&j3,NULL,star,NULL,NULL);
- kern_printf("(%d)",err);
-
- return 0;
-
-}
-
Index: rel_1_2/fsf/initfile.c
===================================================================
--- rel_1_2/fsf/initfile.c (revision 1198)
+++ rel_1_2/fsf/initfile.c (nonexistent)
@@ -1,116 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Giacomo Guidi <giacomo@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/posix.h"
-#include "pthread.h"
-#include "drivers/keyb.h"
-#include "modules/sem.h"
-#include "modules/dummy.h"
-#include "modules/hartport.h"
-
-#include "fsf_contract.h"
-#include "fsf_server.h"
-
-#include "modules/pi.h"
-#include "modules/pc.h"
-
-#define TICK 0
-
-#define RRTICK 10000
-
-void load_file();
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- int grubstar_level;
-
- EDF_register_level(EDF_ENABLE_ALL);
- POSIX_register_level(RRTICK, 1, mb, 32);
- grubstar_level = GRUBSTAR_register_level(FSF_MAX_N_SERVERS, 0);
- FSF_register_module(grubstar_level);
- dummy_register_level();
-
- CBS_register_level(CBS_ENABLE_ALL,0);
-
- SEM_register_module();
-
- PI_register_module();
- PC_register_module();
-
- PTHREAD_register_module(1, 0, 1);
-
- load_file();
-
- return TICK;
-
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-int dos_video_preload(void *filename, long max_size, void **start, void **end);
-
-void *start_file;
-void *end_file;
-
-void load_file()
-{
- start_file = NULL;
- end_file = NULL;
-
- dos_video_preload("test.m2v",5000000,&start_file,&end_file);
-
- cprintf("Start file ptr = %08lx\n",(long)(start_file));
- cprintf("End file ptr = %08lx\n",(long)(end_file));
- cprintf("Size = %8ld\n",(long)(end_file - start_file));
-
-}
-
Index: rel_1_2/fsf/demos.txt
===================================================================
--- rel_1_2/fsf/demos.txt (revision 1198)
+++ rel_1_2/fsf/demos.txt (nonexistent)
@@ -1,48 +0,0 @@
-FSF demo for S.Ha.R.K
-
-test1.c:
-
-This demo shows the main feature of service contract implementation.
-
-A set of 4 threads is created using the pthread standard functions.
-At the beginning, these threads run without temporal restrictions
-and they don't respect any deadline.
-
-Two service contracts are initialized and set
-
-fsf_initialize_contract(&contract1);
-fsf_initialize_contract(&contract2);
-fsf_set_contract_basic_parameters(&contract1,&budget1,&period1,NULL,NULL,FSF_DEFAULT_WORKLOAD);
-fsf_set_contract_basic_parameters(&contract2,&budget2,&period2,NULL,NULL,FSF_DEFAULT_WORKLOAD);
-
-whit the button 'q','w','e' you can respectively
-negotiate contract for a server
-
-[err = fsf_negotiate_contract(&contractX,&serverY);]
-
-'q' -> negotiate contract1 for server1
-'w' -> negotiate contract2 for server2
-'e' -> negotiate contract1 for server3
-
-now with button '1','2','3','4' you can bind the thread to a server
-
-[err = fsf_bind_thread_to_server(serverY,jZ);]
-
-'1' -> bind thread1 to server1
-'2' -> bind thread2 to server2
-'3' -> bind thread3 to server3
-'4' -> bind thread4 to server2
-
-threads will start to respect the assigned budget. It's possible
-to bind more threads to one server. The local scheduler specified in the
-contract define how the threads will get the server resources.
-
-With '5','6','7','8' the thread is unbind from the server
-
-[err = fsf_unbind_thread_from_server(jZ);]
-
-With 'r','t','y' a server is removed
-
-[err = fsf_cancel_contract(&server2);]
-
-
Index: rel_1_2/fsf/mpeg2/getvlc.c
===================================================================
--- rel_1_2/fsf/mpeg2/getvlc.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/getvlc.c (nonexistent)
@@ -1,797 +0,0 @@
-/* getvlc.c, variable length decoding */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include "config.h"
-#include "global.h"
-#include "getvlc.h"
-
-/* private prototypes */
-/* generic picture macroblock type processing functions */
-static int Get_I_macroblock_type _ANSI_ARGS_((void));
-static int Get_P_macroblock_type _ANSI_ARGS_((void));
-static int Get_B_macroblock_type _ANSI_ARGS_((void));
-static int Get_D_macroblock_type _ANSI_ARGS_((void));
-
-/* spatial picture macroblock type processing functions */
-static int Get_I_Spatial_macroblock_type _ANSI_ARGS_((void));
-static int Get_P_Spatial_macroblock_type _ANSI_ARGS_((void));
-static int Get_B_Spatial_macroblock_type _ANSI_ARGS_((void));
-static int Get_SNR_macroblock_type _ANSI_ARGS_((void));
-
-int Get_macroblock_type()
-{
- int macroblock_type = 0;
-
- if (ld->scalable_mode==SC_SNR)
- macroblock_type = Get_SNR_macroblock_type();
- else
- {
- switch (picture_coding_type)
- {
- case I_TYPE:
- macroblock_type = ld->pict_scal ? Get_I_Spatial_macroblock_type() : Get_I_macroblock_type();
- break;
- case P_TYPE:
- macroblock_type = ld->pict_scal ? Get_P_Spatial_macroblock_type() : Get_P_macroblock_type();
- break;
- case B_TYPE:
- macroblock_type = ld->pict_scal ? Get_B_Spatial_macroblock_type() : Get_B_macroblock_type();
- break;
- case D_TYPE:
- macroblock_type = Get_D_macroblock_type();
- break;
- default:
- cprintf("Get_macroblock_type(): unrecognized picture coding type\n");
- break;
- }
- }
-
- return macroblock_type;
-}
-
-static int Get_I_macroblock_type()
-{
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("macroblock_type(I) ");
-#endif /* TRACE */
-
- if (Get_Bits1())
- {
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("(1): Intra (1)\n");
-#endif /* TRACE */
- return 1;
- }
-
- if (!Get_Bits1())
- {
- if (!Quiet_Flag)
- cprintf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- }
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("(01): Intra, Quant (17)\n");
-#endif /* TRACE */
-
- return 17;
-}
-
-static char *MBdescr[]={
- "", "Intra", "No MC, Coded", "",
- "Bwd, Not Coded", "", "Bwd, Coded", "",
- "Fwd, Not Coded", "", "Fwd, Coded", "",
- "Interp, Not Coded", "", "Interp, Coded", "",
- "", "Intra, Quant", "No MC, Coded, Quant", "",
- "", "", "Bwd, Coded, Quant", "",
- "", "", "Fwd, Coded, Quant", "",
- "", "", "Interp, Coded, Quant", ""
-};
-
-static int Get_P_macroblock_type()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("macroblock_type(P) (");
-#endif /* TRACE */
-
- if ((code = Show_Bits(6))>=8)
- {
- code >>= 3;
- Flush_Buffer(PMBtab0[code].len);
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,3,PMBtab0[code].len);
- cprintf("): %s (%d)\n",MBdescr[(int)PMBtab0[code].val],PMBtab0[code].val);
- }
-#endif /* TRACE */
- return PMBtab0[code].val;
- }
-
- if (code==0)
- {
- if (!Quiet_Flag)
- cprintf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- Flush_Buffer(PMBtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,6,PMBtab1[code].len);
- cprintf("): %s (%d)\n",MBdescr[(int)PMBtab1[code].val],PMBtab1[code].val);
- }
-#endif /* TRACE */
-
- return PMBtab1[code].val;
-}
-
-static int Get_B_macroblock_type()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("macroblock_type(B) (");
-#endif /* TRACE */
-
- if ((code = Show_Bits(6))>=8)
- {
- code >>= 2;
- Flush_Buffer(BMBtab0[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,4,BMBtab0[code].len);
- cprintf("): %s (%d)\n",MBdescr[(int)BMBtab0[code].val],BMBtab0[code].val);
- }
-#endif /* TRACE */
-
- return BMBtab0[code].val;
- }
-
- if (code==0)
- {
- if (!Quiet_Flag)
- cprintf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- Flush_Buffer(BMBtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,6,BMBtab1[code].len);
- cprintf("): %s (%d)\n",MBdescr[(int)BMBtab1[code].val],BMBtab1[code].val);
- }
-#endif /* TRACE */
-
- return BMBtab1[code].val;
-}
-
-static int Get_D_macroblock_type()
-{
- if (!Get_Bits1())
- {
- if (!Quiet_Flag)
- cprintf("Invalid macroblock_type code\n");
- Fault_Flag=1;
- }
-
- return 1;
-}
-
-/* macroblock_type for pictures with spatial scalability */
-static int Get_I_Spatial_macroblock_type()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("macroblock_type(I,spat) (");
-#endif /* TRACE */
-
- code = Show_Bits(4);
-
- if (code==0)
- {
- if (!Quiet_Flag)
- cprintf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,4,spIMBtab[code].len);
- cprintf("): %02x\n",spIMBtab[code].val);
- }
-#endif /* TRACE */
-
- Flush_Buffer(spIMBtab[code].len);
- return spIMBtab[code].val;
-}
-
-static int Get_P_Spatial_macroblock_type()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("macroblock_type(P,spat) (");
-#endif /* TRACE */
-
- code = Show_Bits(7);
-
- if (code<2)
- {
- if (!Quiet_Flag)
- cprintf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- if (code>=16)
- {
- code >>= 3;
- Flush_Buffer(spPMBtab0[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,4,spPMBtab0[code].len);
- cprintf("): %02x\n",spPMBtab0[code].val);
- }
-#endif /* TRACE */
-
- return spPMBtab0[code].val;
- }
-
- Flush_Buffer(spPMBtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,7,spPMBtab1[code].len);
- cprintf("): %02x\n",spPMBtab1[code].val);
- }
-#endif /* TRACE */
-
- return spPMBtab1[code].val;
-}
-
-static int Get_B_Spatial_macroblock_type()
-{
- int code;
- VLCtab *p;
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("macroblock_type(B,spat) (");
-#endif /* TRACE */
-
- code = Show_Bits(9);
-
- if (code>=64)
- p = &spBMBtab0[(code>>5)-2];
- else if (code>=16)
- p = &spBMBtab1[(code>>2)-4];
- else if (code>=8)
- p = &spBMBtab2[code-8];
- else
- {
- if (!Quiet_Flag)
- cprintf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- Flush_Buffer(p->len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,9,p->len);
- printf("): %02x\n",p->val);
- }
-#endif /* TRACE */
-
- return p->val;
-}
-
-static int Get_SNR_macroblock_type()
-{
- int code;
-
-#ifdef TRACE /* *CH* */
- if (Trace_Flag)
- cprintf("macroblock_type(SNR) (");
-#endif
-
- code = Show_Bits(3);
-
- if (code==0)
- {
- if (!Quiet_Flag)
- cprintf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- Flush_Buffer(SNRMBtab[code].len);
-
-#ifdef TRACE /* *CH* */
- if (Trace_Flag)
- {
- Print_Bits(code,3,SNRMBtab[code].len);
- cprintf("): %s (%d)\n",MBdescr[(int)SNRMBtab[code].val],SNRMBtab[code].val);
- }
-#endif
-
-
- return SNRMBtab[code].val;
-}
-
-int Get_motion_code()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("motion_code (");
-#endif /* TRACE */
-
- if (Get_Bits1())
- {
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("0): 0\n");
-#endif /* TRACE */
- return 0;
- }
-
- if ((code = Show_Bits(9))>=64)
- {
- code >>= 6;
- Flush_Buffer(MVtab0[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,3,MVtab0[code].len);
- cprintf("%d): %d\n",
- Show_Bits(1),Show_Bits(1)?-MVtab0[code].val:MVtab0[code].val);
- }
-#endif /* TRACE */
-
- return Get_Bits1()?-MVtab0[code].val:MVtab0[code].val;
- }
-
- if (code>=24)
- {
- code >>= 3;
- Flush_Buffer(MVtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,6,MVtab1[code].len);
- cprintf("%d): %d\n",
- Show_Bits(1),Show_Bits(1)?-MVtab1[code].val:MVtab1[code].val);
- }
-#endif /* TRACE */
-
- return Get_Bits1()?-MVtab1[code].val:MVtab1[code].val;
- }
-
- if ((code-=12)<0)
- {
- if (!Quiet_Flag)
-/* HACK */
- cprintf("Invalid motion_vector code (MBA %d, pic %d)\n", global_MBA, global_pic);
- Fault_Flag=1;
- return 0;
- }
-
- Flush_Buffer(MVtab2[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code+12,9,MVtab2[code].len);
- cprintf("%d): %d\n",
- Show_Bits(1),Show_Bits(1)?-MVtab2[code].val:MVtab2[code].val);
- }
-#endif /* TRACE */
-
- return Get_Bits1() ? -MVtab2[code].val : MVtab2[code].val;
-}
-
-/* get differential motion vector (for dual prime prediction) */
-int Get_dmvector()
-{
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("dmvector (");
-#endif /* TRACE */
-
- if (Get_Bits(1))
- {
-#ifdef TRACE
- if (Trace_Flag)
- cprintf(Show_Bits(1) ? "11): -1\n" : "10): 1\n");
-#endif /* TRACE */
- return Get_Bits(1) ? -1 : 1;
- }
- else
- {
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("0): 0\n");
-#endif /* TRACE */
- return 0;
- }
-}
-
-int Get_coded_block_pattern()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("coded_block_pattern_420 (");
-#endif /* TRACE */
-
- if ((code = Show_Bits(9))>=128)
- {
- code >>= 4;
- Flush_Buffer(CBPtab0[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,5,CBPtab0[code].len);
- cprintf("): ");
- Print_Bits(CBPtab0[code].val,6,6);
- cprintf(" (%d)\n",CBPtab0[code].val);
- }
-#endif /* TRACE */
-
- return CBPtab0[code].val;
- }
-
- if (code>=8)
- {
- code >>= 1;
- Flush_Buffer(CBPtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,8,CBPtab1[code].len);
- cprintf("): ");
- Print_Bits(CBPtab1[code].val,6,6);
- cprintf(" (%d)\n",CBPtab1[code].val);
- }
-#endif /* TRACE */
-
- return CBPtab1[code].val;
- }
-
- if (code<1)
- {
- if (!Quiet_Flag)
- cprintf("Invalid coded_block_pattern code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- Flush_Buffer(CBPtab2[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,9,CBPtab2[code].len);
- cprintf("): ");
- Print_Bits(CBPtab2[code].val,6,6);
- cprintf(" (%d)\n",CBPtab2[code].val);
- }
-#endif /* TRACE */
-
- return CBPtab2[code].val;
-}
-
-int Get_macroblock_address_increment()
-{
- int code, val;
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("macroblock_address_increment (");
-#endif /* TRACE */
-
- val = 0;
-
- while ((code = Show_Bits(11))<24)
- {
- if (code!=15) /* if not macroblock_stuffing */
- {
- if (code==8) /* if macroblock_escape */
- {
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("00000001000 ");
-#endif /* TRACE */
-
- val+= 33;
- }
- else
- {
- if (!Quiet_Flag)
- cprintf("Invalid macroblock_address_increment code\n");
-
- Fault_Flag = 1;
- return 1;
- }
- }
- else /* macroblock suffing */
- {
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("00000001111 ");
-#endif /* TRACE */
- }
-
- Flush_Buffer(11);
- }
-
- /* macroblock_address_increment == 1 */
- /* ('1' is in the MSB position of the lookahead) */
- if (code>=1024)
- {
- Flush_Buffer(1);
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("1): %d\n",val+1);
-#endif /* TRACE */
- return val + 1;
- }
-
- /* codes 00010 ... 011xx */
- if (code>=128)
- {
- /* remove leading zeros */
- code >>= 6;
- Flush_Buffer(MBAtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,5,MBAtab1[code].len);
- printf("): %d\n",val+MBAtab1[code].val);
- }
-#endif /* TRACE */
-
-
- return val + MBAtab1[code].val;
- }
-
- /* codes 00000011000 ... 0000111xxxx */
- code-= 24; /* remove common base */
- Flush_Buffer(MBAtab2[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code+24,11,MBAtab2[code].len);
- cprintf("): %d\n",val+MBAtab2[code].val);
- }
-#endif /* TRACE */
-
- return val + MBAtab2[code].val;
-}
-
-/* combined MPEG-1 and MPEG-2 stage. parse VLC and
- perform dct_diff arithmetic.
-
- MPEG-1: ISO/IEC 11172-2 section
- MPEG-2: ISO/IEC 13818-2 section 7.2.1
-
- Note: the arithmetic here is presented more elegantly than
- the spec, yet the results, dct_diff, are the same.
-*/
-
-int Get_Luma_DC_dct_diff()
-{
- int code, size, dct_diff;
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf("dct_dc_size_luminance: (");
-*/
-#endif /* TRACE */
-
- /* decode length */
- code = Show_Bits(5);
-
- if (code<31)
- {
- size = DClumtab0[code].val;
- Flush_Buffer(DClumtab0[code].len);
-#ifdef TRACE
-/*
- if (Trace_Flag)
- {
- Print_Bits(code,5,DClumtab0[code].len);
- printf("): %d",size);
- }
-*/
-#endif /* TRACE */
- }
- else
- {
- code = Show_Bits(9) - 0x1f0;
- size = DClumtab1[code].val;
- Flush_Buffer(DClumtab1[code].len);
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- {
- Print_Bits(code+0x1f0,9,DClumtab1[code].len);
- printf("): %d",size);
- }
-*/
-#endif /* TRACE */
- }
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf(", dct_dc_differential (");
-*/
-#endif /* TRACE */
-
- if (size==0)
- dct_diff = 0;
- else
- {
- dct_diff = Get_Bits(size);
-#ifdef TRACE
-/*
- if (Trace_Flag)
- Print_Bits(dct_diff,size,size);
-*/
-#endif /* TRACE */
- if ((dct_diff & (1<<(size-1)))==0)
- dct_diff-= (1<<size) - 1;
- }
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf("): %d\n",dct_diff);
-*/
-#endif /* TRACE */
-
- return dct_diff;
-}
-
-
-int Get_Chroma_DC_dct_diff()
-{
- int code, size, dct_diff;
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf("dct_dc_size_chrominance: (");
-*/
-#endif /* TRACE */
-
- /* decode length */
- code = Show_Bits(5);
-
- if (code<31)
- {
- size = DCchromtab0[code].val;
- Flush_Buffer(DCchromtab0[code].len);
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- {
- Print_Bits(code,5,DCchromtab0[code].len);
- printf("): %d",size);
- }
-*/
-#endif /* TRACE */
- }
- else
- {
- code = Show_Bits(10) - 0x3e0;
- size = DCchromtab1[code].val;
- Flush_Buffer(DCchromtab1[code].len);
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- {
- Print_Bits(code+0x3e0,10,DCchromtab1[code].len);
- printf("): %d",size);
- }
-*/
-#endif /* TRACE */
- }
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf(", dct_dc_differential (");
-*/
-#endif /* TRACE */
-
- if (size==0)
- dct_diff = 0;
- else
- {
- dct_diff = Get_Bits(size);
-#ifdef TRACE
-/*
- if (Trace_Flag)
- Print_Bits(dct_diff,size,size);
-*/
-#endif /* TRACE */
- if ((dct_diff & (1<<(size-1)))==0)
- dct_diff-= (1<<size) - 1;
- }
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf("): %d\n",dct_diff);
-*/
-#endif /* TRACE */
-
- return dct_diff;
-}
Index: rel_1_2/fsf/mpeg2/mpeg2dec.c
===================================================================
--- rel_1_2/fsf/mpeg2/mpeg2dec.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/mpeg2dec.c (nonexistent)
@@ -1,495 +0,0 @@
-
-/* mpeg2dec.c, main(), initialization, option processing */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include "stdlib.h"
-#include "drivers/glib.h"
-
-#include "fsf_contract.h"
-
-#define GLOBAL
-#include "config.h"
-#include "global.h"
-
-/* private prototypes */
-static int video_sequence _ANSI_ARGS_((int *framenum));
-static int Headers _ANSI_ARGS_((void));
-static void Initialize_Sequence _ANSI_ARGS_((void));
-static void Initialize_Decoder _ANSI_ARGS_((void));
-static void Deinitialize_Sequence _ANSI_ARGS_((void));
-
-/* #define DEBUG */
-
-static void Clear_Options();
-#ifdef DEBUG
-static void Print_Options();
-#endif
-
-#define MAX_M_QOS 0
-#define MIN_M_QOS 0
-
-int dos_video_preload(char *file_name, long max_size, void **start, void **end)
-{
- DOS_FILE* file;
- void *buf;
- long rd;
-
-
- file = DOS_fopen(file_name,"r");
- if (file == NULL) return -1;
-
- buf = malloc(max_size);
- *start = buf;
-
- while(((rd = DOS_fread(buf, sizeof(BYTE), 2048, file)) == 2048) &&
- ((buf - *start + rd) < (max_size-2048))) {
- buf += rd;
- }
-
- *end = buf + rd;
-
- DOS_fclose(file);
- return(0);
-
-}
-
-int Init_Mpeg_Decoder(void *start, void *end)
-{
- int code;
-
- Clear_Options();
-
-#ifdef DEBUG
- Print_Options();
-#endif
-
- ld = &base; /* select base layer context */
- ld->start_file_ptr = start;
- ld->end_file_ptr = end;
- ld->actual_file_ptr = ld->start_file_ptr;
-
- /* open MPEG base layer bitstream file(s) */
- /* NOTE: this is either a base layer stream or a spatial enhancement stream */
- if ((base.Infile=1)<0)
- {
- cprintf("Base layer input file %s not found\n", Main_Bitstream_Filename);
- }
-
-
- if(base.Infile != 0)
- {
- Initialize_Buffer();
-
- if(Show_Bits(8)==0x47)
- {
- sprintf(Error_Text,"Decoder currently does not parse transport streams\n");
- Error(Error_Text);
- }
-
- next_start_code();
- code = Show_Bits(32);
-
- switch(code)
- {
- case SEQUENCE_HEADER_CODE:
- break;
- case PACK_START_CODE:
- System_Stream_Flag = 1;
- case VIDEO_ELEMENTARY_STREAM:
- System_Stream_Flag = 1;
- break;
- default:
- sprintf(Error_Text,"Unable to recognize stream type\n");
- Error(Error_Text);
- break;
- }
-
- ld->actual_file_ptr = ld->start_file_ptr;
- Initialize_Buffer();
- }
-
- if(base.Infile!=0)
- {
- ld->actual_file_ptr = ld->start_file_ptr;
- }
-
- Initialize_Buffer();
-
- if(Two_Streams)
- {
- ld = &enhan; /* select enhancement layer context */
-
- if ((enhan.Infile = 1)<0)
- {
- sprintf(Error_Text,"enhancment layer bitstream file %s not found\n",
- Enhancement_Layer_Bitstream_Filename);
-
- Error(Error_Text);
- }
-
- Initialize_Buffer();
- ld = &base;
- }
-
- Initialize_Decoder();
-
- //Decode_Bitstream();
-
- return 0;
-}
-
-/* IMPLEMENTAION specific rouintes */
-static void Initialize_Decoder()
-{
- int i;
-
- /* Clip table */
- if (!(Clip=(unsigned char *)malloc(1024)))
- Error("Clip[] malloc failed\n");
-
- Clip += 384;
-
- for (i=-384; i<640; i++)
- Clip[i] = (i<0) ? 0 : ((i>255) ? 255 : i);
-
- /* IDCT */
- if (Reference_IDCT_Flag)
- Initialize_Reference_IDCT();
- else
- Initialize_Fast_IDCT();
-
-}
-
-/* mostly IMPLEMENTAION specific rouintes */
-static void Initialize_Sequence()
-{
- int cc, size;
- static int Table_6_20[3] = {6,8,12};
-
- /* check scalability mode of enhancement layer */
- if (Two_Streams && (enhan.scalable_mode!=SC_SNR) && (base.scalable_mode!=SC_DP))
- Error("unsupported scalability mode\n");
-
- /* force MPEG-1 parameters for proper decoder behavior */
- /* see ISO/IEC 13818-2 section D.9.14 */
- if (!base.MPEG2_Flag)
- {
- progressive_sequence = 1;
- progressive_frame = 1;
- picture_structure = FRAME_PICTURE;
- frame_pred_frame_dct = 1;
- chroma_format = CHROMA420;
- matrix_coefficients = 5;
- }
-
- /* round to nearest multiple of coded macroblocks */
- /* ISO/IEC 13818-2 section 6.3.3 sequence_header() */
- mb_width = (horizontal_size+15)/16;
- mb_height = (base.MPEG2_Flag && !progressive_sequence) ? 2*((vertical_size+31)/32)
- : (vertical_size+15)/16;
-
- Coded_Picture_Width = 16*mb_width;
- Coded_Picture_Height = 16*mb_height;
-
- /* ISO/IEC 13818-2 sections 6.1.1.8, 6.1.1.9, and 6.1.1.10 */
- Chroma_Width = (chroma_format==CHROMA444) ? Coded_Picture_Width
- : Coded_Picture_Width>>1;
- Chroma_Height = (chroma_format!=CHROMA420) ? Coded_Picture_Height
- : Coded_Picture_Height>>1;
-
- /* derived based on Table 6-20 in ISO/IEC 13818-2 section 6.3.17 */
- block_count = Table_6_20[chroma_format-1];
-
- for (cc=0; cc<3; cc++)
- {
- if (cc==0)
- size = Coded_Picture_Width*Coded_Picture_Height;
- else
- size = Chroma_Width*Chroma_Height;
-
- if (!(backward_reference_frame[cc] = (unsigned char *)malloc(size)))
- Error("backward_reference_frame[] malloc failed\n");
-
- if (!(forward_reference_frame[cc] = (unsigned char *)malloc(size)))
- Error("forward_reference_frame[] malloc failed\n");
-
- if (!(auxframe[cc] = (unsigned char *)malloc(size)))
- Error("auxframe[] malloc failed\n");
-
- if(Ersatz_Flag)
- if (!(substitute_frame[cc] = (unsigned char *)malloc(size)))
- Error("substitute_frame[] malloc failed\n");
-
-
- if (base.scalable_mode==SC_SPAT)
- {
- /* this assumes lower layer is 4:2:0 */
- if (!(llframe0[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1))))
- Error("llframe0 malloc failed\n");
- if (!(llframe1[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1))))
- Error("llframe1 malloc failed\n");
- }
- }
-
- /* SCALABILITY: Spatial */
- if (base.scalable_mode==SC_SPAT)
- {
- if (!(lltmp = (short *)malloc(lower_layer_prediction_horizontal_size*((lower_layer_prediction_vertical_size*vertical_subsampling_factor_n)/vertical_subsampling_factor_m)*sizeof(short))))
- Error("lltmp malloc failed\n");
- }
-
-#ifdef DISPLAY
- if (Output_Type==T_X11)
- {
- Initialize_Display_Process("");
- Initialize_Dither_Matrix();
- }
-#endif /* DISPLAY */
-
-}
-
-void Error(text)
-char *text;
-{
- cprintf(text);
-}
-
-/* Trace_Flag output */
-void Print_Bits(code,bits,len)
-int code,bits,len;
-{
- int i;
- for (i=0; i<len; i++)
- cprintf("%d",(code>>(bits-1-i))&1);
-}
-
-static int Headers()
-{
- int ret;
-
- ld = &base;
-
-
- /* return when end of sequence (0) or picture
- header has been parsed (1) */
-
- ret = Get_Hdr();
-
-
- if (Two_Streams)
- {
- ld = &enhan;
- if (Get_Hdr()!=ret && !Quiet_Flag)
- cprintf("streams out of sync\n");
- ld = &base;
- }
-
- return ret;
-}
-
-int Decode_Bitstream()
-{
- int ret;
- int Bitstream_Framenum;
-
- Bitstream_Framenum = 0;
-
- for(;;)
- {
-
-#ifdef VERIFY
- Clear_Verify_Headers();
-#endif /* VERIFY */
-
- ld->actual_file_ptr = ld->start_file_ptr;
-
- ret = Headers();
-
- if(ret==1)
- {
- ret = video_sequence(&Bitstream_Framenum);
- }
- else
- return(ret);
- }
-
-}
-
-
-static void Deinitialize_Sequence()
-{
- int i;
-
- /* clear flags */
- base.MPEG2_Flag=0;
-
- for(i=0;i<3;i++)
- {
- free(backward_reference_frame[i]);
- free(forward_reference_frame[i]);
- free(auxframe[i]);
-
- if (base.scalable_mode==SC_SPAT)
- {
- free(llframe0[i]);
- free(llframe1[i]);
- }
- }
-
- if (base.scalable_mode==SC_SPAT)
- free(lltmp);
-
-#ifdef DISPLAY
- if (Output_Type==T_X11)
- Terminate_Display_Process();
-#endif
-}
-
-
-static int video_sequence(Bitstream_Framenumber)
-int *Bitstream_Framenumber;
-{
- int Bitstream_Framenum;
- int Sequence_Framenum;
- int Return_Value;
-
- char tmp[100];
-
- Bitstream_Framenum = *Bitstream_Framenumber;
- Sequence_Framenum=0;
-
- Initialize_Sequence();
-
- /* decode picture whose header has already been parsed in
- Decode_Bitstream() */
-
- ld->px = 310+(rand()%(500-Coded_Picture_Width));
- ld->py = 100+(rand()%(400-Coded_Picture_Height));
-
- sprintf(tmp,"Wx = %3d Wy = %3d",Coded_Picture_Width,Coded_Picture_Height);
- grx_text(tmp,ld->px,ld->py-10,rgb16(255,255,255),0);
-
- Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
-
- /* update picture numbers */
- if (!Second_Field)
- {
- Bitstream_Framenum++;
- Sequence_Framenum++;
- }
-
- fsf_schedule_next_timed_job(NULL, NULL, NULL, NULL, NULL);
-
- /* loop through the rest of the pictures in the sequence */
- while ((Return_Value=Headers()))
- {
- Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
-
- if (!Second_Field)
- {
- Bitstream_Framenum++;
- Sequence_Framenum++;
- }
-
- fsf_schedule_next_timed_job(NULL, NULL, NULL, NULL, NULL);
-
- }
-
- /* put last frame */
- if (Sequence_Framenum!=0)
- {
- Output_Last_Frame_of_Sequence(Bitstream_Framenum);
- }
-
- Deinitialize_Sequence();
-
-#ifdef VERIFY
- Clear_Verify_Headers();
-#endif /* VERIFY */
-
- *Bitstream_Framenumber = Bitstream_Framenum;
- return(Return_Value);
-}
-
-
-
-static void Clear_Options()
-{
- Verbose_Flag = 0;
- Output_Type = 0;
- Output_Picture_Filename = " ";
- hiQdither = 0;
- Output_Type = 0;
- Frame_Store_Flag = 0;
- Spatial_Flag = 0;
- Lower_Layer_Picture_Filename = " ";
- Reference_IDCT_Flag = 0;
- Trace_Flag = 0;
- Quiet_Flag = 0;
- Ersatz_Flag = 0;
- Substitute_Picture_Filename = " ";
- Two_Streams = 0;
- Enhancement_Layer_Bitstream_Filename = " ";
- Big_Picture_Flag = 0;
- Main_Bitstream_Flag = 0;
- Main_Bitstream_Filename = " ";
- Verify_Flag = 0;
- Stats_Flag = 0;
- User_Data_Flag = 0;
-}
-
-
-#ifdef DEBUG
-static void Print_Options()
-{
-
- printf("Verbose_Flag = %d\n", Verbose_Flag);
- printf("Output_Type = %d\n", Output_Type);
- printf("Output_Picture_Filename = %s\n", Output_Picture_Filename);
- printf("hiQdither = %d\n", hiQdither);
- printf("Output_Type = %d\n", Output_Type);
- printf("Frame_Store_Flag = %d\n", Frame_Store_Flag);
- printf("Spatial_Flag = %d\n", Spatial_Flag);
- printf("Lower_Layer_Picture_Filename = %s\n", Lower_Layer_Picture_Filename);
- printf("Reference_IDCT_Flag = %d\n", Reference_IDCT_Flag);
- printf("Trace_Flag = %d\n", Trace_Flag);
- printf("Quiet_Flag = %d\n", Quiet_Flag);
- printf("Ersatz_Flag = %d\n", Ersatz_Flag);
- printf("Substitute_Picture_Filename = %s\n", Substitute_Picture_Filename);
- printf("Two_Streams = %d\n", Two_Streams);
- printf("Enhancement_Layer_Bitstream_Filename = %s\n", Enhancement_Layer_Bitstream_Filename);
- printf("Big_Picture_Flag = %d\n", Big_Picture_Flag);
- printf("Main_Bitstream_Flag = %d\n", Main_Bitstream_Flag);
- printf("Main_Bitstream_Filename = %s\n", Main_Bitstream_Filename);
- printf("Verify_Flag = %d\n", Verify_Flag);
- printf("Stats_Flag = %d\n", Stats_Flag);
- printf("User_Data_Flag = %d\n", User_Data_Flag);
-
-}
-#endif
Index: rel_1_2/fsf/mpeg2/getvlc.h
===================================================================
--- rel_1_2/fsf/mpeg2/getvlc.h (revision 1198)
+++ rel_1_2/fsf/mpeg2/getvlc.h (nonexistent)
@@ -1,491 +0,0 @@
-/* getvlc.h, variable length code tables */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-/* NOTE: #define constants such as MACROBLOCK_QUANT are upper case
- as per C programming convention. However, the MPEG document
- (ISO/IEC 13818-2) lists them in all lower case (e.g. Annex B) */
-
-/* NOTE: the VLC tables are in a flash format---a transformation
- of the tables in Annex B to a form more convenient towards
- parallel (more than one-bit-at-a-time) decoding */
-
-typedef struct {
- char val, len;
-} VLCtab;
-
-typedef struct {
- char run, level, len;
-} DCTtab;
-
-/* Table B-3, macroblock_type in P-pictures, codes 001..1xx */
-static VLCtab PMBtab0[8] = {
- {ERROR,0},
- {MACROBLOCK_MOTION_FORWARD,3},
- {MACROBLOCK_PATTERN,2}, {MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1}
-};
-
-/* Table B-3, macroblock_type in P-pictures, codes 000001..00011x */
-static VLCtab PMBtab1[8] = {
- {ERROR,0},
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,6},
- {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5},
- {MACROBLOCK_INTRA,5}, {MACROBLOCK_INTRA,5}
-};
-
-/* Table B-4, macroblock_type in B-pictures, codes 0010..11xx */
-static VLCtab BMBtab0[16] = {
- {ERROR,0},
- {ERROR,0},
- {MACROBLOCK_MOTION_FORWARD,4},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,4},
- {MACROBLOCK_MOTION_BACKWARD,3},
- {MACROBLOCK_MOTION_BACKWARD,3},
- {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
- {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}
-};
-
-/* Table B-4, macroblock_type in B-pictures, codes 000001..00011x */
-static VLCtab BMBtab1[8] = {
- {ERROR,0},
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,6},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5},
- {MACROBLOCK_INTRA,5},
- {MACROBLOCK_INTRA,5}
-};
-
-/* Table B-5, macroblock_type in spat. scal. I-pictures, codes 0001..1xxx */
-static VLCtab spIMBtab[16] = {
- {ERROR,0},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,4},
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,4},
- {MACROBLOCK_INTRA,4},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}
-};
-
-/* Table B-6, macroblock_type in spat. scal. P-pictures, codes 0010..11xx */
-static VLCtab spPMBtab0[16] =
-{
- {ERROR,0},
- {ERROR,0},
- {MACROBLOCK_MOTION_FORWARD,4},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,4},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2}
-};
-
-/* Table B-6, macroblock_type in spat. scal. P-pictures, codes 0000010..000111x */
-static VLCtab spPMBtab1[16] = {
- {ERROR,0},
- {ERROR,0},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,7},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,7},
- {MACROBLOCK_PATTERN,7},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,7},
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,7},
- {MACROBLOCK_INTRA,7},
- {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
- {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_PATTERN,6}
-};
-
-/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 0010..11xx */
-static VLCtab spBMBtab0[14] = {
- {MACROBLOCK_MOTION_FORWARD,4},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,4},
- {MACROBLOCK_MOTION_BACKWARD,3},
- {MACROBLOCK_MOTION_BACKWARD,3},
- {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
- {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}
-};
-
-/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 0000100..000111x */
-static VLCtab spBMBtab1[12] = {
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,7},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,7},
- {MACROBLOCK_INTRA,7},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,7},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6}
-};
-
-/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 00000100x..000001111 */
-static VLCtab spBMBtab2[8] = {
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,8},
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,8},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,8},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,8},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,9},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,9},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,9},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,9}
-};
-
-/* Table B-8, macroblock_type in spat. scal. B-pictures, codes 001..1xx */
-static VLCtab SNRMBtab[8] = {
- {ERROR,0},
- {0,3},
- {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_PATTERN,1},
- {MACROBLOCK_PATTERN,1},
- {MACROBLOCK_PATTERN,1},
- {MACROBLOCK_PATTERN,1}
-};
-
-/* Table B-10, motion_code, codes 0001 ... 01xx */
-static VLCtab MVtab0[8] =
-{ {ERROR,0}, {3,3}, {2,2}, {2,2}, {1,1}, {1,1}, {1,1}, {1,1}
-};
-
-/* Table B-10, motion_code, codes 0000011 ... 000011x */
-static VLCtab MVtab1[8] =
-{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {7,6}, {6,6}, {5,6}, {4,5}, {4,5}
-};
-
-/* Table B-10, motion_code, codes 0000001100 ... 000001011x */
-static VLCtab MVtab2[12] =
-{ {16,9}, {15,9}, {14,9}, {13,9},
- {12,9}, {11,9}, {10,8}, {10,8},
- {9,8}, {9,8}, {8,8}, {8,8}
-};
-
-/* Table B-9, coded_block_pattern, codes 01000 ... 111xx */
-static VLCtab CBPtab0[32] =
-{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
- {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
- {62,5}, {2,5}, {61,5}, {1,5}, {56,5}, {52,5}, {44,5}, {28,5},
- {40,5}, {20,5}, {48,5}, {12,5}, {32,4}, {32,4}, {16,4}, {16,4},
- {8,4}, {8,4}, {4,4}, {4,4}, {60,3}, {60,3}, {60,3}, {60,3}
-};
-
-/* Table B-9, coded_block_pattern, codes 00000100 ... 001111xx */
-static VLCtab CBPtab1[64] =
-{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
- {58,8}, {54,8}, {46,8}, {30,8},
- {57,8}, {53,8}, {45,8}, {29,8}, {38,8}, {26,8}, {37,8}, {25,8},
- {43,8}, {23,8}, {51,8}, {15,8}, {42,8}, {22,8}, {50,8}, {14,8},
- {41,8}, {21,8}, {49,8}, {13,8}, {35,8}, {19,8}, {11,8}, {7,8},
- {34,7}, {34,7}, {18,7}, {18,7}, {10,7}, {10,7}, {6,7}, {6,7},
- {33,7}, {33,7}, {17,7}, {17,7}, {9,7}, {9,7}, {5,7}, {5,7},
- {63,6}, {63,6}, {63,6}, {63,6}, {3,6}, {3,6}, {3,6}, {3,6},
- {36,6}, {36,6}, {36,6}, {36,6}, {24,6}, {24,6}, {24,6}, {24,6}
-};
-
-/* Table B-9, coded_block_pattern, codes 000000001 ... 000000111 */
-static VLCtab CBPtab2[8] =
-{ {ERROR,0}, {0,9}, {39,9}, {27,9}, {59,9}, {55,9}, {47,9}, {31,9}
-};
-
-/* Table B-1, macroblock_address_increment, codes 00010 ... 011xx */
-static VLCtab MBAtab1[16] =
-{ {ERROR,0}, {ERROR,0}, {7,5}, {6,5}, {5,4}, {5,4}, {4,4}, {4,4},
- {3,3}, {3,3}, {3,3}, {3,3}, {2,3}, {2,3}, {2,3}, {2,3}
-};
-
-/* Table B-1, macroblock_address_increment, codes 00000011000 ... 0000111xxxx */
-static VLCtab MBAtab2[104] =
-{
- {33,11}, {32,11}, {31,11}, {30,11}, {29,11}, {28,11}, {27,11}, {26,11},
- {25,11}, {24,11}, {23,11}, {22,11}, {21,10}, {21,10}, {20,10}, {20,10},
- {19,10}, {19,10}, {18,10}, {18,10}, {17,10}, {17,10}, {16,10}, {16,10},
- {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8},
- {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8},
- {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8},
- {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8},
- {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8},
- {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8},
- {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7},
- {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7},
- {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7},
- {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}
-};
-
-/* Table B-12, dct_dc_size_luminance, codes 00xxx ... 11110 */
-static VLCtab DClumtab0[32] =
-{ {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
- {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
- {0, 3}, {0, 3}, {0, 3}, {0, 3}, {3, 3}, {3, 3}, {3, 3}, {3, 3},
- {4, 3}, {4, 3}, {4, 3}, {4, 3}, {5, 4}, {5, 4}, {6, 5}, {ERROR, 0}
-};
-
-/* Table B-12, dct_dc_size_luminance, codes 111110xxx ... 111111111 */
-static VLCtab DClumtab1[16] =
-{ {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6},
- {8, 7}, {8, 7}, {8, 7}, {8, 7}, {9, 8}, {9, 8}, {10,9}, {11,9}
-};
-
-/* Table B-13, dct_dc_size_chrominance, codes 00xxx ... 11110 */
-static VLCtab DCchromtab0[32] =
-{ {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2},
- {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
- {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
- {3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5}, {ERROR, 0}
-};
-
-/* Table B-13, dct_dc_size_chrominance, codes 111110xxxx ... 1111111111 */
-static VLCtab DCchromtab1[32] =
-{ {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
- {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
- {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7},
- {8, 8}, {8, 8}, {8, 8}, {8, 8}, {9, 9}, {9, 9}, {10,10}, {11,10}
-};
-
-/* Table B-14, DCT coefficients table zero,
- * codes 0100 ... 1xxx (used for first (DC) coefficient)
- */
-DCTtab DCTtabfirst[12] =
-{
- {0,2,4}, {2,1,4}, {1,1,3}, {1,1,3},
- {0,1,1}, {0,1,1}, {0,1,1}, {0,1,1},
- {0,1,1}, {0,1,1}, {0,1,1}, {0,1,1}
-};
-
-/* Table B-14, DCT coefficients table zero,
- * codes 0100 ... 1xxx (used for all other coefficients)
- */
-DCTtab DCTtabnext[12] =
-{
- {0,2,4}, {2,1,4}, {1,1,3}, {1,1,3},
- {64,0,2}, {64,0,2}, {64,0,2}, {64,0,2}, /* EOB */
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}
-};
-
-/* Table B-14, DCT coefficients table zero,
- * codes 000001xx ... 00111xxx
- */
-DCTtab DCTtab0[60] =
-{
- {65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */
- {2,2,7}, {2,2,7}, {9,1,7}, {9,1,7},
- {0,4,7}, {0,4,7}, {8,1,7}, {8,1,7},
- {7,1,6}, {7,1,6}, {7,1,6}, {7,1,6},
- {6,1,6}, {6,1,6}, {6,1,6}, {6,1,6},
- {1,2,6}, {1,2,6}, {1,2,6}, {1,2,6},
- {5,1,6}, {5,1,6}, {5,1,6}, {5,1,6},
- {13,1,8}, {0,6,8}, {12,1,8}, {11,1,8},
- {3,2,8}, {1,3,8}, {0,5,8}, {10,1,8},
- {0,3,5}, {0,3,5}, {0,3,5}, {0,3,5},
- {0,3,5}, {0,3,5}, {0,3,5}, {0,3,5},
- {4,1,5}, {4,1,5}, {4,1,5}, {4,1,5},
- {4,1,5}, {4,1,5}, {4,1,5}, {4,1,5},
- {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
- {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5}
-};
-
-/* Table B-15, DCT coefficients table one,
- * codes 000001xx ... 11111111
-*/
-DCTtab DCTtab0a[252] =
-{
- {65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */
- {7,1,7}, {7,1,7}, {8,1,7}, {8,1,7},
- {6,1,7}, {6,1,7}, {2,2,7}, {2,2,7},
- {0,7,6}, {0,7,6}, {0,7,6}, {0,7,6},
- {0,6,6}, {0,6,6}, {0,6,6}, {0,6,6},
- {4,1,6}, {4,1,6}, {4,1,6}, {4,1,6},
- {5,1,6}, {5,1,6}, {5,1,6}, {5,1,6},
- {1,5,8}, {11,1,8}, {0,11,8}, {0,10,8},
- {13,1,8}, {12,1,8}, {3,2,8}, {1,4,8},
- {2,1,5}, {2,1,5}, {2,1,5}, {2,1,5},
- {2,1,5}, {2,1,5}, {2,1,5}, {2,1,5},
- {1,2,5}, {1,2,5}, {1,2,5}, {1,2,5},
- {1,2,5}, {1,2,5}, {1,2,5}, {1,2,5},
- {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
- {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4}, /* EOB */
- {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
- {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
- {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
- {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
- {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
- {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
- {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,4,5}, {0,4,5}, {0,4,5}, {0,4,5},
- {0,4,5}, {0,4,5}, {0,4,5}, {0,4,5},
- {0,5,5}, {0,5,5}, {0,5,5}, {0,5,5},
- {0,5,5}, {0,5,5}, {0,5,5}, {0,5,5},
- {9,1,7}, {9,1,7}, {1,3,7}, {1,3,7},
- {10,1,7}, {10,1,7}, {0,8,7}, {0,8,7},
- {0,9,7}, {0,9,7}, {0,12,8}, {0,13,8},
- {2,3,8}, {4,2,8}, {0,14,8}, {0,15,8}
-};
-
-/* Table B-14, DCT coefficients table zero,
- * codes 0000001000 ... 0000001111
- */
-DCTtab DCTtab1[8] =
-{
- {16,1,10}, {5,2,10}, {0,7,10}, {2,3,10},
- {1,4,10}, {15,1,10}, {14,1,10}, {4,2,10}
-};
-
-/* Table B-15, DCT coefficients table one,
- * codes 000000100x ... 000000111x
- */
-DCTtab DCTtab1a[8] =
-{
- {5,2,9}, {5,2,9}, {14,1,9}, {14,1,9},
- {2,4,10}, {16,1,10}, {15,1,9}, {15,1,9}
-};
-
-/* Table B-14/15, DCT coefficients table zero / one,
- * codes 000000010000 ... 000000011111
- */
-DCTtab DCTtab2[16] =
-{
- {0,11,12}, {8,2,12}, {4,3,12}, {0,10,12},
- {2,4,12}, {7,2,12}, {21,1,12}, {20,1,12},
- {0,9,12}, {19,1,12}, {18,1,12}, {1,5,12},
- {3,3,12}, {0,8,12}, {6,2,12}, {17,1,12}
-};
-
-/* Table B-14/15, DCT coefficients table zero / one,
- * codes 0000000010000 ... 0000000011111
- */
-DCTtab DCTtab3[16] =
-{
- {10,2,13}, {9,2,13}, {5,3,13}, {3,4,13},
- {2,5,13}, {1,7,13}, {1,6,13}, {0,15,13},
- {0,14,13}, {0,13,13}, {0,12,13}, {26,1,13},
- {25,1,13}, {24,1,13}, {23,1,13}, {22,1,13}
-};
-
-/* Table B-14/15, DCT coefficients table zero / one,
- * codes 00000000010000 ... 00000000011111
- */
-DCTtab DCTtab4[16] =
-{
- {0,31,14}, {0,30,14}, {0,29,14}, {0,28,14},
- {0,27,14}, {0,26,14}, {0,25,14}, {0,24,14},
- {0,23,14}, {0,22,14}, {0,21,14}, {0,20,14},
- {0,19,14}, {0,18,14}, {0,17,14}, {0,16,14}
-};
-
-/* Table B-14/15, DCT coefficients table zero / one,
- * codes 000000000010000 ... 000000000011111
- */
-DCTtab DCTtab5[16] =
-{
- {0,40,15}, {0,39,15}, {0,38,15}, {0,37,15},
- {0,36,15}, {0,35,15}, {0,34,15}, {0,33,15},
- {0,32,15}, {1,14,15}, {1,13,15}, {1,12,15},
- {1,11,15}, {1,10,15}, {1,9,15}, {1,8,15}
-};
-
-/* Table B-14/15, DCT coefficients table zero / one,
- * codes 0000000000010000 ... 0000000000011111
- */
-DCTtab DCTtab6[16] =
-{
- {1,18,16}, {1,17,16}, {1,16,16}, {1,15,16},
- {6,3,16}, {16,2,16}, {15,2,16}, {14,2,16},
- {13,2,16}, {12,2,16}, {11,2,16}, {31,1,16},
- {30,1,16}, {29,1,16}, {28,1,16}, {27,1,16}
-};
-
Index: rel_1_2/fsf/mpeg2/const.h
===================================================================
--- rel_1_2/fsf/mpeg2/const.h (revision 1198)
+++ rel_1_2/fsf/mpeg2/const.h (nonexistent)
@@ -1,141 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: const.h,v 1.1 2003-09-11 13:55:59 giacomo Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2003-09-11 13:55:59 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------------ */
-/* Useful constants */
-/* ------------------ */
-
-#ifndef __CONST_H_
-
-#define __CONST_H_
-
-/* Screen dimensions */
-#define SCREEN_WIDTH 800
-#define SCREEN_HEIGHT 600
-#define SCREEN_BIT_COLORS 8
-
-/* Visible area */
-#define TEL_WIDTH 50
-#define TEL_HEIGHT 50
-
-/* Car dimensions */
-#define CAR_WIDTH 12
-#define CAR_HEIGHT 12
-#define CAR_W 8
-#define CAR_H 10
-
-/* Track dimensions */
-#define TRACK_WIDTH 500
-#define TRACK_HEIGHT 500
-
-/* Track position */
-#define TRACK_X1 0
-#define TRACK_Y1 0
-#define TRACK_X2 TRACK_X1+TRACK_WIDTH-1
-#define TRACK_Y2 TRACK_Y1+TRACK_HEIGHT-1
-
-/* Max number of car on track */
-#define MAX_CAR_NUMBER 10
-#define DRIVERS_NUMBER 20
-#define MAX_DRIVER_NAME_LENGTH 20
-#define MAX_TRACK_NAME_LENGTH 20
-#define TRACK_NUMBER 4
-
-/* Lap direction */
-#define CLOCK 0
-#define ANTICLOCK 1
-
-/* Information display coords */
-#define CMD_WIDTH TRACK_WIDTH
-#define CMD_HEIGHT (SCREEN_HEIGHT-TRACK_HEIGHT-3)
-
-/* Car position limits */
-#define MIN_CAR_X (TRACK_X1 + CAR_WIDTH/2 + 4)
-#define MIN_CAR_Y (TRACK_Y1 + CAR_HEIGHT/2 + 4)
-#define MAX_CAR_X (TRACK_X2 - CAR_WIDTH/2 - 4)
-#define MAX_CAR_Y (TRACK_Y2 - CAR_HEIGHT/2 - 4)
-
-/* Road constants */
-#define LEFT_ONLY 10
-#define RIGHT_ONLY 11
-#define ROAD_OK 12
-#define NO_ROAD 13
-
-/* Collision constants */
-#define COLLISION_LEFT 20
-#define COLLISION_RIGHT 21
-#define COLLISION_BACK 22
-#define NO_COLL 0
-
-/* CAB constants */
-#define ROAD_MSG_DIM sizeof(road_info)
-#define ROAD_MSG_READER 4
-
-#define CAR_MSG_DIM sizeof(car_status)
-#define CAR_MSG_READER 5
-
-/* Tasks parameters */
-#define SENSOR_WCET 3000
-#define SENSOR_PERIOD 40000
-#define CONTROL_WCET 1000
-#define CONTROL_PERIOD 40000
-
-#endif
-
Index: rel_1_2/fsf/mpeg2/mpeg2dec.h
===================================================================
--- rel_1_2/fsf/mpeg2/mpeg2dec.h (revision 1198)
+++ rel_1_2/fsf/mpeg2/mpeg2dec.h (nonexistent)
@@ -1,129 +0,0 @@
-/* mpeg2dec.h, MPEG specific defines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#define ERROR (-1)
-
-#define PICTURE_START_CODE 0x100
-#define SLICE_START_CODE_MIN 0x101
-#define SLICE_START_CODE_MAX 0x1AF
-#define USER_DATA_START_CODE 0x1B2
-#define SEQUENCE_HEADER_CODE 0x1B3
-#define SEQUENCE_ERROR_CODE 0x1B4
-#define EXTENSION_START_CODE 0x1B5
-#define SEQUENCE_END_CODE 0x1B7
-#define GROUP_START_CODE 0x1B8
-#define SYSTEM_START_CODE_MIN 0x1B9
-#define SYSTEM_START_CODE_MAX 0x1FF
-
-#define ISO_END_CODE 0x1B9
-#define PACK_START_CODE 0x1BA
-#define SYSTEM_START_CODE 0x1BB
-
-#define VIDEO_ELEMENTARY_STREAM 0x1e0
-
-/* scalable_mode */
-#define SC_NONE 0
-#define SC_DP 1
-#define SC_SPAT 2
-#define SC_SNR 3
-#define SC_TEMP 4
-
-/* picture coding type */
-#define I_TYPE 1
-#define P_TYPE 2
-#define B_TYPE 3
-#define D_TYPE 4
-
-/* picture structure */
-#define TOP_FIELD 1
-#define BOTTOM_FIELD 2
-#define FRAME_PICTURE 3
-
-/* macroblock type */
-#define MACROBLOCK_INTRA 1
-#define MACROBLOCK_PATTERN 2
-#define MACROBLOCK_MOTION_BACKWARD 4
-#define MACROBLOCK_MOTION_FORWARD 8
-#define MACROBLOCK_QUANT 16
-#define SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG 32
-#define PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS 64
-
-
-/* motion_type */
-#define MC_FIELD 1
-#define MC_FRAME 2
-#define MC_16X8 2
-#define MC_DMV 3
-
-/* mv_format */
-#define MV_FIELD 0
-#define MV_FRAME 1
-
-/* chroma_format */
-#define CHROMA420 1
-#define CHROMA422 2
-#define CHROMA444 3
-
-/* extension start code IDs */
-
-#define SEQUENCE_EXTENSION_ID 1
-#define SEQUENCE_DISPLAY_EXTENSION_ID 2
-#define QUANT_MATRIX_EXTENSION_ID 3
-#define COPYRIGHT_EXTENSION_ID 4
-#define SEQUENCE_SCALABLE_EXTENSION_ID 5
-#define PICTURE_DISPLAY_EXTENSION_ID 7
-#define PICTURE_CODING_EXTENSION_ID 8
-#define PICTURE_SPATIAL_SCALABLE_EXTENSION_ID 9
-#define PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID 10
-
-#define ZIG_ZAG 0
-
-#define PROFILE_422 (128+5)
-#define MAIN_LEVEL 8
-
-/* Layers: used by Verbose_Flag, Verifier_Flag, Stats_Flag, and Trace_Flag */
-#define NO_LAYER 0
-#define SEQUENCE_LAYER 1
-#define PICTURE_LAYER 2
-#define SLICE_LAYER 3
-#define MACROBLOCK_LAYER 4
-#define BLOCK_LAYER 5
-#define EVENT_LAYER 6
-#define ALL_LAYERS 7
-
-
-
-#define FILENAME_LENGTH 256
-
-
-
-
-#define MB_WEIGHT 32
-#define MB_CLASS4 64
-
Index: rel_1_2/fsf/mpeg2/store.c
===================================================================
--- rel_1_2/fsf/mpeg2/store.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/store.c (nonexistent)
@@ -1,319 +0,0 @@
-/* store.c, picture output routines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdlib.h>
-
-#include "drivers/glib.h"
-
-#include "config.h"
-#include "global.h"
-
-extern DWORD flbaddr;
-
-static void conv422to444 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
-static void conv420to422 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
-
-__inline__ WORD down32to16(unsigned char r, unsigned char g, unsigned char b)
-{
- return ((b&0xf8)>>3)|((g&0xfc)<<3)|((r&0xf8)<<8);
-}
-
-void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame))
-{
- int i, j;
- int y, u, v, r, g, b;
-// int rm=0,gm=0,bm=0;
- int crv, cbu, cgu, cgv;
- unsigned char *py, *pu, *pv;
- int height, width, incr;
- static unsigned char *u422, *v422, *u444, *v444;
-
- incr = width = Coded_Picture_Width ;
- height = Coded_Picture_Height;
-
- if (chroma_format==CHROMA444)
- {
- u444 = src[1];
- v444 = src[2];
- }
- else
- {
- if (!u444)
- {
- if (chroma_format==CHROMA420)
- {
- if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
- *Coded_Picture_Height)))
- Error("malloc failed");
- if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
- *Coded_Picture_Height)))
- Error("malloc failed");
- }
-
- if (!(u444 = (unsigned char *)malloc(Coded_Picture_Width
- *Coded_Picture_Height)))
- Error("malloc failed");
-
- if (!(v444 = (unsigned char *)malloc(Coded_Picture_Width
- *Coded_Picture_Height)))
- Error("malloc failed");
- }
-
- if (chroma_format==CHROMA420)
- {
- conv420to422(src[1],u422);
- conv420to422(src[2],v422);
- conv422to444(u422,u444);
- conv422to444(v422,v444);
- }
- else
- {
- conv422to444(src[1],u444);
- conv422to444(src[2],v444);
- }
- }
-
- /* matrix coefficients */
- crv = Inverse_Table_6_9[matrix_coefficients][0];
- cbu = Inverse_Table_6_9[matrix_coefficients][1];
- cgu = Inverse_Table_6_9[matrix_coefficients][2];
- cgv = Inverse_Table_6_9[matrix_coefficients][3];
-
- for (i=0; i<height; i++)
- {
- py = src[0] + incr*i;
- pu = u444 + incr*i;
- pv = v444 + incr*i;
-
- for (j=0; j<width; j++)
- {
- u = *pu++ - 128;
- v = *pv++ - 128;
- y = 76309 * (*py++ - 16); /* (255/219)*65536 */
-
- r = Clip[(y + crv*v + 32768)>>16];
- g = Clip[(y - cgu*u - cgv*v + 32768)>>16];
- b = Clip[(y + cbu*u + 32786)>>16];
-
- *(WORD *)(flbaddr+((i+ld->py)*800+(j+ld->px))*2) = down32to16(r,g,b);
-
- }
- }
-
-}
-
-/*
-void Display_Image(Dithered_Image)
-unsigned char *Dithered_Image;
-{
- / * display dithered image */
-//}
-
-
-/* horizontal 1:2 interpolation filter */
-static void conv422to444(src,dst)
-unsigned char *src,*dst;
-{
- int i, i2, w, j, im3, im2, im1, ip1, ip2, ip3;
-
- w = Coded_Picture_Width>>1;
-
- if (base.MPEG2_Flag)
- {
- for (j=0; j<Coded_Picture_Height; j++)
- {
- for (i=0; i<w; i++)
- {
- i2 = i<<1;
- im2 = (i<2) ? 0 : i-2;
- im1 = (i<1) ? 0 : i-1;
- ip1 = (i<w-1) ? i+1 : w-1;
- ip2 = (i<w-2) ? i+2 : w-1;
- ip3 = (i<w-3) ? i+3 : w-1;
-
- /* FIR filter coefficients (*256): 21 0 -52 0 159 256 159 0 -52 0 21 */
- /* even samples (0 0 256 0 0) */
- dst[i2] = src[i];
-
- /* odd samples (21 -52 159 159 -52 21) */
- dst[i2+1] = Clip[(int)(21*(src[im2]+src[ip3])
- -52*(src[im1]+src[ip2])
- +159*(src[i]+src[ip1])+128)>>8];
- }
- src+= w;
- dst+= Coded_Picture_Width;
- }
- }
- else
- {
- for (j=0; j<Coded_Picture_Height; j++)
- {
- for (i=0; i<w; i++)
- {
-
- i2 = i<<1;
- im3 = (i<3) ? 0 : i-3;
- im2 = (i<2) ? 0 : i-2;
- im1 = (i<1) ? 0 : i-1;
- ip1 = (i<w-1) ? i+1 : w-1;
- ip2 = (i<w-2) ? i+2 : w-1;
- ip3 = (i<w-3) ? i+3 : w-1;
-
- /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
- dst[i2] = Clip[(int)( 5*src[im3]
- -21*src[im2]
- +70*src[im1]
- +228*src[i]
- -37*src[ip1]
- +11*src[ip2]+128)>>8];
-
- dst[i2+1] = Clip[(int)( 5*src[ip3]
- -21*src[ip2]
- +70*src[ip1]
- +228*src[i]
- -37*src[im1]
- +11*src[im2]+128)>>8];
- }
- src+= w;
- dst+= Coded_Picture_Width;
- }
- }
-}
-
-/* vertical 1:2 interpolation filter */
-static void conv420to422(src,dst)
-unsigned char *src,*dst;
-{
- int w, h, i, j, j2;
- int jm6, jm5, jm4, jm3, jm2, jm1, jp1, jp2, jp3, jp4, jp5, jp6, jp7;
-
- w = Coded_Picture_Width>>1;
- h = Coded_Picture_Height>>1;
-
- if (progressive_frame)
- {
- /* intra frame */
- for (i=0; i<w; i++)
- {
- for (j=0; j<h; j++)
- {
- j2 = j<<1;
- jm3 = (j<3) ? 0 : j-3;
- jm2 = (j<2) ? 0 : j-2;
- jm1 = (j<1) ? 0 : j-1;
- jp1 = (j<h-1) ? j+1 : h-1;
- jp2 = (j<h-2) ? j+2 : h-1;
- jp3 = (j<h-3) ? j+3 : h-1;
-
- /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
- /* New FIR filter coefficients (*256): 3 -16 67 227 -32 7 */
- dst[w*j2] = Clip[(int)( 3*src[w*jm3]
- -16*src[w*jm2]
- +67*src[w*jm1]
- +227*src[w*j]
- -32*src[w*jp1]
- +7*src[w*jp2]+128)>>8];
-
- dst[w*(j2+1)] = Clip[(int)( 3*src[w*jp3]
- -16*src[w*jp2]
- +67*src[w*jp1]
- +227*src[w*j]
- -32*src[w*jm1]
- +7*src[w*jm2]+128)>>8];
- }
- src++;
- dst++;
- }
- }
- else
- {
- /* intra field */
- for (i=0; i<w; i++)
- {
- for (j=0; j<h; j+=2)
- {
- j2 = j<<1;
-
- /* top field */
- jm6 = (j<6) ? 0 : j-6;
- jm4 = (j<4) ? 0 : j-4;
- jm2 = (j<2) ? 0 : j-2;
- jp2 = (j<h-2) ? j+2 : h-2;
- jp4 = (j<h-4) ? j+4 : h-2;
- jp6 = (j<h-6) ? j+6 : h-2;
-
- /* Polyphase FIR filter coefficients (*256): 2 -10 35 242 -18 5 */
- /* New polyphase FIR filter coefficients (*256): 1 -7 30 248 -21 5 */
- dst[w*j2] = Clip[(int)( 1*src[w*jm6]
- -7*src[w*jm4]
- +30*src[w*jm2]
- +248*src[w*j]
- -21*src[w*jp2]
- +5*src[w*jp4]+128)>>8];
-
- /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
- /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
- dst[w*(j2+2)] = Clip[(int)( 7*src[w*jm4]
- -35*src[w*jm2]
- +194*src[w*j]
- +110*src[w*jp2]
- -24*src[w*jp4]
- +4*src[w*jp6]+128)>>8];
-
- /* bottom field */
- jm5 = (j<5) ? 1 : j-5;
- jm3 = (j<3) ? 1 : j-3;
- jm1 = (j<1) ? 1 : j-1;
- jp1 = (j<h-1) ? j+1 : h-1;
- jp3 = (j<h-3) ? j+3 : h-1;
- jp5 = (j<h-5) ? j+5 : h-1;
- jp7 = (j<h-7) ? j+7 : h-1;
-
- /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
- /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
- dst[w*(j2+1)] = Clip[(int)( 7*src[w*jp5]
- -35*src[w*jp3]
- +194*src[w*jp1]
- +110*src[w*jm1]
- -24*src[w*jm3]
- +4*src[w*jm5]+128)>>8];
-
- dst[w*(j2+3)] = Clip[(int)( 1*src[w*jp7]
- -7*src[w*jp5]
- +30*src[w*jp3]
- +248*src[w*jp1]
- -21*src[w*jm1]
- +5*src[w*jm3]+128)>>8];
- }
- src++;
- dst++;
- }
- }
-}
-
Index: rel_1_2/fsf/mpeg2/getbits.c
===================================================================
--- rel_1_2/fsf/mpeg2/getbits.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/getbits.c (nonexistent)
@@ -1,217 +0,0 @@
-/* getbits.c, bit level routines */
-
-/*
- * All modifications (mpeg2decode -> mpeg2play) are
- * Copyright (C) 1996, Stefan Eckart. All Rights Reserved.
- */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdlib.h>
-
-#include "drivers/glib.h"
-
-#include "config.h"
-#include "global.h"
-
-/* initialize buffer, call once before first getbits or showbits */
-
-void Initialize_Buffer()
-{
- ld->Incnt = 0;
- ld->Rdptr = ld->Rdbfr + 2048;
- ld->Rdmax = ld->Rdptr;
-
-#ifdef VERIFY
- /* only the verifier uses this particular bit counter
- * Bitcnt keeps track of the current parser position with respect
- * to the video elementary stream being decoded, regardless
- * of whether or not it is wrapped within a systems layer stream
- */
- ld->Bitcnt = 0;
-#endif
-
- ld->Bfr = 0;
- Flush_Buffer(0); /* fills valid data into bfr */
-}
-
-int read(int Infile, void *Rdbfr, int rdsize) {
-
- if (ld->actual_file_ptr + 2048 > ld->end_file_ptr)
- rdsize = (int)(ld->end_file_ptr - ld->actual_file_ptr);
-
- if (rdsize < 0) return 0;
-
- memcpy(Rdbfr,ld->actual_file_ptr,rdsize);
- ld->actual_file_ptr += rdsize;
-
- return rdsize;
-
-}
-
-void Fill_Buffer()
-{
- int Buffer_Level;
-
- Buffer_Level = read(ld->Infile,ld->Rdbfr,2048);
- ld->Rdptr = ld->Rdbfr;
-
- if (System_Stream_Flag)
- ld->Rdmax -= 2048;
-
-
- /* end of the bitstream file */
- if (Buffer_Level < 2048)
- {
- /* just to be safe */
- if (Buffer_Level < 0)
- Buffer_Level = 0;
-
- /* pad until the next to the next 32-bit word boundary */
- while (Buffer_Level & 3)
- ld->Rdbfr[Buffer_Level++] = 0;
-
- /* pad the buffer with sequence end codes */
- while (Buffer_Level < 2048)
- {
- ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>24;
- ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>16;
- ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>8;
- ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE&0xff;
- }
- }
-}
-
-
-/* MPEG-1 system layer demultiplexer */
-
-int Get_Byte()
-{
- while(ld->Rdptr >= ld->Rdbfr+2048)
- {
- read(ld->Infile,ld->Rdbfr,2048);
- ld->Rdptr -= 2048;
- ld->Rdmax -= 2048;
- }
- return *ld->Rdptr++;
-}
-
-/* extract a 16-bit word from the bitstream buffer */
-int Get_Word()
-{
- int Val;
-
- Val = Get_Byte();
- return (Val<<8) | Get_Byte();
-}
-
-
-/* return next n bits (right adjusted) without advancing */
-
-unsigned int Show_Bits(N)
-int N;
-{
- return ld->Bfr >> (32-N);
-}
-
-
-/* return next bit (could be made faster than Get_Bits(1)) */
-
-unsigned int Get_Bits1()
-{
- return Get_Bits(1);
-}
-
-
-/* advance by n bits */
-
-void Flush_Buffer(N)
-int N;
-{
- int Incnt;
-
- ld->Bfr <<= N;
-
- Incnt = ld->Incnt -= N;
-
- if (Incnt <= 24)
- {
- if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4))
- {
- do
- {
- if (ld->Rdptr >= ld->Rdmax)
- Next_Packet();
- ld->Bfr |= Get_Byte() << (24 - Incnt);
- Incnt += 8;
- }
- while (Incnt <= 24);
- }
- else if (ld->Rdptr < ld->Rdbfr+2044)
- {
- do
- {
- ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
- Incnt += 8;
- }
- while (Incnt <= 24);
- }
- else
- {
- do
- {
- if (ld->Rdptr >= ld->Rdbfr+2048)
- Fill_Buffer();
- ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
- Incnt += 8;
- }
- while (Incnt <= 24);
- }
- ld->Incnt = Incnt;
- }
-
-#ifdef VERIFY
- ld->Bitcnt += N;
-#endif /* VERIFY */
-
-}
-
-
-/* return next n bits (right adjusted) */
-
-unsigned int Get_Bits(N)
-int N;
-{
- unsigned int Val;
-
- Val = Show_Bits(N);
- Flush_Buffer(N);
-
- return Val;
-}
-
Index: rel_1_2/fsf/mpeg2/verify.c
===================================================================
--- rel_1_2/fsf/mpeg2/verify.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/verify.c (nonexistent)
@@ -1,300 +0,0 @@
-/* verify.c
- *
- * Bitstream verification routines
- *
- *
- */
-#ifdef VERIFY
-
-#include <stdlib.h>
-#include <math.h> /* needed for ceil() */
-
-#include "config.h"
-#include "global.h"
-
-/* #define DEBUG */
-#ifdef DEBUG
-#define PC
-#endif
-
-#ifdef PC
-#include <conio.h> /* needed for getch() */
-#endif /* PC */
-
-/*
- Check picture headers: due to the VBV definition of picture data,
- this routine must be called immediately before any picture data
- is parsed. (before the first slice start code, including any slice
- start code stuffing).
-*/
-
-
-static void Check_VBV_Delay _ANSI_ARGS_((int Bitstream_Framenum, int Sequence_Framenum));
-
-
-void Check_Headers(Bitstream_Framenum, Sequence_Framenum)
-int Bitstream_Framenum;
-int Sequence_Framenum;
-{
-
-
- if((!low_delay)&&(vbv_delay!=0)&&(vbv_delay!=0xFFFF))
- Check_VBV_Delay(Bitstream_Framenum, Sequence_Framenum);
-
- /* clear out the header tracking variables so we have an accurate
- count next time */
- Clear_Verify_Headers();
-}
-
-
-
-/*
- * Verify vbv_delay value in picture header
- * (low_delay==1 checks not implemented. this does not exhaustively test all
- * possibilities suggested in ISO/IEC 13818-2 Annex C. It only checks
- * for constant rate streams)
- *
- * Q:how do we tell a variable rate stream from a constant rate stream anyway?
- * it's not as simple as vbv_delay==0xFFFF, since we need meaningful
- * vbv_delay values to calculate the piecewise rate in the first place!
- *
- * Also: no special provisions at the beginning or end of a sequence
- */
-
-static void Check_VBV_Delay(Bitstream_Framenum, Sequence_Framenum)
-int Bitstream_Framenum;
-int Sequence_Framenum;
-{
- double B; /* buffer size */
- double Bn; /* buffer fullness for picture n */
- double R; /* bitrate */
- double I; /* time interval (t[n+1] - t[n]) */
- double T; /* inverse of the frame rate (frame period) */
-
- int d;
- int internal_vbv_delay;
-
- static int previous_IorP_picture_structure;
- static int previous_IorP_repeat_first_field;
- static int previous_IorP_top_field_first;
- static int previous_vbv_delay;
- static int previous_bitstream_position;
-
- static double previous_Bn;
- static double E; /* maximum quantization error or mismatch */
-
-
-
- if((Sequence_Framenum==0)&&(!Second_Field))
- { /* first coded picture of sequence */
-
- R = bit_rate;
-
- /* the initial buffer occupancy is taken on faith
- that is, we believe what is transmitted in the first coded picture header
- to be the true/actual buffer occupancy */
-
- Bn = (R * (double) vbv_delay) / 90000.0;
- B = 16 * 1024 * vbv_buffer_size;
-
-
- /* maximum quantization error in bitrate (bit_rate_value is quantized/
- rounded-up to units of 400 bits/sec as per ISO/IEC 13818-2
- section 6.3.3 */
-
- E = (400.0/frame_rate) + 400;
-
-#ifdef DEBUG
- cprintf("vbv_buffer_size (B) = %.0f, Bn=%f, E=%f, \nbitrate=%f, vbv_delay=%d frame_rate=%f\n",
- B, Bn, E, bit_rate, vbv_delay, frame_rate);
-#endif
-
- }
- else /* not the first coded picture of sequence */
- {
-
- /* derive the interval (I). The interval tells us how many constant rate bits
- * will have been downloaded to the buffer during the current picture period
- *
- * interval assumes that:
- * 1. whilst we are decoding the current I or P picture, we are displaying
- * the previous I or P picture which was stored in the reorder
- * buffer (pointed to by forward_reference_frame in this implementation)
- *
- * 2. B pictures are output ("displayed") at the time when they are decoded
- *
- */
-
- if(progressive_sequence) /* Annex C.9 (progressive_sequence==1, low_delay==0) */
- {
-
- T = 1/frame_rate; /* inverse of the frame rate (frame period) */
-
- if(picture_coding_type==B_TYPE)
- {
- if(repeat_first_field==1)
- {
- if(top_field_first==1)
- I = T*3; /* three frame periods */
- else
- I = T*2; /* two frame periods */
- }
- else
- I = T; /* one frame period */
- }
- else /* P or I frame */
- {
- if(previous_IorP_repeat_first_field==1)
- {
- if(previous_IorP_top_field_first==1)
- I = 3*T;
- else
- I = 2*T;
- }
- else
- I = T;
- }
- }
- else /* Annex C.11 (progressive_sequence==0, low_delay==0) */
- {
-
- T = 1/(2*frame_rate); /* inverse of two times the frame rate (field period) */
-
- if(picture_coding_type==B_TYPE)
- {
- if(picture_structure==FRAME_PICTURE)
- {
- if(repeat_first_field==0)
- I = 2*T; /* two field periods */
- else
- I = 3*T; /* three field periods */
- }
- else /* B field */
- {
- I = T; /* one field period */
- }
- }
- else /* I or P picture */
- {
- if(picture_structure==FRAME_PICTURE)
- {
- if(previous_IorP_repeat_first_field==0)
- I = 2*T;
- else
- I = 3*T;
- }
- else
- {
- if(Second_Field==0) /* first field of current frame */
- I = T;
- else /* second field of current frame */
- {
- /* formula: previous I or P display period (2*T or 3*T) minus the
- very recent decode period (T) of the first field of the current
- frame */
-
- if(previous_IorP_picture_structure!=FRAME_PICTURE
- || previous_IorP_repeat_first_field==0)
- I = 2*T - T; /* a net of one field period */
- else if(previous_IorP_picture_structure==FRAME_PICTURE
- && previous_IorP_repeat_first_field==1)
- I = 3*T - T; /* a net of two field periods */
- }
- }
- }
- }
-
- /* derive coded size of previous picture */
- d = ld->Bitcnt - previous_bitstream_position;
-
- /* Rate = Distance/Time */
-
- /* piecewise constant rate (variable rate stream) calculation
- * R = ((double) d /((previous_vbv_delay - vbv_delay)/90000 + I));
- */
-
- R = bit_rate;
-
- /* compute buffer fullness just before removing picture n
- *
- * Bn = previous_Bn + (I*R) - d; (recursive formula)
- *
- * where:
- *
- * n is the current picture
- *
- * Bn is the buffer fullness for the current picture
- *
- * previous_Bn is the buffer fullness of the previous picture
- *
- * (I*R ) is the bits accumulated during the current picture
- * period
- *
- * d is the number of bits removed during the decoding of the
- * previous picture
- */
-
- Bn = previous_Bn + (I*R) - d;
-
- /* compute internally derived vbv_delay (rouding up with ceil()) */
- internal_vbv_delay = (int) ceil((90000 * Bn / bit_rate));
-
-#ifdef DEBUG
- cprintf("\nvbv_delay: internal=%d, bitstream=%d\n", internal_vbv_delay, vbv_delay);
-
- cprintf("Bn=%f, prevBn=%f, I=%f, R=%f, d=%d\n", Bn, previous_Bn, I, R, d);
- cprintf("frame(%d), pictstruct(%d), picttype(%d)\n", Sequence_Framenum,
- picture_structure, picture_coding_type);
-
- /* report error */
- if(internal_vbv_delay != vbv_delay)
- {
- cprintf("WARNING: internal_vbv_delay(%d) != vbv_delay(%d)\n",
- internal_vbv_delay, vbv_delay);
- }
-#endif
-
- } /* not the first coded picture of sequence */
-
-
-#ifdef PC
- getch();
-#endif /* PC */
-
- /* update generic tracking variables */
- previous_bitstream_position = ld->Bitcnt ;
- previous_vbv_delay = vbv_delay;
- previous_Bn = Bn;
-
- /* reference picture: reordered/delayed output picture */
- if(picture_coding_type!=B_TYPE)
- {
- previous_IorP_repeat_first_field = repeat_first_field;
- previous_IorP_top_field_first = top_field_first;
- previous_IorP_picture_structure = picture_structure;
- }
-
-}
-
-
-
-/* variables to keep track of the occurance of redundant headers between pictures */
-void Clear_Verify_Headers()
-{
- verify_sequence_header = 0;
- verify_group_of_pictures_header = 0;
- verify_picture_header = 0;
- verify_slice_header = 0;
- verify_sequence_extension = 0;
- verify_sequence_display_extension = 0;
- verify_quant_matrix_extension = 0;
- verify_sequence_scalable_extension = 0;
- verify_picture_display_extension = 0;
- verify_picture_coding_extension = 0;
- verify_picture_spatial_scalable_extension = 0;
- verify_picture_temporal_scalable_extension = 0;
- verify_copyright_extension = 0;
-}
-
-#endif /* VERIFY */
-
Index: rel_1_2/fsf/mpeg2/global.h
===================================================================
--- rel_1_2/fsf/mpeg2/global.h (revision 1198)
+++ rel_1_2/fsf/mpeg2/global.h (nonexistent)
@@ -1,497 +0,0 @@
-/* global.h, global variables */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include "ll/sys/types.h"
-#include "kernel/kern.h"
-#include "mpeg2dec.h"
-
-/* choose between declaration (GLOBAL undefined)
- * and definition (GLOBAL defined)
- * GLOBAL is defined in exactly one file mpeg2dec.c)
- */
-
-#ifndef GLOBAL
-#define EXTERN extern
-#else
-#define EXTERN
-#endif
-
-/* prototypes of global functions */
-/* readpic.c */
-void Substitute_Frame_Buffer _ANSI_ARGS_ ((int bitstream_framenum,
- int sequence_framenum));
-
-/* Get_Bits.c */
-void Initialize_Buffer _ANSI_ARGS_((void));
-void Fill_Buffer _ANSI_ARGS_((void));
-unsigned int Show_Bits _ANSI_ARGS_((int n));
-unsigned int Get_Bits1 _ANSI_ARGS_((void));
-void Flush_Buffer _ANSI_ARGS_((int n));
-unsigned int Get_Bits _ANSI_ARGS_((int n));
-int Get_Byte _ANSI_ARGS_((void));
-int Get_Word _ANSI_ARGS_((void));
-
-/* systems.c */
-void Next_Packet _ANSI_ARGS_((void));
-int Get_Long _ANSI_ARGS_((void));
-void Flush_Buffer32 _ANSI_ARGS_((void));
-unsigned int Get_Bits32 _ANSI_ARGS_((void));
-
-
-/* getblk.c */
-void Decode_MPEG1_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[]));
-void Decode_MPEG1_Non_Intra_Block _ANSI_ARGS_((int comp));
-void Decode_MPEG2_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[]));
-void Decode_MPEG2_Non_Intra_Block _ANSI_ARGS_((int comp));
-
-/* gethdr.c */
-int Get_Hdr _ANSI_ARGS_((void));
-void next_start_code _ANSI_ARGS_((void));
-int slice_header _ANSI_ARGS_((void));
-void marker_bit _ANSI_ARGS_((char *text));
-
-/* getpic.c */
-void Decode_Picture _ANSI_ARGS_((int bitstream_framenum,
- int sequence_framenum));
-void Output_Last_Frame_of_Sequence _ANSI_ARGS_((int framenum));
-
-/* getvlc.c */
-int Get_macroblock_type _ANSI_ARGS_((void));
-int Get_motion_code _ANSI_ARGS_((void));
-int Get_dmvector _ANSI_ARGS_((void));
-int Get_coded_block_pattern _ANSI_ARGS_((void));
-int Get_macroblock_address_increment _ANSI_ARGS_((void));
-int Get_Luma_DC_dct_diff _ANSI_ARGS_((void));
-int Get_Chroma_DC_dct_diff _ANSI_ARGS_((void));
-
-/* idct.c */
-void Fast_IDCT _ANSI_ARGS_((short *block));
-void Initialize_Fast_IDCT _ANSI_ARGS_((void));
-
-/* Reference_IDCT.c */
-void Initialize_Reference_IDCT _ANSI_ARGS_((void));
-void Reference_IDCT _ANSI_ARGS_((short *block));
-
-/* motion.c */
-void motion_vectors _ANSI_ARGS_((int PMV[2][2][2], int dmvector[2],
- int motion_vertical_field_select[2][2], int s, int motion_vector_count,
- int mv_format, int h_r_size, int v_r_size, int dmv, int mvscale));
-void motion_vector _ANSI_ARGS_((int *PMV, int *dmvector,
- int h_r_size, int v_r_size, int dmv, int mvscale, int full_pel_vector));
-void Dual_Prime_Arithmetic _ANSI_ARGS_((int DMV[][2], int *dmvector, int mvx, int mvy));
-
-/* mpeg2dec.c */
-void Error _ANSI_ARGS_((char *text));
-void Warning _ANSI_ARGS_((char *text));
-void Print_Bits _ANSI_ARGS_((int code, int bits, int len));
-
-/* recon.c */
-void form_predictions _ANSI_ARGS_((int bx, int by, int macroblock_type,
- int motion_type, int PMV[2][2][2], int motion_vertical_field_select[2][2],
- int dmvector[2], int stwtype));
-
-/* spatscal.c */
-void Spatial_Prediction _ANSI_ARGS_((void));
-
-/* store.c */
-void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame));
-
-#ifdef DISPLAY
-/* display.c */
-void Initialize_Display_Process _ANSI_ARGS_((char *name));
-void Terminate_Display_Process _ANSI_ARGS_((void));
-void Display_Second_Field _ANSI_ARGS_((void));
-void dither _ANSI_ARGS_((unsigned char *src[]));
-void Initialize_Dither_Matrix _ANSI_ARGS_((void));
-#endif
-
-/* global variables */
-
-EXTERN char Version[]
-#ifdef GLOBAL
- ="mpeg2decode V1.2a, 96/07/19"
-#endif
-;
-
-EXTERN char Author[]
-#ifdef GLOBAL
- ="(C) 1996, MPEG Software Simulation Group"
-#endif
-;
-
-
-/* zig-zag and alternate scan patterns */
-EXTERN unsigned char scan[2][64]
-#ifdef GLOBAL
-=
-{
- { /* Zig-Zag scan pattern */
- 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
- 12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
- 35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
- 58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
- },
- { /* Alternate scan pattern */
- 0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
- 41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
- 51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
- 53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
- }
-}
-#endif
-;
-
-/* default intra quantization matrix */
-EXTERN unsigned char default_intra_quantizer_matrix[64]
-#ifdef GLOBAL
-=
-{
- 8, 16, 19, 22, 26, 27, 29, 34,
- 16, 16, 22, 24, 27, 29, 34, 37,
- 19, 22, 26, 27, 29, 34, 34, 38,
- 22, 22, 26, 27, 29, 34, 37, 40,
- 22, 26, 27, 29, 32, 35, 40, 48,
- 26, 27, 29, 32, 35, 40, 48, 58,
- 26, 27, 29, 34, 38, 46, 56, 69,
- 27, 29, 35, 38, 46, 56, 69, 83
-}
-#endif
-;
-
-/* non-linear quantization coefficient table */
-EXTERN unsigned char Non_Linear_quantizer_scale[32]
-#ifdef GLOBAL
-=
-{
- 0, 1, 2, 3, 4, 5, 6, 7,
- 8,10,12,14,16,18,20,22,
- 24,28,32,36,40,44,48,52,
- 56,64,72,80,88,96,104,112
-}
-#endif
-;
-
-/* color space conversion coefficients
- * for YCbCr -> RGB mapping
- *
- * entries are {crv,cbu,cgu,cgv}
- *
- * crv=(255/224)*65536*(1-cr)/0.5
- * cbu=(255/224)*65536*(1-cb)/0.5
- * cgu=(255/224)*65536*(cb/cg)*(1-cb)/0.5
- * cgv=(255/224)*65536*(cr/cg)*(1-cr)/0.5
- *
- * where Y=cr*R+cg*G+cb*B (cr+cg+cb=1)
- */
-
-/* ISO/IEC 13818-2 section 6.3.6 sequence_display_extension() */
-
-EXTERN int Inverse_Table_6_9[8][4]
-#ifdef GLOBAL
-=
-{
- {117504, 138453, 13954, 34903}, /* no sequence_display_extension */
- {117504, 138453, 13954, 34903}, /* ITU-R Rec. 709 (1990) */
- {104597, 132201, 25675, 53279}, /* unspecified */
- {104597, 132201, 25675, 53279}, /* reserved */
- {104448, 132798, 24759, 53109}, /* FCC */
- {104597, 132201, 25675, 53279}, /* ITU-R Rec. 624-4 System B, G */
- {104597, 132201, 25675, 53279}, /* SMPTE 170M */
- {117579, 136230, 16907, 35559} /* SMPTE 240M (1987) */
-}
-#endif
-;
-
-
-
-
-
-/* output types (Output_Type) */
-#define T_YUV 0
-#define T_SIF 1
-#define T_TGA 2
-#define T_PPM 3
-#define T_X11 4
-#define T_X11HIQ 5
-
-/* decoder operation control variables */
-EXTERN int Output_Type;
-EXTERN int hiQdither;
-
-/* decoder operation control flags */
-EXTERN int Quiet_Flag;
-EXTERN int Trace_Flag;
-EXTERN int Fault_Flag;
-EXTERN int Verbose_Flag;
-EXTERN int Two_Streams;
-EXTERN int Spatial_Flag;
-EXTERN int Reference_IDCT_Flag;
-EXTERN int Frame_Store_Flag;
-EXTERN int System_Stream_Flag;
-EXTERN int Display_Progressive_Flag;
-EXTERN int Ersatz_Flag;
-EXTERN int Big_Picture_Flag;
-EXTERN int Verify_Flag;
-EXTERN int Stats_Flag;
-EXTERN int User_Data_Flag;
-EXTERN int Main_Bitstream_Flag;
-
-
-/* filenames */
-EXTERN char *Output_Picture_Filename;
-EXTERN char *Substitute_Picture_Filename;
-EXTERN char *Main_Bitstream_Filename;
-EXTERN char *Enhancement_Layer_Bitstream_Filename;
-
-
-/* buffers for multiuse purposes */
-EXTERN char Error_Text[256];
-EXTERN unsigned char *Clip;
-
-/* pointers to generic picture buffers */
-EXTERN unsigned char *backward_reference_frame[3];
-EXTERN unsigned char *forward_reference_frame[3];
-
-EXTERN unsigned char *auxframe[3];
-EXTERN unsigned char *current_frame[3];
-EXTERN unsigned char *substitute_frame[3];
-
-
-/* pointers to scalability picture buffers */
-EXTERN unsigned char *llframe0[3];
-EXTERN unsigned char *llframe1[3];
-
-EXTERN short *lltmp;
-EXTERN char *Lower_Layer_Picture_Filename;
-
-
-
-
-/* non-normative variables derived from normative elements */
-EXTERN int Coded_Picture_Width;
-EXTERN int Coded_Picture_Height;
-EXTERN int Chroma_Width;
-EXTERN int Chroma_Height;
-EXTERN int block_count;
-EXTERN int Second_Field;
-EXTERN int profile, level;
-
-/* normative derived variables (as per ISO/IEC 13818-2) */
-EXTERN int horizontal_size;
-EXTERN int vertical_size;
-EXTERN int mb_width;
-EXTERN int mb_height;
-EXTERN double bit_rate;
-EXTERN double frame_rate;
-
-
-
-/* headers */
-
-/* ISO/IEC 13818-2 section 6.2.2.1: sequence_header() */
-EXTERN int aspect_ratio_information;
-EXTERN int frame_rate_code;
-EXTERN int bit_rate_value;
-EXTERN int vbv_buffer_size;
-EXTERN int constrained_parameters_flag;
-
-/* ISO/IEC 13818-2 section 6.2.2.3: sequence_extension() */
-EXTERN int profile_and_level_indication;
-EXTERN int progressive_sequence;
-EXTERN int chroma_format;
-EXTERN int low_delay;
-EXTERN int frame_rate_extension_n;
-EXTERN int frame_rate_extension_d;
-
-/* ISO/IEC 13818-2 section 6.2.2.4: sequence_display_extension() */
-EXTERN int video_format;
-EXTERN int color_description;
-EXTERN int color_primaries;
-EXTERN int transfer_characteristics;
-EXTERN int matrix_coefficients;
-EXTERN int display_horizontal_size;
-EXTERN int display_vertical_size;
-
-/* ISO/IEC 13818-2 section 6.2.3: picture_header() */
-EXTERN int temporal_reference;
-EXTERN int picture_coding_type;
-EXTERN int vbv_delay;
-EXTERN int full_pel_forward_vector;
-EXTERN int forward_f_code;
-EXTERN int full_pel_backward_vector;
-EXTERN int backward_f_code;
-
-
-/* ISO/IEC 13818-2 section 6.2.3.1: picture_coding_extension() header */
-EXTERN int f_code[2][2];
-EXTERN int intra_dc_precision;
-EXTERN int picture_structure;
-EXTERN int top_field_first;
-EXTERN int frame_pred_frame_dct;
-EXTERN int concealment_motion_vectors;
-
-EXTERN int intra_vlc_format;
-
-EXTERN int repeat_first_field;
-
-EXTERN int chroma_420_type;
-EXTERN int progressive_frame;
-EXTERN int composite_display_flag;
-EXTERN int v_axis;
-EXTERN int field_sequence;
-EXTERN int sub_carrier;
-EXTERN int burst_amplitude;
-EXTERN int sub_carrier_phase;
-
-
-
-/* ISO/IEC 13818-2 section 6.2.3.3: picture_display_extension() header */
-EXTERN int frame_center_horizontal_offset[3];
-EXTERN int frame_center_vertical_offset[3];
-
-
-
-/* ISO/IEC 13818-2 section 6.2.2.5: sequence_scalable_extension() header */
-EXTERN int layer_id;
-EXTERN int lower_layer_prediction_horizontal_size;
-EXTERN int lower_layer_prediction_vertical_size;
-EXTERN int horizontal_subsampling_factor_m;
-EXTERN int horizontal_subsampling_factor_n;
-EXTERN int vertical_subsampling_factor_m;
-EXTERN int vertical_subsampling_factor_n;
-
-
-/* ISO/IEC 13818-2 section 6.2.3.5: picture_spatial_scalable_extension() header */
-EXTERN int lower_layer_temporal_reference;
-EXTERN int lower_layer_horizontal_offset;
-EXTERN int lower_layer_vertical_offset;
-EXTERN int spatial_temporal_weight_code_table_index;
-EXTERN int lower_layer_progressive_frame;
-EXTERN int lower_layer_deinterlaced_field_select;
-
-
-
-
-
-
-/* ISO/IEC 13818-2 section 6.2.3.6: copyright_extension() header */
-EXTERN int copyright_flag;
-EXTERN int copyright_identifier;
-EXTERN int original_or_copy;
-EXTERN int copyright_number_1;
-EXTERN int copyright_number_2;
-EXTERN int copyright_number_3;
-
-/* ISO/IEC 13818-2 section 6.2.2.6: group_of_pictures_header() */
-EXTERN int drop_flag;
-EXTERN int hour;
-EXTERN int minute;
-EXTERN int sec;
-EXTERN int frame;
-EXTERN int closed_gop;
-EXTERN int broken_link;
-
-
-
-/* layer specific variables (needed for SNR and DP scalability) */
-EXTERN struct layer_data {
- /* bit input */
- int Infile;
-
- void *start_file_ptr;
- void *actual_file_ptr;
- void *end_file_ptr;
-
- int px;
- int py;
-
- unsigned char Rdbfr[2048];
- unsigned char *Rdptr;
- unsigned char Inbfr[16];
- /* from mpeg2play */
- unsigned int Bfr;
- unsigned char *Rdmax;
- int Incnt;
- int Bitcnt;
- /* sequence header and quant_matrix_extension() */
- int intra_quantizer_matrix[64];
- int non_intra_quantizer_matrix[64];
- int chroma_intra_quantizer_matrix[64];
- int chroma_non_intra_quantizer_matrix[64];
-
- int load_intra_quantizer_matrix;
- int load_non_intra_quantizer_matrix;
- int load_chroma_intra_quantizer_matrix;
- int load_chroma_non_intra_quantizer_matrix;
-
- int MPEG2_Flag;
- /* sequence scalable extension */
- int scalable_mode;
- /* picture coding extension */
- int q_scale_type;
- int alternate_scan;
- /* picture spatial scalable extension */
- int pict_scal;
- /* slice/macroblock */
- int priority_breakpoint;
- int quantizer_scale;
- int intra_slice;
- short block[12][64];
-} base, enhan, *ld;
-
-#ifdef VERIFY
-EXTERN int verify_sequence_header;
-EXTERN int verify_group_of_pictures_header;
-EXTERN int verify_picture_header;
-EXTERN int verify_slice_header;
-EXTERN int verify_sequence_extension;
-EXTERN int verify_sequence_display_extension;
-EXTERN int verify_quant_matrix_extension;
-EXTERN int verify_sequence_scalable_extension;
-EXTERN int verify_picture_display_extension;
-EXTERN int verify_picture_coding_extension;
-EXTERN int verify_picture_spatial_scalable_extension;
-EXTERN int verify_picture_temporal_scalable_extension;
-EXTERN int verify_copyright_extension;
-#endif /* VERIFY */
-
-
-EXTERN int Decode_Layer;
-
-/* verify.c */
-#ifdef VERIFY
-void Check_Headers _ANSI_ARGS_((int Bitstream_Framenum, int Sequence_Framenum));
-void Clear_Verify_Headers _ANSI_ARGS_((void));
-#endif /* VERIFY */
-
-
-EXTERN int global_MBA;
-EXTERN int global_pic;
-EXTERN int True_Framenum;
-
Index: rel_1_2/fsf/mpeg2/motion.c
===================================================================
--- rel_1_2/fsf/mpeg2/motion.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/motion.c (nonexistent)
@@ -1,234 +0,0 @@
-/* motion.c, motion vector decoding */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include "config.h"
-#include "global.h"
-
-/* private prototypes */
-static void decode_motion_vector _ANSI_ARGS_((int *pred, int r_size, int motion_code,
- int motion_residualesidual, int full_pel_vector));
-
-/* ISO/IEC 13818-2 sections 6.2.5.2, 6.3.17.2, and 7.6.3: Motion vectors */
-void motion_vectors(PMV,dmvector,
- motion_vertical_field_select,s,motion_vector_count,mv_format,h_r_size,v_r_size,dmv,mvscale)
-int PMV[2][2][2];
-int dmvector[2];
-int motion_vertical_field_select[2][2];
-int s, motion_vector_count, mv_format, h_r_size, v_r_size, dmv, mvscale;
-{
- if (motion_vector_count==1)
- {
- if (mv_format==MV_FIELD && !dmv)
- {
- motion_vertical_field_select[1][s] = motion_vertical_field_select[0][s] = Get_Bits(1);
-#ifdef TRACE
- if (Trace_Flag)
- {
- cprintf("motion_vertical_field_select[][%d] (%d): %d\n",s,
- motion_vertical_field_select[0][s],motion_vertical_field_select[0][s]);
- }
-#endif /* TRACE */
- }
-
- motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
-
- /* update other motion vector predictors */
- PMV[1][s][0] = PMV[0][s][0];
- PMV[1][s][1] = PMV[0][s][1];
- }
- else
- {
- motion_vertical_field_select[0][s] = Get_Bits(1);
-#ifdef TRACE
- if (Trace_Flag)
- {
- cprintf("motion_vertical_field_select[0][%d] (%d): %d\n",s,
- motion_vertical_field_select[0][s],motion_vertical_field_select[0][s]);
- }
-#endif /* TRACE */
- motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
-
- motion_vertical_field_select[1][s] = Get_Bits(1);
-#ifdef TRACE
- if (Trace_Flag)
- {
- cprintf("motion_vertical_field_select[1][%d] (%d): %d\n",s,
- motion_vertical_field_select[1][s],motion_vertical_field_select[1][s]);
- }
-#endif /* TRACE */
- motion_vector(PMV[1][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
- }
-}
-
-/* get and decode motion vector and differential motion vector
- for one prediction */
-void motion_vector(PMV,dmvector,
- h_r_size,v_r_size,dmv,mvscale,full_pel_vector)
-int *PMV;
-int *dmvector;
-int h_r_size;
-int v_r_size;
-int dmv; /* MPEG-2 only: get differential motion vectors */
-int mvscale; /* MPEG-2 only: field vector in frame pic */
-int full_pel_vector; /* MPEG-1 only */
-{
- int motion_code, motion_residual;
-
- /* horizontal component */
- /* ISO/IEC 13818-2 Table B-10 */
- motion_code = Get_motion_code();
-
- motion_residual = (h_r_size!=0 && motion_code!=0) ? Get_Bits(h_r_size) : 0;
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- if (h_r_size!=0 && motion_code!=0)
- {
- cprintf("motion_residual (");
- Print_Bits(motion_residual,h_r_size,h_r_size);
- cprintf("): %d\n",motion_residual);
- }
- }
-#endif /* TRACE */
-
-
- decode_motion_vector(&PMV[0],h_r_size,motion_code,motion_residual,full_pel_vector);
-
- if (dmv)
- dmvector[0] = Get_dmvector();
-
-
- /* vertical component */
- motion_code = Get_motion_code();
- motion_residual = (v_r_size!=0 && motion_code!=0) ? Get_Bits(v_r_size) : 0;
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- if (v_r_size!=0 && motion_code!=0)
- {
- cprintf("motion_residual (");
- Print_Bits(motion_residual,v_r_size,v_r_size);
- cprintf("): %d\n",motion_residual);
- }
- }
-#endif /* TRACE */
-
- if (mvscale)
- PMV[1] >>= 1; /* DIV 2 */
-
- decode_motion_vector(&PMV[1],v_r_size,motion_code,motion_residual,full_pel_vector);
-
- if (mvscale)
- PMV[1] <<= 1;
-
- if (dmv)
- dmvector[1] = Get_dmvector();
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("PMV = %d,%d\n",PMV[0],PMV[1]);
-#endif /* TRACE */
-}
-
-/* calculate motion vector component */
-/* ISO/IEC 13818-2 section 7.6.3.1: Decoding the motion vectors */
-/* Note: the arithmetic here is more elegant than that which is shown
- in 7.6.3.1. The end results (PMV[][][]) should, however, be the same. */
-
-static void decode_motion_vector(pred,r_size,motion_code,motion_residual,full_pel_vector)
-int *pred;
-int r_size, motion_code, motion_residual;
-int full_pel_vector; /* MPEG-1 (ISO/IEC 11172-1) support */
-{
- int lim, vec;
-
- lim = 16<<r_size;
- vec = full_pel_vector ? (*pred >> 1) : (*pred);
-
- if (motion_code>0)
- {
- vec+= ((motion_code-1)<<r_size) + motion_residual + 1;
- if (vec>=lim)
- vec-= lim + lim;
- }
- else if (motion_code<0)
- {
- vec-= ((-motion_code-1)<<r_size) + motion_residual + 1;
- if (vec<-lim)
- vec+= lim + lim;
- }
- *pred = full_pel_vector ? (vec<<1) : vec;
-}
-
-
-/* ISO/IEC 13818-2 section 7.6.3.6: Dual prime additional arithmetic */
-void Dual_Prime_Arithmetic(DMV,dmvector,mvx,mvy)
-int DMV[][2];
-int *dmvector; /* differential motion vector */
-int mvx, mvy; /* decoded mv components (always in field format) */
-{
- if (picture_structure==FRAME_PICTURE)
- {
- if (top_field_first)
- {
- /* vector for prediction of top field from bottom field */
- DMV[0][0] = ((mvx +(mvx>0))>>1) + dmvector[0];
- DMV[0][1] = ((mvy +(mvy>0))>>1) + dmvector[1] - 1;
-
- /* vector for prediction of bottom field from top field */
- DMV[1][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
- DMV[1][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] + 1;
- }
- else
- {
- /* vector for prediction of top field from bottom field */
- DMV[0][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
- DMV[0][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] - 1;
-
- /* vector for prediction of bottom field from top field */
- DMV[1][0] = ((mvx +(mvx>0))>>1) + dmvector[0];
- DMV[1][1] = ((mvy +(mvy>0))>>1) + dmvector[1] + 1;
- }
- }
- else
- {
- /* vector for prediction from field of opposite 'parity' */
- DMV[0][0] = ((mvx+(mvx>0))>>1) + dmvector[0];
- DMV[0][1] = ((mvy+(mvy>0))>>1) + dmvector[1];
-
- /* correct for vertical field shift */
- if (picture_structure==TOP_FIELD)
- DMV[0][1]--;
- else
- DMV[0][1]++;
- }
-}
-
Index: rel_1_2/fsf/mpeg2/recon.c
===================================================================
--- rel_1_2/fsf/mpeg2/recon.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/recon.c (nonexistent)
@@ -1,465 +0,0 @@
-/* Predict.c, motion compensation routines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include "config.h"
-#include "global.h"
-
-/* private prototypes */
-static void form_prediction _ANSI_ARGS_((unsigned char *src[], int sfield,
- unsigned char *dst[], int dfield,
- int lx, int lx2, int w, int h, int x, int y, int dx, int dy,
- int average_flag));
-
-static void form_component_prediction _ANSI_ARGS_((unsigned char *src, unsigned char *dst,
- int lx, int lx2, int w, int h, int x, int y, int dx, int dy, int average_flag));
-
-void form_predictions(bx,by,macroblock_type,motion_type,PMV,motion_vertical_field_select,dmvector,stwtype)
-int bx, by;
-int macroblock_type;
-int motion_type;
-int PMV[2][2][2], motion_vertical_field_select[2][2], dmvector[2];
-int stwtype;
-{
- int currentfield;
- unsigned char **predframe;
- int DMV[2][2];
- int stwtop, stwbot;
-
- stwtop = stwtype%3; /* 0:temporal, 1:(spat+temp)/2, 2:spatial */
- stwbot = stwtype/3;
-
- if ((macroblock_type & MACROBLOCK_MOTION_FORWARD)
- || (picture_coding_type==P_TYPE))
- {
- if (picture_structure==FRAME_PICTURE)
- {
- if ((motion_type==MC_FRAME)
- || !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
- {
- /* frame-based prediction (broken into top and bottom halves
- for spatial scalability prediction purposes) */
- if (stwtop<2)
- form_prediction(forward_reference_frame,0,current_frame,0,
- Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
- PMV[0][0][0],PMV[0][0][1],stwtop);
-
- if (stwbot<2)
- form_prediction(forward_reference_frame,1,current_frame,1,
- Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
- PMV[0][0][0],PMV[0][0][1],stwbot);
- }
- else if (motion_type==MC_FIELD) /* field-based prediction */
- {
- /* top field prediction */
- if (stwtop<2)
- form_prediction(forward_reference_frame,motion_vertical_field_select[0][0],
- current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by>>1,PMV[0][0][0],PMV[0][0][1]>>1,stwtop);
-
- /* bottom field prediction */
- if (stwbot<2)
- form_prediction(forward_reference_frame,motion_vertical_field_select[1][0],
- current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by>>1,PMV[1][0][0],PMV[1][0][1]>>1,stwbot);
- }
- else if (motion_type==MC_DMV) /* dual prime prediction */
- {
- /* calculate derived motion vectors */
- Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]>>1);
-
- if (stwtop<2)
- {
- /* predict top field from top field */
- form_prediction(forward_reference_frame,0,current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
- PMV[0][0][0],PMV[0][0][1]>>1,0);
-
- /* predict and add to top field from bottom field */
- form_prediction(forward_reference_frame,1,current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
- DMV[0][0],DMV[0][1],1);
- }
-
- if (stwbot<2)
- {
- /* predict bottom field from bottom field */
- form_prediction(forward_reference_frame,1,current_frame,1,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
- PMV[0][0][0],PMV[0][0][1]>>1,0);
-
- /* predict and add to bottom field from top field */
- form_prediction(forward_reference_frame,0,current_frame,1,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
- DMV[1][0],DMV[1][1],1);
- }
- }
- else
- /* invalid motion_type */
- cprintf("invalid motion_type\n");
- }
- else /* TOP_FIELD or BOTTOM_FIELD */
- {
- /* field picture */
- currentfield = (picture_structure==BOTTOM_FIELD);
-
- /* determine which frame to use for prediction */
- if ((picture_coding_type==P_TYPE) && Second_Field
- && (currentfield!=motion_vertical_field_select[0][0]))
- predframe = backward_reference_frame; /* same frame */
- else
- predframe = forward_reference_frame; /* previous frame */
-
- if ((motion_type==MC_FIELD)
- || !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
- {
- /* field-based prediction */
- if (stwtop<2)
- form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
- PMV[0][0][0],PMV[0][0][1],stwtop);
- }
- else if (motion_type==MC_16X8)
- {
- if (stwtop<2)
- {
- form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by,
- PMV[0][0][0],PMV[0][0][1],stwtop);
-
- /* determine which frame to use for lower half prediction */
- if ((picture_coding_type==P_TYPE) && Second_Field
- && (currentfield!=motion_vertical_field_select[1][0]))
- predframe = backward_reference_frame; /* same frame */
- else
- predframe = forward_reference_frame; /* previous frame */
-
- form_prediction(predframe,motion_vertical_field_select[1][0],current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by+8,
- PMV[1][0][0],PMV[1][0][1],stwtop);
- }
- }
- else if (motion_type==MC_DMV) /* dual prime prediction */
- {
- if (Second_Field)
- predframe = backward_reference_frame; /* same frame */
- else
- predframe = forward_reference_frame; /* previous frame */
-
- /* calculate derived motion vectors */
- Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]);
-
- /* predict from field of same parity */
- form_prediction(forward_reference_frame,currentfield,current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
- PMV[0][0][0],PMV[0][0][1],0);
-
- /* predict from field of opposite parity */
- form_prediction(predframe,!currentfield,current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
- DMV[0][0],DMV[0][1],1);
- }
- else
- /* invalid motion_type */
- cprintf("invalid motion_type\n");
- }
- stwtop = stwbot = 1;
- }
-
- if (macroblock_type & MACROBLOCK_MOTION_BACKWARD)
- {
- if (picture_structure==FRAME_PICTURE)
- {
- if (motion_type==MC_FRAME)
- {
- /* frame-based prediction */
- if (stwtop<2)
- form_prediction(backward_reference_frame,0,current_frame,0,
- Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
- PMV[0][1][0],PMV[0][1][1],stwtop);
-
- if (stwbot<2)
- form_prediction(backward_reference_frame,1,current_frame,1,
- Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
- PMV[0][1][0],PMV[0][1][1],stwbot);
- }
- else /* field-based prediction */
- {
- /* top field prediction */
- if (stwtop<2)
- form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
- current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by>>1,PMV[0][1][0],PMV[0][1][1]>>1,stwtop);
-
- /* bottom field prediction */
- if (stwbot<2)
- form_prediction(backward_reference_frame,motion_vertical_field_select[1][1],
- current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by>>1,PMV[1][1][0],PMV[1][1][1]>>1,stwbot);
- }
- }
- else /* TOP_FIELD or BOTTOM_FIELD */
- {
- /* field picture */
- if (motion_type==MC_FIELD)
- {
- /* field-based prediction */
- form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
- current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,
- bx,by,PMV[0][1][0],PMV[0][1][1],stwtop);
- }
- else if (motion_type==MC_16X8)
- {
- form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
- current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by,PMV[0][1][0],PMV[0][1][1],stwtop);
-
- form_prediction(backward_reference_frame,motion_vertical_field_select[1][1],
- current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by+8,PMV[1][1][0],PMV[1][1][1],stwtop);
- }
- else
- /* invalid motion_type */
- cprintf("invalid motion_type\n");
- }
- }
-}
-
-static void form_prediction(src,sfield,dst,dfield,lx,lx2,w,h,x,y,dx,dy,average_flag)
-unsigned char *src[]; /* prediction source buffer */
-int sfield; /* prediction source field number (0 or 1) */
-unsigned char *dst[]; /* prediction destination buffer */
-int dfield; /* prediction destination field number (0 or 1)*/
-int lx,lx2; /* line strides */
-int w,h; /* prediction block/sub-block width, height */
-int x,y; /* pixel co-ordinates of top-left sample in current MB */
-int dx,dy; /* horizontal, vertical prediction address */
-int average_flag; /* add prediction error to prediction ? */
-{
- /* Y */
- form_component_prediction(src[0]+(sfield?lx2>>1:0),dst[0]+(dfield?lx2>>1:0),
- lx,lx2,w,h,x,y,dx,dy,average_flag);
-
- if (chroma_format!=CHROMA444)
- {
- lx>>=1; lx2>>=1; w>>=1; x>>=1; dx/=2;
- }
-
- if (chroma_format==CHROMA420)
- {
- h>>=1; y>>=1; dy/=2;
- }
-
- /* Cb */
- form_component_prediction(src[1]+(sfield?lx2>>1:0),dst[1]+(dfield?lx2>>1:0),
- lx,lx2,w,h,x,y,dx,dy,average_flag);
-
- /* Cr */
- form_component_prediction(src[2]+(sfield?lx2>>1:0),dst[2]+(dfield?lx2>>1:0),
- lx,lx2,w,h,x,y,dx,dy,average_flag);
-}
-
-/* ISO/IEC 13818-2 section 7.6.4: Forming predictions */
-/* NOTE: the arithmetic below produces numerically equivalent results
- * to 7.6.4, yet is more elegant. It differs in the following ways:
- *
- * 1. the vectors (dx, dy) are based on cartesian frame
- * coordiantes along a half-pel grid (always positive numbers)
- * In contrast, vector[r][s][t] are differential (with positive and
- * negative values). As a result, deriving the integer vectors
- * (int_vec[t]) from dx, dy is accomplished by a simple right shift.
- *
- * 2. Half pel flags (xh, yh) are equivalent to the LSB (Least
- * Significant Bit) of the half-pel coordinates (dx,dy).
- *
- *
- * NOTE: the work of combining predictions (ISO/IEC 13818-2 section 7.6.7)
- * is distributed among several other stages. This is accomplished by
- * folding line offsets into the source and destination (src,dst)
- * addresses (note the call arguments to form_prediction() in Predict()),
- * line stride variables lx and lx2, the block dimension variables (w,h),
- * average_flag, and by the very order in which Predict() is called.
- * This implementation design (implicitly different than the spec)
- * was chosen for its elegance.
-*/
-
-static void form_component_prediction(src,dst,lx,lx2,w,h,x,y,dx,dy,average_flag)
-unsigned char *src;
-unsigned char *dst;
-int lx; /* raster line increment */
-int lx2;
-int w,h;
-int x,y;
-int dx,dy;
-int average_flag; /* flag that signals bi-directional or Dual-Prime
- averaging (7.6.7.1 and 7.6.7.4). if average_flag==1,
- a previously formed prediction has been stored in
- pel_pred[] */
-{
- int xint; /* horizontal integer sample vector: analogous to int_vec[0] */
- int yint; /* vertical integer sample vectors: analogous to int_vec[1] */
- int xh; /* horizontal half sample flag: analogous to half_flag[0] */
- int yh; /* vertical half sample flag: analogous to half_flag[1] */
- int i, j, v;
- unsigned char *s; /* source pointer: analogous to pel_ref[][] */
- unsigned char *d; /* destination pointer: analogous to pel_pred[][] */
-
- /* half pel scaling for integer vectors */
- xint = dx>>1;
- yint = dy>>1;
-
- /* derive half pel flags */
- xh = dx & 1;
- yh = dy & 1;
-
- /* compute the linear address of pel_ref[][] and pel_pred[][]
- based on cartesian/raster cordinates provided */
- s = src + lx*(y+yint) + x + xint;
- d = dst + lx*y + x;
-
- if (!xh && !yh) /* no horizontal nor vertical half-pel */
- {
- if (average_flag)
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- v = d[i]+s[i];
- d[i] = (v+(v>=0?1:0))>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- else
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- d[i] = s[i];
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- }
- else if (!xh && yh) /* no horizontal but vertical half-pel */
- {
- if (average_flag)
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- v = d[i] + ((unsigned int)(s[i]+s[i+lx]+1)>>1);
- d[i]=(v+(v>=0?1:0))>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- else
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- d[i] = (unsigned int)(s[i]+s[i+lx]+1)>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- }
- else if (xh && !yh) /* horizontal but no vertical half-pel */
- {
- if (average_flag)
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- v = d[i] + ((unsigned int)(s[i]+s[i+1]+1)>>1);
- d[i] = (v+(v>=0?1:0))>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- else
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- d[i] = (unsigned int)(s[i]+s[i+1]+1)>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- }
- else /* if (xh && yh) horizontal and vertical half-pel */
- {
- if (average_flag)
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- v = d[i] + ((unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2);
- d[i] = (v+(v>=0?1:0))>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- else
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- d[i] = (unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- }
-}
Index: rel_1_2/fsf/mpeg2/systems.c
===================================================================
--- rel_1_2/fsf/mpeg2/systems.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/systems.c (nonexistent)
@@ -1,195 +0,0 @@
-/* systems.c, systems-specific routines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdlib.h>
-
-#include "config.h"
-#include "global.h"
-
-/* initialize buffer, call once before first getbits or showbits */
-
-/* parse system layer, ignore everything we don't need */
-void Next_Packet()
-{
- unsigned int code;
- int l;
-
- for(;;)
- {
- code = Get_Long();
-
- /* remove system layer byte stuffing */
- while ((code & 0xffffff00) != 0x100)
- code = (code<<8) | Get_Byte();
-
- switch(code)
- {
- case PACK_START_CODE: /* pack header */
- /* skip pack header (system_clock_reference and mux_rate) */
- ld->Rdptr += 8;
- break;
- case VIDEO_ELEMENTARY_STREAM:
- code = Get_Word(); /* packet_length */
- ld->Rdmax = ld->Rdptr + code;
-
- code = Get_Byte();
-
- if((code>>6)==0x02)
- {
- ld->Rdptr++;
- code=Get_Byte(); /* parse PES_header_data_length */
- ld->Rdptr+=code; /* advance pointer by PES_header_data_length */
- cprintf("MPEG-2 PES packet\n");
- return;
- }
- else if(code==0xff)
- {
- /* parse MPEG-1 packet header */
- while((code=Get_Byte())== 0xFF);
- }
-
- /* stuffing bytes */
- if(code>=0x40)
- {
- if(code>=0x80)
- {
- cprintf("Error in packet header\n");
- }
- /* skip STD_buffer_scale */
- ld->Rdptr++;
- code = Get_Byte();
- }
-
- if(code>=0x30)
- {
- if(code>=0x40)
- {
- cprintf("Error in packet header\n");
- }
- /* skip presentation and decoding time stamps */
- ld->Rdptr += 9;
- }
- else if(code>=0x20)
- {
- /* skip presentation time stamps */
- ld->Rdptr += 4;
- }
- else if(code!=0x0f)
- {
- cprintf("Error in packet header\n");
- }
- return;
- case ISO_END_CODE: /* end */
- /* simulate a buffer full of sequence end codes */
- l = 0;
- while (l<2048)
- {
- ld->Rdbfr[l++] = SEQUENCE_END_CODE>>24;
- ld->Rdbfr[l++] = SEQUENCE_END_CODE>>16;
- ld->Rdbfr[l++] = SEQUENCE_END_CODE>>8;
- ld->Rdbfr[l++] = SEQUENCE_END_CODE&0xff;
- }
- ld->Rdptr = ld->Rdbfr;
- ld->Rdmax = ld->Rdbfr + 2048;
- return;
- default:
- if(code>=SYSTEM_START_CODE)
- {
- /* skip system headers and non-video packets*/
- code = Get_Word();
- ld->Rdptr += code;
- }
- else
- {
- cprintf("Unexpected startcode %08x in system layer\n",code);
- }
- break;
- }
- }
-}
-
-
-
-void Flush_Buffer32()
-{
- int Incnt;
-
- ld->Bfr = 0;
-
- Incnt = ld->Incnt;
- Incnt -= 32;
-
- if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4))
- {
- while (Incnt <= 24)
- {
- if (ld->Rdptr >= ld->Rdmax)
- Next_Packet();
- ld->Bfr |= Get_Byte() << (24 - Incnt);
- Incnt += 8;
- }
- }
- else
- {
- while (Incnt <= 24)
- {
- if (ld->Rdptr >= ld->Rdbfr+2048)
- Fill_Buffer();
- ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
- Incnt += 8;
- }
- }
- ld->Incnt = Incnt;
-
-#ifdef VERIFY
- ld->Bitcnt += 32;
-#endif /* VERIFY */
-}
-
-
-unsigned int Get_Bits32()
-{
- unsigned int l;
-
- l = Show_Bits(32);
- Flush_Buffer32();
-
- return l;
-}
-
-
-int Get_Long()
-{
- int i;
-
- i = Get_Word();
- return (i<<16) | Get_Word();
-}
-
-
Index: rel_1_2/fsf/mpeg2/subspic.c
===================================================================
--- rel_1_2/fsf/mpeg2/subspic.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/subspic.c (nonexistent)
@@ -1,384 +0,0 @@
-/* #define DEBUG */
-/* subspic.c, Frame buffer substitution routines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdlib.h>
-
-#include "config.h"
-#include "global.h"
-
-/* private prototypes*/
-static void Read_Frame _ANSI_ARGS_((char *filename,
- unsigned char *frame_buffer[], int framenum));
-static void Copy_Frame _ANSI_ARGS_((unsigned char *src, unsigned char *dst,
- int width, int height, int parity, int incr));
-static int Read_Components _ANSI_ARGS_ ((char *filename,
- unsigned char *frame[3], int framenum));
-static int Read_Component _ANSI_ARGS_ ((char *fname, unsigned char *frame,
- int width, int height));
-static int Extract_Components _ANSI_ARGS_ ((char *filename,
- unsigned char *frame[3], int framenum));
-
-extern int read(int Infile, void *Rdbfr, int rdsize);
-
-/* substitute frame buffer routine */
-void Substitute_Frame_Buffer (bitstream_framenum, sequence_framenum)
-int bitstream_framenum;
-int sequence_framenum;
-{
- /* static tracking variables */
- static int previous_temporal_reference;
- static int previous_bitstream_framenum;
- static int previous_anchor_temporal_reference;
- static int previous_anchor_bitstream_framenum;
- static int previous_picture_coding_type;
- static int bgate;
-
- /* local temporary variables */
- int substitute_display_framenum;
-
-
-#ifdef DEBUG
- cprintf("SUB: seq fn(%d) bitfn(%d) tempref(%d) picstr(%d) type(%d)\n",
- sequence_framenum, bitstream_framenum, temporal_reference,
- picture_structure, picture_coding_type);
-#endif
-
- /* we don't substitute at the first picture of a sequence */
- if((sequence_framenum!=0)||(Second_Field))
- {
- /* only at the start of the frame */
- if ((picture_structure==FRAME_PICTURE)||(!Second_Field))
- {
- if(picture_coding_type==P_TYPE)
- {
- /* the most recently decoded reference frame needs substituting */
- substitute_display_framenum = bitstream_framenum - 1;
-
- Read_Frame(Substitute_Picture_Filename, forward_reference_frame,
- substitute_display_framenum);
- }
- /* only the first B frame in a consequitve set of B pictures
- loads a substitute backward_reference_frame since all subsequent
- B frames predict from the same reference pictures */
- else if((picture_coding_type==B_TYPE)&&(bgate!=1))
- {
- substitute_display_framenum =
- (previous_temporal_reference - temporal_reference)
- + bitstream_framenum - 1;
-
- Read_Frame(Substitute_Picture_Filename, backward_reference_frame,
- substitute_display_framenum);
- }
- } /* P fields can predict from the two most recently decoded fields, even
- from the first field of the same frame being decoded */
- else if(Second_Field && (picture_coding_type==P_TYPE))
- {
- /* our favourite case: the IP field picture pair */
- if((previous_picture_coding_type==I_TYPE)&&(picture_coding_type==P_TYPE))
- {
- substitute_display_framenum = bitstream_framenum;
- }
- else /* our more generic P field picture pair */
- {
- substitute_display_framenum =
- (temporal_reference - previous_anchor_temporal_reference)
- + bitstream_framenum - 1;
- }
-
- Read_Frame(Substitute_Picture_Filename, current_frame, substitute_display_framenum);
- }
-#ifdef DEBUG
- else if((picture_coding_type!=B_TYPE)||(picture_coding_type!=D_TYPE))
- {
- cprintf("NO SUBS FOR THIS PICTURE\n");
- }
-#endif
- }
-
-
- /* set b gate so we don't redundantly load next time around */
- if(picture_coding_type==B_TYPE)
- bgate = 1;
- else
- bgate = 0;
-
- /* update general tracking variables */
- if((picture_structure==FRAME_PICTURE)||(!Second_Field))
- {
- previous_temporal_reference = temporal_reference;
- previous_bitstream_framenum = bitstream_framenum;
- }
-
- /* update reference frame tracking variables */
- if((picture_coding_type!=B_TYPE) &&
- ((picture_structure==FRAME_PICTURE)||Second_Field))
- {
- previous_anchor_temporal_reference = temporal_reference;
- previous_anchor_bitstream_framenum = bitstream_framenum;
- }
-
- previous_picture_coding_type = picture_coding_type;
-
-}
-
-
-/* Note: fields are only read to serve as the same-frame reference for
- a second field */
-static void Read_Frame(fname,frame,framenum)
-char *fname;
-unsigned char *frame[];
-int framenum;
-{
- int parity;
- int rerr = 0;
- int field_mode;
-
- if(framenum<0)
- cprintf("ERROR: framenum (%d) is less than zero\n", framenum);
-
-
- if(Big_Picture_Flag)
- rerr = Extract_Components(fname, substitute_frame, framenum);
- else
- rerr = Read_Components(fname, substitute_frame, framenum);
-
- if(rerr!=0)
- {
- cprintf("was unable to substitute frame\n");
- }
-
- /* now copy to the appropriate buffer */
- /* first field (which we are attempting to substitute) must be
- of opposite field parity to the current one */
- if((Second_Field)&&(picture_coding_type==P_TYPE))
- {
- parity = (picture_structure==TOP_FIELD ? 1:0);
- field_mode = (picture_structure==FRAME_PICTURE ? 0:1);
- }
- else
- {
- /* Like frame structued pictures, B pictures only substitute an entire frame
- since both fields always predict from the same frame (with respect
- to forward/backwards directions) */
- parity = 0;
- field_mode = 0;
- }
-
-
- Copy_Frame(substitute_frame[0], frame[0], Coded_Picture_Width,
- Coded_Picture_Height, parity, field_mode);
-
- Copy_Frame(substitute_frame[1], frame[1], Chroma_Width, Chroma_Height,
- parity, field_mode);
-
- Copy_Frame(substitute_frame[2], frame[2], Chroma_Width, Chroma_Height,
- parity, field_mode);
-
-#ifdef VERBOSE
- if(Verbose_Flag > NO_LAYER)
- cprintf("substituted %s %d\n",
- (field_mode ? (parity?"bottom field":"bottom field"):"frame"), framenum);
-#endif
-}
-
-
-
-
-static int Read_Components(filename, frame, framenum)
-char *filename;
-unsigned char *frame[3];
-int framenum;
-{
- int err = 0;
- char outname[FILENAME_LENGTH];
- char name[FILENAME_LENGTH];
-
- sprintf(outname,filename,framenum);
-
-
- sprintf(name,"%s.Y",outname);
- err += Read_Component(name, frame[0], Coded_Picture_Width,
- Coded_Picture_Height);
-
- sprintf(name,"%s.U",outname);
- err += Read_Component(name, frame[1], Chroma_Width, Chroma_Height);
-
- sprintf(name,"%s.V",outname);
- err += Read_Component(name, frame[2], Chroma_Width, Chroma_Height);
-
- return(err);
-}
-
-
-static int Read_Component(Filename, Frame, Width, Height)
-char *Filename;
-unsigned char *Frame;
-int Width;
-int Height;
-{
- int Size;
- int Bytes_Read;
- int Infile;
-
- Size = Width*Height;
-
-#ifdef DEBUG
- cprintf("SUBS: reading %s\n", filename);
-#endif
-
- if(!(Infile=1)<0)
- {
- cprintf("ERROR: unable to open reference filename (%s)\n", Filename);
- return(-1);
- }
-
- Bytes_Read = read(Infile, Frame, Size);
-
- if(Bytes_Read!=Size)
- {
- cprintf("was able to read only %d bytes of %d of file %s\n",
- Bytes_Read, Size, Filename);
- }
-
- return(0);
-}
-
-
-/* optimization: do not open the big file each time. Open once at start
- of decoder, and close at the very last frame */
-
-/* Note: "big" files were used in E-mail exchanges almost exclusively by the
- MPEG Committee's syntax validation and conformance ad-hoc groups from
- the year 1993 until 1995 */
-static int Extract_Components(filename, frame, framenum)
-char *filename;
-unsigned char *frame[3];
-int framenum;
-{
-/* int err = 0; */
- int line;
- int size, offset;
-
- cprintf("Extract_Components\n");
-
- /* compute size of each frame (in bytes) */
- size = (Coded_Picture_Width*Coded_Picture_Height);
-
- if(chroma_format==CHROMA444)
- size = (size * 3);
- else if(chroma_format==CHROMA422)
- size = (size * 2);
- else if(chroma_format==CHROMA420)
- size = ((size*3)>>1);
- else
- cprintf("ERROR: chroma_format (%d) not recognized\n", chroma_format);
-
-
- /* compute distance into "big" file */
- offset = size*framenum;
-
-#ifdef DEBUG
- printf("EXTRACTING: frame(%d) offset(%d), size (%d) from %s\n",
- framenum, offset, size, filename);
-#endif
-
- /* seek to location in big file where desired frame begins */
- /* note: this offset cannot exceed a few billion bytes due to the */
- /* obvious limitations of 32-bit integers */
- //fseek(fd, offset, 0);
-
- /* Y */
- for (line=0; line<Coded_Picture_Height; line++)
- {
- //fread(frame[0]+(line*Coded_Picture_Width),1,Coded_Picture_Width,fd);
- }
-
- /* Cb */
- for (line=0; line<Chroma_Height; line++)
- {
- //fread(frame[1]+(line*Chroma_Width),1,Chroma_Width,fd);
- }
-
- /* Cr */
- for (line=0; line<Chroma_Height; line++)
- {
- //fread(frame[2]+(line*Chroma_Width),1,Chroma_Width,fd);
- }
-
-
- //fclose(fd);
- return(0);
-}
-
-
-static void Copy_Frame(src, dst, width, height, parity, field_mode)
-unsigned char *src;
-unsigned char *dst;
-int width;
-int height;
-int parity; /* field parity (top or bottom) to overwrite */
-int field_mode; /* 0 = frame, 1 = field */
-{
- int row, col;
- int s, d;
- int incr;
-
- s = d = 0;
-
-#ifdef DEBUG
- cprintf("COPYING (w=%d, h=%d, parity=%d, field_mode=%d)\n",
- width,height,parity,field_mode);
-#endif /* DEBUG */
-
- if(field_mode)
- {
- incr = 2;
-
- if(parity==0)
- s += width;
- }
- else
- {
- incr = 1;
- }
-
- for(row=0; row<height; row+=incr)
- {
- for(col=0; col<width; col++)
- {
- dst[d+col] = src[s+col];
- }
-
- d += (width*incr);
- s += (width*incr);
- }
-
-}
-
Index: rel_1_2/fsf/mpeg2/getblk.c
===================================================================
--- rel_1_2/fsf/mpeg2/getblk.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/getblk.c (nonexistent)
@@ -1,571 +0,0 @@
-/* getblk.c, DCT block decoding */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include "config.h"
-#include "global.h"
-
-
-/* defined in getvlc.h */
-typedef struct {
- char run, level, len;
-} DCTtab;
-
-extern DCTtab DCTtabfirst[],DCTtabnext[],DCTtab0[],DCTtab1[];
-extern DCTtab DCTtab2[],DCTtab3[],DCTtab4[],DCTtab5[],DCTtab6[];
-extern DCTtab DCTtab0a[],DCTtab1a[];
-
-
-/* decode one intra coded MPEG-1 block */
-
-void Decode_MPEG1_Intra_Block(comp,dc_dct_pred)
-int comp;
-int dc_dct_pred[];
-{
- int val, i, j, sign;
- unsigned int code;
- DCTtab *tab;
- short *bp;
-
- bp = ld->block[comp];
-
- /* ISO/IEC 11172-2 section 2.4.3.7: Block layer. */
- /* decode DC coefficients */
- if (comp<4)
- bp[0] = (dc_dct_pred[0]+=Get_Luma_DC_dct_diff()) << 3;
- else if (comp==4)
- bp[0] = (dc_dct_pred[1]+=Get_Chroma_DC_dct_diff()) << 3;
- else
- bp[0] = (dc_dct_pred[2]+=Get_Chroma_DC_dct_diff()) << 3;
-
- if (Fault_Flag) return;
-
- /* D-pictures do not contain AC coefficients */
- if(picture_coding_type == D_TYPE)
- return;
-
- /* decode AC coefficients */
- for (i=1; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384)
- tab = &DCTtabnext[(code>>12)-4];
- else if (code>=1024)
- tab = &DCTtab0[(code>>8)-4];
- else if (code>=512)
- tab = &DCTtab1[(code>>6)-8];
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- cprintf("invalid Huffman code in Decode_MPEG1_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
-
- Flush_Buffer(tab->len);
-
- if (tab->run==64) /* end_of_block */
- return;
-
- if (tab->run==65) /* escape */
- {
- i+= Get_Bits(6);
-
- val = Get_Bits(8);
- if (val==0)
- val = Get_Bits(8);
- else if (val==128)
- val = Get_Bits(8) - 256;
- else if (val>128)
- val -= 256;
-
- if((sign = (val<0)))
- val = -val;
- }
- else
- {
- i+= tab->run;
- val = tab->level;
- sign = Get_Bits(1);
- }
-
- if (i>=64)
- {
- if (!Quiet_Flag)
- cprintf("DCT coeff index (i) out of bounds (intra)\n");
- Fault_Flag = 1;
- return;
- }
-
- j = scan[ZIG_ZAG][i];
- val = (val*ld->quantizer_scale*ld->intra_quantizer_matrix[j]) >> 3;
-
- /* mismatch control ('oddification') */
- if (val!=0) /* should always be true, but it's not guaranteed */
- val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
-
- /* saturation */
- if (!sign)
- bp[j] = (val>2047) ? 2047 : val; /* positive */
- else
- bp[j] = (val>2048) ? -2048 : -val; /* negative */
- }
-}
-
-
-/* decode one non-intra coded MPEG-1 block */
-
-void Decode_MPEG1_Non_Intra_Block(comp)
-int comp;
-{
- int val, i, j, sign;
- unsigned int code;
- DCTtab *tab;
- short *bp;
-
- bp = ld->block[comp];
-
- /* decode AC coefficients */
- for (i=0; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384)
- {
- if (i==0)
- tab = &DCTtabfirst[(code>>12)-4];
- else
- tab = &DCTtabnext[(code>>12)-4];
- }
- else if (code>=1024)
- tab = &DCTtab0[(code>>8)-4];
- else if (code>=512)
- tab = &DCTtab1[(code>>6)-8];
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- cprintf("invalid Huffman code in Decode_MPEG1_Non_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
-
- Flush_Buffer(tab->len);
-
- if (tab->run==64) /* end_of_block */
- return;
-
- if (tab->run==65) /* escape */
- {
- i+= Get_Bits(6);
-
- val = Get_Bits(8);
- if (val==0)
- val = Get_Bits(8);
- else if (val==128)
- val = Get_Bits(8) - 256;
- else if (val>128)
- val -= 256;
-
- if((sign = (val<0)))
- val = -val;
- }
- else
- {
- i+= tab->run;
- val = tab->level;
- sign = Get_Bits(1);
- }
-
- if (i>=64)
- {
- if (!Quiet_Flag)
- cprintf("DCT coeff index (i) out of bounds (inter)\n");
- Fault_Flag = 1;
- return;
- }
-
- j = scan[ZIG_ZAG][i];
- val = (((val<<1)+1)*ld->quantizer_scale*ld->non_intra_quantizer_matrix[j]) >> 4;
-
- /* mismatch control ('oddification') */
- if (val!=0) /* should always be true, but it's not guaranteed */
- val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
-
- /* saturation */
- if (!sign)
- bp[j] = (val>2047) ? 2047 : val; /* positive */
- else
- bp[j] = (val>2048) ? -2048 : -val; /* negative */
- }
-}
-
-
-/* decode one intra coded MPEG-2 block */
-
-void Decode_MPEG2_Intra_Block(comp,dc_dct_pred)
-int comp;
-int dc_dct_pred[];
-{
- int val, i, j, sign, nc, cc, run;
- unsigned int code;
- DCTtab *tab;
- short *bp;
- int *qmat;
- struct layer_data *ld1;
-
- /* with data partitioning, data always goes to base layer */
- ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
- bp = ld1->block[comp];
-
- if (base.scalable_mode==SC_DP) {
- if (base.priority_breakpoint<64)
- ld = &enhan;
- else
- ld = &base;
- }
-
- cc = (comp<4) ? 0 : (comp&1)+1;
-
- qmat = (comp<4 || chroma_format==CHROMA420)
- ? ld1->intra_quantizer_matrix
- : ld1->chroma_intra_quantizer_matrix;
-
- /* ISO/IEC 13818-2 section 7.2.1: decode DC coefficients */
- if (cc==0)
- val = (dc_dct_pred[0]+= Get_Luma_DC_dct_diff());
- else if (cc==1)
- val = (dc_dct_pred[1]+= Get_Chroma_DC_dct_diff());
- else
- val = (dc_dct_pred[2]+= Get_Chroma_DC_dct_diff());
-
- if (Fault_Flag) return;
-
- bp[0] = val << (3-intra_dc_precision);
-
- nc=0;
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("DCT(%d)i:",comp);
-#endif /* TRACE */
-
- /* decode AC coefficients */
- for (i=1; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384 && !intra_vlc_format)
- tab = &DCTtabnext[(code>>12)-4];
- else if (code>=1024)
- {
- if (intra_vlc_format)
- tab = &DCTtab0a[(code>>8)-4];
- else
- tab = &DCTtab0[(code>>8)-4];
- }
- else if (code>=512)
- {
- if (intra_vlc_format)
- tab = &DCTtab1a[(code>>6)-8];
- else
- tab = &DCTtab1[(code>>6)-8];
- }
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- cprintf("invalid Huffman code in Decode_MPEG2_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
-
- Flush_Buffer(tab->len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf(" (");
- Print_Bits(code,16,tab->len);
- }
-#endif /* TRACE */
-
- if (tab->run==64) /* end_of_block */
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf("): EOB\n");
-#endif /* TRACE */
- return;
- }
-
- if (tab->run==65) /* escape */
- {
-#ifdef TRACE
- if (Trace_Flag)
- {
- putchar(' ');
- Print_Bits(Show_Bits(6),6,6);
- }
-#endif /* TRACE */
-
- i+= run = Get_Bits(6);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- putchar(' ');
- Print_Bits(Show_Bits(12),12,12);
- }
-#endif /* TRACE */
-
- val = Get_Bits(12);
- if ((val&2047)==0)
- {
- if (!Quiet_Flag)
- cprintf("invalid escape in Decode_MPEG2_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
- if((sign = (val>=2048)))
- val = 4096 - val;
- }
- else
- {
- i+= run = tab->run;
- val = tab->level;
- sign = Get_Bits(1);
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("%d",sign);
-#endif /* TRACE */
- }
-
- if (i>=64)
- {
- if (!Quiet_Flag)
- cprintf("DCT coeff index (i) out of bounds (intra2)\n");
- Fault_Flag = 1;
- return;
- }
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("): %d/%d",run,sign ? -val : val);
-#endif /* TRACE */
-
- j = scan[ld1->alternate_scan][i];
- val = (val * ld1->quantizer_scale * qmat[j]) >> 4;
- bp[j] = sign ? -val : val;
- nc++;
-
- if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
- ld = &enhan;
- }
-}
-
-
-/* decode one non-intra coded MPEG-2 block */
-
-void Decode_MPEG2_Non_Intra_Block(comp)
-int comp;
-{
- int val, i, j, sign, nc, run;
- unsigned int code;
- DCTtab *tab;
- short *bp;
- int *qmat;
- struct layer_data *ld1;
-
- /* with data partitioning, data always goes to base layer */
- ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
- bp = ld1->block[comp];
-
- if (base.scalable_mode==SC_DP) {
- if (base.priority_breakpoint<64)
- ld = &enhan;
- else
- ld = &base;
- }
-
- qmat = (comp<4 || chroma_format==CHROMA420)
- ? ld1->non_intra_quantizer_matrix
- : ld1->chroma_non_intra_quantizer_matrix;
-
- nc = 0;
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("DCT(%d)n:",comp);
-#endif /* TRACE */
-
- /* decode AC coefficients */
- for (i=0; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384)
- {
- if (i==0)
- tab = &DCTtabfirst[(code>>12)-4];
- else
- tab = &DCTtabnext[(code>>12)-4];
- }
- else if (code>=1024)
- tab = &DCTtab0[(code>>8)-4];
- else if (code>=512)
- tab = &DCTtab1[(code>>6)-8];
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- cprintf("invalid Huffman code in Decode_MPEG2_Non_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
-
- Flush_Buffer(tab->len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- cprintf(" (");
- Print_Bits(code,16,tab->len);
- }
-#endif /* TRACE */
-
- if (tab->run==64) /* end_of_block */
- {
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("): EOB\n");
-#endif /* TRACE */
- return;
- }
-
- if (tab->run==65) /* escape */
- {
-#ifdef TRACE
- if (Trace_Flag)
- {
- cprintf(" ");
- Print_Bits(Show_Bits(6),6,6);
- }
-#endif /* TRACE */
-
- i+= run = Get_Bits(6);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- cprintf(" ");
- Print_Bits(Show_Bits(12),12,12);
- }
-#endif /* TRACE */
-
- val = Get_Bits(12);
- if ((val&2047)==0)
- {
- if (!Quiet_Flag)
- cprintf("invalid escape in Decode_MPEG2_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
- if((sign = (val>=2048)))
- val = 4096 - val;
- }
- else
- {
- i+= run = tab->run;
- val = tab->level;
- sign = Get_Bits(1);
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("%d",sign);
-#endif /* TRACE */
- }
-
- if (i>=64)
- {
- if (!Quiet_Flag)
- cprintf("DCT coeff index (i) out of bounds (inter2)\n");
- Fault_Flag = 1;
- return;
- }
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("): %d/%d",run,sign?-val:val);
-#endif /* TRACE */
-
- j = scan[ld1->alternate_scan][i];
- val = (((val<<1)+1) * ld1->quantizer_scale * qmat[j]) >> 5;
- bp[j] = sign ? -val : val;
- nc++;
-
- if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
- ld = &enhan;
- }
-}
-
Index: rel_1_2/fsf/mpeg2/spatscal.c
===================================================================
--- rel_1_2/fsf/mpeg2/spatscal.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/spatscal.c (nonexistent)
@@ -1,275 +0,0 @@
-
-#include "config.h"
-#include "global.h"
-
-/* private prototypes */
-static void Read_Lower_Layer_Component_Framewise _ANSI_ARGS_((int comp, int lw, int lh));
-static void Read_Lower_Layer_Component_Fieldwise _ANSI_ARGS_((int comp, int lw, int lh));
-static void Make_Spatial_Prediction_Frame _ANSI_ARGS_((int progressive_frame,
- int llprogressive_frame, unsigned char *fld0, unsigned char *fld1,
- short *tmp, unsigned char *dst, int llx0, int lly0, int llw, int llh,
- int horizontal_size, int vertical_size, int vm, int vn, int hm, int hn,
- int aperture));
-static void Deinterlace _ANSI_ARGS_((unsigned char *fld0, unsigned char *fld1,
- int j0, int lx, int ly, int aperture));
-static void Subsample_Vertical _ANSI_ARGS_((unsigned char *s, short *d,
- int lx, int lys, int lyd, int m, int n, int j0, int dj));
-static void Subsample_Horizontal _ANSI_ARGS_((short *s, unsigned char *d,
- int x0, int lx, int lxs, int lxd, int ly, int m, int n));
-
-
-
-/* get reference frame */
-void Spatial_Prediction()
-{
-
- if(Frame_Store_Flag)
- {
- Read_Lower_Layer_Component_Framewise(0,lower_layer_prediction_horizontal_size,
- lower_layer_prediction_vertical_size); /* Y */
- Read_Lower_Layer_Component_Framewise(1,lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1); /* Cb ("U") */
- Read_Lower_Layer_Component_Framewise(2,lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1); /* Cr ("V") */
- }
- else
- {
- Read_Lower_Layer_Component_Fieldwise(0,lower_layer_prediction_horizontal_size,
- lower_layer_prediction_vertical_size); /* Y */
- Read_Lower_Layer_Component_Fieldwise(1,lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1); /* Cb ("U") */
- Read_Lower_Layer_Component_Fieldwise(2,lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1); /* Cr ("V") */
- }
-
-
- Make_Spatial_Prediction_Frame /* Y */
- (progressive_frame,lower_layer_progressive_frame,llframe0[0],llframe1[0],
- lltmp,current_frame[0],lower_layer_horizontal_offset,
- lower_layer_vertical_offset,
- lower_layer_prediction_horizontal_size,
- lower_layer_prediction_vertical_size,
- horizontal_size,vertical_size,vertical_subsampling_factor_m,
- vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
- horizontal_subsampling_factor_n,
- picture_structure!=FRAME_PICTURE); /* this changed from CD to DIS */
-
- Make_Spatial_Prediction_Frame /* Cb */
- (progressive_frame,lower_layer_progressive_frame,llframe0[1],llframe1[1],
- lltmp,current_frame[1],lower_layer_horizontal_offset/2,
- lower_layer_vertical_offset/2,
- lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1,
- horizontal_size>>1,vertical_size>>1,vertical_subsampling_factor_m,
- vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
- horizontal_subsampling_factor_n,1);
-
- Make_Spatial_Prediction_Frame /* Cr */
- (progressive_frame,lower_layer_progressive_frame,llframe0[2],llframe1[2],
- lltmp,current_frame[2],lower_layer_horizontal_offset/2,
- lower_layer_vertical_offset/2,
- lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1,
- horizontal_size>>1,vertical_size>>1,vertical_subsampling_factor_m,
- vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
- horizontal_subsampling_factor_n,1);
-
-}
-
-static void Read_Lower_Layer_Component_Framewise(comp,lw,lh)
- int comp;
- int lw, lh;
-{
- cprintf("Read_Lower_Layer_Component_Framewise\n");
-}
-
-
-static void Read_Lower_Layer_Component_Fieldwise(comp,lw,lh)
- int comp;
- int lw, lh;
-{
- cprintf("Read_Lower_Layer_Component_Fieldwise\n");
-}
-
-
-/* form spatial prediction */
-static void Make_Spatial_Prediction_Frame(progressive_frame,
- llprogressive_frame,fld0,fld1,tmp,dst,llx0,lly0,llw,llh,horizontal_size,
- vertical_size,vm,vn,hm,hn,aperture)
-int progressive_frame,llprogressive_frame;
-unsigned char *fld0,*fld1;
-short *tmp;
-unsigned char *dst;
-int llx0,lly0,llw,llh,horizontal_size,vertical_size,vm,vn,hm,hn,aperture;
-{
- int w, h, x0, llw2, llh2;
-
- llw2 = (llw*hn)/hm;
- llh2 = (llh*vn)/vm;
-
- if (llprogressive_frame)
- {
- /* progressive -> progressive / interlaced */
- Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,1);
- }
- else if (progressive_frame)
- {
- /* interlaced -> progressive */
- if (lower_layer_deinterlaced_field_select)
- {
- Deinterlace(fld1,fld0,0,llw,llh,aperture);
- Subsample_Vertical(fld1,tmp,llw,llh,llh2,vm,vn,0,1);
- }
- else
- {
- Deinterlace(fld0,fld1,1,llw,llh,aperture);
- Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,1);
- }
- }
- else
- {
- /* interlaced -> interlaced */
- Deinterlace(fld0,fld1,1,llw,llh,aperture);
- Deinterlace(fld1,fld0,0,llw,llh,aperture);
- Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,2);
- Subsample_Vertical(fld1,tmp,llw,llh,llh2,vm,vn,1,2);
- }
-
- /* vertical limits */
- if (lly0<0)
- {
- tmp-= llw*lly0;
- llh2+= lly0;
- if (llh2<0)
- llh2 = 0;
- h = (vertical_size<llh2) ? vertical_size : llh2;
- }
- else
- {
- dst+= horizontal_size*lly0;
- h= vertical_size - lly0;
- if (h>llh2)
- h = llh2;
- }
-
- /* horizontal limits */
- if (llx0<0)
- {
- x0 = -llx0;
- llw2+= llx0;
- if (llw2<0)
- llw2 = 0;
- w = (horizontal_size<llw2) ? horizontal_size : llw2;
- }
- else
- {
- dst+= llx0;
- x0 = 0;
- w = horizontal_size - llx0;
- if (w>llw2)
- w = llw2;
- }
-
- Subsample_Horizontal(tmp,dst,x0,w,llw,horizontal_size,h,hm,hn);
-}
-
-/* deinterlace one field (interpolate opposite parity samples)
- *
- * deinterlacing is done in-place: if j0=1, fld0 contains the input field in
- * its even lines and the odd lines are interpolated by this routine
- * if j0=0, the input field is in the odd lines and the even lines are
- * interpolated
- *
- * fld0: field to be deinterlaced
- * fld1: other field (referenced by the two field aperture filter)
- * j0: 0: interpolate even (top) lines, 1: interpolate odd (bottom) lines
- * lx: width of fld0 and fld1
- * ly: height of the deinterlaced field (has to be even)
- * aperture: 1: use one field aperture filter (two field otherwise)
- */
-static void Deinterlace(fld0,fld1,j0,lx,ly,aperture)
-unsigned char *fld0,*fld1;
-int j0,lx,ly; /* ly has to be even */
-int aperture;
-{
- int i,j,v;
- unsigned char *p0, *p0m1, *p0p1, *p1, *p1m2, *p1p2;
-
- /* deinterlace one field */
- for (j=j0; j<ly; j+=2)
- {
- p0 = fld0+lx*j;
- p0m1 = (j==0) ? p0+lx : p0-lx;
- p0p1 = (j==ly-1) ? p0-lx : p0+lx;
-
- if (aperture)
- for (i=0; i<lx; i++)
- p0[i] = (unsigned int)(p0m1[i] + p0p1[i] + 1)>>1;
- else
- {
- p1 = fld1 + lx*j;
- p1m2 = (j<2) ? p1 : p1-2*lx;
- p1p2 = (j>=ly-2) ? p1 : p1+2*lx;
- for (i=0; i<lx; i++)
- {
- v = 8*(p0m1[i]+p0p1[i]) + 2*p1[i] - p1m2[i] - p1p2[i];
- p0[i] = Clip[(v + ((v>=0) ? 8 : 7))>>4];
- }
- }
- }
-}
-
-/* vertical resampling */
-static void Subsample_Vertical(s,d,lx,lys,lyd,m,n,j0,dj)
-unsigned char *s;
-short *d;
-int lx, lys, lyd, m, n, j0, dj;
-{
- int i, j, c1, c2, jd;
- unsigned char *s1, *s2;
- short *d1;
-
- for (j=j0; j<lyd; j+=dj)
- {
- d1 = d + lx*j;
- jd = (j*m)/n;
- s1 = s + lx*jd;
- s2 = (jd<lys-1)? s1+lx : s1;
- c2 = (16*((j*m)%n) + (n>>1))/n;
- c1 = 16 - c2;
- for (i=0; i<lx; i++)
- d1[i] = c1*s1[i] + c2*s2[i];
- }
-}
-
-/* horizontal resampling */
-static void Subsample_Horizontal(s,d,x0,lx,lxs,lxd,ly,m,n)
-short *s;
-unsigned char *d;
-int x0, lx, lxs, lxd, ly, m, n;
-{
- int i, i1, j, id, c1, c2, v;
- short *s1, *s2;
- unsigned char *d1;
-
- for (i1=0; i1<lx; i1++)
- {
- d1 = d + i1;
- i = x0 + i1;
- id = (i*m)/n;
- s1 = s+id;
- s2 = (id<lxs-1) ? s1+1 : s1;
- c2 = (16*((i*m)%n) + (n>>1))/n;
- c1 = 16 - c2;
- for (j=0; j<ly; j++)
- {
- v = c1*(*s1) + c2*(*s2);
- *d1 = (v + ((v>=0) ? 128 : 127))>>8;
- d1+= lxd;
- s1+= lxs;
- s2+= lxs;
- }
- }
-}
-
-
Index: rel_1_2/fsf/mpeg2/config.h
===================================================================
--- rel_1_2/fsf/mpeg2/config.h (revision 1198)
+++ rel_1_2/fsf/mpeg2/config.h (nonexistent)
@@ -1,45 +0,0 @@
-/* config.h, configuration defines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-/* define NON_ANSI_COMPILER for compilers without function prototyping */
-/* #define NON_ANSI_COMPILER */
-
-#ifdef NON_ANSI_COMPILER
-#define _ANSI_ARGS_(x) ()
-#else
-#define _ANSI_ARGS_(x) x
-#endif
-
-#define RB "rb"
-#define WB "wb"
-
-#ifndef O_BINARY
-#define O_BINARY 0
-
-#endif
Index: rel_1_2/fsf/mpeg2/getpic.c
===================================================================
--- rel_1_2/fsf/mpeg2/getpic.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/getpic.c (nonexistent)
@@ -1,1223 +0,0 @@
-/* getpic.c, picture decoding */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include "config.h"
-#include "global.h"
-
-/* private prototypes*/
-static void picture_data _ANSI_ARGS_((int framenum));
-static void macroblock_modes _ANSI_ARGS_((int *pmacroblock_type, int *pstwtype,
- int *pstwclass, int *pmotion_type, int *pmotion_vector_count, int *pmv_format, int *pdmv,
- int *pmvscale, int *pdct_type));
-static void Clear_Block _ANSI_ARGS_((int comp));
-static void Sum_Block _ANSI_ARGS_((int comp));
-static void Saturate _ANSI_ARGS_((short *bp));
-static void Add_Block _ANSI_ARGS_((int comp, int bx, int by,
- int dct_type, int addflag));
-static void Update_Picture_Buffers _ANSI_ARGS_((void));
-static void frame_reorder _ANSI_ARGS_((int bitstream_framenum,
- int sequence_framenum));
-static void Decode_SNR_Macroblock _ANSI_ARGS_((int *SNRMBA, int *SNRMBAinc,
- int MBA, int MBAmax, int *dct_type));
-
-static void motion_compensation _ANSI_ARGS_((int MBA, int macroblock_type,
- int motion_type, int PMV[2][2][2], int motion_vertical_field_select[2][2],
- int dmvector[2], int stwtype, int dct_type));
-
-static void skipped_macroblock _ANSI_ARGS_((int dc_dct_pred[3],
- int PMV[2][2][2], int *motion_type, int motion_vertical_field_select[2][2],
- int *stwtype, int *macroblock_type));
-
-static int slice _ANSI_ARGS_((int framenum, int MBAmax));
-
-static int start_of_slice _ANSI_ARGS_ ((int MBAmax, int *MBA,
- int *MBAinc, int dc_dct_pred[3], int PMV[2][2][2]));
-
-static int decode_macroblock _ANSI_ARGS_((int *macroblock_type,
- int *stwtype, int *stwclass, int *motion_type, int *dct_type,
- int PMV[2][2][2], int dc_dct_pred[3],
- int motion_vertical_field_select[2][2], int dmvector[2]));
-
-
-/* decode one frame or field picture */
-void Decode_Picture(bitstream_framenum, sequence_framenum)
-int bitstream_framenum, sequence_framenum;
-{
-
- if (picture_structure==FRAME_PICTURE && Second_Field)
- {
- /* recover from illegal number of field pictures */
- cprintf("odd number of field pictures\n");
- Second_Field = 0;
- }
-
- /* IMPLEMENTATION: update picture buffer pointers */
- Update_Picture_Buffers();
-
-#ifdef VERIFY
- Check_Headers(bitstream_framenum, sequence_framenum);
-#endif /* VERIFY */
-
- /* ISO/IEC 13818-4 section 2.4.5.4 "frame buffer intercept method" */
- /* (section number based on November 1995 (Dallas) draft of the
- conformance document) */
- if(Ersatz_Flag)
- Substitute_Frame_Buffer(bitstream_framenum, sequence_framenum);
-
- /* form spatial scalable picture */
-
- /* form spatial scalable picture */
- /* ISO/IEC 13818-2 section 7.7: Spatial scalability */
- if (base.pict_scal && !Second_Field)
- {
- Spatial_Prediction();
- }
-
- /* decode picture data ISO/IEC 13818-2 section 6.2.3.7 */
- picture_data(bitstream_framenum);
-
- /* write or display current or previously decoded reference frame */
- /* ISO/IEC 13818-2 section 6.1.1.11: Frame reordering */
- frame_reorder(bitstream_framenum, sequence_framenum);
-
- if (picture_structure!=FRAME_PICTURE)
- Second_Field = !Second_Field;
-}
-
-
-/* decode all macroblocks of the current picture */
-/* stages described in ISO/IEC 13818-2 section 7 */
-static void picture_data(framenum)
-int framenum;
-{
- int MBAmax;
- int ret;
-
- /* number of macroblocks per picture */
- MBAmax = mb_width*mb_height;
-
- if (picture_structure!=FRAME_PICTURE)
- MBAmax>>=1; /* field picture has half as mnay macroblocks as frame */
-
- for(;;)
- {
- if((ret=slice(framenum, MBAmax))<0)
- return;
- }
-
-}
-
-
-
-/* decode all macroblocks of the current picture */
-/* ISO/IEC 13818-2 section 6.3.16 */
-static int slice(framenum, MBAmax)
-int framenum, MBAmax;
-{
- int MBA;
- int MBAinc, macroblock_type, motion_type, dct_type;
- int dc_dct_pred[3];
- int PMV[2][2][2], motion_vertical_field_select[2][2];
- int dmvector[2];
- int stwtype, stwclass;
- int SNRMBA, SNRMBAinc;
- int ret;
-
- MBA = 0; /* macroblock address */
- MBAinc = 0;
-
- if((ret=start_of_slice(MBAmax, &MBA, &MBAinc, dc_dct_pred, PMV))!=1)
- return(ret);
-
- if (Two_Streams && enhan.scalable_mode==SC_SNR)
- {
- SNRMBA=0;
- SNRMBAinc=0;
- }
-
- Fault_Flag=0;
-
- for (;;)
- {
-
- /* this is how we properly exit out of picture */
- if (MBA>=MBAmax)
- return(-1); /* all macroblocks decoded */
-
-#ifdef TRACE
- if (Trace_Flag)
- cprintf("frame %d, MB %d\n",framenum,MBA);
-#endif /* TRACE */
-
-#ifdef DISPLAY
- if (!progressive_frame && picture_structure==FRAME_PICTURE
- && MBA==(MBAmax>>1) && framenum!=0 && Output_Type==T_X11
- && !Display_Progressive_Flag)
- {
- Display_Second_Field();
- }
-#endif
-
- ld = &base;
-
- if (MBAinc==0)
- {
- if (base.scalable_mode==SC_DP && base.priority_breakpoint==1)
- ld = &enhan;
-
- if (!Show_Bits(23) || Fault_Flag) /* next_start_code or fault */
- {
-resync: /* if Fault_Flag: resynchronize to next next_start_code */
- Fault_Flag = 0;
- return(0); /* trigger: go to next slice */
- }
- else /* neither next_start_code nor Fault_Flag */
- {
- if (base.scalable_mode==SC_DP && base.priority_breakpoint==1)
- ld = &enhan;
-
- /* decode macroblock address increment */
- MBAinc = Get_macroblock_address_increment();
-
- if (Fault_Flag) goto resync;
- }
- }
-
- if (MBA>=MBAmax)
- {
- /* MBAinc points beyond picture dimensions */
- if (!Quiet_Flag)
- cprintf("Too many macroblocks in picture\n");
- return(-1);
- }
-
- if (MBAinc==1) /* not skipped */
- {
- ret = decode_macroblock(&macroblock_type, &stwtype, &stwclass,
- &motion_type, &dct_type, PMV, dc_dct_pred,
- motion_vertical_field_select, dmvector);
-
- if(ret==-1)
- return(-1);
-
- if(ret==0)
- goto resync;
-
- }
- else /* MBAinc!=1: skipped macroblock */
- {
- /* ISO/IEC 13818-2 section 7.6.6 */
- skipped_macroblock(dc_dct_pred, PMV, &motion_type,
- motion_vertical_field_select, &stwtype, &macroblock_type);
- }
-
- /* SCALABILITY: SNR */
- /* ISO/IEC 13818-2 section 7.8 */
- /* NOTE: we currently ignore faults encountered in this routine */
- if (Two_Streams && enhan.scalable_mode==SC_SNR)
- Decode_SNR_Macroblock(&SNRMBA, &SNRMBAinc, MBA, MBAmax, &dct_type);
-
- /* ISO/IEC 13818-2 section 7.6 */
- motion_compensation(MBA, macroblock_type, motion_type, PMV,
- motion_vertical_field_select, dmvector, stwtype, dct_type);
-
-
- /* advance to next macroblock */
- MBA++;
- MBAinc--;
-
- /* SCALABILITY: SNR */
- if (Two_Streams && enhan.scalable_mode==SC_SNR)
- {
- SNRMBA++;
- SNRMBAinc--;
- }
-
- if (MBA>=MBAmax)
- return(-1); /* all macroblocks decoded */
- }
-}
-
-
-/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
-static void macroblock_modes(pmacroblock_type,pstwtype,pstwclass,
- pmotion_type,pmotion_vector_count,pmv_format,pdmv,pmvscale,pdct_type)
- int *pmacroblock_type, *pstwtype, *pstwclass;
- int *pmotion_type, *pmotion_vector_count, *pmv_format, *pdmv, *pmvscale;
- int *pdct_type;
-{
- int macroblock_type;
- int stwtype, stwcode, stwclass;
- int motion_type = 0;
- int motion_vector_count, mv_format, dmv, mvscale;
- int dct_type;
- static unsigned char stwc_table[3][4]
- = { {6,3,7,4}, {2,1,5,4}, {2,5,7,4} };
- static unsigned char stwclass_table[9]
- = {0, 1, 2, 1, 1, 2, 3, 3, 4};
-
- /* get macroblock_type */
- macroblock_type = Get_macroblock_type();
-
- if (Fault_Flag) return;
-
- /* get spatial_temporal_weight_code */
- if (macroblock_type & MB_WEIGHT)
- {
- if (spatial_temporal_weight_code_table_index==0)
- stwtype = 4;
- else
- {
- stwcode = Get_Bits(2);
-#ifdef TRACE
- if (Trace_Flag)
- {
- cprintf("spatial_temporal_weight_code (");
- Print_Bits(stwcode,2,2);
- cprintf("): %d\n",stwcode);
- }
-#endif /* TRACE */
- stwtype = stwc_table[spatial_temporal_weight_code_table_index-1][stwcode];
- }
- }
- else
- stwtype = (macroblock_type & MB_CLASS4) ? 8 : 0;
-
- /* SCALABILITY: derive spatial_temporal_weight_class (Table 7-18) */
- stwclass = stwclass_table[stwtype];
-
- /* get frame/field motion type */
- if (macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD))
- {
- if (picture_structure==FRAME_PICTURE) /* frame_motion_type */
- {
- motion_type = frame_pred_frame_dct ? MC_FRAME : Get_Bits(2);
-#ifdef TRACE
- if (!frame_pred_frame_dct && Trace_Flag)
- {
- cprintf("frame_motion_type (");
- Print_Bits(motion_type,2,2);
- cprintf("): %s\n",motion_type==MC_FIELD?"Field":
- motion_type==MC_FRAME?"Frame":
- motion_type==MC_DMV?"Dual_Prime":"Invalid");
- }
-#endif /* TRACE */
- }
- else /* field_motion_type */
- {
- motion_type = Get_Bits(2);
-#ifdef TRACE
- if (Trace_Flag)
- {
- cprintf("field_motion_type (");
- Print_Bits(motion_type,2,2);
- cprintf("): %s\n",motion_type==MC_FIELD?"Field":
- motion_type==MC_16X8?"16x8 MC":
- motion_type==MC_DMV?"Dual_Prime":"Invalid");
- }
-#endif /* TRACE */
- }
- }
- else if ((macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
- {
- /* concealment motion vectors */
- motion_type = (picture_structure==FRAME_PICTURE) ? MC_FRAME : MC_FIELD;
- }
-#if 0
- else
- {
- printf("maroblock_modes(): unknown macroblock type\n");
- motion_type = -1;
- }
-#endif
-
- /* derive motion_vector_count, mv_format and dmv, (table 6-17, 6-18) */
- if (picture_structure==FRAME_PICTURE)
- {
- motion_vector_count = (motion_type==MC_FIELD && stwclass<2) ? 2 : 1;
- mv_format = (motion_type==MC_FRAME) ? MV_FRAME : MV_FIELD;
- }
- else
- {
- motion_vector_count = (motion_type==MC_16X8) ? 2 : 1;
- mv_format = MV_FIELD;
- }
-
- dmv = (motion_type==MC_DMV); /* dual prime */
-
- /* field mv predictions in frame pictures have to be scaled
- * ISO/IEC 13818-2 section 7.6.3.1 Decoding the motion vectors
- * IMPLEMENTATION: mvscale is derived for later use in motion_vectors()
- * it displaces the stage:
- *
- * if((mv_format=="field")&&(t==1)&&(picture_structure=="Frame picture"))
- * prediction = PMV[r][s][t] DIV 2;
- */
-
- mvscale = ((mv_format==MV_FIELD) && (picture_structure==FRAME_PICTURE));
-
- /* get dct_type (frame DCT / field DCT) */
- dct_type = (picture_structure==FRAME_PICTURE)
- && (!frame_pred_frame_dct)
- && (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA))
- ? Get_Bits(1)
- : 0;
-
-#ifdef TRACE
- if (Trace_Flag && (picture_structure==FRAME_PICTURE)
- && (!frame_pred_frame_dct)
- && (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA)))
- cprintf("dct_type (%d): %s\n",dct_type,dct_type?"Field":"Frame");
-#endif /* TRACE */
-
- /* return values */
- *pmacroblock_type = macroblock_type;
- *pstwtype = stwtype;
- *pstwclass = stwclass;
- *pmotion_type = motion_type;
- *pmotion_vector_count = motion_vector_count;
- *pmv_format = mv_format;
- *pdmv = dmv;
- *pmvscale = mvscale;
- *pdct_type = dct_type;
-}
-
-
-/* move/add 8x8-Block from block[comp] to backward_reference_frame */
-/* copy reconstructed 8x8 block from block[comp] to current_frame[]
- * ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data
- * This stage also embodies some of the operations implied by:
- * - ISO/IEC 13818-2 section 7.6.7: Combining predictions
- * - ISO/IEC 13818-2 section 6.1.3: Macroblock
-*/
-static void Add_Block(comp,bx,by,dct_type,addflag)
-int comp,bx,by,dct_type,addflag;
-{
- int cc,i, j, iincr;
- unsigned char *rfp;
- short *bp;
-
-
- /* derive color component index */
- /* equivalent to ISO/IEC 13818-2 Table 7-1 */
- cc = (comp<4) ? 0 : (comp&1)+1; /* color component index */
-
- if (cc==0)
- {
- /* luminance */
-
- if (picture_structure==FRAME_PICTURE)
- if (dct_type)
- {
- /* field DCT coding */
- rfp = current_frame[0]
- + Coded_Picture_Width*(by+((comp&2)>>1)) + bx + ((comp&1)<<3);
- iincr = (Coded_Picture_Width<<1) - 8;
- }
- else
- {
- /* frame DCT coding */
- rfp = current_frame[0]
- + Coded_Picture_Width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
- iincr = Coded_Picture_Width - 8;
- }
- else
- {
- /* field picture */
- rfp = current_frame[0]
- + (Coded_Picture_Width<<1)*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
- iincr = (Coded_Picture_Width<<1) - 8;
- }
- }
- else
- {
- /* chrominance */
-
- /* scale coordinates */
- if (chroma_format!=CHROMA444)
- bx >>= 1;
- if (chroma_format==CHROMA420)
- by >>= 1;
- if (picture_structure==FRAME_PICTURE)
- {
- if (dct_type && (chroma_format!=CHROMA420))
- {
- /* field DCT coding */
- rfp = current_frame[cc]
- + Chroma_Width*(by+((comp&2)>>1)) + bx + (comp&8);
- iincr = (Chroma_Width<<1) - 8;
- }
- else
- {
- /* frame DCT coding */
- rfp = current_frame[cc]
- + Chroma_Width*(by+((comp&2)<<2)) + bx + (comp&8);
- iincr = Chroma_Width - 8;
- }
- }
- else
- {
- /* field picture */
- rfp = current_frame[cc]
- + (Chroma_Width<<1)*(by+((comp&2)<<2)) + bx + (comp&8);
- iincr = (Chroma_Width<<1) - 8;
- }
- }
-
- bp = ld->block[comp];
-
- if (addflag)
- {
- for (i=0; i<8; i++)
- {
- for (j=0; j<8; j++)
- {
- *rfp = Clip[*bp++ + *rfp];
- rfp++;
- }
-
- rfp+= iincr;
- }
- }
- else
- {
- for (i=0; i<8; i++)
- {
- for (j=0; j<8; j++)
- *rfp++ = Clip[*bp++ + 128];
-
- rfp+= iincr;
- }
- }
-}
-
-
-/* ISO/IEC 13818-2 section 7.8 */
-static void Decode_SNR_Macroblock(SNRMBA, SNRMBAinc, MBA, MBAmax, dct_type)
- int *SNRMBA, *SNRMBAinc;
- int MBA, MBAmax;
- int *dct_type;
-{
- int SNRmacroblock_type, SNRcoded_block_pattern, SNRdct_type, dummy;
- int slice_vert_pos_ext, quantizer_scale_code, comp, code;
-
- ld = &enhan;
-
- if (*SNRMBAinc==0)
- {
- if (!Show_Bits(23)) /* next_start_code */
- {
- next_start_code();
- code = Show_Bits(32);
-
- if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
- {
- /* only slice headers are allowed in picture_data */
- if (!Quiet_Flag)
- cprintf("SNR: Premature end of picture\n");
- return;
- }
-
- Flush_Buffer32();
-
- /* decode slice header (may change quantizer_scale) */
- slice_vert_pos_ext = slice_header();
-
- /* decode macroblock address increment */
- *SNRMBAinc = Get_macroblock_address_increment();
-
- /* set current location */
- *SNRMBA =
- ((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *SNRMBAinc - 1;
-
- *SNRMBAinc = 1; /* first macroblock in slice: not skipped */
- }
- else /* not next_start_code */
- {
- if (*SNRMBA>=MBAmax)
- {
- if (!Quiet_Flag)
- cprintf("Too many macroblocks in picture\n");
- return;
- }
-
- /* decode macroblock address increment */
- *SNRMBAinc = Get_macroblock_address_increment();
- }
- }
-
- if (*SNRMBA!=MBA)
- {
- /* streams out of sync */
- if (!Quiet_Flag)
- cprintf("Cant't synchronize streams\n");
- return;
- }
-
- if (*SNRMBAinc==1) /* not skipped */
- {
- macroblock_modes(&SNRmacroblock_type, &dummy, &dummy,
- &dummy, &dummy, &dummy, &dummy, &dummy,
- &SNRdct_type);
-
- if (SNRmacroblock_type & MACROBLOCK_PATTERN)
- *dct_type = SNRdct_type;
-
- if (SNRmacroblock_type & MACROBLOCK_QUANT)
- {
- quantizer_scale_code = Get_Bits(5);
- ld->quantizer_scale =
- ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1;
- }
-
- /* macroblock_pattern */
- if (SNRmacroblock_type & MACROBLOCK_PATTERN)
- {
- SNRcoded_block_pattern = Get_coded_block_pattern();
-
- if (chroma_format==CHROMA422)
- SNRcoded_block_pattern = (SNRcoded_block_pattern<<2) | Get_Bits(2); /* coded_block_pattern_1 */
- else if (chroma_format==CHROMA444)
- SNRcoded_block_pattern = (SNRcoded_block_pattern<<6) | Get_Bits(6); /* coded_block_pattern_2 */
- }
- else
- SNRcoded_block_pattern = 0;
-
- /* decode blocks */
- for (comp=0; comp<block_count; comp++)
- {
- Clear_Block(comp);
-
- if (SNRcoded_block_pattern & (1<<(block_count-1-comp)))
- Decode_MPEG2_Non_Intra_Block(comp);
- }
- }
- else /* SNRMBAinc!=1: skipped macroblock */
- {
- for (comp=0; comp<block_count; comp++)
- Clear_Block(comp);
- }
-
- ld = &base;
-}
-
-
-
-/* IMPLEMENTATION: set scratch pad macroblock to zero */
-static void Clear_Block(comp)
-int comp;
-{
- short *Block_Ptr;
- int i;
-
- Block_Ptr = ld->block[comp];
-
- for (i=0; i<64; i++)
- *Block_Ptr++ = 0;
-}
-
-
-/* SCALABILITY: add SNR enhancement layer block data to base layer */
-/* ISO/IEC 13818-2 section 7.8.3.4: Addition of coefficients from the two layes */
-static void Sum_Block(comp)
-int comp;
-{
- short *Block_Ptr1, *Block_Ptr2;
- int i;
-
- Block_Ptr1 = base.block[comp];
- Block_Ptr2 = enhan.block[comp];
-
- for (i=0; i<64; i++)
- *Block_Ptr1++ += *Block_Ptr2++;
-}
-
-
-/* limit coefficients to -2048..2047 */
-/* ISO/IEC 13818-2 section 7.4.3 and 7.4.4: Saturation and Mismatch control */
-static void Saturate(Block_Ptr)
-short *Block_Ptr;
-{
- int i, sum, val;
-
- sum = 0;
-
- /* ISO/IEC 13818-2 section 7.4.3: Saturation */
- for (i=0; i<64; i++)
- {
- val = Block_Ptr[i];
-
- if (val>2047)
- val = 2047;
- else if (val<-2048)
- val = -2048;
-
- Block_Ptr[i] = val;
- sum+= val;
- }
-
- /* ISO/IEC 13818-2 section 7.4.4: Mismatch control */
- if ((sum&1)==0)
- Block_Ptr[63]^= 1;
-
-}
-
-
-/* reuse old picture buffers as soon as they are no longer needed
- based on life-time axioms of MPEG */
-static void Update_Picture_Buffers()
-{
- int cc; /* color component index */
- unsigned char *tmp; /* temporary swap pointer */
-
- for (cc=0; cc<3; cc++)
- {
- /* B pictures do not need to be save for future reference */
- if (picture_coding_type==B_TYPE)
- {
- current_frame[cc] = auxframe[cc];
- }
- else
- {
- /* only update at the beginning of the coded frame */
- if (!Second_Field)
- {
- tmp = forward_reference_frame[cc];
-
- /* the previously decoded reference frame is stored
- coincident with the location where the backward
- reference frame is stored (backwards prediction is not
- needed in P pictures) */
- forward_reference_frame[cc] = backward_reference_frame[cc];
-
- /* update pointer for potential future B pictures */
- backward_reference_frame[cc] = tmp;
- }
-
- /* can erase over old backward reference frame since it is not used
- in a P picture, and since any subsequent B pictures will use the
- previously decoded I or P frame as the backward_reference_frame */
- current_frame[cc] = backward_reference_frame[cc];
- }
-
- /* IMPLEMENTATION:
- one-time folding of a line offset into the pointer which stores the
- memory address of the current frame saves offsets and conditional
- branches throughout the remainder of the picture processing loop */
- if (picture_structure==BOTTOM_FIELD)
- current_frame[cc]+= (cc==0) ? Coded_Picture_Width : Chroma_Width;
- }
-}
-
-
-/* store last frame */
-
-void Output_Last_Frame_of_Sequence(Framenum)
-int Framenum;
-{
- if (Second_Field)
- cprintf("last frame incomplete, not stored\n");
- else
- Write_Frame(backward_reference_frame,Framenum-1);
-}
-
-
-
-static void frame_reorder(Bitstream_Framenum, Sequence_Framenum)
-int Bitstream_Framenum, Sequence_Framenum;
-{
- /* tracking variables to insure proper output in spatial scalability */
- static int Oldref_progressive_frame, Newref_progressive_frame;
-
- if (Sequence_Framenum!=0)
- {
- if (picture_structure==FRAME_PICTURE || Second_Field)
- {
- if (picture_coding_type==B_TYPE)
- Write_Frame(auxframe,Bitstream_Framenum-1);
- else
- {
- Newref_progressive_frame = progressive_frame;
- progressive_frame = Oldref_progressive_frame;
-
- Write_Frame(forward_reference_frame,Bitstream_Framenum-1);
-
- Oldref_progressive_frame = progressive_frame = Newref_progressive_frame;
- }
- }
-#ifdef DISPLAY
- else if (Output_Type==T_X11)
- {
- if(!Display_Progressive_Flag)
- Display_Second_Field();
- }
-#endif
- }
- else
- Oldref_progressive_frame = progressive_frame;
-
-}
-
-
-/* ISO/IEC 13818-2 section 7.6 */
-static void motion_compensation(MBA, macroblock_type, motion_type, PMV,
- motion_vertical_field_select, dmvector, stwtype, dct_type)
-int MBA;
-int macroblock_type;
-int motion_type;
-int PMV[2][2][2];
-int motion_vertical_field_select[2][2];
-int dmvector[2];
-int stwtype;
-int dct_type;
-{
- int bx, by;
- int comp;
-
- /* derive current macroblock position within picture */
- /* ISO/IEC 13818-2 section 6.3.1.6 and 6.3.1.7 */
- bx = 16*(MBA%mb_width);
- by = 16*(MBA/mb_width);
-
- /* motion compensation */
- if (!(macroblock_type & MACROBLOCK_INTRA))
- form_predictions(bx,by,macroblock_type,motion_type,PMV,
- motion_vertical_field_select,dmvector,stwtype);
-
- /* SCALABILITY: Data Partitioning */
- if (base.scalable_mode==SC_DP)
- ld = &base;
-
- /* copy or add block data into picture */
- for (comp=0; comp<block_count; comp++)
- {
- /* SCALABILITY: SNR */
- /* ISO/IEC 13818-2 section 7.8.3.4: Addition of coefficients from
- the two a layers */
- if (Two_Streams && enhan.scalable_mode==SC_SNR)
- Sum_Block(comp); /* add SNR enhancement layer data to base layer */
-
- /* MPEG-2 saturation and mismatch control */
- /* base layer could be MPEG-1 stream, enhancement MPEG-2 SNR */
- /* ISO/IEC 13818-2 section 7.4.3 and 7.4.4: Saturation and Mismatch control */
- if ((Two_Streams && enhan.scalable_mode==SC_SNR) || ld->MPEG2_Flag)
- Saturate(ld->block[comp]);
-
- /* ISO/IEC 13818-2 section Annex A: inverse DCT */
- if (Reference_IDCT_Flag)
- Reference_IDCT(ld->block[comp]);
- else
- Fast_IDCT(ld->block[comp]);
-
- /* ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data */
- Add_Block(comp,bx,by,dct_type,(macroblock_type & MACROBLOCK_INTRA)==0);
- }
-
-}
-
-
-
-/* ISO/IEC 13818-2 section 7.6.6 */
-static void skipped_macroblock(dc_dct_pred, PMV, motion_type,
- motion_vertical_field_select, stwtype, macroblock_type)
-int dc_dct_pred[3];
-int PMV[2][2][2];
-int *motion_type;
-int motion_vertical_field_select[2][2];
-int *stwtype;
-int *macroblock_type;
-{
- int comp;
-
- /* SCALABILITY: Data Paritioning */
- if (base.scalable_mode==SC_DP)
- ld = &base;
-
- for (comp=0; comp<block_count; comp++)
- Clear_Block(comp);
-
- /* reset intra_dc predictors */
- /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
- dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
-
- /* reset motion vector predictors */
- /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
- if (picture_coding_type==P_TYPE)
- PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
-
- /* derive motion_type */
- if (picture_structure==FRAME_PICTURE)
- *motion_type = MC_FRAME;
- else
- {
- *motion_type = MC_FIELD;
-
- /* predict from field of same parity */
- /* ISO/IEC 13818-2 section 7.6.6.1 and 7.6.6.3: P field picture and B field
- picture */
- motion_vertical_field_select[0][0]=motion_vertical_field_select[0][1] =
- (picture_structure==BOTTOM_FIELD);
- }
-
- /* skipped I are spatial-only predicted, */
- /* skipped P and B are temporal-only predicted */
- /* ISO/IEC 13818-2 section 7.7.6: Skipped macroblocks */
- *stwtype = (picture_coding_type==I_TYPE) ? 8 : 0;
-
- /* IMPLEMENTATION: clear MACROBLOCK_INTRA */
- *macroblock_type&= ~MACROBLOCK_INTRA;
-
-}
-
-
-/* return==-1 means go to next picture */
-/* the expression "start of slice" is used throughout the normative
- body of the MPEG specification */
-static int start_of_slice(MBAmax, MBA, MBAinc,
- dc_dct_pred, PMV)
-int MBAmax;
-int *MBA;
-int *MBAinc;
-int dc_dct_pred[3];
-int PMV[2][2][2];
-{
- unsigned int code;
- int slice_vert_pos_ext;
-
- ld = &base;
-
- Fault_Flag = 0;
-
- next_start_code();
- code = Show_Bits(32);
-
- if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
- {
- /* only slice headers are allowed in picture_data */
- if (!Quiet_Flag)
- cprintf("start_of_slice(): Premature end of picture\n");
-
- return(-1); /* trigger: go to next picture */
- }
-
- Flush_Buffer32();
-
- /* decode slice header (may change quantizer_scale) */
- slice_vert_pos_ext = slice_header();
-
-
- /* SCALABILITY: Data Partitioning */
- if (base.scalable_mode==SC_DP)
- {
- ld = &enhan;
- next_start_code();
- code = Show_Bits(32);
-
- if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
- {
- /* only slice headers are allowed in picture_data */
- if (!Quiet_Flag)
- cprintf("DP: Premature end of picture\n");
- return(-1); /* trigger: go to next picture */
- }
-
- Flush_Buffer32();
-
- /* decode slice header (may change quantizer_scale) */
- slice_vert_pos_ext = slice_header();
-
- if (base.priority_breakpoint!=1)
- ld = &base;
- }
-
- /* decode macroblock address increment */
- *MBAinc = Get_macroblock_address_increment();
-
- if (Fault_Flag)
- {
- cprintf("start_of_slice(): MBAinc unsuccessful\n");
- return(0); /* trigger: go to next slice */
- }
-
- /* set current location */
- /* NOTE: the arithmetic used to derive macroblock_address below is
- * equivalent to ISO/IEC 13818-2 section 6.3.17: Macroblock
- */
- *MBA = ((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *MBAinc - 1;
- *MBAinc = 1; /* first macroblock in slice: not skipped */
-
- /* reset all DC coefficient and motion vector predictors */
- /* reset all DC coefficient and motion vector predictors */
- /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
- dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
-
- /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
- PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
- PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
-
- /* successfull: trigger decode macroblocks in slice */
- return(1);
-}
-
-
-/* ISO/IEC 13818-2 sections 7.2 through 7.5 */
-static int decode_macroblock(macroblock_type, stwtype, stwclass,
- motion_type, dct_type, PMV, dc_dct_pred,
- motion_vertical_field_select, dmvector)
-int *macroblock_type;
-int *stwtype;
-int *stwclass;
-int *motion_type;
-int *dct_type;
-int PMV[2][2][2];
-int dc_dct_pred[3];
-int motion_vertical_field_select[2][2];
-int dmvector[2];
-{
- /* locals */
- int quantizer_scale_code;
- int comp;
-
- int motion_vector_count;
- int mv_format;
- int dmv;
- int mvscale;
- int coded_block_pattern;
-
- /* SCALABILITY: Data Patitioning */
- if (base.scalable_mode==SC_DP)
- {
- if (base.priority_breakpoint<=2)
- ld = &enhan;
- else
- ld = &base;
- }
-
- /* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
- macroblock_modes(macroblock_type, stwtype, stwclass,
- motion_type, &motion_vector_count, &mv_format, &dmv, &mvscale,
- dct_type);
-
- if (Fault_Flag) return(0); /* trigger: go to next slice */
-
- if (*macroblock_type & MACROBLOCK_QUANT)
- {
- quantizer_scale_code = Get_Bits(5);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- cprintf("quantiser_scale_code (");
- Print_Bits(quantizer_scale_code,5,5);
- cprintf("): %d\n",quantizer_scale_code);
- }
-#endif /* TRACE */
-
- /* ISO/IEC 13818-2 section 7.4.2.2: Quantizer scale factor */
- if (ld->MPEG2_Flag)
- ld->quantizer_scale =
- ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code]
- : (quantizer_scale_code << 1);
- else
- ld->quantizer_scale = quantizer_scale_code;
-
- /* SCALABILITY: Data Partitioning */
- if (base.scalable_mode==SC_DP)
- /* make sure base.quantizer_scale is valid */
- base.quantizer_scale = ld->quantizer_scale;
- }
-
- /* motion vectors */
-
-
- /* ISO/IEC 13818-2 section 6.3.17.2: Motion vectors */
-
- /* decode forward motion vectors */
- if ((*macroblock_type & MACROBLOCK_MOTION_FORWARD)
- || ((*macroblock_type & MACROBLOCK_INTRA)
- && concealment_motion_vectors))
- {
- if (ld->MPEG2_Flag)
- motion_vectors(PMV,dmvector,motion_vertical_field_select,
- 0,motion_vector_count,mv_format,f_code[0][0]-1,f_code[0][1]-1,
- dmv,mvscale);
- else
- motion_vector(PMV[0][0],dmvector,
- forward_f_code-1,forward_f_code-1,0,0,full_pel_forward_vector);
- }
-
- if (Fault_Flag) return(0); /* trigger: go to next slice */
-
- /* decode backward motion vectors */
- if (*macroblock_type & MACROBLOCK_MOTION_BACKWARD)
- {
- if (ld->MPEG2_Flag)
- motion_vectors(PMV,dmvector,motion_vertical_field_select,
- 1,motion_vector_count,mv_format,f_code[1][0]-1,f_code[1][1]-1,0,
- mvscale);
- else
- motion_vector(PMV[0][1],dmvector,
- backward_f_code-1,backward_f_code-1,0,0,full_pel_backward_vector);
- }
-
- if (Fault_Flag) return(0); /* trigger: go to next slice */
-
- if ((*macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
- Flush_Buffer(1); /* remove marker_bit */
-
- if (base.scalable_mode==SC_DP && base.priority_breakpoint==3)
- ld = &enhan;
-
- /* macroblock_pattern */
- /* ISO/IEC 13818-2 section 6.3.17.4: Coded block pattern */
- if (*macroblock_type & MACROBLOCK_PATTERN)
- {
- coded_block_pattern = Get_coded_block_pattern();
-
- if (chroma_format==CHROMA422)
- {
- /* coded_block_pattern_1 */
- coded_block_pattern = (coded_block_pattern<<2) | Get_Bits(2);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- cprintf("coded_block_pattern_1: ");
- Print_Bits(coded_block_pattern,2,2);
- cprintf(" (%d)\n",coded_block_pattern&3);
- }
-#endif /* TRACE */
- }
- else if (chroma_format==CHROMA444)
- {
- /* coded_block_pattern_2 */
- coded_block_pattern = (coded_block_pattern<<6) | Get_Bits(6);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- cprintf("coded_block_pattern_2: ");
- Print_Bits(coded_block_pattern,6,6);
- cprintf(" (%d)\n",coded_block_pattern&63);
- }
-#endif /* TRACE */
- }
- }
- else
- coded_block_pattern = (*macroblock_type & MACROBLOCK_INTRA) ?
- (1<<block_count)-1 : 0;
-
- if (Fault_Flag) return(0); /* trigger: go to next slice */
-
- /* decode blocks */
- for (comp=0; comp<block_count; comp++)
- {
- /* SCALABILITY: Data Partitioning */
- if (base.scalable_mode==SC_DP)
- ld = &base;
-
- Clear_Block(comp);
-
- if (coded_block_pattern & (1<<(block_count-1-comp)))
- {
- if (*macroblock_type & MACROBLOCK_INTRA)
- {
- if (ld->MPEG2_Flag)
- Decode_MPEG2_Intra_Block(comp,dc_dct_pred);
- else
- Decode_MPEG1_Intra_Block(comp,dc_dct_pred);
- }
- else
- {
- if (ld->MPEG2_Flag)
- Decode_MPEG2_Non_Intra_Block(comp);
- else
- Decode_MPEG1_Non_Intra_Block(comp);
- }
-
- if (Fault_Flag) return(0); /* trigger: go to next slice */
- }
- }
-
- if(picture_coding_type==D_TYPE)
- {
- /* remove end_of_macroblock (always 1, prevents startcode emulation) */
- /* ISO/IEC 11172-2 section 2.4.2.7 and 2.4.3.6 */
- marker_bit("D picture end_of_macroblock bit");
- }
-
- /* reset intra_dc predictors */
- /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
- if (!(*macroblock_type & MACROBLOCK_INTRA))
- dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
-
- /* reset motion vector predictors */
- if ((*macroblock_type & MACROBLOCK_INTRA) && !concealment_motion_vectors)
- {
- /* intra mb without concealment motion vectors */
- /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
- PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
- PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
- }
-
- /* special "No_MC" macroblock_type case */
- /* ISO/IEC 13818-2 section 7.6.3.5: Prediction in P pictures */
- if ((picture_coding_type==P_TYPE)
- && !(*macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_INTRA)))
- {
- /* non-intra mb without forward mv in a P picture */
- /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
- PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
-
- /* derive motion_type */
- /* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes, frame_motion_type */
- if (picture_structure==FRAME_PICTURE)
- *motion_type = MC_FRAME;
- else
- {
- *motion_type = MC_FIELD;
- /* predict from field of same parity */
- motion_vertical_field_select[0][0] = (picture_structure==BOTTOM_FIELD);
- }
- }
-
- if (*stwclass==4)
- {
- /* purely spatially predicted macroblock */
- /* ISO/IEC 13818-2 section 7.7.5.1: Resetting motion vector predictions */
- PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
- PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
- }
-
- /* successfully decoded macroblock */
- return(1);
-
-} /* decode_macroblock */
-
-
Index: rel_1_2/fsf/mpeg2/gvideo.c
===================================================================
--- rel_1_2/fsf/mpeg2/gvideo.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/gvideo.c (nonexistent)
@@ -1,51 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-#include "drivers/glib.h"
-
-#include "fsf_contract.h"
-
-#include "config.h"
-#include "global.h"
-
-extern void *start_file;
-extern void *end_file;
-
-int Init_Mpeg_Decoder(void *start,void *end);
-int Decode_Bitstream();
-
-void *mpeg2decoder(void *arg)
-{
-
- int init = 1;
-
- Init_Mpeg_Decoder(start_file,end_file);
-
- while(1) {
-
- if (init == 1) {
- Decode_Bitstream();
- }
-
- }
-
- return 0;
-
-}
-
-
Index: rel_1_2/fsf/mpeg2/gethdr.c
===================================================================
--- rel_1_2/fsf/mpeg2/gethdr.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/gethdr.c (nonexistent)
@@ -1,1074 +0,0 @@
-/* gethdr.c, header decoding */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include "config.h"
-#include "global.h"
-
-
-/* private prototypes */
-static void sequence_header _ANSI_ARGS_((void));
-static void group_of_pictures_header _ANSI_ARGS_((void));
-static void picture_header _ANSI_ARGS_((void));
-static void extension_and_user_data _ANSI_ARGS_((void));
-static void sequence_extension _ANSI_ARGS_((void));
-static void sequence_display_extension _ANSI_ARGS_((void));
-static void quant_matrix_extension _ANSI_ARGS_((void));
-static void sequence_scalable_extension _ANSI_ARGS_((void));
-static void picture_display_extension _ANSI_ARGS_((void));
-static void picture_coding_extension _ANSI_ARGS_((void));
-static void picture_spatial_scalable_extension _ANSI_ARGS_((void));
-static void picture_temporal_scalable_extension _ANSI_ARGS_((void));
-static int extra_bit_information _ANSI_ARGS_((void));
-static void copyright_extension _ANSI_ARGS_((void));
-static void user_data _ANSI_ARGS_((void));
-static void user_data _ANSI_ARGS_((void));
-
-
-
-
-/* introduced in September 1995 to assist spatial scalable decoding */
-static void Update_Temporal_Reference_Tacking_Data _ANSI_ARGS_((void));
-/* private variables */
-static int Temporal_Reference_Base = 0;
-static int True_Framenum_max = -1;
-static int Temporal_Reference_GOP_Reset = 0;
-
-#define RESERVED -1
-static double frame_rate_Table[16] =
-{
- 0.0,
- ((23.0*1000.0)/1001.0),
- 24.0,
- 25.0,
- ((30.0*1000.0)/1001.0),
- 30.0,
- 50.0,
- ((60.0*1000.0)/1001.0),
- 60.0,
-
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED
-};
-
-/*
- * decode headers from one input stream
- * until an End of Sequence or picture start code
- * is found
- */
-int Get_Hdr()
-{
- unsigned int code;
-
- for (;;)
- {
- /* look for next_start_code */
- next_start_code();
- code = Get_Bits32();
-
- switch (code)
- {
- case SEQUENCE_HEADER_CODE:
- sequence_header();
- break;
- case GROUP_START_CODE:
- group_of_pictures_header();
- break;
- case PICTURE_START_CODE:
- picture_header();
- return 1;
- break;
- case SEQUENCE_END_CODE:
- return 0;
- break;
- default:
- if (!Quiet_Flag)
- cprintf("Unexpected next_start_code %08x (ignored)\n",code);
- break;
- }
- }
-}
-
-
-/* align to start of next next_start_code */
-
-void next_start_code()
-{
- /* byte align */
- Flush_Buffer(ld->Incnt&7);
- while (Show_Bits(24)!=0x01L)
- Flush_Buffer(8);
-}
-
-
-/* decode sequence header */
-
-static void sequence_header()
-{
- int i;
- int pos;
-
- pos = ld->Bitcnt;
- horizontal_size = Get_Bits(12);
- vertical_size = Get_Bits(12);
- aspect_ratio_information = Get_Bits(4);
- frame_rate_code = Get_Bits(4);
- bit_rate_value = Get_Bits(18);
- marker_bit("sequence_header()");
- vbv_buffer_size = Get_Bits(10);
- constrained_parameters_flag = Get_Bits(1);
-
- if((ld->load_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
- else
- {
- for (i=0; i<64; i++)
- ld->intra_quantizer_matrix[i] = default_intra_quantizer_matrix[i];
- }
-
- if((ld->load_non_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
- else
- {
- for (i=0; i<64; i++)
- ld->non_intra_quantizer_matrix[i] = 16;
- }
-
- /* copy luminance to chrominance matrices */
- for (i=0; i<64; i++)
- {
- ld->chroma_intra_quantizer_matrix[i] =
- ld->intra_quantizer_matrix[i];
-
- ld->chroma_non_intra_quantizer_matrix[i] =
- ld->non_intra_quantizer_matrix[i];
- }
-
-#ifdef VERBOSE
- if (Verbose_Flag > NO_LAYER)
- {
- cprintf("sequence header (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag > SEQUENCE_LAYER)
- {
- cprintf(" horizontal_size=%d\n",horizontal_size);
- cprintf(" vertical_size=%d\n",vertical_size);
- cprintf(" aspect_ratio_information=%d\n",aspect_ratio_information);
- cprintf(" frame_rate_code=%d",frame_rate_code);
- cprintf(" bit_rate_value=%d\n",bit_rate_value);
- cprintf(" vbv_buffer_size=%d\n",vbv_buffer_size);
- cprintf(" constrained_parameters_flag=%d\n",constrained_parameters_flag);
- cprintf(" load_intra_quantizer_matrix=%d\n",ld->load_intra_quantizer_matrix);
- cprintf(" load_non_intra_quantizer_matrix=%d\n",ld->load_non_intra_quantizer_matrix);
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_sequence_header++;
-#endif /* VERIFY */
-
- extension_and_user_data();
-}
-
-
-
-/* decode group of pictures header */
-/* ISO/IEC 13818-2 section 6.2.2.6 */
-static void group_of_pictures_header()
-{
- int pos;
-
- if (ld == &base)
- {
- Temporal_Reference_Base = True_Framenum_max + 1; /* *CH* */
- Temporal_Reference_GOP_Reset = 1;
- }
- pos = ld->Bitcnt;
- drop_flag = Get_Bits(1);
- hour = Get_Bits(5);
- minute = Get_Bits(6);
- marker_bit("group_of_pictures_header()");
- sec = Get_Bits(6);
- frame = Get_Bits(6);
- closed_gop = Get_Bits(1);
- broken_link = Get_Bits(1);
-
-#ifdef VERBOSE
- if (Verbose_Flag > NO_LAYER)
- {
- cprintf("group of pictures (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag > SEQUENCE_LAYER)
- {
- cprintf(" drop_flag=%d\n",drop_flag);
- cprintf(" timecode %d:%02d:%02d:%02d\n",hour,minute,sec,frame);
- cprintf(" closed_gop=%d\n",closed_gop);
- cprintf(" broken_link=%d\n",broken_link);
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_group_of_pictures_header++;
-#endif /* VERIFY */
-
- extension_and_user_data();
-
-}
-
-
-/* decode picture header */
-
-/* ISO/IEC 13818-2 section 6.2.3 */
-static void picture_header()
-{
- int pos;
- int Extra_Information_Byte_Count;
-
- /* unless later overwritten by picture_spatial_scalable_extension() */
- ld->pict_scal = 0;
-
- pos = ld->Bitcnt;
- temporal_reference = Get_Bits(10);
- picture_coding_type = Get_Bits(3);
- vbv_delay = Get_Bits(16);
-
- if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
- {
- full_pel_forward_vector = Get_Bits(1);
- forward_f_code = Get_Bits(3);
- }
- if (picture_coding_type==B_TYPE)
- {
- full_pel_backward_vector = Get_Bits(1);
- backward_f_code = Get_Bits(3);
- }
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- cprintf("picture header (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- cprintf(" temporal_reference=%d\n",temporal_reference);
- cprintf(" picture_coding_type=%d\n",picture_coding_type);
- cprintf(" vbv_delay=%d\n",vbv_delay);
- if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
- {
- cprintf(" full_pel_forward_vector=%d\n",full_pel_forward_vector);
- cprintf(" forward_f_code =%d\n",forward_f_code);
- }
- if (picture_coding_type==B_TYPE)
- {
- cprintf(" full_pel_backward_vector=%d\n",full_pel_backward_vector);
- cprintf(" backward_f_code =%d\n",backward_f_code);
- }
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_picture_header++;
-#endif /* VERIFY */
-
- Extra_Information_Byte_Count =
- extra_bit_information();
-
- extension_and_user_data();
-
- /* update tracking information used to assist spatial scalability */
- Update_Temporal_Reference_Tacking_Data();
-}
-
-/* decode slice header */
-
-/* ISO/IEC 13818-2 section 6.2.4 */
-int slice_header()
-{
- int slice_vertical_position_extension;
- int quantizer_scale_code;
- int pos;
- int slice_picture_id_enable = 0;
- int slice_picture_id = 0;
- int extra_information_slice = 0;
-
- pos = ld->Bitcnt;
-
- slice_vertical_position_extension =
- (ld->MPEG2_Flag && vertical_size>2800) ? Get_Bits(3) : 0;
-
- if (ld->scalable_mode==SC_DP)
- ld->priority_breakpoint = Get_Bits(7);
-
- quantizer_scale_code = Get_Bits(5);
- ld->quantizer_scale =
- ld->MPEG2_Flag ? (ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1) : quantizer_scale_code;
-
- /* slice_id introduced in March 1995 as part of the video corridendum
- (after the IS was drafted in November 1994) */
- if (Get_Bits(1))
- {
- ld->intra_slice = Get_Bits(1);
-
- slice_picture_id_enable = Get_Bits(1);
- slice_picture_id = Get_Bits(6);
-
- extra_information_slice = extra_bit_information();
- }
- else
- ld->intra_slice = 0;
-
-#ifdef VERBOSE
- if (Verbose_Flag>PICTURE_LAYER)
- {
- cprintf("slice header (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SLICE_LAYER)
- {
- if (ld->MPEG2_Flag && vertical_size>2800)
- cprintf(" slice_vertical_position_extension=%d\n",slice_vertical_position_extension);
-
- if (ld->scalable_mode==SC_DP)
- cprintf(" priority_breakpoint=%d\n",ld->priority_breakpoint);
-
- cprintf(" quantizer_scale_code=%d\n",quantizer_scale_code);
-
- cprintf(" slice_picture_id_enable = %d\n", slice_picture_id_enable);
-
- if(slice_picture_id_enable)
- cprintf(" slice_picture_id = %d\n", slice_picture_id);
-
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_slice_header++;
-#endif /* VERIFY */
-
-
- return slice_vertical_position_extension;
-}
-
-
-/* decode extension and user data */
-/* ISO/IEC 13818-2 section 6.2.2.2 */
-static void extension_and_user_data()
-{
- int code,ext_ID;
-
- next_start_code();
-
- while ((code = Show_Bits(32))==EXTENSION_START_CODE || code==USER_DATA_START_CODE)
- {
- if (code==EXTENSION_START_CODE)
- {
- Flush_Buffer32();
- ext_ID = Get_Bits(4);
- switch (ext_ID)
- {
- case SEQUENCE_EXTENSION_ID:
- sequence_extension();
- break;
- case SEQUENCE_DISPLAY_EXTENSION_ID:
- sequence_display_extension();
- break;
- case QUANT_MATRIX_EXTENSION_ID:
- quant_matrix_extension();
- break;
- case SEQUENCE_SCALABLE_EXTENSION_ID:
- sequence_scalable_extension();
- break;
- case PICTURE_DISPLAY_EXTENSION_ID:
- picture_display_extension();
- break;
- case PICTURE_CODING_EXTENSION_ID:
- picture_coding_extension();
- break;
- case PICTURE_SPATIAL_SCALABLE_EXTENSION_ID:
- picture_spatial_scalable_extension();
- break;
- case PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID:
- picture_temporal_scalable_extension();
- break;
- case COPYRIGHT_EXTENSION_ID:
- copyright_extension();
- break;
- default:
- cprintf("reserved extension start code ID %d\n",ext_ID);
- break;
- }
- next_start_code();
- }
- else
- {
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- cprintf("user data\n");
-#endif /* VERBOSE */
- Flush_Buffer32();
- user_data();
- }
- }
-}
-
-
-/* decode sequence extension */
-
-/* ISO/IEC 13818-2 section 6.2.2.3 */
-static void sequence_extension()
-{
- int horizontal_size_extension;
- int vertical_size_extension;
- int bit_rate_extension;
- int vbv_buffer_size_extension;
-
- /* derive bit position for trace */
-#ifdef VERBOSE
- pos = ld->Bitcnt;
-#endif
-
- ld->MPEG2_Flag = 1;
-
- ld->scalable_mode = SC_NONE; /* unless overwritten by sequence_scalable_extension() */
- layer_id = 0; /* unless overwritten by sequence_scalable_extension() */
-
- profile_and_level_indication = Get_Bits(8);
- progressive_sequence = Get_Bits(1);
- chroma_format = Get_Bits(2);
- horizontal_size_extension = Get_Bits(2);
- vertical_size_extension = Get_Bits(2);
- bit_rate_extension = Get_Bits(12);
- marker_bit("sequence_extension");
- vbv_buffer_size_extension = Get_Bits(8);
- low_delay = Get_Bits(1);
- frame_rate_extension_n = Get_Bits(2);
- frame_rate_extension_d = Get_Bits(5);
-
- frame_rate = frame_rate_Table[frame_rate_code] *
- ((frame_rate_extension_n+1)/(frame_rate_extension_d+1));
-
- /* special case for 422 profile & level must be made */
- if((profile_and_level_indication>>7) & 1)
- { /* escape bit of profile_and_level_indication set */
-
- /* 4:2:2 Profile @ Main Level */
- if((profile_and_level_indication&15)==5)
- {
- profile = PROFILE_422;
- level = MAIN_LEVEL;
- }
- }
- else
- {
- profile = profile_and_level_indication >> 4; /* Profile is upper nibble */
- level = profile_and_level_indication & 0xF; /* Level is lower nibble */
- }
-
-
- horizontal_size = (horizontal_size_extension<<12) | (horizontal_size&0x0fff);
- vertical_size = (vertical_size_extension<<12) | (vertical_size&0x0fff);
-
-
- /* ISO/IEC 13818-2 does not define bit_rate_value to be composed of
- * both the original bit_rate_value parsed in sequence_header() and
- * the optional bit_rate_extension in sequence_extension_header().
- * However, we use it for bitstream verification purposes.
- */
-
- bit_rate_value += (bit_rate_extension << 18);
- bit_rate = ((double) bit_rate_value) * 400.0;
- vbv_buffer_size += (vbv_buffer_size_extension << 10);
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- cprintf("sequence extension (byte %d)\n",(pos>>3)-4);
-
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- cprintf(" profile_and_level_indication=%d\n",profile_and_level_indication);
-
- if (profile_and_level_indication<128)
- {
- cprintf(" profile=%d, level=%d\n",profile,level);
- }
-
- cprintf(" progressive_sequence=%d\n",progressive_sequence);
- cprintf(" chroma_format=%d\n",chroma_format);
- cprintf(" horizontal_size_extension=%d\n",horizontal_size_extension);
- cprintf(" vertical_size_extension=%d\n",vertical_size_extension);
- cprintf(" bit_rate_extension=%d\n",bit_rate_extension);
- cprintf(" vbv_buffer_size_extension=%d\n",vbv_buffer_size_extension);
- cprintf(" low_delay=%d\n",low_delay);
- cprintf(" frame_rate_extension_n=%d\n",frame_rate_extension_n);
- cprintf(" frame_rate_extension_d=%d\n",frame_rate_extension_d);
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_sequence_extension++;
-#endif /* VERIFY */
-
-
-}
-
-
-/* decode sequence display extension */
-
-static void sequence_display_extension()
-{
- int pos;
-
- pos = ld->Bitcnt;
- video_format = Get_Bits(3);
- color_description = Get_Bits(1);
-
- if (color_description)
- {
- color_primaries = Get_Bits(8);
- transfer_characteristics = Get_Bits(8);
- matrix_coefficients = Get_Bits(8);
- }
-
- display_horizontal_size = Get_Bits(14);
- marker_bit("sequence_display_extension");
- display_vertical_size = Get_Bits(14);
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- cprintf("sequence display extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
-
- cprintf(" video_format=%d\n",video_format);
- cprintf(" color_description=%d\n",color_description);
-
- if (color_description)
- {
- cprintf(" color_primaries=%d\n",color_primaries);
- cprintf(" transfer_characteristics=%d\n",transfer_characteristics);
- cprintf(" matrix_coefficients=%d\n",matrix_coefficients);
- }
- cprintf(" display_horizontal_size=%d\n",display_horizontal_size);
- cprintf(" display_vertical_size=%d\n",display_vertical_size);
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_sequence_display_extension++;
-#endif /* VERIFY */
-
-}
-
-
-/* decode quant matrix entension */
-/* ISO/IEC 13818-2 section 6.2.3.2 */
-static void quant_matrix_extension()
-{
- int i;
- int pos;
-
- pos = ld->Bitcnt;
-
- if((ld->load_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- {
- ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = Get_Bits(8);
- }
- }
-
- if((ld->load_non_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- {
- ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = Get_Bits(8);
- }
- }
-
- if((ld->load_chroma_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
-
- if((ld->load_chroma_non_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- cprintf("quant matrix extension (byte %d)\n",(pos>>3)-4);
- cprintf(" load_intra_quantizer_matrix=%d\n",
- ld->load_intra_quantizer_matrix);
- cprintf(" load_non_intra_quantizer_matrix=%d\n",
- ld->load_non_intra_quantizer_matrix);
- cprintf(" load_chroma_intra_quantizer_matrix=%d\n",
- ld->load_chroma_intra_quantizer_matrix);
- cprintf(" load_chroma_non_intra_quantizer_matrix=%d\n",
- ld->load_chroma_non_intra_quantizer_matrix);
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_quant_matrix_extension++;
-#endif /* VERIFY */
-
-}
-
-
-/* decode sequence scalable extension */
-/* ISO/IEC 13818-2 section 6.2.2.5 */
-static void sequence_scalable_extension()
-{
- int pos;
-
- pos = ld->Bitcnt;
-
- /* values (without the +1 offset) of scalable_mode are defined in
- Table 6-10 of ISO/IEC 13818-2 */
- ld->scalable_mode = Get_Bits(2) + 1; /* add 1 to make SC_DP != SC_NONE */
-
- layer_id = Get_Bits(4);
-
- if (ld->scalable_mode==SC_SPAT)
- {
- lower_layer_prediction_horizontal_size = Get_Bits(14);
- marker_bit("sequence_scalable_extension()");
- lower_layer_prediction_vertical_size = Get_Bits(14);
- horizontal_subsampling_factor_m = Get_Bits(5);
- horizontal_subsampling_factor_n = Get_Bits(5);
- vertical_subsampling_factor_m = Get_Bits(5);
- vertical_subsampling_factor_n = Get_Bits(5);
- }
-
- if (ld->scalable_mode==SC_TEMP)
- Error("temporal scalability not implemented\n");
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- cprintf("sequence scalable extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- cprintf(" scalable_mode=%d\n",ld->scalable_mode-1);
- cprintf(" layer_id=%d\n",layer_id);
- if (ld->scalable_mode==SC_SPAT)
- {
- cprintf(" lower_layer_prediction_horiontal_size=%d\n",
- lower_layer_prediction_horizontal_size);
- cprintf(" lower_layer_prediction_vertical_size=%d\n",
- lower_layer_prediction_vertical_size);
- cprintf(" horizontal_subsampling_factor_m=%d\n",
- horizontal_subsampling_factor_m);
- cprintf(" horizontal_subsampling_factor_n=%d\n",
- horizontal_subsampling_factor_n);
- cprintf(" vertical_subsampling_factor_m=%d\n",
- vertical_subsampling_factor_m);
- cprintf(" vertical_subsampling_factor_n=%d\n",
- vertical_subsampling_factor_n);
- }
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_sequence_scalable_extension++;
-#endif /* VERIFY */
-
-}
-
-
-/* decode picture display extension */
-/* ISO/IEC 13818-2 section 6.2.3.3. */
-static void picture_display_extension()
-{
- int i;
- int number_of_frame_center_offsets;
- int pos;
-
- pos = ld->Bitcnt;
- /* based on ISO/IEC 13818-2 section 6.3.12
- (November 1994) Picture display extensions */
-
- /* derive number_of_frame_center_offsets */
- if(progressive_sequence)
- {
- if(repeat_first_field)
- {
- if(top_field_first)
- number_of_frame_center_offsets = 3;
- else
- number_of_frame_center_offsets = 2;
- }
- else
- {
- number_of_frame_center_offsets = 1;
- }
- }
- else
- {
- if(picture_structure!=FRAME_PICTURE)
- {
- number_of_frame_center_offsets = 1;
- }
- else
- {
- if(repeat_first_field)
- number_of_frame_center_offsets = 3;
- else
- number_of_frame_center_offsets = 2;
- }
- }
-
-
- /* now parse */
- for (i=0; i<number_of_frame_center_offsets; i++)
- {
- frame_center_horizontal_offset[i] = Get_Bits(16);
- marker_bit("picture_display_extension, first marker bit");
-
- frame_center_vertical_offset[i] = Get_Bits(16);
- marker_bit("picture_display_extension, second marker bit");
- }
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- cprintf("picture display extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
-
- for (i=0; i<number_of_frame_center_offsets; i++)
- {
- cprintf(" frame_center_horizontal_offset[%d]=%d\n",i,
- frame_center_horizontal_offset[i]);
- cprintf(" frame_center_vertical_offset[%d]=%d\n",i,
- frame_center_vertical_offset[i]);
- }
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_picture_display_extension++;
-#endif /* VERIFY */
-
-}
-
-
-/* decode picture coding extension */
-static void picture_coding_extension()
-{
- int pos;
-
- pos = ld->Bitcnt;
-
- f_code[0][0] = Get_Bits(4);
- f_code[0][1] = Get_Bits(4);
- f_code[1][0] = Get_Bits(4);
- f_code[1][1] = Get_Bits(4);
-
- intra_dc_precision = Get_Bits(2);
- picture_structure = Get_Bits(2);
- top_field_first = Get_Bits(1);
- frame_pred_frame_dct = Get_Bits(1);
- concealment_motion_vectors = Get_Bits(1);
- ld->q_scale_type = Get_Bits(1);
- intra_vlc_format = Get_Bits(1);
- ld->alternate_scan = Get_Bits(1);
- repeat_first_field = Get_Bits(1);
- chroma_420_type = Get_Bits(1);
- progressive_frame = Get_Bits(1);
- composite_display_flag = Get_Bits(1);
-
- if (composite_display_flag)
- {
- v_axis = Get_Bits(1);
- field_sequence = Get_Bits(3);
- sub_carrier = Get_Bits(1);
- burst_amplitude = Get_Bits(7);
- sub_carrier_phase = Get_Bits(8);
- }
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- cprintf("picture coding extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- cprintf(" forward horizontal f_code=%d\n", f_code[0][0]);
- cprintf(" forward vertical f_code=%d\n", f_code[0][1]);
- cprintf(" backward horizontal f_code=%d\n", f_code[1][0]);
- cprintf(" backward_vertical f_code=%d\n", f_code[1][1]);
- cprintf(" intra_dc_precision=%d\n",intra_dc_precision);
- cprintf(" picture_structure=%d\n",picture_structure);
- cprintf(" top_field_first=%d\n",top_field_first);
- cprintf(" frame_pred_frame_dct=%d\n",frame_pred_frame_dct);
- cprintf(" concealment_motion_vectors=%d\n",concealment_motion_vectors);
- cprintf(" q_scale_type=%d\n",ld->q_scale_type);
- cprintf(" intra_vlc_format=%d\n",intra_vlc_format);
- cprintf(" alternate_scan=%d\n",ld->alternate_scan);
- cprintf(" repeat_first_field=%d\n",repeat_first_field);
- cprintf(" chroma_420_type=%d\n",chroma_420_type);
- cprintf(" progressive_frame=%d\n",progressive_frame);
- cprintf(" composite_display_flag=%d\n",composite_display_flag);
-
- if (composite_display_flag)
- {
- cprintf(" v_axis=%d\n",v_axis);
- cprintf(" field_sequence=%d\n",field_sequence);
- cprintf(" sub_carrier=%d\n",sub_carrier);
- cprintf(" burst_amplitude=%d\n",burst_amplitude);
- cprintf(" sub_carrier_phase=%d\n",sub_carrier_phase);
- }
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_picture_coding_extension++;
-#endif /* VERIFY */
-}
-
-
-/* decode picture spatial scalable extension */
-/* ISO/IEC 13818-2 section 6.2.3.5. */
-static void picture_spatial_scalable_extension()
-{
- int pos;
-
- pos = ld->Bitcnt;
-
- ld->pict_scal = 1; /* use spatial scalability in this picture */
-
- lower_layer_temporal_reference = Get_Bits(10);
- marker_bit("picture_spatial_scalable_extension(), first marker bit");
- lower_layer_horizontal_offset = Get_Bits(15);
- if (lower_layer_horizontal_offset>=16384)
- lower_layer_horizontal_offset-= 32768;
- marker_bit("picture_spatial_scalable_extension(), second marker bit");
- lower_layer_vertical_offset = Get_Bits(15);
- if (lower_layer_vertical_offset>=16384)
- lower_layer_vertical_offset-= 32768;
- spatial_temporal_weight_code_table_index = Get_Bits(2);
- lower_layer_progressive_frame = Get_Bits(1);
- lower_layer_deinterlaced_field_select = Get_Bits(1);
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- cprintf("picture spatial scalable extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- cprintf(" lower_layer_temporal_reference=%d\n",lower_layer_temporal_reference);
- cprintf(" lower_layer_horizontal_offset=%d\n",lower_layer_horizontal_offset);
- cprintf(" lower_layer_vertical_offset=%d\n",lower_layer_vertical_offset);
- cprintf(" spatial_temporal_weight_code_table_index=%d\n",
- spatial_temporal_weight_code_table_index);
- cprintf(" lower_layer_progressive_frame=%d\n",lower_layer_progressive_frame);
- cprintf(" lower_layer_deinterlaced_field_select=%d\n",lower_layer_deinterlaced_field_select);
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_picture_spatial_scalable_extension++;
-#endif /* VERIFY */
-
-}
-
-
-/* decode picture temporal scalable extension
- *
- * not implemented
- */
-/* ISO/IEC 13818-2 section 6.2.3.4. */
-static void picture_temporal_scalable_extension()
-{
- Error("temporal scalability not supported\n");
-
-#ifdef VERIFY
- verify_picture_temporal_scalable_extension++;
-#endif /* VERIFY */
-}
-
-
-/* decode extra bit information */
-/* ISO/IEC 13818-2 section 6.2.3.4. */
-static int extra_bit_information()
-{
- int Byte_Count = 0;
-
- while (Get_Bits1())
- {
- Flush_Buffer(8);
- Byte_Count++;
- }
-
- return(Byte_Count);
-}
-
-
-
-/* ISO/IEC 13818-2 section 5.3 */
-/* Purpose: this function is mainly designed to aid in bitstream conformance
- testing. A simple Flush_Buffer(1) would do */
-void marker_bit(text)
-char *text;
-{
- int marker;
-
- marker = Get_Bits(1);
-
-#ifdef VERIFY
- if(!marker)
- cprintf("ERROR: %s--marker_bit set to 0",text);
-#endif
-}
-
-
-/* ISO/IEC 13818-2 sections 6.3.4.1 and 6.2.2.2.2 */
-static void user_data()
-{
- /* skip ahead to the next start code */
- next_start_code();
-}
-
-
-
-/* Copyright extension */
-/* ISO/IEC 13818-2 section 6.2.3.6. */
-/* (header added in November, 1994 to the IS document) */
-
-
-static void copyright_extension()
-{
- int pos;
- int reserved_data;
-
- pos = ld->Bitcnt;
-
-
- copyright_flag = Get_Bits(1);
- copyright_identifier = Get_Bits(8);
- original_or_copy = Get_Bits(1);
-
- /* reserved */
- reserved_data = Get_Bits(7);
-
- marker_bit("copyright_extension(), first marker bit");
- copyright_number_1 = Get_Bits(20);
- marker_bit("copyright_extension(), second marker bit");
- copyright_number_2 = Get_Bits(22);
- marker_bit("copyright_extension(), third marker bit");
- copyright_number_3 = Get_Bits(22);
-
- if(Verbose_Flag>NO_LAYER)
- {
- cprintf("copyright_extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- cprintf(" copyright_flag =%d\n",copyright_flag);
-
- cprintf(" copyright_identifier=%d\n",copyright_identifier);
-
- cprintf(" original_or_copy = %d (original=1, copy=0)\n",
- original_or_copy);
-
- cprintf(" copyright_number_1=%d\n",copyright_number_1);
- cprintf(" copyright_number_2=%d\n",copyright_number_2);
- cprintf(" copyright_number_3=%d\n",copyright_number_3);
- }
- }
-
-#ifdef VERIFY
- verify_copyright_extension++;
-#endif /* VERIFY */
-}
-
-
-
-/* introduced in September 1995 to assist Spatial Scalability */
-static void Update_Temporal_Reference_Tacking_Data()
-{
- static int temporal_reference_wrap = 0;
- static int temporal_reference_old = 0;
-
- if (ld == &base) /* *CH* */
- {
- if (picture_coding_type!=B_TYPE && temporal_reference!=temporal_reference_old)
- /* check first field of */
- {
- /* non-B-frame */
- if (temporal_reference_wrap)
- {/* wrap occured at previous I- or P-frame */
- /* now all intervening B-frames which could
- still have high temporal_reference values are done */
- Temporal_Reference_Base += 1024;
- temporal_reference_wrap = 0;
- }
-
- /* distinguish from a reset */
- if (temporal_reference<temporal_reference_old && !Temporal_Reference_GOP_Reset)
- temporal_reference_wrap = 1; /* we must have just passed a GOP-Header! */
-
- temporal_reference_old = temporal_reference;
- Temporal_Reference_GOP_Reset = 0;
- }
-
- True_Framenum = Temporal_Reference_Base + temporal_reference;
-
- /* temporary wrap of TR at 1024 for M frames */
- if (temporal_reference_wrap && temporal_reference <= temporal_reference_old)
- True_Framenum += 1024;
-
- True_Framenum_max = (True_Framenum > True_Framenum_max) ?
- True_Framenum : True_Framenum_max;
- }
-}
Index: rel_1_2/fsf/mpeg2/idctref.c
===================================================================
--- rel_1_2/fsf/mpeg2/idctref.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/idctref.c (nonexistent)
@@ -1,108 +0,0 @@
-/* Reference_IDCT.c, Inverse Discrete Fourier Transform, double precision */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-/* Perform IEEE 1180 reference (64-bit floating point, separable 8x1
- * direct matrix multiply) Inverse Discrete Cosine Transform
-*/
-
-
-/* Here we use math.h to generate constants. Compiler results may
- vary a little */
-
-#include <math.h>
-
-#include "config.h"
-
-#ifndef PI
-# ifdef M_PI
-# define PI M_PI
-# else
-# define PI 3.14159265358979323846
-# endif
-#endif
-
-/* global declarations */
-void Initialize_Fast_IDCTref _ANSI_ARGS_((void));
-void Reference_IDCT _ANSI_ARGS_((short *block));
-
-/* private data */
-
-/* cosine transform matrix for 8x1 IDCT */
-static double c[8][8];
-
-/* initialize DCT coefficient matrix */
-
-void Initialize_Reference_IDCT()
-{
- int freq, time;
- double scale;
-
- for (freq=0; freq < 8; freq++)
- {
- scale = (freq == 0) ? sqrt(0.125) : 0.5;
- for (time=0; time<8; time++)
- c[freq][time] = scale*cos((PI/8.0)*freq*(time + 0.5));
- }
-}
-
-/* perform IDCT matrix multiply for 8x8 coefficient block */
-
-void Reference_IDCT(block)
-short *block;
-{
- int i, j, k, v;
- double partial_product;
- double tmp[64];
-
- for (i=0; i<8; i++)
- for (j=0; j<8; j++)
- {
- partial_product = 0.0;
-
- for (k=0; k<8; k++)
- partial_product+= c[k][j]*block[8*i+k];
-
- tmp[8*i+j] = partial_product;
- }
-
- /* Transpose operation is integrated into address mapping by switching
- loop order of i and j */
-
- for (j=0; j<8; j++)
- for (i=0; i<8; i++)
- {
- partial_product = 0.0;
-
- for (k=0; k<8; k++)
- partial_product+= c[k][i]*tmp[8*k+j];
-
- v = (int) floor(partial_product+0.5);
- block[8*i+j] = (v<-256) ? -256 : ((v>255) ? 255 : v);
- }
-}
Index: rel_1_2/fsf/mpeg2/idct.c
===================================================================
--- rel_1_2/fsf/mpeg2/idct.c (revision 1198)
+++ rel_1_2/fsf/mpeg2/idct.c (nonexistent)
@@ -1,211 +0,0 @@
-/* idct.c, inverse fast discrete cosine transform */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-/**********************************************************/
-/* inverse two dimensional DCT, Chen-Wang algorithm */
-/* (cf. IEEE ASSP-32, pp. 803-816, Aug. 1984) */
-/* 32-bit integer arithmetic (8 bit coefficients) */
-/* 11 mults, 29 adds per DCT */
-/* sE, 18.8.91 */
-/**********************************************************/
-/* coefficients extended to 12 bit for IEEE1180-1990 */
-/* compliance sE, 2.1.94 */
-/**********************************************************/
-
-/* this code assumes >> to be a two's-complement arithmetic */
-/* right shift: (-2)>>1 == -1 , (-3)>>1 == -2 */
-
-#include "config.h"
-
-#define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */
-#define W2 2676 /* 2048*sqrt(2)*cos(2*pi/16) */
-#define W3 2408 /* 2048*sqrt(2)*cos(3*pi/16) */
-#define W5 1609 /* 2048*sqrt(2)*cos(5*pi/16) */
-#define W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */
-#define W7 565 /* 2048*sqrt(2)*cos(7*pi/16) */
-
-/* global declarations */
-void Initialize_Fast_IDCT _ANSI_ARGS_((void));
-void Fast_IDCT _ANSI_ARGS_((short *block));
-
-/* private data */
-static short iclip[1024]; /* clipping table */
-static short *iclp;
-
-/* private prototypes */
-static void idctrow _ANSI_ARGS_((short *blk));
-static void idctcol _ANSI_ARGS_((short *blk));
-
-/* row (horizontal) IDCT
- *
- * 7 pi 1
- * dst[k] = sum c[l] * src[l] * cos( -- * ( k + - ) * l )
- * l=0 8 2
- *
- * where: c[0] = 128
- * c[1..7] = 128*sqrt(2)
- */
-
-static void idctrow(blk)
-short *blk;
-{
- int x0, x1, x2, x3, x4, x5, x6, x7, x8;
-
- /* shortcut */
- if (!((x1 = blk[4]<<11) | (x2 = blk[6]) | (x3 = blk[2]) |
- (x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))
- {
- blk[0]=blk[1]=blk[2]=blk[3]=blk[4]=blk[5]=blk[6]=blk[7]=blk[0]<<3;
- return;
- }
-
- x0 = (blk[0]<<11) + 128; /* for proper rounding in the fourth stage */
-
- /* first stage */
- x8 = W7*(x4+x5);
- x4 = x8 + (W1-W7)*x4;
- x5 = x8 - (W1+W7)*x5;
- x8 = W3*(x6+x7);
- x6 = x8 - (W3-W5)*x6;
- x7 = x8 - (W3+W5)*x7;
-
- /* second stage */
- x8 = x0 + x1;
- x0 -= x1;
- x1 = W6*(x3+x2);
- x2 = x1 - (W2+W6)*x2;
- x3 = x1 + (W2-W6)*x3;
- x1 = x4 + x6;
- x4 -= x6;
- x6 = x5 + x7;
- x5 -= x7;
-
- /* third stage */
- x7 = x8 + x3;
- x8 -= x3;
- x3 = x0 + x2;
- x0 -= x2;
- x2 = (181*(x4+x5)+128)>>8;
- x4 = (181*(x4-x5)+128)>>8;
-
- /* fourth stage */
- blk[0] = (x7+x1)>>8;
- blk[1] = (x3+x2)>>8;
- blk[2] = (x0+x4)>>8;
- blk[3] = (x8+x6)>>8;
- blk[4] = (x8-x6)>>8;
- blk[5] = (x0-x4)>>8;
- blk[6] = (x3-x2)>>8;
- blk[7] = (x7-x1)>>8;
-}
-
-/* column (vertical) IDCT
- *
- * 7 pi 1
- * dst[8*k] = sum c[l] * src[8*l] * cos( -- * ( k + - ) * l )
- * l=0 8 2
- *
- * where: c[0] = 1/1024
- * c[1..7] = (1/1024)*sqrt(2)
- */
-static void idctcol(blk)
-short *blk;
-{
- int x0, x1, x2, x3, x4, x5, x6, x7, x8;
-
- /* shortcut */
- if (!((x1 = (blk[8*4]<<8)) | (x2 = blk[8*6]) | (x3 = blk[8*2]) |
- (x4 = blk[8*1]) | (x5 = blk[8*7]) | (x6 = blk[8*5]) | (x7 = blk[8*3])))
- {
- blk[8*0]=blk[8*1]=blk[8*2]=blk[8*3]=blk[8*4]=blk[8*5]=blk[8*6]=blk[8*7]=
- iclp[(blk[8*0]+32)>>6];
- return;
- }
-
- x0 = (blk[8*0]<<8) + 8192;
-
- /* first stage */
- x8 = W7*(x4+x5) + 4;
- x4 = (x8+(W1-W7)*x4)>>3;
- x5 = (x8-(W1+W7)*x5)>>3;
- x8 = W3*(x6+x7) + 4;
- x6 = (x8-(W3-W5)*x6)>>3;
- x7 = (x8-(W3+W5)*x7)>>3;
-
- /* second stage */
- x8 = x0 + x1;
- x0 -= x1;
- x1 = W6*(x3+x2) + 4;
- x2 = (x1-(W2+W6)*x2)>>3;
- x3 = (x1+(W2-W6)*x3)>>3;
- x1 = x4 + x6;
- x4 -= x6;
- x6 = x5 + x7;
- x5 -= x7;
-
- /* third stage */
- x7 = x8 + x3;
- x8 -= x3;
- x3 = x0 + x2;
- x0 -= x2;
- x2 = (181*(x4+x5)+128)>>8;
- x4 = (181*(x4-x5)+128)>>8;
-
- /* fourth stage */
- blk[8*0] = iclp[(x7+x1)>>14];
- blk[8*1] = iclp[(x3+x2)>>14];
- blk[8*2] = iclp[(x0+x4)>>14];
- blk[8*3] = iclp[(x8+x6)>>14];
- blk[8*4] = iclp[(x8-x6)>>14];
- blk[8*5] = iclp[(x0-x4)>>14];
- blk[8*6] = iclp[(x3-x2)>>14];
- blk[8*7] = iclp[(x7-x1)>>14];
-}
-
-/* two dimensional inverse discrete cosine transform */
-void Fast_IDCT(block)
-short *block;
-{
- int i;
-
- for (i=0; i<8; i++)
- idctrow(block+8*i);
-
- for (i=0; i<8; i++)
- idctcol(block+i);
-}
-
-void Initialize_Fast_IDCT()
-{
- int i;
-
- iclp = iclip+512;
- for (i= -512; i<512; i++)
- iclp[i] = (i<-256) ? -256 : ((i>255) ? 255 : i);
-}
Index: rel_1_2/fsf/makefile
===================================================================
--- rel_1_2/fsf/makefile (revision 1198)
+++ rel_1_2/fsf/makefile (nonexistent)
@@ -1,23 +0,0 @@
-#
-#
-
-BASE=../..
-include $(BASE)/config/config.mk
-
-PROGS= test1 test2 test3
-
-MPEG2 = ./mpeg2/getbits.o ./mpeg2/getblk.o ./mpeg2/gethdr.o ./mpeg2/getpic.o\
- ./mpeg2/getvlc.o ./mpeg2/idct.o ./mpeg2/idctref.o ./mpeg2/motion.o\
- ./mpeg2/mpeg2dec.o ./mpeg2/recon.o ./mpeg2/spatscal.o ./mpeg2/store.o\
- ./mpeg2/subspic.o ./mpeg2/systems.o ./mpeg2/verify.o ./mpeg2/gvideo.o
-
-include $(BASE)/config/example.mk
-
-test1:
- make -f $(SUBMAKE) APP=test1 INIT= OTHEROBJS= OTHERINCL= SHARKOPT="__OLDCHAR__ __FIRST__"
-
-test2:
- make -f $(SUBMAKE) APP=test2 INIT= OTHEROBJS="initfile.o $(MPEG2)" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__ __FIRST__"
-test3:
- make -f $(SUBMAKE) APP=test3 INIT= OTHEROBJS= OTHERINCL= SHARKOPT="__OLDCHAR__ __FIRST__"
-
Index: rel_1_2/fsf/test1.c
===================================================================
--- rel_1_2/fsf/test1.c (revision 1198)
+++ rel_1_2/fsf/test1.c (nonexistent)
@@ -1,347 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Giacomo Guidi <giacomo@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-
-#include "modules/edf.h"
-#include "modules/cbs.h"
-
-#include "pthread.h"
-#include "modules/posix.h"
-
-#include "fsf_contract.h"
-#include "fsf_server.h"
-
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-#include <stdlib.h>
-
-// --------------------------------------------------
-// --------------------------------------------------
-// Init Part
-// --------------------------------------------------
-// --------------------------------------------------
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- int grubstar_level;
-
- EDF_register_level(EDF_ENABLE_ALL);
- POSIX_register_level(RRTICK, 1, mb, 32);
- grubstar_level = GRUBSTAR_register_level(4, 0);
- FSF_register_module(grubstar_level);
- dummy_register_level();
-
- // for the keyboard...
- CBS_register_level(CBS_ENABLE_ALL, 0);
-
- PI_register_module();
- PC_register_module();
-
- SEM_register_module();
-
- PTHREAD_register_module(1, 0, 1);
-
- return TICK;
-}
-
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-
-}
-
-// --------------------------------------------------
-// --------------------------------------------------
-// The Test
-// --------------------------------------------------
-// --------------------------------------------------
-
-pthread_t j1 = -1;
-pthread_t j2 = -1;
-pthread_t j3 = -1;
-pthread_t j4 = -1;
-fsf_server_id_t server1 = -1;
-fsf_server_id_t server2 = -1;
-fsf_server_id_t server3 = -1;
-fsf_server_id_t server4 = -1;
-fsf_contract_parameters_t contract1, contract2;
-
-pthread_mutex_t mux;
-
-#define TASK_PERIOD 1000000
-
-void *periodic_star(void *arg)
-{
- struct timespec actual,end,next_time;
- int actpersecond,act,cycle;
- int mean,nmean;
- bool was_deadline_missed, was_budget_overran;
-
- act = 0;
- actpersecond = 0;
- mean = 0;
- nmean = 0;
- cycle = 0;
- for (;;) {
-
- kern_gettime(&actual);
- cycle++;
-
- if (act == 0) {
- TIMESPEC_ASSIGN(&end,&actual);
- end.tv_sec++;
- }
-
- if (TIMESPEC_A_LT_B(&actual,&end)) {
- act++;
- } else {
- actpersecond = act;
- act = 0;
- mean = (mean * nmean + actpersecond) / (nmean+1);
- nmean++;
- }
-
- //pthread_mutex_lock(&mux);
- printf_xy(0,exec_shadow,WHITE,"Thread %3d Act_per_Second = %8d Mean = %8d Cycle = %8d",
- exec_shadow,actpersecond,mean,cycle);
- //pthread_mutex_unlock(&mux);
-
- kern_gettime(&next_time);
- ADDUSEC2TIMESPEC(TASK_PERIOD, &next_time);
- fsf_schedule_next_timed_job(NULL, NULL, NULL, &was_deadline_missed, &was_budget_overran);
-
- }
-
- return NULL;
-
-}
-
-void *star(void *arg)
-{
- struct timespec actual,end;
- int actpersecond,act;
- int mean,nmean,cycle;
-
- act = 0;
- actpersecond = 0;
- mean = 0;
- nmean = 0;
- cycle = 0;
- for (;;) {
-
- cycle++;
- kern_gettime(&actual);
-
- if (act == 0) {
- TIMESPEC_ASSIGN(&end,&actual);
- end.tv_sec++;
- }
-
- if (TIMESPEC_A_LT_B(&actual,&end)) {
- act++;
- } else {
- actpersecond = act;
- act = 0;
- mean = (mean * nmean + actpersecond) / (nmean+1);
- nmean++;
- }
-
- //pthread_mutex_lock(&mux);
- printf_xy(0,exec_shadow,WHITE,"Thread %3d Act_per_Second = %8d Mean = %8d Cycle = %8d",
- exec_shadow,actpersecond,mean,cycle);
- //pthread_mutex_unlock(&mux);
-
- }
-
- return NULL;
-
-}
-
-void *edftask(void *arg)
-{
- int i,j;
- while(1) {
- for (i=0;i<5; i++) {
- for (j=0; j<10; j++);
- //cputc('#');
- //cputs((char *)(arg));
- }
-
- task_endcycle();
- }
-
- return NULL;
-}
-
-
-void create()
-{
- HARD_TASK_MODEL mhard;
-
- struct timespec period1 = {0,100000000};
- struct timespec period2 = {0,100000000};
- struct timespec budget1 = {0,30000000};
- struct timespec budget2 = {0,30000000};
-
- PID t1, t2;
-
- kern_printf("(Start Create)");
-
- hard_task_default_model(mhard);
- hard_task_def_ctrl_jet(mhard);
- hard_task_def_mit(mhard,32000);
- hard_task_def_wcet(mhard,3000);
- hard_task_def_arg(mhard,(void *)"X");
- hard_task_def_group(mhard,1);
- hard_task_def_periodic(mhard);
-
- t1 = task_create("X", edftask, &mhard, NULL);
- if (t1 == NIL) {
- perror("Could not create task X ...");
- sys_end();
- }
-
- hard_task_def_mit(mhard,32000);
- hard_task_def_wcet(mhard,3000);
- hard_task_def_arg(mhard,(void *)"Y");
- t2 = task_create("Y", edftask, &mhard, NULL);
- if (t2 == NIL) {
- perror("Could not create task Y ...");
- sys_end();
- }
-
- group_activate(1);
-
- fsf_initialize_contract(&contract1);
- fsf_set_contract_basic_parameters(&contract1,&budget1,&period1,NULL,NULL,FSF_DEFAULT_WORKLOAD);
- fsf_initialize_contract(&contract2);
- fsf_set_contract_basic_parameters(&contract2,&budget2,&period2,NULL,NULL,FSF_DEFAULT_WORKLOAD);
-
- kern_printf("(End Create)");
-
-}
-
-int main(int argc, char **argv)
-{
-
- char ch = 0;
- int err;
-
- pthread_mutex_init(&mux,NULL);
-
- create();
-
- do {
- ch = keyb_getch(BLOCK);
-
- switch(ch) {
- case '1':
- err = fsf_create_thread(server1,&j1,NULL,star,NULL,NULL);
- kern_printf("(%d)",err);
- break;
- case '2':
- err = fsf_create_thread(server2,&j2,NULL,star,NULL,NULL);
- kern_printf("(%d)",err);
- break;
- case '3':
- err = fsf_create_thread(server1,&j3,NULL,star,NULL,NULL);
- kern_printf("(%d)",err);
- break;
- case '4':
- err = fsf_create_thread(server2,&j4,NULL,star,NULL,NULL);
- kern_printf("(%d)",err);
- break;
- case 'q':
- err = fsf_negotiate_contract(&contract1,&server1);
- cprintf("(%d)",err);
- break;
- case 'w':
- err = fsf_negotiate_contract(&contract2,&server2);
- kern_printf("(%d)",err);
- break;
- case 'e':
- err = fsf_negotiate_contract(&contract1,&server3);
- kern_printf("(%d)",err);
- break;
- case 'r':
- err = fsf_cancel_contract(&server1);
- kern_printf("(%d)",err);
- break;
- case 't':
- err = fsf_cancel_contract(&server2);
- kern_printf("(%d)",err);
- break;
- case 'y':
- err = fsf_cancel_contract(&server3);
- kern_printf("(%d)",err);
- break;
-
- }
-
- } while(ch != ESC);
-
- sys_end();
-
- return 0;
-
-}
-
Index: rel_1_2/fsf/test2.c
===================================================================
--- rel_1_2/fsf/test2.c (revision 1198)
+++ rel_1_2/fsf/test2.c (nonexistent)
@@ -1,301 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Giacomo Guidi <giacomo@gandalf.sssup.it>
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "kernel/kern.h"
-
-#include "fsf_contract.h"
-
-#include "stdlib.h"
-#include "unistd.h"
-#include "string.h"
-
-#include "pthread.h"
-
-#include "drivers/keyb.h"
-#include "drivers/glib.h"
-
-#define TEST_PERIOD 50000
-
-mutex_t mux;
-
-void program_key_end(KEY_EVT *k)
-{
-
- sys_end();
-
-}
-
-void print_timer(int x, int y)
-{
-
- long nsec,sec,min,hrs,day;
- struct timespec actual_timer;
- char tmp[100];
-
- sys_gettime(&actual_timer);
-
- nsec = actual_timer.tv_nsec;
- sec = actual_timer.tv_sec;
- min = sec / 60;
- sec %= 60;
- hrs = min / 60;
- min %= 60;
- day = hrs / 24;
- hrs %= 24;
-
- sprintf(tmp,"Time: %2ld d %2ld h %2ld m %2ld s %12ld ns",day,hrs,min,sec,(long)nsec);
- //mutex_lock(&mux);
- grx_text(tmp,x,y,rgb16(255,255,255),0);
- //mutex_unlock(&mux);
-
-}
-
-#define LOAD_VARIATION 10
-
-#define MAX_V_QOS 30
-#define MIN_V_QOS 2
-
-void *test_task_variable(void *arg) {
-
- char tmp[100];
-
- long long i;
- int task_qos;
- int var_load, rd_per;
-
- TIME exectime;
-
- task_qos = 7;
- var_load = 5;
- rd_per = 0;
-
- while(1) {
-
- print_timer(307,10+30*exec_shadow);
- sprintf(tmp,"Test Thread V QOS = %5d PID = %3d VLOAD = %3d",task_qos,exec_shadow,var_load);
-
- //mutex_lock(&mux);
- grx_text(tmp,307,20+30*exec_shadow,rgb16(255,255,255),0);
- //mutex_unlock(&mux);
-
- jet_gettable(exec_shadow, &exectime, 1);
- sprintf(tmp,"Thread Exec Timer = %10d us",(int)exectime);
- grx_text(tmp,307,30+30*exec_shadow,rgb16(255,255,255),0);
-
- if (rd_per > LOAD_VARIATION) {
- var_load += rand()%3-1;
- if (var_load > 20) var_load = 20;
- if (var_load < 0) var_load = 0;
- rd_per = 0;
- } else {
- rd_per++;
- }
-
- for(i = 0; i < 10000*(task_qos+var_load); i++);
-
- }
-
- return NULL;
-
-}
-
-#define MAX_C_QOS 30
-#define MIN_C_QOS 2
-
-void *test_task_constant(void *arg) {
-
- char tmp[100];
-
- long long i;
- int task_qos;
-
- task_qos = 7;
-
- while(1) {
-
- print_timer(307,10+20*exec_shadow);
- sprintf(tmp,"Test Task C QOS = %5d PID = %3d",task_qos,exec_shadow);
- //mutex_lock(&mux);
- grx_text(tmp,307,20+20*exec_shadow,rgb16(255,255,255),0);
- //mutex_unlock(&mux);
-
- for(i = 0; i < 10000*task_qos; i++);
-
- }
-
- return NULL;
-
-}
-
-void draw_box(int x1, int y1, int x2, int y2)
-{
-
- grx_rect(x1,y1,x2,y2,rgb16(160,160,160));
- grx_rect(x1+2,y1+2,x2-2,y2-2,rgb16(210,210,210));
-
-}
-
-void layout_screen()
-{
-
- draw_box(0,0,300,500);
- grx_text("Application Task List",5,5,rgb16(255,255,255),0);
-
- draw_box(303,0,799,500);
- grx_text("Task Output",305,5,rgb16(255,255,255),0);
-
- draw_box(0,503,799,599);
- grx_line(140,505,140,597,rgb16(255,255,255));
- grx_line(140,583,797,583,rgb16(255,255,255));
-
- grx_text("Application Statistics",142,507,rgb16(255,255,255),0);
-
-}
-
-void program_end()
-{
-
- grx_close();
-
-}
-
-void *mpeg2decoder(void *arg);
-
-void add_posixstar_thread(fsf_server_id_t server)
-{
-
- pthread_t j = -1;
-
- fsf_create_thread(server, &j, NULL, test_task_variable, NULL, NULL);
-
-}
-
-void add_edfstar_thread(fsf_server_id_t server)
-{
-
- pthread_t j = -1;
- HARD_TASK_MODEL ht;
-
- hard_task_default_model(ht);
- hard_task_def_mit(ht,100000);
- hard_task_def_wcet(ht,90000);
-
- fsf_create_thread(server, &j, NULL, mpeg2decoder, NULL, &ht);
-
-}
-
-int main(int argc, char **argv)
-{
-
- char ch;
- int err;
-
- KEY_EVT k;
-
- PI_mutexattr_t a;
-
- struct timespec period1 = {0,10000000};
- struct timespec period2 = {0,10000000};
- struct timespec budget1 = {0,4000000};
- struct timespec budget2 = {0,4000000};
-
- fsf_server_id_t server1, server2;
- fsf_contract_parameters_t contract1, contract2;
-
- sys_atrunlevel(program_end, NULL, RUNLEVEL_BEFORE_EXIT);
-
- k.flag = ALTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,program_key_end);
-
- srand(sys_gettime(NULL));
-
- // graphic card Initialization
- if (grx_init() < 1) {
- sys_end();
- }
-
- if (grx_open(800, 600, 16) < 0) {
- cprintf("GRX Err\n");
- sys_end();
- }
-
- layout_screen();
-
- PI_mutexattr_default(a);
-
- mutex_init(&mux,&a);
-
- fsf_initialize_contract(&contract1);
- fsf_set_contract_basic_parameters(&contract1,&budget1,&period1,NULL,NULL,FSF_DEFAULT_WORKLOAD);
- fsf_initialize_contract(&contract2);
- fsf_set_contract_basic_parameters(&contract2,&budget2,&period2,NULL,NULL,FSF_DEFAULT_WORKLOAD);
- fsf_set_local_scheduler_parameter(&contract2, FSF_SCHEDULER_EDF);
-
- err = fsf_negotiate_contract(&contract1,&server1);
- if (err) cprintf("(FSF ERROR %d)",err);
- err = fsf_negotiate_contract(&contract2,&server2);
- if (err) cprintf("(FSF ERROR %d)",err);
-
- ch = keyb_getch(BLOCK);
-
- while(ch != ESC) {
-
- switch (ch) {
-
- case '1':
- add_posixstar_thread(server1);
- break;
- case '2':
- add_edfstar_thread(server2);
- break;
- case '3':
- break;
- case '4':
- break;
- case '5':
- break;
- }
-
- ch = keyb_getch(BLOCK);
-
- }
-
- sys_end();
-
- return 0;
-
-}
Index: rel_1_2/tracer/utils/util.c
===================================================================
--- rel_1_2/tracer/utils/util.c (revision 1198)
+++ rel_1_2/tracer/utils/util.c (nonexistent)
@@ -1,203 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Massimiliano Giorgi
- * Copyright (C) 2002 Paolo Gai
- * Copyright (C) 2002 Tomas Lenvall
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * CVS : $Id: util.c,v 1.3 2003-07-24 12:22:11 giacomo Exp $
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <stdlib.h>
-
-#include "types.h"
-#include <trace.h>
-#include <types.h>
-
-static char *names[]={
- "reserved",
- "hoops",
- /*--*/
- "create",
- "activate",
- "schedule",
- "delay",
- "sleep",
- "endcycle",
- "destroy",
- "intactiv",
- "disable",
- /*--*/
- "user0",
- "user1",
- "user2",
- "user3",
- "user4",
- "user5",
- "user6",
- "user7",
- /*--*/
- "wait",
- "waitnb",
- "signal"
-};
-
-int classtable[TRC_NUMCLASSES+1]={
- TRC_F_TRACER,
- TRC_F_SYSTEM,
- TRC_F_USER,
- TRC_F_SEM,
- TRC_F_LAST
-};
-
-int event_class(int ev)
-{
- int i;
-
- if (ev < 0 || ev >= TRC_NUMEVENTS)
- return -1;
-
- for (i = 0; i < TRC_NUMCLASSES; i++)
- if (ev >= classtable[i] && ev < classtable[i+1])
- return i;
-
- return -1;
-}
-
-char *event_name(int ev)
-{
- if (ev<0||ev>=TRC_NUMEVENTS) return "unknown";
- return names[ev];
-}
-
-char *event_hexdump(u_int8_t *ptr,int maxsize)
-{
- static char buffer[256];
- int i;
- for (i=0;i<maxsize;i++) sprintf(buffer+i*2,"%02x",*(ptr+i));
- buffer[maxsize*2]='\0';
- return buffer;
-}
-
-char *event_strdump(u_int8_t *ptr, int maxsize)
-{
- static char buffer[256];
- memcpy(buffer,ptr,maxsize);
- buffer[maxsize]='\0';
- return buffer;
-}
-
-
-char *format_time(long time)
-{
- static char buffer[256];
-
- if (time<1000l) {
- sprintf(buffer,"%li",time);
- return buffer;
- }
- if (time<1000000l) {
- sprintf(buffer,"%li,%03li",time/1000l,time%1000l);
- return buffer;
- }
- sprintf(buffer,"%li,%03li,%03li",
- (time/1000000l),
- (time%1000000l)/1000l,
- time%1000l);
- return buffer;
-}
-
-#ifndef O_BINARY
-#define O_BINARY 0
-#endif
-
-int read_trace(char *filename,int (*func)(trc_event_t *))
-{
- trc_event_t buffer;
- int fin;
- int res;
-
- fin=open(filename,O_RDONLY|O_BINARY);
- if (fin==-1) return -1;
- for (;;) {
- res=read(fin,&buffer,sizeof(trc_event_t));
- if (res!=sizeof(trc_event_t)) {
- close(fin);
- return res==0?0:-2;
- }
- res=(*func)(&buffer);
- if (res!=0) {
- close(fin);
- return res;
- }
- }
- close(fin);
- return 0;
-}
-
-
-/* reads trace events from a udp message */
-int read_udp_trace(char *msg, int (*func)(trc_event_t *))
-{
- short int events; // temporary storage of nr of events
- int res;
-
- /* message:
- |2 bytes=nr of events|12 bytes=event 0|12 bytes=event 1|...
-
- Note: the size of an event depends on the extra informations that
- are put on the trc_event_t data structures. That size is
- currently 12 bytes, but it can change if additional fields are
- added to the trc_event_t structure. Including the
- include/trace/types.h header ensures that the size used in this
- application is coherent with the size of the compiled Shark
- applications...
- */
- events = *((short int *)msg);
-
- msg += 2; // skip the 2 first bytes
-
- for (;
- events > 0;
- events--, msg += sizeof(trc_event_t))
- res = (*func)((trc_event_t *)msg);
-
- return 1;
-}
-
Index: rel_1_2/tracer/utils/udpdump.c
===================================================================
--- rel_1_2/tracer/utils/udpdump.c (revision 1198)
+++ rel_1_2/tracer/utils/udpdump.c (nonexistent)
@@ -1,216 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Massimiliano Giorgi
- * Copyright (C) 2002 Paolo Gai
- * Copyright (C) 2002 Tomas Lenvall
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * CVS : $Id: udpdump.c,v 1.1 2002-10-28 08:07:32 pj Exp $
- */
-
-/* this example simply prints a Shark trace file */
-
-// INCLUDES
-#include <netinet/in.h>
-
-#include "types.h"
-#include "trace.h"
-#include "util.h"
-
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <unistd.h>/* close() */
-#include <string.h> /* memset() */
-#include <stdlib.h>
-
-
-// GLOBALS
-char server_ipaddr[20]; // Store the IP adress of the server
-
-// DEFINES
-#define LOCAL_SERVER_PORT 20000
-#define MAX_MSG 10000
-
-// FUNCTIONS
-/* */
-int dumpsys(trc_system_event_t *sys)
-{
- printf("%02i\n",sys->task);
- return 0;
-}
-
-/* */
-int dumpusr(trc_user_event_t *usr)
-{
- printf("%8li ",usr->n);
- printf("\n");
- return 0;
-}
-
-/* */
-int dumpsem(trc_sem_event_t *sem)
-{
- printf("on [%i]\n",sem->id);
- return 0;
-}
-
-/* */
-int dumpfunc(trc_event_t *ev)
-{
- static int counter=0;
-
- printf("\t%4i ",counter);
- counter++;
- printf("%12s ",format_time(ev->time));
- printf("%-10s ",event_name(ev->event));
-
- //printf("%08x\n",(unsigned)ev->sys.event);
- //return 0;
-
- switch(event_class(ev->event)) {
- case TRC_CLASS_SYSTEM: return dumpsys(&ev->x.sys);
- case TRC_CLASS_USER: return dumpusr(&ev->x.usr);
- case TRC_CLASS_SEM: return dumpsem(&ev->x.sem);
- }
- printf("\nEVENT %i... CLASS %i UNKNOWN!\n",ev->event,event_class(ev->event));
- return -1;
-}
-
-
-/* Use UDP/IP to receive the events from the client computer */
-int main(int argc, char *argv[])
-{
- int sd, rc, n, cliLen;
- struct sockaddr_in cliAddr, servAddr;
- char msg[MAX_MSG];
-
- // socket creation
- sd = socket(AF_INET, SOCK_DGRAM, 0);
- if(sd < 0) {
- printf("%s: cannot open socket \n",argv[0]);
- exit(1);
- }
-
- // bind local server port
- servAddr.sin_family = AF_INET;
-
- servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servAddr.sin_port = htons(LOCAL_SERVER_PORT);
-
- rc = bind (sd, (struct sockaddr *)&servAddr,sizeof(servAddr));
- if(rc < 0) {
- printf("%s: cannot bind port number %d \n",
- argv[0], LOCAL_SERVER_PORT);
- exit(1);
- }
-
- while(1){
-
- // init buffer
- memset(msg, 0x0, MAX_MSG);
-
- // receive message
- cliLen = sizeof(cliAddr);
- n = recvfrom(sd, msg, MAX_MSG, 0,(struct sockaddr *)&cliAddr, &cliLen);
-
- printf("Packet received, length %d, %d tracer events.\n", n,
- *((short int *)msg));
-
- if(n < 0) {
- printf("%s: cannot receive data \n",argv[0]);
- continue;
- }
-
- // Read the trace we got from the network
- read_udp_trace(msg, dumpfunc);
- }
-
- return 0;
-}
-
-
-// test main: testing this program from a file (simulating a network package)
-// ONLY USED FOR TESTING!!!
-
-/*int main(int argc, char *argv[])
-{
- FILE* fin;
- int nr_of_events = 0;
- trc_event_t buffer;
- char all_events[1000];
- char tmpbuf[2];
-
- if(argc != 2) {
- printf("Missing filename!\n");
- return -1;
- }
-
- // open the file and send event by event
- fin = fopen(argv[1], "r");
- if (fin == NULL) {
- printf("Cannot open file\n");
- return -1;
- }
-
- // check how many events
- while (!feof(fin)) {
- fread(&buffer, sizeof(trc_event_t), 1, fin);
- nr_of_events++;
- }
-
- //printf("Nr of events: %d\n", nr_of_events);
-
- rewind(fin); // start from the beginning again...
- //strncpy(tmpbuf, itoa(nr_of_events), 2);
- sprintf(tmpbuf, "%d", nr_of_events);
- //printf("tmpbuf: %s\n", tmpbuf);
-
- memset(all_events, 0, 1000);
- memcpy(all_events, tmpbuf, 2);
- printf("all_events(1): %s\n", all_events);
- // read all tracer events and store them in an array
- fread(all_events + 2, sizeof(trc_event_t), nr_of_events, fin);
- fclose(fin);
-
- printf("all_events(2): %s\n", all_events);
- // send it to the event reader
- read_trace(all_events, dumpfunc);
-
- return 1;
-}
-*/
Index: rel_1_2/tracer/utils/jdump.c
===================================================================
--- rel_1_2/tracer/utils/jdump.c (revision 1198)
+++ rel_1_2/tracer/utils/jdump.c (nonexistent)
@@ -1,470 +0,0 @@
-/*
- * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Gerardo Lamastra <gerardo@sssup.it>
- *
- * Authors : Massimiliano Giorgi <massy@hartik.sssup.it>
- * (see authors.txt for full list of hartik's authors)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://hartik.sssup.it
- */
-
-/*
- * Copyright (C) 1999 Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: jdump.c,v 1.3 2003-07-24 12:22:11 giacomo Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.3 $
- * Last update: $Date: 2003-07-24 12:22:11 $
- */
-
-#include <netinet/in.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#include "types.h"
-#include <trace.h>
-#include "util.h"
-
-/*
- *
- * This filter converts trace file formats from SHARK to JTRACER
- *
- */
-
-/* All times are dived by this costant. */
-#define TIMESCALE 1
-
-/* If defined dump on stdout the packets (in ascii) that will be written
- * on the output file (the file of the tracer).
- */
-
-#define DUMPOUT
-
-/*
- *
- *
- *
- */
-
-int pippo=0;
-
-int writeInt(int h, int x)
-{
- int y,res;
- y=htonl(x);
- res=write(h,&y,sizeof(int));
- return res!=sizeof(int);
-}
-
-
-int writeStr(int h, char *s)
-{
- int res,size;
- size=strlen(s);
- writeInt(h,size);
- res=write(h,s,size);
- return res!=size;
-}
-
-/*
- *
- */
-
-#define TASK_ARRIVAL 0
-#define TASK_SCHEDULE 1
-#define TASK_DESCHEDULE 2
-#define TASK_END 3
-#define TASK_DLINEPOST 4
-#define TASK_DLINESET 5
-#define TASK_WAIT 6
-#define TASK_SIGNAL 7
-#define TASK_IDLE 8
-#define TASK_NAME 9
-
-#define EVT_NUMBER 10
-
-char *eventsname[]={
- "task_arrival",
- "task_schedule",
- "task_deschedule",
- "task_end",
- "task_dlinepost",
- "task_dlineset",
- "task_wait",
- "task_signal",
- "task_idle",
- "task_name"
-};
-
-struct j_evt_prolog {
- int type;
- int time;
-};
-
-struct j_evt_task {
- struct j_evt_prolog p;
- int task;
-};
-
-struct j_evt_dlinepost {
- struct j_evt_task t;
- int taskD;
- int taskD2;
-};
-
-struct j_evt_dlineset {
- struct j_evt_task t;
- int taskD;
-};
-
-struct j_evt_semaph {
- struct j_evt_task t;
- int res;
- char *name;
-};
-
-struct j_evt_name {
- struct j_evt_task t;
- char *name;
-};
-
-/*
- *
- */
-
-int j_write_prolog(int h, void *ptr)
-{
-#ifdef DUMPOUT
- printf("%10i ",((struct j_evt_prolog *)ptr)->time);
- printf("%-18s ",eventsname[((struct j_evt_prolog *)ptr)->type]);
-#endif
- if (writeInt(h,((struct j_evt_prolog *)ptr)->type)) return -2;
- if (writeInt(h,((struct j_evt_prolog *)ptr)->time)) return -3;
- return 0;
-}
-
-int j_write_task(int h, void *ptr)
-{
- int res;
- res=j_write_prolog(h,ptr);
-#ifdef DUMPOUT
- printf("tsk=%i ",((struct j_evt_task *)ptr)->task);
-#endif
- if (res) return res;
- if (writeInt(h,((struct j_evt_task *)ptr)->task)) return -4;
- return 0;
-}
-
-int j_write_dlinepost(int h, void *ptr)
-{
- int res;
- res=j_write_task(h,ptr);
- if (res) return res;
- if (writeInt(h,((struct j_evt_dlinepost *)ptr)->taskD)) return -5;
- if (writeInt(h,((struct j_evt_dlinepost *)ptr)->taskD2)) return -6;
- return 0;
-}
-
-int j_write_dlineset(int h, void *ptr)
-{
- int res;
- res=j_write_task(h,ptr);
- if (res) return res;
- if (writeInt(h,((struct j_evt_dlineset *)ptr)->taskD)) return -7;
- return 0;
-}
-
-int j_write_semaph(int h, void *ptr)
-{
- int res;
- res=j_write_task(h,ptr);
- if (res) return res;
- if (writeInt(h,((struct j_evt_semaph *)ptr)->res)) return -8;
- if (writeStr(h,((struct j_evt_semaph *)ptr)->name)) return -9;
- return 0;
-}
-
-int j_write_name(int h, void *ptr)
-{
- int res;
- res=j_write_task(h,ptr);
-#ifdef DUMPOUT
- printf("name='%s' ",((struct j_evt_name *)ptr)->name);
-#endif
- if (res) return res;
- if (writeStr(h,((struct j_evt_name *)ptr)->name)) return -10;
- return 0;
-}
-
-int writeEvent(int h, void *ptr)
-{
- int res;
-
- //printf("<%i>",((struct j_evt_prolog*)ptr)->type);
-
- ((struct j_evt_prolog*)ptr)->time/=TIMESCALE;
-
- switch(((struct j_evt_prolog*)ptr)->type) {
- case TASK_ARRIVAL:
- case TASK_SCHEDULE:
- case TASK_DESCHEDULE:
- case TASK_END:
- case TASK_IDLE:
- res=j_write_task(h,ptr);
- break;
- case TASK_DLINEPOST:
- res=j_write_dlinepost(h,ptr);
- break;
- case TASK_DLINESET:
- res=j_write_dlineset(h,ptr);
- break;
- case TASK_WAIT:
- case TASK_SIGNAL:
- res=j_write_semaph(h,ptr);
- break;
- case TASK_NAME:
- res=j_write_name(h,ptr);
- break;
- default:
- return -1;
-
- }
-
-#ifdef DUMPOUT
- printf(" \n");
-#endif
-
- return res;
-}
-
-/*
- *
- *
- *
- */
-
-#define MAX_PROC 150
-
-//int activated[MAX_PROC];
-
-int cxx=0;
-/* write MAXC-1 events */
-#define MAXC 10000
-
-long lasttime;
-
-int sys_event(int h, void *param)
-{
- static int prevtask=-1;
- trc_event_t *ptr=(trc_event_t *)param;
- struct j_evt_task evt;
-
- evt.p.time=ptr->time;
- evt.task=ptr->x.sys.task;
-
- lasttime=ptr->time;
- switch(ptr->event) {
-
- case TRC_CREATE:
- return 0;
-
- case TRC_ACTIVATE:
- case TRC_INTACTIVATION:
-
-
- //activated[ptr->x.sys.task]=1;
-
-
- evt.p.type=TASK_ARRIVAL;
- break;
-
- case TRC_DESTROY:
-
-
- //activated[ptr->x.sys.task]=0;
-
-
-
- return 0;
-
- case TRC_DISABLE:
-
- return 0;
-
- case TRC_DELAY:
- prevtask=-1;
- evt.p.type=TASK_DESCHEDULE;
- break;
-
- case TRC_SLEEP:
- prevtask=-1;
- evt.p.type=TASK_DESCHEDULE;
- break;
-
- case TRC_ENDCYCLE:
- prevtask=-1;
- evt.p.type=TASK_END;
- break;
-
- case TRC_SCHEDULE:
- if (prevtask!=-1) {
- struct j_evt_task evt2;
- int res;
- evt2.p.time=ptr->time;
- evt2.p.type=TASK_DESCHEDULE;
- evt2.task=prevtask;
- res=writeEvent(h,&evt2);
- if (res!=0) return -1;
- }
-
- /*
- if (!activated[ptr->x.sys.task]) {
- struct j_evt_task evt2;
-
- evt2.p.time=ptr->time-1;
- evt2.task=ptr->x.sys.task;
- evt2.p.type=TASK_ARRIVAL;
-
- writeEvent(h,&evt2);
-
- activated[ptr->x.sys.task]=1;
- }
- */
-
- evt.p.type=TASK_SCHEDULE;
- prevtask=ptr->x.sys.task;
- break;
-
- default:
- return 0;
- }
-
- cxx++;
- if (cxx==MAXC) return -1;
-
- return writeEvent(h,&evt);
-}
-
-
-int sem_event(int h,void *param)
-{
- //trc_event_t *ptr=(trc_event_t *)param;
- //struct j_evt_semaph evt;
-
- return 0;
- /*
- evt.t.p.time=ptr->x.norm.when;
- evt.t.task=ptr->x.norm.who;
- switch(ptr->what) {
- case TRC_SEM_WAIT: evt.t.p.type=TASK_WAIT; break;
- case TRC_SEM_SIGNAL: evt.t.p.type=TASK_SIGNAL; break;
- case TRC_SEM_WAITNB: return 0;
- default: return 0;
- }
- evt.res=1;
- evt.name="NoName";
- return j_write_semaph(h,&evt);
- */
-}
-
-/* -- */
-
-#define MAX_PROC 150
-int names[MAX_PROC];
-
-int outfile;
-
-int dumpfunc(trc_event_t *ptr)
-{
- //printf("{%i}",ptr->event);
-
- if (!names[ptr->x.sys.task]) {
- struct j_evt_name evtname;
- static char name[24];
-
- cxx++;
- if (cxx==MAXC) return -1;
-
- evtname.t.p.time=lasttime;
- evtname.t.task=ptr->x.sys.task;
- evtname.t.p.type=TASK_NAME;
- sprintf(name,"task%03i",ptr->x.sys.task);
- evtname.name=name;
- writeEvent(outfile,&evtname);
- names[ptr->x.sys.task]=1;
-
- }
-
- switch(event_class(ptr->event)) {
- case TRC_CLASS_SYSTEM:
- return sys_event(outfile,ptr);
- case TRC_CLASS_SEM:
- return 0;
- return sem_event(outfile,ptr);
- case TRC_CLASS_USER:
- return 0;
- }
- return 0;
-}
-
-/*
- *
- */
-
-#ifndef O_BINARY
-#define O_BINARY 0
-#endif
-
-int main(int argc, char *argv[])
-{
- int res;
- int i;
-
- if (argc!=3) {
- fprintf(stderr,"missing filenames\n");
- fprintf(stderr,"usage: jdump SHARKtracefilename JTRACERtracefilename\n");
- return -1;
- }
-
- for (i=0;i<MAX_PROC;i++) {
- names[i]=0;
- //activated[i]=0;
- }
-
- outfile=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,0777);
- if (outfile==-1) {
- perror("can't open outfile");
- return -1;
- }
- res=read_trace(argv[1],dumpfunc);
- close(outfile);
-
- //fprintf(stderr,"result=%i",res);
- return 0;
-}
Index: rel_1_2/tracer/utils/util.h
===================================================================
--- rel_1_2/tracer/utils/util.h (revision 1198)
+++ rel_1_2/tracer/utils/util.h (nonexistent)
@@ -1,58 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Massimiliano Giorgi
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * CVS : $Id: util.h,v 1.2 2002-10-28 08:07:32 pj Exp $
- */
-
-#ifndef __UTIL_H
-#define __UTIL_H
-
-#include "types.h"
-
-char *event_name(int evt);
-char *event_hexdump(u_int8_t *ptr, int maxsize);
-char *event_strdump(u_int8_t *ptr, int maxsize);
-int event_class(int evt);
-
-int read_trace(char *filename,int (*func)(trc_event_t *));
-int read_udp_trace(void *msg, int (*func)(trc_event_t *));
-
-char *format_time(long time);
-
-#endif
-
Index: rel_1_2/tracer/utils/sa.c
===================================================================
--- rel_1_2/tracer/utils/sa.c (revision 1198)
+++ rel_1_2/tracer/utils/sa.c (nonexistent)
@@ -1,120 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * CVS : $Id: sa.c,v 1.2 2002-10-28 08:07:32 pj Exp $
- */
-
-#include <netinet/in.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include "types.h"
-#include <trace.h>
-#include "util.h"
-
-/* this file prints the distribution of (schedule_time - arrival_time) */
-
-#define MAXX 50
-#define PREC 100
-#define DELTA ((double)MAXX/(double)PREC)
-
-#include "distr.c"
-
-int task;
-long a=-1;
-long s;
-
-int safunc(trc_event_t *ev)
-{
- if (event_class(ev->event)!=TRC_CLASS_SYSTEM) return 0;
-
- if (ev->x.sys.task!=task) return 0;
-
- if (a==-1) {
- if (ev->event==TRC_ACTIVATE||ev->event==TRC_INTACTIVATION)
- a=ev->time;
- } else {
- if (ev->event==TRC_SCHEDULE) {
- s=ev->time;
- d_insert(s-a);
- a=-1;
- }
- }
- return 0;
-}
-
-/* -- */
-
-int main(int argc, char *argv[])
-{
- int res;
-
- if (argc!=4) {
- fprintf(stderr,"usage: sa [tracefile] [pid] [outputfile]\n");
- return -1;
- }
-
- d_init();
-
- task=atoi(argv[2]);
- res=read_trace(argv[1],safunc);
-
- if (res==0) {
- FILE *fout;
- fout=fopen(argv[3],"wt");
- if (fout==NULL) {
- fprintf(stderr,"error writing output file!\n");
- return 0;
- }
- d_dump(fout);
- fclose(fout);
- }
-
- if (res!=0) {
- fprintf(stderr,"error=%i\n",res);
- perror("ERROR");
- }
-
- return 0;
-}
-
-
-
-
-
-
-
Index: rel_1_2/tracer/utils/wait.c
===================================================================
--- rel_1_2/tracer/utils/wait.c (revision 1198)
+++ rel_1_2/tracer/utils/wait.c (nonexistent)
@@ -1,95 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * CVS : $Id: wait.c,v 1.2 2002-10-28 08:07:32 pj Exp $
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "types.h"
-#include <trace.h>
-#include "util.h"
-
-/* This demo computes the distribution of the wait times on disk requests */
-
-#define MAXX 37000
-#define PREC 37000
-#define DELTA ((double)MAXX/(double)PREC)
-
-#include "distr.c"
-
-int task;
-long a=-1;
-
-int waitfunc(trc_event_t *ev)
-{
- if (event_class(ev->event)!=TRC_CLASS_USER) return 0;
- if (ev->x.usr.n!=task) return 0;
- if (ev->event==TRC_USER1) {
- a=ev->time;
- return 0;
- }
- if (ev->event==TRC_USER2) {
- if (a!=-1) d_insert(ev->time-a);
- a=-1;
- }
- return 0;
-}
-
-int main(int argc, char *argv[])
-{
- FILE *fout;
- int res;
- if (argc!=4) {
- fprintf(stderr,"missing filename!\n");
- return -1;
- }
- d_init();
- task=atoi(argv[2]);
- res=read_trace(argv[1],waitfunc);
- if (res==0) {
- fout=fopen(argv[3],"wt");
- if (fout!=NULL) {
- d_dump(fout);
- fclose(fout);
- } else
- fprintf(stderr,"can't create output file!\n");
- } else
- fprintf(stderr,"read_trace error\n");
-
- return 0;
-}
Index: rel_1_2/tracer/utils/distr.c
===================================================================
--- rel_1_2/tracer/utils/distr.c (revision 1198)
+++ rel_1_2/tracer/utils/distr.c (nonexistent)
@@ -1,83 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * CVS : $Id: distr.c,v 1.2 2002-10-28 08:07:32 pj Exp $
- */
-
-long t[PREC];
-long counter;
-long hoops;
-long maxv=0;
-
-void d_init(void)
-{
- int i;
- hoops=counter=0;
- for (i=0;i<PREC;i++) t[i]=0;
-}
-
-void d_insert(long d)
-{
- if (d>=MAXX) {
- hoops++;
- if (d>maxv) maxv=d;
- return;
- }
-
- counter++;
- t[(int)(d/DELTA)]++;
-}
-
-void d_dump(FILE *fout)
-{
- int i;
-
- if (counter==0) {
- fprintf(stderr,"nothing to write to the output file\n");
- return;
- }
-
- if (hoops) {
- fprintf(stderr,"%li values to big (max=%li)\n",hoops,maxv);
- }
-
- for (i=0;i<PREC;i++)
- fprintf(fout,"%f %f\n",
- DELTA/2.0+DELTA*i,
- (double)t[i]/(double)counter
- );
-}
Index: rel_1_2/tracer/utils/road.c
===================================================================
--- rel_1_2/tracer/utils/road.c (revision 1198)
+++ rel_1_2/tracer/utils/road.c (nonexistent)
@@ -1,96 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * CVS : $Id: road.c,v 1.2 2002-10-28 08:07:32 pj Exp $
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "types.h"
-#include <trace.h>
-#include "util.h"
-
-
-/* this test prints the distribution of the HD seeks */
-
-#define MAXX 1000
-#define PREC 1000
-#define DELTA ((double)MAXX/(double)PREC)
-
-#include "distr.c"
-
-int dumpusr(int event, trc_user_event_t *usr)
-{
- static long last=-1;
- long d;
- if (event!=TRC_USER0) return 0;
- if (last!=-1) {
- d=abs(last-usr->n);
- d_insert(d);
- }
- last=usr->n;
- return 0;
-}
-
-int dumpfunc(trc_event_t *ev)
-{
- if (event_class(ev->event)==TRC_CLASS_USER) dumpusr(ev->event,&ev->x.usr);
- return 0;
-}
-
-int main(int argc, char *argv[])
-{
- FILE *fout;
- int res;
- if (argc!=3) {
- fprintf(stderr,"missing filename!\n");
- return -1;
- }
- d_init();
- res=read_trace(argv[1],dumpfunc);
- if (res==0) {
- fout=fopen(argv[2],"wt");
- if (fout!=NULL) {
- d_dump(fout);
- fclose(fout);
- } else
- fprintf(stderr,"can't create output file!\n");
- } else
- fprintf(stderr,"read_trace error\n");
-
- return 0;
-}
Index: rel_1_2/tracer/utils/types.h
===================================================================
--- rel_1_2/tracer/utils/types.h (revision 1198)
+++ rel_1_2/tracer/utils/types.h (nonexistent)
@@ -1,55 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Massimiliano Giorgi
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * CVS : $Id: types.h,v 1.2 2002-10-28 08:07:32 pj Exp $
- */
-
-#ifndef __TYPES_H__
-#define __TYPES_H__
-
-#include <sys/types.h>
-
-/* when compiling under MSDOS, uncomment this three typedefs!!! */
-
-//typedef unsigned char u_int8_t;
-//typedef unsigned short u_int16_t;
-//typedef unsigned long u_int32_t;
-
-#include <types.h>
-#endif
-
Index: rel_1_2/tracer/utils/tdump.c
===================================================================
--- rel_1_2/tracer/utils/tdump.c (revision 1198)
+++ rel_1_2/tracer/utils/tdump.c (nonexistent)
@@ -1,115 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Massimiliano Giorgi
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * CVS : $Id: tdump.c,v 1.2 2002-10-28 08:07:32 pj Exp $
- */
-
-/* this example simply prints a Shark trace file */
-
-#include <netinet/in.h>
-
-#include <stdio.h>
-#include "types.h"
-#include <trace.h>
-#include "util.h"
-
-int dumpsys(trc_system_event_t *sys)
-{
- /*
- if (sys->event==TRC_SCHEDULE) {
- //if (sys->prev!=65535)
- // printf("%02i->%02i\n",sys->prev,sys->task);
- //else
- printf("??->%02i\n",sys->task);
- return 0;
- }
- */
- printf("%02i\n",sys->task);
- return 0;
-}
-
-int dumpusr(trc_user_event_t *usr)
-{
- printf("%8li ",usr->n);
- printf("\n");
- return 0;
-}
-
-int dumpsem(trc_sem_event_t *sem)
-{
- printf("on [%i]\n",sem->id);
- return 0;
-}
-
-int dumpfunc(trc_event_t *ev)
-{
- static int counter=0;
-
- printf("%4i ",counter);
- counter++;
- printf("%12s ",format_time(ev->time));
- printf("%-10s ",event_name(ev->event));
-
- //printf("%08x\n",(unsigned)ev->sys.event);
- //return 0;
-
- switch(event_class(ev->event)) {
- case TRC_CLASS_SYSTEM: return dumpsys(&ev->x.sys);
- case TRC_CLASS_USER: return dumpusr(&ev->x.usr);
- case TRC_CLASS_SEM: return dumpsem(&ev->x.sem);
- }
- printf("\nEVENT %i... CLASS %i UNKNOWN!\n",ev->event,event_class(ev->event));
- return -1;
-}
-
-int main(int argc, char *argv[])
-{
- int res;
-
- if (argc!=2) {
- fprintf(stderr,"missing filename!\n");
- return -1;
- }
-
- res=read_trace(argv[1],dumpfunc);
-
- //fprintf(stderr,"result=%i\n",res);
- //fprintf(stderr,"size=%li\n",sizeof(trc_event_t));
-
- return 0;
-}
Index: rel_1_2/tracer/utils/readme
===================================================================
--- rel_1_2/tracer/utils/readme (revision 1198)
+++ rel_1_2/tracer/utils/readme (nonexistent)
@@ -1,13 +0,0 @@
-This directory contains a set of utilities that can be used to interpret
-the tracer output:
-
-- tdump this example simply prints a Shark trace file
-- jdump converts trace file formats from SHARK to JTRACER
-- sa prints the distribution of (schedule_time - arrival_time)
-- road prints the distribution of the HD seeks
-- wait computes the distribution of the wait times on disk requests
-
-Under Linux: to compile, type "make util_linux"
-Under MSDOS: uncomment the three lines into types.h, then type "make util_dos"
-
-PJ
Index: rel_1_2/tracer/utils/makefile
===================================================================
--- rel_1_2/tracer/utils/makefile (revision 1198)
+++ rel_1_2/tracer/utils/makefile (nonexistent)
@@ -1,70 +0,0 @@
-#
-# util -> compiles the tracer utilities under MSDOS/DJGPP
-# util_linux -> compiles the tracer utilities under Linux
-#
-
-ifndef BASE
-BASE=../../..
-endif
-
-.PHONY: util_dos util_linux clean
-
-all:
- @echo Targets: util_dos util_linux clean
- @echo Note: udpdump is available only under linux
-
-util_dos: tdump.exe jdump.exe sa.exe road.exe wait.exe
-
-tdump.exe: tdump.c util.c
- gcc -s -Wimplicit-function-declaration -Wall \
- -I$(BASE)/include/trace tdump.c util.c -o tdump.exe
-
-jdump.exe: jdump.c util.c
- gcc -s -Wimplicit-function-declaration -Wall \
- -I$(BASE)/include/trace jdump.c util.c -o jdump.exe
-
-sa.exe: sa.c util.c distr.c
- gcc -s -Wimplicit-function-declaration -Wall \
- -I$(BASE)/include/trace sa.c util.c -o sa.exe
-
-road.exe: road.c util.c distr.c
- gcc -s -Wimplicit-function-declaration -Wall \
- -I$(BASE)/include/trace road.c util.c -o road.exe
-
-wait.exe: wait.c util.c distr.c
- gcc -s -Wimplicit-function-declaration -Wall \
- -I$(BASE)/include/trace wait.c util.c -o wait.exe
-
-
-util_linux: jdump tdump sa road wait udpdump
-
-jdump: jdump.c util.c
- gcc -s -Wimplicit-function-declaration -Wall \
- -I$(BASE)/include/trace -I$(BASE)/oslib jdump.c util.c -o jdump
-
-tdump: tdump.c util.c
- gcc -s -Wimplicit-function-declaration -Wall \
- -I$(BASE)/include/trace -I$(BASE)/oslib tdump.c util.c -o tdump
-
-sa: sa.c util.c distr.c
- gcc -s -Wimplicit-function-declaration -Wall \
- -I$(BASE)/include/trace -I$(BASE)/oslib sa.c util.c -o sa
-
-road: road.c util.c distr.c
- gcc -s -Wimplicit-function-declaration -Wall \
- -I$(BASE)/include/trace -I$(BASE)/oslib road.c util.c -o road
-
-wait: wait.c util.c distr.c
- gcc -s -Wimplicit-function-declaration -Wall \
- -I$(BASE)/include/trace -I$(BASE)/oslib wait.c util.c -o wait
-
-udpdump: udpdump.c util.c
- gcc -Wimplicit-function-declaration -Wall -ggdb\
- -I$(BASE)/include/trace -I$(BASE)/oslib udpdump.c util.c -o udpdump
-
-
-
-clean:
- rm -rf *.o jdump tdump sa road wait tdump.exe jdump.exe sa.exe road.exe wait.exe
-
-
Index: rel_1_2/tracer/dfixed/readme
===================================================================
--- rel_1_2/tracer/dfixed/readme (revision 1198)
+++ rel_1_2/tracer/dfixed/readme (nonexistent)
@@ -1,8 +0,0 @@
-This is a simple test that uses the tracer.
-
-The example simply creates a soft task that does 10 instances and then dies.
-It uses a DOSFS Fixed queue to write the output on a file.
-
-Enjoy,
-
-PJ
Index: rel_1_2/tracer/dfixed/makefile
===================================================================
--- rel_1_2/tracer/dfixed/makefile (revision 1198)
+++ rel_1_2/tracer/dfixed/makefile (nonexistent)
@@ -1,21 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../../..
-endif
-
-include $(BASE)/config/config.mk
-
-PROGS= dfixed
-
-include $(BASE)/config/example.mk
-
-dfixed:
- make -f $(SUBMAKE) BASE=$(BASE) APP=dfixed INIT= OTHEROBJS=initfile.o SHARKOPT=__OLDCHAR__
-
-
-
-
-
Index: rel_1_2/tracer/dfixed/dfixed.c
===================================================================
--- rel_1_2/tracer/dfixed/dfixed.c (revision 1198)
+++ rel_1_2/tracer/dfixed/dfixed.c (nonexistent)
@@ -1,133 +0,0 @@
-/*
- * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Gerardo Lamastra <gerardo@sssup.it>
- *
- * Authors : Massimiliano Giorgi <massy@hartik.sssup.it>
- * (see authors.txt for full list of hartik's authors)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://hartik.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: dfixed.c,v 1.1 2002-10-21 09:12:35 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1 $
- * Last update: $Date: 2002-10-21 09:12:35 $
- */
-
-/*
- * Example of tracer initialization.
- */
-
-#include <ll/i386/cons.h>
-
-#include <kernel/func.h>
-#include <kernel/trace.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <drivers/keyb.h>
-
-#include <trace/trace.h>
-#include <trace/queues.h>
-
-#include <sys/mount.h>
-#include <stddef.h>
-
-
-void mytracer_prologue(void)
-{
- int myqueue;
- TRC_PARMS p;
- TRC_FIXED_PARMS f;
-
- trc_default_parms(p);
- trc_def_path(p,"");
-
- trc_fixed_default_parms(f);
- trc_fixed_def_filename(f,"fixed");
-
- /* Tracer Initialization */
- /* the first functions to call... parameters can be passed */
- TRC_init_phase1(&p);
-
- /* all the tracer queue types must be registered */
- trc_register_dosfs_fixed_queue();
-
- /* then, we create all the queues we need */
- myqueue = trc_create_queue(TRC_DOSFS_FIXED_QUEUE,&f);
-
- /* Then, we say that events must be sent to a particular queue */
- trc_trace_class(TRC_CLASS_SYSTEM);
- trc_assign_class_to_queue(TRC_CLASS_SYSTEM, myqueue);
-}
-
-void mytracer_epilogue(void)
-{
- TRC_init_phase2();
-}
-
-void ctrlc_exit(KEY_EVT *k)
-{
- sys_end();
-}
-
-void *mytask(void *arg)
-{
- int i;
-
- for(i=0; i<10; i++) {
- cprintf("%d ", i);
- task_endcycle();
- }
-
- return 0;
-}
-
-int main(int argc,char *argv[])
-{
- SOFT_TASK_MODEL mp;
-
- PID pid;
-
- soft_task_default_model(mp);
- soft_task_def_met(mp, 10000);
- soft_task_def_period(mp,50000);
- soft_task_def_usemath(mp);
-
- cprintf("\nHello, world!\n");
-
- pid = task_create("mytask", mytask, &mp, NULL);
-
- if (pid != NIL) task_activate(pid);
-
- return 0;
-}
Index: rel_1_2/tracer/dfixed/initfile.c
===================================================================
--- rel_1_2/tracer/dfixed/initfile.c (revision 1198)
+++ rel_1_2/tracer/dfixed/initfile.c (nonexistent)
@@ -1,115 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: initfile.c,v 1.1 2002-10-21 09:12:35 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1 $
- * Last update: $Date: 2002-10-21 09:12:35 $
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/cbs.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-#include "modules/nopm.h"
-
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-void mytracer_prologue(void);
-void mytracer_epilogue(void);
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- mytracer_prologue();
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- PC_register_module();
- NPP_register_module();
- SRP_register_module();
- NOP_register_module();
- NOPM_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- KEYB_PARMS keyb = BASE_KEYB;
- extern void ctrlc_exit(KEY_EVT *k);
-
- HARTPORT_init();
-
- keyb_def_ctrlC(keyb, ctrlc_exit);
- KEYB_init(&keyb);
-
- mytracer_epilogue();
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/tracer/udp/initfile.c
===================================================================
--- rel_1_2/tracer/udp/initfile.c (revision 1198)
+++ rel_1_2/tracer/udp/initfile.c (nonexistent)
@@ -1,115 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: initfile.c,v 1.1 2002-10-28 08:10:10 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1 $
- * Last update: $Date: 2002-10-28 08:10:10 $
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/cbs.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-#include "modules/nopm.h"
-
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-void mytracer_prologue(void);
-void mytracer_epilogue(void);
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- mytracer_prologue();
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- PC_register_module();
- NPP_register_module();
- SRP_register_module();
- NOP_register_module();
- NOPM_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- KEYB_PARMS keyb = BASE_KEYB;
- extern void ctrlc_exit(KEY_EVT *k);
-
- HARTPORT_init();
-
- keyb_def_ctrlC(keyb, ctrlc_exit);
- KEYB_init(&keyb);
-
- mytracer_epilogue();
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/tracer/udp/udptrace.c
===================================================================
--- rel_1_2/tracer/udp/udptrace.c (revision 1198)
+++ rel_1_2/tracer/udp/udptrace.c (nonexistent)
@@ -1,160 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Massimiliano Giorgi
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * CVS : $Id: udptrace.c,v 1.3 2003-10-07 09:37:47 giacomo Exp $
- */
-
-/*
- * Example of tracer initialization.
- */
-
-#include <ll/i386/cons.h>
-
-#include <kernel/func.h>
-#include <kernel/trace.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <drivers/keyb.h>
-#include <drivers/udpip.h>
-
-#include <trace/trace.h>
-#include <trace/queues.h>
-
-#include <sys/mount.h>
-#include <stddef.h>
-#include <string.h>
-
-char myipaddr[15], toipaddr[15];
-
-void mytracer_prologue(void)
-{
- int myqueue;
- TRC_PARMS p;
- TRC_UDP_PARMS u;
- UDP_ADDR local, remote;
-
- /* these are the IP numbers of my home PCs ;-) */
- strcpy(myipaddr, "192.168.1.2");
- strcpy(toipaddr, "192.168.1.1");
-
- clear();
-
- ip_str2addr(toipaddr,&(remote.s_addr));
- remote.s_port = 20000; // htons is done automatically;
- ip_str2addr(myipaddr,&(local.s_addr));
- local.s_port = 20000; // htons is done automatically;
-
- trc_default_parms(p);
- trc_def_path(p,"");
-
- trc_udp_default_parms(u,local,remote);
-
- /* Tracer Initialization */
- /* the first functions to call... parameters can be passed */
- TRC_init_phase1(&p);
-
- /* all the tracer queue types must be registered */
- trc_register_udp_queue();
-
- /* then, we create all the queues we need */
- myqueue = trc_create_queue(TRC_UDP_QUEUE,&u);
-
- /* Then, we say that events must be sent to a particular queue */
- trc_trace_class(TRC_CLASS_SYSTEM);
- trc_assign_class_to_queue(TRC_CLASS_SYSTEM, myqueue);
-}
-
-void mytracer_epilogue(void)
-{
- struct net_model m = net_base;
-
-
- /* We want a task for TX mutual exclusion */
- net_setmode(m, TXTASK);
- /* We use UDP/IP stack */
- net_setudpip(m, myipaddr, "255.255.255.255");
- /* OK: let's start the NetLib! */
- if (net_init(&m) == 1) {
- cprintf("udptrace: Net Init OK...\n");
- } else {
- cprintf("udptrace: Net Init Failed...\n");
- sys_abort(300);
- }
-
- TRC_init_phase2();
-}
-
-void ctrlc_exit(KEY_EVT *k)
-{
- sys_end();
-}
-
-void *mytask(void *arg)
-{
- int i;
-
- for(i=0; i<10; i++) {
- cprintf("%d\n", i);
- task_endcycle();
- }
-
- return 0;
-}
-
-int main(int argc,char *argv[])
-{
- SOFT_TASK_MODEL mp;
-
- PID pid;
-
- soft_task_default_model(mp);
- soft_task_def_met(mp, 10000);
- soft_task_def_period(mp,50000);
- soft_task_def_usemath(mp);
-
- cprintf("\nHello, world!\n");
-
- pid = task_create("mytask", mytask, &mp, NULL);
-
- if (pid != NIL) task_activate(pid);
-
- return 0;
-}
Index: rel_1_2/tracer/udp/readme
===================================================================
--- rel_1_2/tracer/udp/readme (revision 1198)
+++ rel_1_2/tracer/udp/readme (nonexistent)
@@ -1,10 +0,0 @@
-This is a simple test that uses the tracer.
-
-The example assigns the IP address 192.168.1.2 to the machine, and
-sends the tracer data to 192.168.1.1 using UDp, port 20000.
-
-You can use demos/tracer/utils/udpdump to get the informations.
-
-Enjoy,
-
-PJ
Index: rel_1_2/tracer/udp/makefile
===================================================================
--- rel_1_2/tracer/udp/makefile (revision 1198)
+++ rel_1_2/tracer/udp/makefile (nonexistent)
@@ -1,21 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../../..
-endif
-
-include $(BASE)/config/config.mk
-
-PROGS= udptrace
-
-include $(BASE)/config/example.mk
-
-udptrace:
- make -f $(SUBMAKE) BASE=$(BASE) APP=udptrace INIT= OTHEROBJS=initfile.o SHARKOPT=__OLDCHAR__
-
-
-
-
-
Index: rel_1_2/tracer/small/readme
===================================================================
--- rel_1_2/tracer/small/readme (revision 1198)
+++ rel_1_2/tracer/small/readme (nonexistent)
@@ -1,27 +0,0 @@
-This directory contains a set of tests that uses the Shark Filesystem and the tracer
-
-treef1 - the test shows all filenames of a directory of an hardisk
- recursively using a soft task for every directory.
- The tracer with a circular queue is activated.
-
-treec2 - the test shows all filenames of a directory of an hardisk
- recursively using a soft task for every directory.
- The tracer with a circular queue is activated that write
- on hardisk online (while the system is running).
-
-treec1 - This test show all filenames of a directory of an hardisk
- recursively using a soft task for every directory.
- The tracer with a circular queue is activated.
-
-test0 - A file is opened for reading while the tracerwith a fixed
- queue is runnig.
-
-simple - Simple hello world (with tracer)!
-
-hello - another hello world...
-
-hello1 - another hello world with a dummy queue...
-
-hello2 - another hello world with a fixed queue...
-
-PJ
Index: rel_1_2/tracer/small/initfs.c
===================================================================
--- rel_1_2/tracer/small/initfs.c (revision 1198)
+++ rel_1_2/tracer/small/initfs.c (nonexistent)
@@ -1,119 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: initfs.c,v 1.1 2002-11-11 07:45:05 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1 $
- * Last update: $Date: 2002-11-11 07:45:05 $
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/cbs.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-#include "modules/nopm.h"
-
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- extern int __register_sub_init_prologue(void);
- extern int __register_sub_init(void);
-
- __register_sub_init_prologue();
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- PC_register_module();
- NPP_register_module();
- SRP_register_module();
- NOP_register_module();
- NOPM_register_module();
-
- __register_sub_init();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- KEYB_PARMS keyb = BASE_KEYB;
- extern int __bdev_sub_init(void);
- extern int __fs_sub_init(void);
- extern void ctrlc_exit(KEY_EVT *k);
-
- HARTPORT_init();
-
- keyb_def_ctrlC(keyb, ctrlc_exit);
- KEYB_init(&keyb);
-
- __bdev_sub_init();
- __fs_sub_init();
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/tracer/small/makefile
===================================================================
--- rel_1_2/tracer/small/makefile (revision 1198)
+++ rel_1_2/tracer/small/makefile (nonexistent)
@@ -1,29 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= simple hello hello1 hello2 test0 treef1 treec1 treec2
-
-include $(BASE)/config/example.mk
-
-simple:
- make -f $(SUBMAKE) BASE=$(BASE) APP=simple OTHEROBJS=initfs.o SHARKOPT=__OLDCHAR__
-hello:
- make -f $(SUBMAKE) BASE=$(BASE) APP=hello OTHEROBJS=initfs.o SHARKOPT=__OLDCHAR__
-hello1:
- make -f $(SUBMAKE) BASE=$(BASE) APP=hello1 OTHEROBJS="initfs.o common.o" SHARKOPT=__OLDCHAR__
-hello2:
- make -f $(SUBMAKE) BASE=$(BASE) APP=hello2 OTHEROBJS="initfs.o common.o" SHARKOPT=__OLDCHAR__
-test0:
- make -f $(SUBMAKE) BASE=$(BASE) APP=test0 OTHEROBJS="initfs.o common.o" SHARKOPT=__OLDCHAR__
-treef1:
- make -f $(SUBMAKE) BASE=$(BASE) APP=treef1 OTHEROBJS="initfs.o common.o" SHARKOPT=__OLDCHAR__
-treec1:
- make -f $(SUBMAKE) BASE=$(BASE) APP=treec1 OTHEROBJS="initfs.o common.o" SHARKOPT=__OLDCHAR__
-treec2:
- make -f $(SUBMAKE) BASE=$(BASE) APP=treec2 OTHEROBJS="initfs.o common.o" SHARKOPT=__OLDCHAR__
Index: rel_1_2/tracer/small/common.h
===================================================================
--- rel_1_2/tracer/small/common.h (revision 1198)
+++ rel_1_2/tracer/small/common.h (nonexistent)
@@ -1,28 +0,0 @@
-
-#ifndef _COMMON_H
-#define _COMMON_H
-
-#include <sys/types.h>
-
-/*
-#include <kernel/int_sem.h>
-#define SEM internal_sem_t
-#define sem_init internal_sem_init
-#define sem_signal internal_sem_post
-#define sem_wait internal_sem_wait
-*/
-
-#define SEM sem_t
-#define sem_signal sem_post
-
-extern __dev_t root_device;
-extern __dev_t temp_device;
-
-int choose_temp_callback(__dev_t dev,__uint8_t fs);
-
-void showmessage(char *s);
-void waitend(void);
-
-#define FROMDIR "/TEMP"
-
-#endif
Index: rel_1_2/tracer/small/test0.c
===================================================================
--- rel_1_2/tracer/small/test0.c (revision 1198)
+++ rel_1_2/tracer/small/test0.c (nonexistent)
@@ -1,71 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <kernel/func.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <drivers/keyb.h>
-
-#include <sys/mount.h>
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-
-#include "common.h"
-
-#define FILENAME "/TEMP/ALFA1.TXT"
-
-#include <trace/trace.h>
-#include <trace/queues.h>
-
-int __register_sub_init_prologue(void)
-{
- TRC_init_phase1(NULL);
- trc_register_fixed_queue();
- trc_create_queue(TRC_FIXED_QUEUE,NULL);
- return 0;
-}
-
-int main(int argc,char *argv[])
-{
- int h;
-
- showmessage("A file is opened for reading while the tracer\n"
- "with a fixed queue is runnig\n");
-
- cprintf("OPENING %s\n",FILENAME);
- h=open(FILENAME,O_RDONLY);
- if (h>=0) {
- char buffer[128];
- int len;
- cprintf("OPENED!\n");
-
- cprintf("READING...\n");
- len=read(h,buffer,sizeof(buffer));
- cprintf("READ %i bytes\n",len);
- memset(buffer,'\0',sizeof(buffer));
- cprintf("buffer='%s'\n",buffer);
-
- cprintf("READING...\n");
- len=read(h,buffer,sizeof(buffer));
- cprintf("READ %i bytes\n",len);
- memset(buffer,'\0',sizeof(buffer));
- cprintf("buffer='%s'\n",buffer);
-
- close(h);
-
- } else
- cprintf("FAILED!\n");
-
- waitend();
-
- return 0;
-}
Index: rel_1_2/tracer/small/treec1.c
===================================================================
--- rel_1_2/tracer/small/treec1.c (revision 1198)
+++ rel_1_2/tracer/small/treec1.c (nonexistent)
@@ -1,220 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <kernel/func.h>
-#include <kernel/model.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mount.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <semaphore.h>
-#include <stdio.h>
-#include <time.h>
-
-#include "common.h"
-
-#include <trace/trace.h>
-#include <trace/queues.h>
-
-
-int noscroll=0;
-SEM console;
-
-#define MPROC ((50<(MAX_PROC-10))?50:MAX_PROC-10)
-
-TASK viewdir(void *prof);
-sem_t actmutex,actsync;
-char *globpathname;
-PID globpid;
-int counter=0,actcounter=0;
-
-void activate_task(int prof, char *pathname)
-{
- char tname[32];
- NRT_TASK_MODEL m;
- PID pid;
-
-REPEAT:
- sem_wait(&actmutex);
-
- if (actcounter>=MPROC) {
- struct timespec delay;
- delay.tv_sec = 0;
- delay.tv_nsec = 10000000;
- sem_signal(&actmutex);
- nanosleep(&delay, NULL);
- goto REPEAT;
- }
-
- globpathname=pathname;
- counter++;
- sprintf(tname,"tsk%i",counter);
-
- nrt_task_default_model(m);
- nrt_task_def_arg(m,(void*)counter);
-
- globpid=pid=task_create(tname,viewdir,&m,NULL);
- if (pid==-1) {
- sem_wait(&console);
- cprintf("can't create '%s'\n",tname);
- perror("can't create task");
- sem_signal(&console);
- sys_end();
- return;
- }
- task_activate(pid);
- sem_wait(&actsync);
- actcounter++;
-
- sem_signal(&actmutex);
-}
-
-/*
- *
- */
-
-int filecounter=0;
-
-TASK viewdir(void *pointer)
-{
- struct dirent *den;
- struct stat st;
- char *str;
- DIR *d;
- int res;
- int x;
- char pathname[1024];
- PID mypid;
- int prof=(int)pointer;
-
- strcpy(pathname,globpathname);
- mypid=globpid;
- sem_signal(&actsync);
-
- str=pathname+(x=strlen(pathname));
- d=opendir(pathname);
-
- if (d==NULL) {
- sem_wait(&console);
- cprintf("%03i ERR: can't open dir %s\n",prof,pathname);
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- sem_signal(&console);
-
- sys_end();
- l1_exit(0);
-
- goto END;
- }
-
- while ((den=readdir(d))!=NULL) {
-
- if (x==1&&*pathname=='/')
- strcat(pathname,den->d_name);
- else
- strcat(strcat(pathname,"/"),den->d_name);
-
- sem_wait(&console);
- if (noscroll) {
- place(0,10);
- cprintf(" ");
- place(0,10);
- }
- cprintf("t%03i %s\n",prof,pathname);
- filecounter++;
- sem_signal(&console);
-
- if (!strcmp(den->d_name,".")) goto SKIP;
- if (!strcmp(den->d_name,"..")) goto SKIP;
-
- res=stat(pathname,&st);
- if (res!=0) {
- sem_wait(&console);
- cprintf("t%03i can't stat %s\n",prof,pathname);
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- sem_signal(&console);
-
- sys_end();
- l1_exit(0);
-
- closedir(d);
- goto END;
- } else {
- if (S_ISDIR(st.st_mode)) {
- sem_wait(&console);
- sem_signal(&console);
- activate_task(prof,pathname);
- }
-
- }
-
- SKIP:
- *str='\0';
- }
-
- closedir(d);
-
-END:
- sem_wait(&actmutex);
- actcounter--;
- sem_signal(&actmutex);
-
- return 0;
-}
-
-/*
- *
- */
-
-int __register_sub_init_prologue(void)
-{
- TRC_init_phase1(NULL);
- trc_register_circular_queue();
- trc_create_queue(TRC_CIRCULAR_QUEUE,NULL);
- return 0;
-}
-
-/*
- *
- */
-
-int main(int argc,char *argv[])
-{
- // int res;
-
- showmessage("This test show all filenames of a directory of an hardisk\n"
- "recursively using a soft task for every directory.\n"
- "The tracer with a circular queue is activated.\n");
-
- sem_init(&console,0,1);
- sem_init(&actmutex,0,1);
- sem_init(&actsync,0,0);
-
- activate_task(-1,FROMDIR);
-
- {
- struct timespec delay;
- delay.tv_sec = 0;
- delay.tv_nsec = 500000000;
- for(;;) {
- sem_wait(&actmutex);
- if (actcounter==0) break;
- sem_signal(&actmutex);
- nanosleep(&delay, NULL);
- }
- }
-
- cprintf("\nfiles: %i\n",filecounter);
-
- waitend();
-
- return 0;
-}
Index: rel_1_2/tracer/small/hello.c
===================================================================
--- rel_1_2/tracer/small/hello.c (revision 1198)
+++ rel_1_2/tracer/small/hello.c (nonexistent)
@@ -1,209 +0,0 @@
-/*
- * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Gerardo Lamastra <gerardo@sssup.it>
- *
- * Authors : Massimiliano Giorgi <massy@hartik.sssup.it>
- * (see authors.txt for full list of hartik's authors)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://hartik.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: hello.c,v 1.1 2002-10-21 09:12:35 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1 $
- * Last update: $Date: 2002-10-21 09:12:35 $
- */
-
-/*
- * Example of tracer initialization.
- */
-
-#include <ll/i386/cons.h>
-
-#include <kernel/func.h>
-#include <kernel/trace.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <drivers/keyb.h>
-
-#include <trace/trace.h>
-#include <trace/queues.h>
-
-#include <sys/mount.h>
-#include <stddef.h>
-
-/*
- this example use initfs.c to initialize the system; this file define
- the following two function.
-
- __kernel_register_levels__(), must initialize all kernel modules,
- it has this structure:
-
- {
- __register_sub_init_prologue();
-
- ... modules initialization....
-
- __register_sub_init();
- }
-
- __init__(void *arg) is called when the first task is created
- and must call the main():
-
- {
-
- ... drivers initialization ....
-
- __bdev_sub_init();
- __fs_sub_init();
-
- call_main()
-
- }
-
- */
-
-/*
- * This function is called before all other modules initialization because
- * all modules that need the tracer must follow tracer initialization.
- */
-int __register_sub_init_prologue(void)
-{
- /* the first functions to call... parameters can be passed */
- TRC_init_phase1(NULL);
- /* all the tracer queues must be registrated (in this case only */
- /* a dummy queue is initialized) */
- trc_register_dummy_queue();
- /* the queues must be created (only one in this example) */
- trc_create_queue(TRC_DUMMY_QUEUE,NULL);
- /* events can be dispatch to a queue (nothing in this case) */
- return 0;
-}
-
-/*
- * This function is called after all other modules initialization
- * functions... notjing to do.
- */
-int __register_sub_init(void)
-{
- return 0;
-}
-
-__dev_t root_device;
-__dev_t temp_device;
-
-/*
- * Now the system is running... we have to initialize the block device
- * drivers
- */
-int __bdev_sub_init(void)
-{
- BDEV_PARMS bdev=BASE_BDEV;
-
- /* This to initialize the block device drivers... a NULL can be passed */
- /* to the bdev_init() functions */
- bdev_def_showinfo(bdev,FALSE);
- bdev_init(&bdev);
-
- /* The following phase ca be made in several way: we must decide the */
- /* device that we want mount as root... we use the bdev_find_byname() */
- /* functions to find a specific device */
- root_device=bdev_find_byname("ide/hda1");
- if (root_device<0) {
- cprintf("can't find root device to mount on /!!!\n");
- sys_end();
- return -1;
- }
-
- /* Well, we want a device to mount into /TEMP */
- temp_device=bdev_find_byname("ide/hdb3");
- if (temp_device<0) {
- cprintf("can't find a filesystem to mount on /TEMP!!!\n");
- sys_end();
- return -1;
- }
-
- return 0;
-}
-
-
-/*
- * This is the real filesystem initialization!
- */
-int __fs_sub_init(void)
-{
- FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
- extern int libc_initialize(void);
- int res;
- struct mount_opts opts;
-
- /* We set the root device and call the filesystem_init() function */
- filesystem_def_rootdevice(fs,root_device);
- filesystem_def_fs(fs,FS_MSDOS);
- filesystem_def_showinfo(fs,FALSE);
- filesystem_init(&fs);
-
- /* We must initialize the libC if we use it */
- libc_initialize();
-
- /* We have choose to mount the second partiotion into the /TEMP */
- /* directory with read/write privilegies (this step is not required) */
- if (temp_device>=0) {
- memset(&opts,0,sizeof(struct mount_opts));
- opts.flags=MOUNT_FLAG_RW;
- res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
- if (res!=0) {
- cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
- }
- }
-
- /* NOW we call the tracer initialization phase 2!!! */
- /* It must FOLLOW the filesystem initialization... (this function */
- /* can be called after the call to filesystem_init() functions but */
- /* we do it here because we want be able to write into the /TEMP */
- /* directory! */
- TRC_init_phase2();
-
- return 0;
-}
-
-void ctrlc_exit(KEY_EVT *k)
-{
- sys_end();
-}
-
-int main(int argc,char *argv[])
-{
- cprintf("\nHello, world!\n");
- return 0;
-}
Index: rel_1_2/tracer/small/treec2.c
===================================================================
--- rel_1_2/tracer/small/treec2.c (revision 1198)
+++ rel_1_2/tracer/small/treec2.c (nonexistent)
@@ -1,233 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <kernel/func.h>
-#include <kernel/model.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mount.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <semaphore.h>
-#include <stdio.h>
-#include <time.h>
-
-#include "common.h"
-
-#include <trace/trace.h>
-#include <trace/queues.h>
-
-#define sem_signal sem_post
-
-int noscroll=0;
-SEM console;
-
-#define MPROC ((50<(MAX_PROC-10))?50:MAX_PROC-10)
-
-TASK viewdir(void *prof);
-sem_t actmutex,actsync;
-char *globpathname;
-PID globpid;
-int counter=0,actcounter=0;
-
-void activate_task(int prof, char *pathname)
-{
- char tname[32];
- NRT_TASK_MODEL m;
- PID pid;
-
-REPEAT:
- sem_wait(&actmutex);
-
- if (actcounter>=MPROC) {
- struct timespec delay;
- delay.tv_sec = 0;
- delay.tv_nsec = 10000000;
- sem_signal(&actmutex);
- nanosleep(&delay, NULL);
- goto REPEAT;
- }
-
- globpathname=pathname;
- counter++;
- sprintf(tname,"tsk%i",counter);
-
- nrt_task_default_model(m);
- nrt_task_def_arg(m,(void*)counter);
-
- globpid=pid=task_create(tname,viewdir,&m,NULL);
- if (pid==-1) {
- sem_wait(&console);
- cprintf("can't create '%s'\n",tname);
- perror("can't create task");
- sem_signal(&console);
- sys_end();
- return;
- }
- task_activate(pid);
- sem_wait(&actsync);
- actcounter++;
-
- sem_signal(&actmutex);
-}
-
-/*
- *
- */
-
-int filecounter=0;
-
-TASK viewdir(void *pointer)
-{
- struct dirent *den;
- struct stat st;
- char *str;
- DIR *d;
- int res;
- int x;
- char pathname[1024];
- PID mypid;
- int prof=(int)pointer;
-
- strcpy(pathname,globpathname);
- mypid=globpid;
- sem_signal(&actsync);
-
- str=pathname+(x=strlen(pathname));
- d=opendir(pathname);
-
- if (d==NULL) {
- sem_wait(&console);
- cprintf("%03i ERR: can't open dir %s\n",prof,pathname);
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- sem_signal(&console);
-
- sys_end();
- l1_exit(0);
-
- goto END;
- }
-
- while ((den=readdir(d))!=NULL) {
-
- if (x==1&&*pathname=='/')
- strcat(pathname,den->d_name);
- else
- strcat(strcat(pathname,"/"),den->d_name);
-
- sem_wait(&console);
- if (noscroll) {
- place(0,10);
- cprintf(" ");
- place(0,10);
- }
- cprintf("t%03i %s\n",prof,pathname);
- filecounter++;
- sem_signal(&console);
-
- if (!strcmp(den->d_name,".")) goto SKIP;
- if (!strcmp(den->d_name,"..")) goto SKIP;
-
- res=stat(pathname,&st);
- if (res!=0) {
- sem_wait(&console);
- cprintf("t%03i can't stat %s\n",prof,pathname);
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- sem_signal(&console);
-
- sys_end();
- l1_exit(0);
-
- closedir(d);
- goto END;
- } else {
- if (S_ISDIR(st.st_mode)) {
- sem_wait(&console);
- sem_signal(&console);
- activate_task(prof,pathname);
- }
-
- }
-
- SKIP:
- *str='\0';
- }
-
- closedir(d);
-
-END:
- sem_wait(&actmutex);
- actcounter--;
- sem_signal(&actmutex);
-
- return 0;
-}
-
-/*
- *
- */
-
-int __register_sub_init_prologue(void)
-{
- TRC_CIRCULAR_PARMS args;
- int q;
-
- TRC_init_phase1(NULL);
- trc_register_circular_queue();
-
- trc_circular_default_parms(args);
- trc_circular_def_onlinetask(args);
- q=trc_create_queue(TRC_CIRCULAR_QUEUE,&args);
-
- trc_assign_class_to_queue(TRC_CLASS_SYSTEM,q);
- trc_trace_class(TRC_CLASS_SYSTEM);
-
- return 0;
-}
-
-/*
- *
- */
-
-int main(int argc,char *argv[])
-{
- // int res;
-
- showmessage("This test show all filenames of a directory of an hardisk\n"
- "recursively using a soft task for every directory.\n"
- "The tracer with a circular queue is activated that write\n"
- "on hardisk online (while the system is running)\n");
-
- sem_init(&console,0,1);
- sem_init(&actmutex,0,1);
- sem_init(&actsync,0,0);
-
- activate_task(-1,FROMDIR);
- //activate_task(-1,"/");
-
- {
- struct timespec delay;
- delay.tv_sec = 0;
- delay.tv_nsec = 500000000;
- for(;;) {
- sem_wait(&actmutex);
- if (actcounter==0) break;
- sem_signal(&actmutex);
- nanosleep(&delay, NULL);
- }
- }
-
- cprintf("\nfiles: %i\n",filecounter);
-
- waitend();
-
- return 0;
-}
Index: rel_1_2/tracer/small/hello1.c
===================================================================
--- rel_1_2/tracer/small/hello1.c (revision 1198)
+++ rel_1_2/tracer/small/hello1.c (nonexistent)
@@ -1,27 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <ll/i386/cons.h>
-#include <stddef.h>
-
-#include <trace/trace.h>
-#include <trace/queues.h>
-
-int __register_sub_init_prologue(void)
-{
- TRC_init_phase1(NULL);
- trc_register_dummy_queue();
- trc_create_queue(TRC_DUMMY_QUEUE,NULL);
- return 0;
-}
-
-int main(int argc,char *argv[])
-{
- cprintf("\nHello, world!\n");
- cprintf("The tracer has been activated!\n");
- cprintf("(No result are produced)\n\n");
- return 0;
-}
Index: rel_1_2/tracer/small/hello2.c
===================================================================
--- rel_1_2/tracer/small/hello2.c (revision 1198)
+++ rel_1_2/tracer/small/hello2.c (nonexistent)
@@ -1,30 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <ll/i386/cons.h>
-#include <stddef.h>
-
-#include <trace/trace.h>
-#include <trace/queues.h>
-
-int __register_sub_init_prologue(void)
-{
- int q;
- TRC_init_phase1(NULL);
- trc_register_fixed_queue();
- q=trc_create_queue(TRC_FIXED_QUEUE,NULL);
- trc_assign_class_to_queue(TRC_CLASS_SYSTEM,q);
- trc_trace_class(TRC_CLASS_SYSTEM);
- return 0;
-}
-
-int main(int argc,char *argv[])
-{
- cprintf("\nHello, world!\n");
- cprintf("The tracer has been activated! Look at the results.\n");
- cprintf("(A fixed queue has been created)\n\n");
- return 0;
-}
Index: rel_1_2/tracer/small/treef1.c
===================================================================
--- rel_1_2/tracer/small/treef1.c (revision 1198)
+++ rel_1_2/tracer/small/treef1.c (nonexistent)
@@ -1,224 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <kernel/func.h>
-#include <kernel/model.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mount.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <semaphore.h>
-#include <stdio.h>
-#include <time.h>
-
-#include "common.h"
-
-#include <trace/trace.h>
-#include <trace/queues.h>
-
-#define sem_signal sem_post
-
-int noscroll=0;
-SEM console;
-
-#define MPROC ((50<(MAX_PROC-10))?50:MAX_PROC-10)
-
-TASK viewdir(void *prof);
-sem_t actmutex,actsync;
-char *globpathname;
-PID globpid;
-int counter=0,actcounter=0;
-
-void activate_task(int prof, char *pathname)
-{
- char tname[32];
- NRT_TASK_MODEL m;
- PID pid;
-
-REPEAT:
- sem_wait(&actmutex);
-
- if (actcounter>=MPROC) {
- struct timespec delay;
- delay.tv_sec = 0;
- delay.tv_nsec = 10000000;
- sem_signal(&actmutex);
- nanosleep(&delay, NULL);
- goto REPEAT;
- }
-
- globpathname=pathname;
- counter++;
- sprintf(tname,"tsk%i",counter);
-
- nrt_task_default_model(m);
- nrt_task_def_arg(m,(void*)counter);
-
- globpid=pid=task_create(tname,viewdir,&m,NULL);
- if (pid==-1) {
- sem_wait(&console);
- cprintf("can't create '%s'\n",tname);
- perror("can't create task");
- sem_signal(&console);
- sys_end();
- return;
- }
- task_activate(pid);
- sem_wait(&actsync);
- actcounter++;
-
- sem_signal(&actmutex);
-}
-
-/*
- *
- */
-
-int filecounter=0;
-
-TASK viewdir(void *pointer)
-{
- struct dirent *den;
- struct stat st;
- char *str;
- DIR *d;
- int res;
- int x;
- char pathname[1024];
- PID mypid;
- int prof=(int)pointer;
-
- strcpy(pathname,globpathname);
- mypid=globpid;
- sem_signal(&actsync);
-
- str=pathname+(x=strlen(pathname));
- d=opendir(pathname);
-
- if (d==NULL) {
- sem_wait(&console);
- cprintf("%03i ERR: can't open dir %s\n",prof,pathname);
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- sem_signal(&console);
-
- sys_end();
- l1_exit(0);
-
- goto END;
- }
-
- while ((den=readdir(d))!=NULL) {
-
- if (x==1&&*pathname=='/')
- strcat(pathname,den->d_name);
- else
- strcat(strcat(pathname,"/"),den->d_name);
-
- sem_wait(&console);
- if (noscroll) {
- place(0,10);
- cprintf(" ");
- place(0,10);
- }
- cprintf("t%03i %s\n",prof,pathname);
- filecounter++;
- sem_signal(&console);
-
- if (!strcmp(den->d_name,".")) goto SKIP;
- if (!strcmp(den->d_name,"..")) goto SKIP;
-
- res=stat(pathname,&st);
- if (res!=0) {
- sem_wait(&console);
- cprintf("t%03i can't stat %s\n",prof,pathname);
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- sem_signal(&console);
-
- sys_end();
- l1_exit(0);
-
- closedir(d);
- goto END;
- } else {
- if (S_ISDIR(st.st_mode)) {
- sem_wait(&console);
- sem_signal(&console);
- activate_task(prof,pathname);
- }
-
- }
-
- SKIP:
- *str='\0';
- }
-
- closedir(d);
-
-END:
- sem_wait(&actmutex);
- actcounter--;
- sem_signal(&actmutex);
-
- return 0;
-}
-
-/*
- *
- */
-
-int __register_sub_init_prologue(void)
-{
- int q;
- TRC_init_phase1(NULL);
- trc_register_fixed_queue();
- q=trc_create_queue(TRC_FIXED_QUEUE,NULL);
- trc_assign_class_to_queue(TRC_CLASS_SYSTEM,q);
- trc_trace_class(TRC_CLASS_SYSTEM);
- return 0;
-}
-
-/*
- *
- */
-
-int main(int argc,char *argv[])
-{
- // int res;
-
- showmessage("This test show all filenames of a directory of an hardisk\n"
- "recursively using a soft task for every directory.\n"
- "The tracer with a circular queue is activated.\n");
-
- sem_init(&console,0,1);
- sem_init(&actmutex,0,1);
- sem_init(&actsync,0,0);
-
- activate_task(-1,FROMDIR);
-
- {
- struct timespec delay;
- delay.tv_sec = 0;
- delay.tv_nsec = 500000000;
- for(;;) {
- sem_wait(&actmutex);
- if (actcounter==0) break;
- sem_signal(&actmutex);
- nanosleep(&delay, NULL);
- }
- }
-
- cprintf("\nfiles: %i\n",filecounter);
-
- waitend();
-
- return 0;
-}
Index: rel_1_2/tracer/small/common.c
===================================================================
--- rel_1_2/tracer/small/common.c (revision 1198)
+++ rel_1_2/tracer/small/common.c (nonexistent)
@@ -1,133 +0,0 @@
-
-#include <kernel/func.h>
-#include <kernel/trace.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <drivers/keyb.h>
-
-#include <trace/trace.h>
-#include <trace/queues.h>
-
-#include <sys/mount.h>
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-
-int __register_sub_init(void)
-{
- return 0;
-}
-
-/* -- */
-
-__dev_t root_device;
-__dev_t temp_device;
-
-int choose_root_callback(__dev_t dev,__uint8_t fs)
-{
- if (fs==FS_MSDOS) return dev;
- return -1;
-}
-
-int choose_temp_callback(__dev_t dev,__uint8_t fs)
-{
- static int flag=0;
- if (fs==FS_MSDOS) {
- if (flag) return dev;
- flag=1;
- }
- return -1;
-}
-
-/* -- */
-
-extern int bdev_scan_devices(int(*callback)(__dev_t,__uint8_t));
-
-int __bdev_sub_init(void)
-{
- BDEV_PARMS bdev=BASE_BDEV;
-
- bdev_def_showinfo(bdev,FALSE);
- bdev_init(&bdev);
-
- root_device=bdev_scan_devices(choose_root_callback);
- if (root_device<0) {
- cprintf("can't find root device to mount on /!!!\n");
- sys_end();
- return -1;
- }
-
- temp_device=bdev_scan_devices(choose_temp_callback);
- if (temp_device<0) {
- cprintf("can't find a filesystem to mount on /TEMP!!!\n");
- }
-
- return 0;
-}
-
-/* -- */
-
-extern int libc_initialize(void);
-
-int __fs_sub_init(void)
-{
- FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
- struct mount_opts opts;
- int res;
-
- filesystem_def_rootdevice(fs,root_device);
- filesystem_def_fs(fs,FS_MSDOS);
- filesystem_def_showinfo(fs,FALSE);
-
-
- //filesystem_init_prologue();
- filesystem_init(&fs);
-
- libc_initialize();
-
- if (temp_device>=0) {
- memset(&opts,0,sizeof(struct mount_opts));
- opts.flags=MOUNT_FLAG_RW;
- res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
- if (res!=0) {
- cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
- }
- }
-
- TRC_init_phase2();
-
- return 0;
-}
-
-/* -- */
-
-void ctrlc_exit(KEY_EVT *k)
-{
- extern void dump_sem_table(void);
- extern void dump_nop_table(void);
- //dump_sem_table();
- //dump_nop_table();
- sys_end();
-}
-
-/* -- */
-
-void showmessage(char *s)
-{
- cputs(s);
- cprintf("Press [x] to begin...");
- while (keyb_getchar()!='x');
- cprintf("\n");
-}
-
-void waitend(void)
-{
- int c;
- cprintf("Press [x] to exit...");
- while ((c=keyb_getchar())!='x');
- cprintf("\n");
-}
Index: rel_1_2/tracer/small/simple.c
===================================================================
--- rel_1_2/tracer/small/simple.c (revision 1198)
+++ rel_1_2/tracer/small/simple.c (nonexistent)
@@ -1,132 +0,0 @@
-/*
- * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Gerardo Lamastra <gerardo@sssup.it>
- *
- * Authors : Massimiliano Giorgi <massy@hartik.sssup.it>
- * (see authors.txt for full list of hartik's authors)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://hartik.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: simple.c,v 1.1 2002-10-21 09:12:35 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1 $
- * Last update: $Date: 2002-10-21 09:12:35 $
- */
-
-/*
- * Example of simple tracer initialization.
- */
-
-#include <ll/i386/cons.h>
-
-#include <kernel/func.h>
-#include <kernel/trace.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <drivers/keyb.h>
-
-#include <trace/trace.h>
-
-#include <sys/mount.h>
-#include <stddef.h>
-
-#define ROOTDEVICE "ide/hda2"
-
-int __register_sub_init_prologue(void)
-{
- int res;
-
- /* tracer initialization phase 1 */
- res=TRC_init_phase1_standard();
- if (res!=0) {
- cprintf("tracer initialization error (%i)!!!\n",res);
- sys_end();
- return -1;
- }
-
- return 0;
-}
-
-int __register_sub_init(void)
-{
- return 0;
-}
-
-__dev_t root_device;
-
-int __bdev_sub_init(void)
-{
- /* block device initialization */
- bdev_init(NULL);
-
- /* choose root device */
- root_device=bdev_find_byname(ROOTDEVICE);
- if (root_device<0) {
- cprintf("can't find root device to mount on /!!!\n");
- sys_end();
- return -1;
- }
-
- return 0;
-}
-
-int __fs_sub_init(void)
-{
- FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
- extern int libc_initialize(void);
-
- /* filesystems initialization */
- filesystem_def_rootdevice(fs,root_device);
- filesystem_def_fs(fs,FS_MSDOS);
- filesystem_def_showinfo(fs,FALSE);
- filesystem_init(&fs);
-
- /* libC initialization */
- libc_initialize();
-
- /* tracer initialization phase 2 */
- TRC_init_phase2_standard();
- return 0;
-}
-
-void ctrlc_exit(KEY_EVT *k)
-{
- sys_end();
-}
-
-int main(int argc,char *argv[])
-{
- cprintf("\nSimple hello world (with tracer)!\n\n");
- return 0;
-}
Index: rel_1_2/tracer/readme
===================================================================
--- rel_1_2/tracer/readme (revision 1198)
+++ rel_1_2/tracer/readme (nonexistent)
@@ -1,14 +0,0 @@
-This directory contains a set of sub directories containing all the tracer
-examples and utilities.
-
-Here a short description of the contents
-
-utils - some small utilities that can read tracer files
-dfixed - a small applications that defines a tracer queue.
- At the end a file is written (using DOSFS).
-small - a set of small examples of tracer usage (using the Shark Filesystem)
-udp - a small application that sends its trace data through the network
-
-Enjoy
-
-PJ
Index: rel_1_2/tracer/makefile
===================================================================
--- rel_1_2/tracer/makefile (revision 1198)
+++ rel_1_2/tracer/makefile (nonexistent)
@@ -1,11 +0,0 @@
-.PHONY: all clean
-
-all:
- make -C dfixed
- make -C small
- make -C udp
-
-clean:
- make -C dfixed clean
- make -C small clean
- make -C udp clean
Index: rel_1_2/oscilloscopio/osc.c
===================================================================
--- rel_1_2/oscilloscopio/osc.c (revision 1198)
+++ rel_1_2/oscilloscopio/osc.c (nonexistent)
@@ -1,871 +0,0 @@
-/*****************************************************************************
-* Filename: osc.c *
-* Author: Ghiro Andrea,Franchino Gianluca *
-* Date: 09/2003 *
-* Description: Oscilloscope and function generator for PCI6025E *
-*----------------------------------------------------------------------------*
-* Notes: Connect DAC output pin (21) to ADC input pins (3-18) and *
-* watch the waveforms. *
-*****************************************************************************/
-
-/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
- *
- * Copyright (C) 2003 Ghiro Andrea,Franchino Gianluca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <math.h>
-#include <drivers/pci6025e/dac.h>
-#include <modules/hartport.h>
-#include <modules/srp.h>
-#include "adc.h"
-
-#define MAX_VAL 500
-#define NUM_POINT 20
-#define GRAPH_PERIOD 50000
-#define GRAPH_WCET 2000
-#define WAVE_WCET 200
-#define OSC_WCET 200
-#define TASK_GROUP 1
-#define CHFREQ_PERIOD 5000
-#define CHFREQ_WCET 200
-
-void drawInterface(void);
-void endfun(KEY_EVT *);
-void close_event(void *);
-void createWaves(void);
-void change_disp(KEY_EVT *);
-void change_mode(KEY_EVT *);
-void change_wave(KEY_EVT *);
-void change_passo(KEY_EVT *);
-void change_channel(KEY_EVT *);
-void inc(KEY_EVT *);
-void dec(KEY_EVT *);
-
-TASK video_body(int);
-TASK wave_body(int);
-TASK osc_body(int);
-TASK chfreq_body(int);
-
-HARD_TASK_MODEL wave0;
-HARD_TASK_MODEL chfreq;
-HARD_TASK_MODEL osc;
-SRP_RES_MODEL r;
-SRP_mutexattr_t a;
-
-PID wave0_pid;
-PID chfreq_pid;
-PID osc_pid;
-
-mutex_t m1 ;
-
-int black = rgb16(0,0,0),
- white = rgb16(255, 255, 255);
-
-int wave = 3,
- varfun = 0,
- varosc = 0,
- flagch = 0,
- channel = 0;
-
-float vfun = 0,
- vosc = 2.5,
- ffun = 1,
- tbase = 75,
- yr[MAX_VAL],
- yrdac[NUM_POINT],
- ys[MAX_VAL],
- ysdac[NUM_POINT],
- yq[MAX_VAL],
- yqdac[NUM_POINT];
-
-BYTE disp = 0,
- modefun= 0,
- modeosc= 0,
- lib = 0,
- sys = 0;
-
-short yoscold[MAX_VAL];
-
-unsigned int period= 1e6/NUM_POINT;
-unsigned int oscperiod = 1500;
-
-int main(int argc, char **argv)
-{
- KEY_EVT k;
-
- HARD_TASK_MODEL video;
- PID video_pid;
-
- int modenum;
-
- k.flag = CNTR_BIT;
- k.scan = KEY_X;
- k.ascii = 'x';
- keyb_hook(k, endfun);
-
- k.flag = CNTL_BIT;
- keyb_hook(k, endfun);
-
- k.flag = 0;
- k.scan = KEY_A;
- k.ascii = 'a';
- keyb_hook(k, change_disp);
-
- k.flag = 0;
- k.scan = KEY_S;
- k.ascii = 's';
- keyb_hook(k, change_mode);
-
- k.flag = 0;
- k.scan = KEY_F;
- k.ascii = 'f';
- keyb_hook(k, change_wave);
-
- k.flag = 0;
- k.scan = KEY_G;
- k.ascii = 'g';
- keyb_hook(k, change_wave);
-
- k.flag = 0;
- k.scan = KEY_H;
- k.ascii = 'H';
- keyb_hook(k, change_wave);
-
- k.flag = 0;
- k.scan = KEY_D;
- k.ascii = 'd';
- keyb_hook(k, change_passo);
-
- k.flag = 0;
- k.scan = KEY_J;
- k.ascii = 'j';
- keyb_hook(k, change_channel);
-
- k.flag = 0;
- k.scan = 78;
- k.ascii = 43;
- keyb_hook(k, inc);
-
- k.flag = 0;
- k.scan = 74;
- k.ascii = 45;
- keyb_hook(k, dec);
-
- sys_atrunlevel(close_event, NULL, RUNLEVEL_BEFORE_EXIT);
-
- /*initialize the srp mutex*/
- SRP_mutexattr_default(a);
- mutex_init(&m1,&a);
-
- hard_task_default_model(wave0);
- hard_task_def_wcet(wave0, WAVE_WCET);
- hard_task_def_mit(wave0, period);
- hard_task_def_group(wave0, TASK_GROUP);
- if( (wave0_pid = task_create("Wave 0", wave_body, &wave0, NULL)) == NIL )
- {
- sys = 10;
- sys_end();
- }
-
- hard_task_default_model(video);
- hard_task_def_wcet(video, GRAPH_WCET);
- hard_task_def_mit(video, GRAPH_PERIOD);
- hard_task_def_group(video, TASK_GROUP);
- SRP_res_default_model(r,2);
- if( (video_pid = task_createn("Video task", video_body, &video, &r,
- SRP_usemutex(&m1), NULL))== NIL )
- {
- sys = 12;
- sys_end();
- }
-
- hard_task_default_model(osc);
- hard_task_def_wcet(osc, OSC_WCET);
- hard_task_def_mit(osc, oscperiod);
- hard_task_def_group(osc, TASK_GROUP);
- SRP_res_default_model(r,1);
- if((osc_pid = task_createn("osc task", osc_body, &osc, &r,
- SRP_usemutex(&m1), NULL))== NIL )
- {
- sys = 11;
- sys_end();
- }
-
- hard_task_default_model(chfreq);
- hard_task_def_wcet(chfreq, CHFREQ_WCET);
- hard_task_def_mit(chfreq, CHFREQ_PERIOD);
- hard_task_def_group(chfreq, TASK_GROUP);
- if( (chfreq_pid = task_create("chfreq", chfreq_body, &chfreq, NULL)) == NIL )
- {
- sys = 13;
- sys_end();
- }
-
- if(grx_init() == -1)
- {
- sys = 30;
- sys_end();
- }
-
- if((modenum = grx_getmode(800, 600, 16)) == -1)
- {
- sys = 31;
- sys_end();
- }
-
- if(pci_init() == -1)
- {
- sys = 20;
- sys_end();
- }
-
- if(!reMap())
- {
- sys = 21;
- sys_end();
- }
-
- grx_setmode(modenum);
-
- createWaves();
- drawInterface();
-
- DAC_Init(); //Program the DAQ-STC AOTM
- Configure_Board(channel); //Configure the board with the channel settings.
- ADC_Init(); //Program the DAQ-STC AITM
-
- group_activate(TASK_GROUP);
-
- return 0;
-}
-
-void endfun(KEY_EVT *k)
-{
- sys_end();
-}
-
-void close_event(void *arg)
-{
- grx_close();
- switch(sys)
- {
- case 0: cprintf("Regular End!\n"); break;
- case 10: cprintf("Cannot create <wave 0> task!\n"); break;
- case 11: cprintf("Cannot create <osc> task!\n"); break;
- case 12: cprintf("Cannot create <video> task!\n"); break;
- case 13: cprintf("Cannot create <chfreq> task!\n"); break;
- case 14: cprintf("Cannot kill <wave 0> task!\n"); break;
- case 15: cprintf("Cannot kill <osc> task\n");break;
- case 20: cprintf("No PCI bus found!\n"); break;
- case 21: cprintf("No NATIONAL PCI E-Series board found on PCI bus!\n");break;
- case 30: cprintf("Cannot start graphic envirorment!\n"); break;
- case 31: cprintf("800x600x16 video mode not supported!\n");break;
- default: cprintf("Unknown exit event!\n"); break;
- }
-}
-
-/*
-* kill wave0 or osc when frequency change
-*/
-
-TASK chfreq_body(int w)
-{
- PORT p;
- char msg[1];
- p = port_create("activation",1,1,STREAM,WRITE);
-
- while(1)
- {
- if(flagch == 1)
- {
- if(task_kill(wave0_pid)!=0)
- {
- sys=14;
- sys_end();
- }
- hard_task_def_mit(wave0, period);
- if( (wave0_pid = task_create("wave 0", wave_body, &wave0, NULL))== NIL )
- {
- sys = 10;
- sys_end();
- }
- flagch = 0;
- task_activate(wave0_pid);
- }
-
- if(flagch == 2)
- {
- if(task_kill(osc_pid)!=0)
- {
- sys=15;
- sys_end();
- }
- hard_task_def_mit(osc, oscperiod);
- if( (osc_pid = task_createn("osc", osc_body, &osc, &r,
- SRP_usemutex(&m1), NULL))== NIL )
- {
- sys = 11;
- sys_end();
- }
- flagch = 0;
- msg[0]=1;
- port_send(p,msg,NON_BLOCK);
- }
- task_endcycle();
- }
-}
-
-/*
-* acquisition of input samples
-*/
-
-TASK osc_body(int wv)
-{
- int i = 0 ;
- short y = 0;
- WORD Status = 0;
-
- while(1)
- {
- mutex_lock(&m1);
- if(lib)
- {
- mutex_unlock(&m1);
- AI_Start_The_Acquisition();
- do {
- Status = DAQ_STC_Windowed_Mode_Read(AI_STATUS_1);
- if (!( (Status & 0x1000) == 0x1000 ) )
- y = Immediate_Readw(ADC_DATA_READ);
- } while(((Status & 0x1000) == 0x1000));
- y = (2.5/vosc)*(y-40)/20;
- if(abs(y)<=100)
- {
- grx_plot(19+i,483-y,rgb16(255,255,0));
- }
- yoscold[i]=y;
- i=(i+1)%500;
- if(i==0)
- {
- mutex_lock(&m1);
- lib=0;
- mutex_unlock(&m1);
- task_testcancel();
- }
- }
- else mutex_unlock(&m1);
- task_endcycle();
- }
-}
-
-/*
-* Sends out waves' samples
-*/
-
-TASK wave_body(int wv)
-{
- int i = 0;
- int y = 0;
- while(1)
- {
- if(wave==0)
- {
- y=vfun*(yrdac[i]*20);
- y=(y & 0x0FFF);
- }
- if(wave==1)
- {
- y=vfun*(ysdac[i]*20);
- y=(y & 0x0FFF);
- }
- if(wave==2)
- {
- y=vfun*(yqdac[i]*20);
- y=(y & 0x0FFF);
- }
- DAC_output(DAC1,y);
- i = (i + 1) % NUM_POINT;
- task_testcancel();
- task_endcycle();
- }
-}
-
-/*
-* Shows setting,wave,grid and clear display
-*/
-
-TASK video_body(int dummy)
-{
- BYTE dispold = 1,
- modefunold = 1,
- modeoscold = 1,
- new = 0;
-
- int waveold = 3,
- varfunold = 2,
- i = 0,
- y = 0,
- channelold = 16,
- yold[MAX_VAL];
-
-
- float vfunold = 1,
- voscold = 1,
- ffunold = 0,
- tbaseold = 1;
-
- char st[20];
-
- PORT p;
- char msg[1];
- p=port_connect("activation",1,STREAM,READ);
-
- while(1)
- {
- mutex_lock(&m1);
- if(!lib)
- {
- mutex_unlock(&m1);
- for(i=0;i<MAX_VAL;i++)
- {
- if(abs(yoscold[i])<=100)
- {
- grx_plot(19+i,483-yoscold[i],rgb16(0,0,0));
- }
- }
- //OSCILLOSCOPE GRID
- grx_line(19, 385, 519, 385, rgb16(150,150,150));
- grx_line(19, 410, 519, 410, rgb16(150,150,150));
- grx_line(19, 435, 519, 435, rgb16(150,150,150));
- grx_line(19, 460, 519, 460, rgb16(150,150,150));
- grx_line(19, 485, 519, 485, rgb16(150,150,150));
- grx_line(19, 510, 519, 510, rgb16(150,150,150));
- grx_line(19, 535, 519, 535, rgb16(150,150,150));
- grx_line(19, 560, 519, 560, rgb16(150,150,150));
- grx_line(19, 585, 519, 585, rgb16(150,150,150));
- grx_line(19, 385, 19, 585, rgb16(150,150,150));
- grx_line(69, 385, 69, 585, rgb16(150,150,150));
- grx_line(119, 385, 119, 585, rgb16(150,150,150));
- grx_line(169, 385, 169, 585, rgb16(150,150,150));
- grx_line(219, 385, 219, 585, rgb16(150,150,150));
- grx_line(269, 385, 269, 585, rgb16(150,150,150));
- grx_line(319, 385, 319, 585, rgb16(150,150,150));
- grx_line(369, 385, 369, 585, rgb16(150,150,150));
- grx_line(419, 385, 419, 585, rgb16(150,150,150));
- grx_line(469, 385, 469, 585, rgb16(150,150,150));
- grx_line(519, 385, 519, 585, rgb16(150,150,150));
- mutex_lock(&m1);
- lib=1;
- mutex_unlock(&m1);
- port_receive(p,msg,NON_BLOCK);
- if(msg[0]==1)
- {
- task_activate(osc_pid);
- }
- }
- else mutex_unlock(&m1);
- if(disp != dispold)
- {
- dispold = disp;
- grx_disc(780,120,10,rgb16(255*(1-disp),0,0));
- grx_disc(780,390,10,rgb16(0,255*disp,0));
- }
-
- if(modefun != modefunold)
- {
- modefunold = modefun;
- grx_disc(780,237,5,rgb16(255*(1-modefun),0,0));
- grx_disc(780,267,5,rgb16(255*(modefun),0,0));
- }
-
- if(modeosc != modeoscold)
- {
- modeoscold = modeosc;
- grx_disc(780,502,5,rgb16(0,255*(1-modeosc),0));
- grx_disc(780,532,5,rgb16(0,255*(modeosc),0));
- }
-
- if(wave != waveold)
- {
- waveold = wave;
- grx_disc(730,127,3,rgb16(127*(1-wave)*(2-wave),0,0));
- grx_disc(730,142,3,rgb16(254*wave*(2-wave),0,0));
- grx_disc(730,157,3,rgb16(254*wave*(wave-1),0,0));
- new=1;
- }
-
- if(varfun != varfunold)
- {
- varfunold = varfun;
- grx_disc(675,292,3,rgb16(42*(1-varfun)*(2-varfun)*(3-varfun),0,0));
- grx_disc(775,292,3,rgb16(126*varfun*(2-varfun)*(3-varfun),0,0));
- grx_disc(675,307,3,rgb16(252*varfun*(varfun-1)*(3-varfun),0,0));
- grx_disc(775,307,3,rgb16(42*varfun*(varfun-1)*(varfun-2),0,0));
- }
-
-
- if(channel != channelold)
- {
- sprintf(st,"%2d",channel);
- grx_text(" ",660,470,black,white);
- grx_text(st,660,470,black,white);
- }
-
- if(ffun != ffunold)
- {
- ffunold = ffun;
- sprintf(st,"%10f",ffun);
- grx_text(" ",660,265,black,white);
- grx_text(st,660,265,black,white);
- }
-
- if(tbase != tbaseold)
- {
- tbaseold = tbase;
- sprintf(st,"%10f",tbase);
- grx_text(" ",660,530,black,white);
- grx_text(st,660,530,black,white);
- }
-
- if(vfun != vfunold)
- {
- vfunold = vfun;
- sprintf(st,"%3.1f",vfun);
- grx_text(" ",660,235,black,white);
- grx_text(st,660,235,black,white);
- new=1;
- }
-
- if(vosc != voscold)
- {
- voscold = vosc;
- sprintf(st,"%3.1f",vosc);
- grx_text(" ",660,500,black,white);
- grx_text(st,660,500,black,white);
- }
-
- if(new)
- {
- for(i=0; i<MAX_VAL; i++)
- {
- grx_plot(19+i, 215-yold[i],rgb16(0, 0, 0));
- }
-
- //FUNCTION GENERATOR GRID
- grx_line(22, 115, 525, 115, rgb16(150,150,150));
- grx_line(22, 165, 525, 165, rgb16(150,150,150));
- grx_line(22, 265, 525, 265, rgb16(150,150,150));
- grx_line(22, 315, 525, 315, rgb16(150,150,150));
- grx_line(19, 110, 19, 320, rgb16(150,150,150));
- grx_line(14, 215, 525, 215, rgb16(150,150,150));
-
- if(wave==0)
- {
- for(i=0;i<MAX_VAL;i++)
- {
- y=(vfun)*yr[i];
- grx_plot(19+i,215-y,rgb16(255,255,0));
- yold[i]=y;
- }
- }
-
- if(wave==1)
- {
- for(i=0;i<MAX_VAL;i++)
- {
- y=(vfun)*ys[i];
- grx_plot(19+i,215-y,rgb16(255,255,0));
- yold[i]=y;
- }
- }
-
- if(wave==2)
- {
- for(i=0;i<MAX_VAL;i++)
- {
- y=(vfun)*yq[i];
- grx_plot(19+i,215-y,rgb16(255,255,0));
- yold[i]=y;
- }
- }
-
- new=0;
- }
- task_endcycle();
- }
-}
-
-/*
-* create wave triangular,sinusoidal and square
-*/
-
-void createWaves(void)
-{
- float u=0,
- qdac= 2*PI/NUM_POINT,
- q = 2*PI/(MAX_VAL/2);
-
- register int i;
-
- BYTE direction=0;
-/*create the vectors for the video task*/
- for(i=0;i<MAX_VAL/2;i++)
- {
- yr[i]=yr[i+MAX_VAL/2]=u/10;
- if(!direction) u += 1.613;
- else u -= 1.613;
- if(u >= 100) direction = 1;
- if(u <= -101) direction = 0;
-
- ys[i]=ys[i+MAX_VAL/2] = (sin(i*q)*10);
-
- if((i>=(MAX_VAL/4) && i< (MAX_VAL/2))) yq[i]=yq[i+MAX_VAL/2]=0;
- else yq[i]=yq[i+MAX_VAL/2]=10;
- }
-/*create the vectors for the wave_body task*/
- direction=0;
- u = 0;
- for(i=0;i<NUM_POINT;i++)
- {
- yrdac[i]=u/10;
- if(!direction) u += (400/NUM_POINT);
- else u -= (400/NUM_POINT);
- if(u >= 100) direction = 1;
- if(u <= -100) direction = 0;
-
- ysdac[i]=(sin(i*qdac)*10);
-
- if((i>=(NUM_POINT/2) && i<NUM_POINT)) yqdac[i]=0;
- else yqdac[i]=10;
- }
-}
-
-/*
-* select device (0 function generator,1 oscilloscope)
-*/
-
-void change_disp(KEY_EVT *k)
-{
- if(disp) disp = 0;
- else disp = 1;
-}
-
-/*
-* select volt or frequency
-*/
-
-void change_mode(KEY_EVT *k)
-{
- if(disp && modeosc) modeosc = 0;
- else
- if(disp && !modeosc) modeosc = 1;
- else
- if(!disp && modefun) modefun = 0;
- else
- if(!disp && !modefun) modefun =1;
-}
-
-/*
-* select wave (0 triangular,1 sinusoindal,2 square
-*/
-
-void change_wave(KEY_EVT *k)
-{
- if(!disp && k->ascii =='f')
- {
- wave=0;
- }
- else
- if(!disp && k->ascii =='g')
- {
- wave=1;
- }
- else
- if(!disp && k->ascii =='h')
- {
- wave=2;
- }
-}
-
-/*
-* select increase or decrease step
-*/
-
-void change_passo(KEY_EVT *k)
-{
- if(!disp && modefun)
- {
- varfun=(varfun+1)%2;
- }
-}
-
-/*
-* select input channel
-*/
-
-void change_channel(KEY_EVT *k)
-{
- if(disp)
- {
- channel=(channel+1)%16;
- Configure_Board(channel);
- }
-}
-
-/*
-* increase selected variable
-*/
-
-void inc(KEY_EVT *k)
-{
- if(disp && modeosc && tbase<300)
- {
- flagch=2;
- switch(varosc)
- {
- case(0): tbase = tbase*2;
- oscperiod=(tbase/50)*1000;
- break;
- }
- }
- else
- if(disp && !modeosc && vosc<10) vosc += 0.1;
- else
- if(!disp && modefun && ffun<(1e6/(1020*NUM_POINT))-1)
- {
- flagch=1;
- switch(varfun)
- {
- case(0): ffun += 1;
- period = 1e6/(NUM_POINT*ffun);
- break;
- case(1): ffun += 10;
- period = 1e6/(NUM_POINT*ffun);
- break;
- }
- }
- else
- if(!disp && !modefun && vfun<10) vfun += 0.1;
-}
-
-/*
-* decrease selected variable
-*/
-
-void dec(KEY_EVT *k)
-{
- if(disp && modeosc && tbase> 75)
- {
- flagch=2;
- switch(varosc)
- {
- case(0): tbase = tbase/2;
- oscperiod=(tbase/50)*1000;
- break;
- }
- }
- else
- if(disp && !modeosc && vosc> 0.2) vosc -= 0.1;
- else
- if(!disp && modefun && ffun> 0)
- {
- flagch = 1;
- switch(varfun)
- {
- case(0): ffun -= 1;
- if(ffun == 0) period =1e6;
- else
- period = 1e6/(NUM_POINT*ffun);
- break;
- case(1): ffun -= 10;
- if(ffun == 0) period =1e6;
- else
- period = 1e6/(NUM_POINT*ffun);
- break;
- }
- }
- else
- if(!disp && !modefun && vfun> -10) vfun -= 0.1;
-}
-
-/*
-* draw interface
-*/
-
-void drawInterface(void)
-{
- //TITLE
- grx_rect(1, 1, 799, 69, rgb16(105, 0, 105));
- grx_rect(2, 2, 798, 68, rgb16(155, 0, 155));
- grx_rect(3, 3, 797, 67, rgb16(205, 0, 205));
- grx_rect(4, 4, 796, 66, rgb16(255, 0, 255));
- grx_text("Oscilloscope and function generator for PCI6025E",7, 10, rgb16(50, 255, 50), black);
- grx_text("Pin ADC 3-18, DAC 21",7, 25, rgb16(0, 255, 255), black);
- grx_text("A for select Oscilloscope or Function generator",7, 40, rgb16(0, 255, 255), black);
- grx_text("CTRL-X for Exit", 7, 55, rgb16(200, 200, 0), black);
-
- //FUNCTION GENERATOR
- grx_text("FUNCTION GENERATOR", 100, 92, rgb16(200, 200, 0), black);
- grx_rect(1, 100, 549, 325, rgb16(0, 105, 0));
- grx_rect(2, 101, 548, 324, rgb16(0, 155, 0));
- grx_rect(3, 102, 547, 323, rgb16(0, 205, 0));
- grx_rect(4, 103, 546, 322, rgb16(0, 255, 0));
- grx_rect(579, 100, 799, 325, rgb16(0, 105, 0));
- grx_rect(580, 101, 798, 324, rgb16(0, 155, 0));
- grx_rect(581, 102, 797, 323, rgb16(0, 205, 0));
- grx_rect(582, 103, 796, 322, rgb16(0, 255, 0));
- grx_text("Wave selection",589,110,rgb16(0, 255, 0), black);
- grx_text("f -->triangular",589,125,rgb16(200, 200, 0), black);
- grx_text("g -->sin",589,140,rgb16(200, 200, 0), black);
- grx_text("h -->square",589,155,rgb16(200, 200, 0), black);
- grx_text("s -->select volt/freq",589,180,rgb16(200, 200, 0), black);
- grx_text("+/- -->set volt/freq",589,195,rgb16(200, 200, 0), black);
- grx_text("d -->frequency increase",589,210,rgb16(200, 200, 0),black);
- grx_text("Vpicco V",589,235,rgb16(0, 255, 0),black);
- grx_text("Freq Hz",589,265,rgb16(0, 255, 0),black);
- grx_text("+/- 1 Hz",589,290,rgb16(0, 255, 0),black);
- grx_text("+/- 10 HZ",689,290,rgb16(0, 255, 0),black);
-
- //OSCILLOSCOPE
- grx_text("OSCILLOSCOPE", 100, 362, rgb16(200, 200, 0), black);
- grx_rect(1, 370, 549, 595, rgb16(105, 0, 0));
- grx_rect(2, 371, 548, 594, rgb16(155, 0, 0));
- grx_rect(3, 372, 547, 593, rgb16(205, 0, 0));
- grx_rect(4, 373, 546, 592, rgb16(255, 0, 0));
- grx_rect(579, 370, 799, 595, rgb16(105, 0, 0));
- grx_rect(580, 371, 798, 594, rgb16(155, 0, 0));
- grx_rect(581, 372, 797, 593, rgb16(205, 0, 0));
- grx_rect(582, 373, 796, 592, rgb16(255, 0, 0));
- grx_text("Scale selection",589,380,rgb16(255, 0, 0), black);
- grx_text("s -->select volt/freq",589,400,rgb16(200, 200, 0), black);
- grx_text("+/- -->set volt/freq",589,415,rgb16(200, 200, 0), black);
- grx_text("j -->change channel",589,430,rgb16(200, 200, 0),black);
- grx_text("Channel",589,470,rgb16(255, 0, 0),black);
- grx_text("Volt/div V",589,500,rgb16(255, 0, 0),black);
- grx_text("Time/div ms",589,530,rgb16(255, 0, 0),black);
-
- //LABEL
- grx_text("0 V", 555, 211, rgb16(0, 255, 0), black);
- grx_text("+10", 555, 111, rgb16(0, 255, 0), black);
- grx_text("+5", 555, 161, rgb16(0, 255, 0), black);
- grx_text("-5", 555, 261, rgb16(0, 255, 0), black);
- grx_text("-10", 555, 311, rgb16(0, 255 , 0), black);
- grx_text("0 V", 555, 481, rgb16(255, 0, 0), black);
-}
Index: rel_1_2/oscilloscopio/adc.c
===================================================================
--- rel_1_2/oscilloscopio/adc.c (revision 1198)
+++ rel_1_2/oscilloscopio/adc.c (nonexistent)
@@ -1,400 +0,0 @@
-/*****************************************************************************
-* Filename: ADC.C *
-* Author: Ghiro Andrea,Franchino Gianluca *
-* Date: 06/06/2001 *
-* Description: Analog 2 digital conversion functions *
-*----------------------------------------------------------------------------*
-* Notes: Funcion for one sample from Ch0 *
-*****************************************************************************/
-
-/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
- *
- * Copyright (C) 2003 Ghiro Andrea,Franchino Gianluca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "adc.h"
-
-/*
-* Call this function to configure board options.
-*/
-
-void Configure_Board(BYTE numch)
-{
-WORD memhi;
- /*
- * Writing to register Write_Strobe_0_Register with address 82.
- * Write_Strobe_0 <= 1
- * New pattern = 0x0001
- */
- DAQ_STC_Windowed_Mode_Write(WRITE_STROBE_0,0x0001);
-
- /*
- * Writing to register Write_Strobe_1_Register with address 83.
- * Write_Strobe_1 <= 1
- * New pattern = 0x0001
- */
- DAQ_STC_Windowed_Mode_Write(WRITE_STROBE_1,0x0001);
-
- /*
- * Writing to register Config_Memory_High_Register with address 18.
- * CM_Channel_Number <= channel_number (0)
- * CM_Channel_Bank <= channel_bank (0)
- * CM_Channel_Type <= channel_type_for_rev_b (3)
- * New pattern = 0x3000
- */
- memhi = 0x3000 | numch;
- Immediate_Writew(ADC_CONFIG_HI,memhi);
-
- /*
- * Writing to register Config_Memory_Low_Register with address 16.
- * CM_Last_Channel <= last_channel (1)
- * CM_Trigger <= trigger (0)
- * CM_AI_Gain <= ai_gain (1)
- * CM_AI_Polarity <= ai_polarity (0)
- * CM_AI_Dither_Enable <= ai_dither_enable (0)
- * New pattern = 0x8001
- */
- Immediate_Writew(ADC_CONFIG_LO,0x8100);
- return;
- }
-
-/*
-* program the ADC_STC
-*/
-
-void ADC_Init()
-{
-/*
-* configure the timebase options.
-*/
- /*
- * Writing to register Clock_and_FOUT_Register with address 56.
- * Slow_Internal_Timebase <= p->msc_slow_int_tb_enable (1)
- * Slow_Internal_Time_Divide_By_2 <= p->msc_slow_int_tb_divide_by_2 (1)
- * Clock_To_Board <= p->msc_clock_to_board_enable (1)
- * Clock_To_Board_Divide_By_2 <= p->msc_clock_to_board_divide_by_2 (1)
- * New pattern = 0x1B00
- */
- DAQ_STC_Windowed_Mode_Write(CLOCK_AND_FOUT,0x1B00);
-
-/*
-* clear the AI FIFO.
-*/
- /*
- * Writing to register Write_Strobe_1_Register with address 83.
- * Write_Strobe_1 <= 1
- * New pattern = 0x0001
- */
- DAQ_STC_Windowed_Mode_Write(WRITE_STROBE_1,0x0001);
-
-/*
-* stop any activities in progress.
-*/
- /*
- * Writing to register Joint_Reset_Register with address 72.
- * AI_Reset <= 1
- * New pattern = 0x0001
- */
- DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0001);
-
- /*
- * Writing to register Joint_Reset_Register with address 72.
- * AI_Configuration_Start <= 1
- * New pattern = 0x0010
- */
- DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0010);
-
- /*
- * Writing to register Interrupt_A_Ack_Register with address 2.
- * AI_SC_TC_Error_Confirm <= 1
- * AI_SC_TC_Interrupt_Ack <= 1
- * AI_START1_Interrupt_Ack <= 1
- * AI_START2_Interrupt_Ack <= 1
- * AI_START_Interrupt_Ack <= 1
- * AI_STOP_Interrupt_Ack <= 1
- * AI_Error_Interrupt_Ack <= 1
- * New pattern = 0x3F80
- */
- DAQ_STC_Windowed_Mode_Write(INTERRUPT_A_ACK,0x3F80);
-
- /*
- * Writing to register AI_Command_1_Register with address 8.
- * AI_Command_1_Register <= 0
- * New pattern = 0x0000
- */
- DAQ_STC_Windowed_Mode_Write(AI_COMMAND_1,0x0000);
-
- /*
- * Writing to register AI_Mode_1_Register with address 12.
- * Reserved_One <= 1
- * AI_Start_Stop <= 1
- * New pattern = 0x000C
- */
- DAQ_STC_Windowed_Mode_Write(AI_MODE_1,0x000C);
-
- /*
- * Writing to register Joint_Reset_Register with address 72.
- * AI_Configuration_Start <= 0
- * AI_Configuration_End <= 1
- * New pattern = 0x0100
- */
- DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0100);
-
-/*
-* setup the board.
-*/
- /*
- * Writing to register Joint_Reset_Register with address 72.
- * AI_Configuration_Start <= 1
- * New pattern = 0x0010
- */
- DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0010);
-
- /*
- * Writing to register Clock_and_FOUT_Register with address 56.
- * AI_Source_Divide_By_2 <= p->ai_source_divide_by_2 (0)
- * AI_Output_Divide_By_2 <= p->ai_output_divide_by_2 (1)
- * New pattern = 0x1B80
- */
- DAQ_STC_Windowed_Mode_Write(CLOCK_AND_FOUT,0x1B80);
-
- /*
- * Writing to register AI_Personal_Register with address 77.
- * AI_CONVERT_Pulse_Timebase <= p->ai_convert_pulse_timebase (0)
- * AI_CONVERT_Pulse_Width <= p->ai_convert_pulse_width (1)
- * AI_FIFO_Flags_Polarity <= p->ai_fifo_flags_polarity (0)
- * AI_LOCALMUX_CLK_Pulse_Width <= p->ai_localmux_clk_pulse_width (1)
- * AI_AIFREQ_Polarity <= p->ai_aifreq_polarity (0)
- * AI_SHIFTIN_Polarity <= p->ai_shiftin_polarity (0)
- * AI_SHIFTIN_Pulse_Width <= p->ai_shiftin_pulse_width (1)
- * AI_EOC_Polarity <= p->ai_eoc_polarity (0)
- * AI_SOC_Polarity <= p->ai_soc_polarity (1)
- * AI_Overrun_Mode <= p->ai_overrun_mode (1)
- * New pattern = 0xA4A0
- */
- DAQ_STC_Windowed_Mode_Write(AI_PERSONAL,0xA4A0);
-
- /*
- * Writing to register AI_Output_Control_Register with address 60.
- * AI_CONVERT_Output_Select <= p->ai_convert_output_select (2)
- * AI_SC_TC_Output_Select <= p->ai_sc_tc_output_select (3)
- * AI_SCAN_IN_PROG_Output_Select <= p->ai_scan_in_prog_output_select (3)
- * AI_LOCALMUX_CLK_Output_Select <= p->ai_localmux_clk_output_select (2)
- * New pattern = 0x032E
- */
- DAQ_STC_Windowed_Mode_Write(AI_OUTPUT_CONTROL,0x032E);
-
- /*
- * Writing to register Joint_Reset_Register with address 72.
- * AI_Configuration_Start <= 0
- * AI_Configuration_End <= 1
- * New pattern = 0x0100
- */
- DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0100);
-
-/*
-* access the first value in the configuration
-* FIFO.
-*/
- /*
- * Writing to register AI_Command_1_Register with address 8.
- * AI_CONVERT_Pulse <= 1
- * New pattern = 0x0001
- */
- DAQ_STC_Windowed_Mode_Write(AI_COMMAND_1,0x0001);
-
-/*
-* setup for external hardware.
-*/
- /*
- * Writing to register Joint_Reset_Register with address 72.
- * AI_Configuration_Start <= 1
- * New pattern = 0x0010
- */
- DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0010);
-
- /*
- * Writing to register AI_Mode_2_Register with address 13.
- * AI_External_MUX_Present <= 0
- * New pattern = 0x0000
- */
- DAQ_STC_Windowed_Mode_Write(AI_MODE_2,0x0000);
-
- /*
- * Writing to register AI_Output_Control_Register with address 60.
- * AI_EXTMUX_CLK_Output_Select <= p->ai_extmux_clk_output_select (0)
- * New pattern = 0x032E
- */
- DAQ_STC_Windowed_Mode_Write(AI_OUTPUT_CONTROL,0x032E);
-
- /*
- * Writing to register Joint_Reset_Register with address 72.
- * AI_Configuration_Start <= 0
- * AI_Configuration_End <= 1
- * New pattern = 0x0100
- */
- DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0100);
-
-/*
-* enable or disable retriggering.
-*/
- /*
- * Writing to register Joint_Reset_Register with address 72.
- * AI_Configuration_Start <= 1
- * New pattern = 0x0010
- */
- DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0010);
-
- /*
- * Writing to register AI_Mode_1_Register with address 12.
- * AI_Trigger_Once <= 1
- * New pattern = 0x000D
- */
- DAQ_STC_Windowed_Mode_Write(AI_MODE_1,0x000D);
-
- /*
- * Writing to register AI_Trigger_Select_Register with address 63.
- * AI_START1_Select <= 0
- * AI_START1_Polarity <= 0
- * AI_START1_Edge <= 1
- * AI_START1_Sync <= 1
- * New pattern = 0x0060
- */
- DAQ_STC_Windowed_Mode_Write(AI_TRIGGER_SELECT,0x0060);
-
- /*
- * Writing to register Joint_Reset_Register with address 72.
- * AI_Configuration_Start <= 0
- * AI_Configuration_End <= 1
- * New pattern = 0x0100
- */
- DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0100);
-
-/*
-* select the number of scans.
-*/
-/*
- * Writing to register Joint_Reset_Register with address 72.
- * AI_Configuration_Start <= 1
- * New pattern = 0x0010
- */
- DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0010);
-
- DAQ_STC_Windowed_Mode_Write(AI_MODE_1,0x000F);
-
- /*
- * Writing to register Joint_Reset_Register with address 72.
- * AI_Configuration_Start <= 0
- * AI_Configuration_End <= 1
- * New pattern = 0x0100
- */
- DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0100);
-
-/*
-* select the scan start event.
-*/
- /*
- * Writing to register Joint_Reset_Register with address 72.
- * AI_Configuration_Start <= 1
- * New pattern = 0x0010
- */
- DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0010);
-
- /*
- * Writing to register AI_START_STOP_Select_Register with address 62.
- * AI_START_Select <= 0
- * AI_START_Edge <= 1
- * AI_START_Sync <= 1
- * AI_START_Polarity <= 0
- * New pattern = 0x0060
- */
- DAQ_STC_Windowed_Mode_Write(AI_START_STOP_SELECT,0x0060);
-
-
- /*
- * Writing to register Joint_Reset_Register with address 72.
- * AI_Configuration_Start <= 0
- * AI_Configuration_End <= 1
- * New pattern = 0x0100
- */
- DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0100);
-
-/*
-* select the end of scan event.
-*/
- /*
- * Writing to register Joint_Reset_Register with address 72.
- * AI_Configuration_Start <= 1
- * New pattern = 0x0010
- */
- DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0010);
-
- /*
- * Writing to register AI_START_STOP_Select_Register with address 62.
- * AI_STOP_Select <= p->ai_stop_select (19)
- * AI_STOP_Edge <= 0
- * AI_STOP_Polarity <= p->ai_stop_polarity (0)
- * AI_STOP_Sync <= 1
- * New pattern = 0x29E0
- */
- DAQ_STC_Windowed_Mode_Write(AI_START_STOP_SELECT,0x29E0);
-
- /*
- * Writing to register Joint_Reset_Register with address 72.
- * AI_Configuration_Start <= 0
- * AI_Configuration_End <= 1
- * New pattern = 0x0100
- */
- DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0100);
-
-/*
-* clear the AI FIFO.
-*/
- /*
- * Writing to register Write_Strobe_1_Register with address 83.
- * Write_Strobe_1 <= 1
- * New pattern = 0x0001
- */
- DAQ_STC_Windowed_Mode_Write(WRITE_STROBE_1,0x0001);
-return;
-}
-
-/*
-* Call this function to start the acquistion.
-*/
-
-void AI_Start_The_Acquisition()
-{
- /*
- * Writing to register AI_Command_1_Register with address 8.
- * AI_CONVERT_Pulse <= 1
- * New pattern = 0x0001
- */
- DAQ_STC_Windowed_Mode_Write(AI_COMMAND_1,0x0001);
- return;
- }
-
-/*End of file: adc.c*/
-
-
-
-
-
-
-
-
Index: rel_1_2/oscilloscopio/initosc.c
===================================================================
--- rel_1_2/oscilloscopio/initosc.c (revision 1198)
+++ rel_1_2/oscilloscopio/initosc.c (nonexistent)
@@ -1,69 +0,0 @@
-/*
-* Filename: Initosc.c
-* Author: Ghiro Andrea, Franchino Gianluca
-* Date: 09/03
-* Description: this file is for osc
-*/
-
-/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
- *
- * Copyright (C) 2003 Ghiro Andrea Franchino Gianluca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <kernel/kern.h>
-#include <modules/edf.h>
-#include <modules/cbs.h>
-#include <modules/rr.h>
-#include <modules/hartport.h>
-#include <modules/dummy.h>
-#include <modules/sem.h>
-#include <modules/srp.h>
-
-#include <drivers/keyb.h>
-
-#define TICK 1000
-#define RRTICK 5000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
-
- dummy_register_level();
-
- SEM_register_module();
-
- SRP_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
Index: rel_1_2/oscilloscopio/readme.txt
===================================================================
--- rel_1_2/oscilloscopio/readme.txt (revision 1198)
+++ rel_1_2/oscilloscopio/readme.txt (nonexistent)
@@ -1 +0,0 @@
-Verione con tutti i task periodici Hard
Index: rel_1_2/oscilloscopio/adc.h
===================================================================
--- rel_1_2/oscilloscopio/adc.h (revision 1198)
+++ rel_1_2/oscilloscopio/adc.h (nonexistent)
@@ -1,48 +0,0 @@
-/*****************************************************************************
-* Filename: ADC.H *
-* Author: Ghiro Andrea,Franchino Gianluca *
-* Date: 09/2003 *
-* Description: Analog 2 digital conversion package header file *
-*----------------------------------------------------------------------------*
-* Notes: *
-*****************************************************************************/
-
-/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
- *
- * Copyright (C) 2003 Ghiro Andrea,Franchino Gianluca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#ifndef _MY_ADC_H_
-#define _MY_ADC_H_
-
-#include <drivers/pci6025e/pci6025e.h>
-#include <drivers/pci6025e/regconst.h>
-#include "ll/sys/cdefs.h"
-
-__BEGIN_DECLS
-
-//Analog input releted functions
-void Configure_Board(BYTE);
-void ADC_Init(void);
-void AI_Start_The_Acquisition(void);
-
-__END_DECLS
-#endif
-/*End of file: adc.h*/
-
Index: rel_1_2/oscilloscopio/makefile
===================================================================
--- rel_1_2/oscilloscopio/makefile (revision 1198)
+++ rel_1_2/oscilloscopio/makefile (nonexistent)
@@ -1,18 +0,0 @@
-#
-#
-# PCI6025E Examples and Test programs
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= osc
-
-include $(BASE)/config/example.mk
-
-osc:
- make -f $(SUBMAKE) APP=osc OTHEROBJS="initosc.o adc.o" SHARKOPT="__6025E__ __OLDCHAR__ __GRX__"
-
Index: rel_1_2/bttvdemo/initfile.c
===================================================================
--- rel_1_2/bttvdemo/initfile.c (revision 1198)
+++ rel_1_2/bttvdemo/initfile.c (nonexistent)
@@ -1,120 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: initfile.c,v 1.1 2003-05-22 14:12:29 giacomo Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2003-05-22 14:12:29 $
- ------------
-
- System initialization file
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- NRT_TASK_MODEL at level 2
-
- This file is similar to the configuration of kernel/init/hartik3.c
-
- TICK is set to 0 (one-shot timer is used)
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/bttvdemo/readme.txt
===================================================================
--- rel_1_2/bttvdemo/readme.txt (revision 1198)
+++ rel_1_2/bttvdemo/readme.txt (nonexistent)
@@ -1,38 +0,0 @@
---------------------------------------
-BTTV Frame Grabber Demo
-
-by
-
-Giacomo Guidi <giacomo@gandalf.sssup.it>
-
-Last update 27/05/2003
---------------------------------------
-Ex:
-
-x bttv [channel number]
-
-if the channel is not specified 0 is taken.
-If you don't see a grabbed image, you
-can try to set a channel number from 1 to 4.
-
-This is a simple demo for the BTTV driver.
-It starts the frame grabber at 25 fps 320x200.
-The GRX driver is used to
-visualize the grabbed images.
-
-See also drivers/bttv/readme
-
-drivers/bttv/fgman-it.txt is the
-italian manual
-
---------------------------------------
-
-The demo is composed by:
-
-MAKEFILE The makefile used to compile the application
-README.TXT This file
-INITFILE.C The init file
-BTTV.C The BTTV Demo
-
---------------------------------------
-
Index: rel_1_2/bttvdemo/makefile
===================================================================
--- rel_1_2/bttvdemo/makefile (revision 1198)
+++ rel_1_2/bttvdemo/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS = bttv
-
-include $(BASE)/config/example.mk
-
-bttv:
- make -f $(SUBMAKE) APP=bttv INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__ __BTTV__"
-
Index: rel_1_2/bttvdemo/bttv.c
===================================================================
--- rel_1_2/bttvdemo/bttv.c (revision 1198)
+++ rel_1_2/bttvdemo/bttv.c (nonexistent)
@@ -1,153 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Giacomo Guidi <giacomo@gandalf.sssup.it>
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2003 Giacomo Guidi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "kernel/kern.h"
-#include <drivers/fg.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <unistd.h>
-#include <stdlib.h>
-
-#define WIDTH 640
-#define HEIGHT 480
-#define BYTES_PP 2
-
-unsigned char *video_buf = NULL; //Video Buffer
-unsigned long int VMEMLONG = WIDTH * HEIGHT * BYTES_PP / 4; // Used by copy_videomem_16to16
-unsigned long int RGB565MEM = WIDTH * HEIGHT * BYTES_PP; // Total video mem
-
-#define FG_PERIOD 40000
-#define FG_WCET 30000
-#define FG_W 320
-#define FG_H 200
-
-unsigned int color = FG_MONO;
-
-extern DWORD flbaddr;
-
-static void screen()
-{
-
- /* graphic card Initialization */
- if (grx_init() < 1) {
- sys_abort(1);
- }
-
- if (grx_open(640, 480, 16) < 0) {
- cprintf("GRX Err\n");
- sys_abort(1);
- }
-
- video_buf = (unsigned char *)flbaddr;
-
-}
-
-void program_end(void *arg)
-{
-
- grx_close();
-
- sys_end();
-
-}
-
-void elaborate_image(void *imageptr)
-{
-
- WORD x,y;
- BYTE *col;
-
- if (color == FG_MONO) {
-
- for(y = 0; y < FG_H; y++)
- for(x = 0; x < FG_W; x++) {
-
- col = (BYTE *)(imageptr + y*FG_W + x);
- *(WORD *)(video_buf + y*(WIDTH*2) + (x*2)) = (WORD)rgb16(*(BYTE *)(col),*(BYTE *)(col),*(BYTE *)(col));
-
- }
-
- }
-
- if (color == FG_RGB24) {
-
- for(y = 0; y < FG_H; y++)
- for(x = 0; x < FG_W; x++) {
-
- col = (BYTE *)(imageptr + y*(FG_W*3) + (x*3));
- *(WORD *)(video_buf + y*(WIDTH*2) + (x*2)) = (WORD)rgb16(*(BYTE *)(col),*(BYTE *)(col+1),*(BYTE *)(col+2));
-
- }
-
- }
-
- //printf_xy(0,0,WHITE,"Grabbed = %08lx",*(DWORD *)(imageptr + 50*FG_W + 50));
- //printf_xy(0,1,WHITE,"Grabbed = %08lx",*(DWORD *)(imageptr + 51*FG_W + 50));
-
-}
-
-int main(int argc, char **argv)
-{
-
- int channel = 0;
-
- if (argc < 2) {
- channel = 0;
- } else {
- channel = atoi(argv[1]);
- }
-
- sys_atrunlevel(program_end,NULL, RUNLEVEL_BEFORE_EXIT);
-
- screen();
- //video_buf = malloc(RGB565MEM);
-
- sleep(1);
-
- FG_init(FG_PERIOD, FG_WCET, FG_W, FG_H, color, channel);
-
- FG_set_hook(elaborate_image);
-
- FG_start_grabbing();
-
- while(keyb_getch(BLOCK) != ESC);
-
- FG_close();
-
- sys_end();
-
- return 0;
-
-}
Index: rel_1_2/parport/readme.txt
===================================================================
--- rel_1_2/parport/readme.txt (revision 1198)
+++ rel_1_2/parport/readme.txt (nonexistent)
@@ -1,27 +0,0 @@
-Hi,
-
-This directory contains a small demo that uses the Shark Parallel Port driver.
-
-Full documentation is available on the Shark Web Page.
-
-PJ
-
-PS: The following text is the original text made by the authors.
-------------------------------------------------------------------------------
-
-Universita' degli Studi di Pavia
-Facoltà di Ingegneria
-Dipartimento di Informatica e Sistemistica
-
--------------------------------------------------------------
- PARALLEL PORT SHARK PROJECT
- COMUNICAZIONE TRA PERSONAL COMPUTER TRAMITE PORTA PARALLELA
--------------------------------------------------------------
-Corso: Informatica Industriale - A.A. 2001/2002
-Docente: Prof. Giorgio Buttazzo
-Responsabili: Prof. Giorgio Buttazzo - Ing. Paolo Gai
-
-Progetto: Parallel Port Shark Project
-Autori: Andrea Battistotti, Armando Leggio
-
-(C) Copyright 2002 Andrea Battistotti & Armando Leggio
Index: rel_1_2/parport/makefile
===================================================================
--- rel_1_2/parport/makefile (revision 1198)
+++ rel_1_2/parport/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= ppdemo
-
-include $(BASE)/config/example.mk
-
-ppdemo:
- make -f $(SUBMAKE) APP=ppdemo INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __PPORT__ __GRX__"
-
Index: rel_1_2/parport/initfile.c
===================================================================
--- rel_1_2/parport/initfile.c (revision 1198)
+++ rel_1_2/parport/initfile.c (nonexistent)
@@ -1,120 +0,0 @@
-/*
- *
- * Project:
- * Parallel Port S.Ha.R.K. Project
- *
- * Module:
- * Initfile.c
- *
- * Description:
- * System initialization file
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors:
- * Andrea Battistotti <btandrea@libero.it>
- * Armando Leggio <a_leggio@hotmail.com>
- *
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- *
-
-
- System initialization file
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- NRT_TASK_MODEL at level 2
-
- This file is similar to the configuration of kernel/init/hartik3.c
-
- TICK is set to 0 (one-shot timer is used)
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-/* #define TICK 100 */
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/parport/ppdemo.c
===================================================================
--- rel_1_2/parport/ppdemo.c (revision 1198)
+++ rel_1_2/parport/ppdemo.c (nonexistent)
@@ -1,495 +0,0 @@
-/*
- *
- * Project:
- * Parallel Port S.Ha.R.K. Project
- *
- * Module:
- * ppDemo.c
- *
- * Description:
- * file contents description
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors:
- * Andrea Battistotti <btandrea@libero.it>
- * Armando Leggio <a_leggio@hotmail.com>
- *
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- *
- */
-
-/**
- ------------
- CVS : $Id: ppdemo.c,v 1.3 2003-03-24 11:18:19 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.3 $
- Last update: $Date: 2003-03-24 11:18:19 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/****************************************************************/
-/* PERIODIC PROCESS TEST */
-/****************************************************************/
-
-
-#include <drivers/parport.h>
-#include <drivers/keyb.h>
-#include <drivers/glib.h>
-
-#define TSK_PERIOD 250000 /*400000 ok for debug...*/
-#define TSK_WCET 70000
-
-
-#define YMENU 10 /* menu level */
-#define XMIN 10
-#define XMAX 630
-#define YMIN 10
-#define YMAX 470
-#define ESC 27 /* ASCII code of ESCAPE key */
-#define X0
-#define GRXWND_COLS 33
-#define GRXWND_LINS 15
-
-
-
-void ppInitGrxWnd(void)
-{
- /* graphic preparation */
- /* graphic card Initialization */
- if (grx_init() < 1) {
- sys_abort(1);
- }
-
- if (grx_open(640, 480, 8) < 0) {
- kern_printf("GRX Err\n");
- sys_abort(1);
- }
- kern_printf("Video card ok!\n");
- /* The scenario */
-
- // Background
- grx_clear(6);
-
- // Frame
- grx_rect(XMIN-1, YMIN-1, XMAX+1, YMAX+1, 0);
-
- // Window 1
- grx_box(XMIN+14,YMIN+14,XMAX-317,YMAX-235,7); //window
- grx_box(XMIN+17,YMIN+17,XMAX-320,YMAX-427,1); //bar
- grx_box(XMIN+17,YMIN+42,XMAX- 320,YMAX-238,0); //workspace
- grx_box(XMIN+286,YMIN+19,XMAX-322,YMAX-429,7);//button
- grx_text("PPDemo", XMIN+30, YMIN+21, 15, 1); //title
- grx_text("**********************************", XMIN+25, YMIN+55, 10, 0);
- grx_text("* PARALLEL PORT DEMONSTRATION *", XMIN+25, YMIN+70, 10, 0);
- grx_text("**********************************", XMIN+25, YMIN+85, 10, 0);
- grx_text("Press ALT X to exit", XMIN+25, YMIN+115, 10, 0);
- grx_text("other keys to communicate with", XMIN+25, YMIN+130, 10, 0);
- grx_text("remote terminal", XMIN+25, YMIN+145, 10, 0);
- grx_text("(c) Copyright 2002", XMIN+25, YMIN+190, 10, 0);
- grx_text("Andrea Battistotti, Armando Leggio", XMIN+25, YMIN+205, 10, 0);
-
- // Window 2
- grx_box(XMIN+317,YMIN+14,XMAX-14,YMAX-235,7);
- grx_box(XMIN+320,YMIN+17,XMAX-17,YMAX-427,1);
- grx_box(XMIN+320,YMIN+42,XMAX-17,YMAX-238,0);
- grx_box(XMIN+589,YMIN+19,XMAX-19,YMAX-429,7);
- grx_text("Statistics", XMIN+333, YMIN+21, 15, 1);
-
-}
-
-
-void ppInitGrxWnd_b(void)
-{
- // Window 3
- grx_box(XMIN+14,YMIN+243,XMAX-317,YMAX-6,7);
- grx_box(XMIN+17,YMIN+246,XMAX-320,YMAX-198,1);
- grx_box(XMIN+17,YMIN+271,XMAX-320,YMAX-9,0);
- grx_box(XMIN+286,YMIN+248,XMAX-322,YMAX-200,7);
- grx_text("Local Terminal", XMIN+30, YMIN+250, 15, 1);
-
- // Window 4
- grx_box(XMIN+317,YMIN+243,XMAX-14,YMAX-6,7);
- grx_box(XMIN+320,YMIN+246,XMAX-17,YMAX-198,1);
- grx_box(XMIN+320,YMIN+271,XMAX-17,YMAX-9,0);
- grx_box(XMIN+589,YMIN+248,XMAX-19,YMAX-200,7);
- grx_text("Remote Terminal", XMIN+333, YMIN+250, 15, 1);
-
-}
-
-
-void ppGrxWnd2(char *c) /* sys msg wind */
-{
- static int i,j;
- static char sysmsg[GRXWND_LINS+1][GRXWND_COLS+1];
- char s[2];
-
- s[1]='\0';
-
-
- while ((s[0]=*c++)) // *c != 0
- {
- sysmsg[i][j]=s[0] ;
- switch (s[0])
- {
- case '\r': case '\n':
- j=0;i++;
- break;
-
- case '\b':
- if (j>0)
- {
- j--;s[0]=' ';
- grx_text(s, XMIN+330+8*j, YMIN+49+10*i,10,0);
- //statistics grx_text(s, XMIN+330+8*j, YMIN+49+10*i,10,0);
- //statistics
- }
- break;
-
- default:
- grx_text(s, XMIN+330+8*j, YMIN+49+10*i,10,0); //statistics
- j++;
- break;
-
- }
- if (j>=GRXWND_COLS)
- {i++;
- j=0;}
- if (i>=GRXWND_LINS) {
- s[0]=' ';
- for (i=0;i<GRXWND_LINS;i++){
- for (j=0;j<GRXWND_COLS;j++){
- grx_text(s, XMIN+330+8*j, YMIN+49+10*i,10,0); //statistics
- };
- };
- i=0; j=0;
- };
- } // end while
-}
-
-
-void ppGrxWnd3(char c)
-{
- static int i,j;
- char talk[GRXWND_LINS+1][GRXWND_COLS+1];
- char s[2];
- s[1]='\0';
-
- talk[i][j]=c;
- s[0] = c;
- switch (c)
- {
- case '\r': case '\n':
- j=0;i++;
- break;
-
-
- case '\b':
- if (j>0)
- {
- j--;s[0]=' ';
- grx_text(s, XMIN+27+8*j, YMIN+278+10*i,10,0); //local term
-
- }
- break;
-
- default:
- grx_text(s, XMIN+27+8*j, YMIN+278+10*i,10,0); //local term
- j++;
- break;
-
- }
- if(j==GRXWND_COLS) {i++; j=0;};
- if(i==GRXWND_LINS) {
- s[0]=' ';
- for (i=0;i<GRXWND_LINS;i++){
- for (j=0;j<GRXWND_COLS;j++){
- grx_text(s, XMIN+27+8*j, YMIN+278+10*i,10,0); //local term
- };
- };
- i=0; j=0;
- }
-}
-
-
-void ppGrxWnd4(char c)
-{
- static int i,j;
- char talk[GRXWND_LINS][GRXWND_COLS];
- char s[2];
- s[1]='\0';
-
- talk[i][j]=c;
- s[0] = c;
- switch (c)
- {
- case '\r': case '\n':
- j=0;i++;break;
-
- case '\b':
- if (j>0)
- {
- j--;s[0]=' ';
- grx_text(s, XMIN+330+8*j, YMIN+278+10*i,10,0); //remote term
- }
- break;
- default:
- grx_text(s, XMIN+330+8*j, YMIN+278+10*i,10,0); //remote term
- j++;
- break;
- }
-
- if(j==GRXWND_COLS) {i++; j=0;}
- if(i==GRXWND_LINS) {
- s[0]=' ';
- for (i=0;i<GRXWND_LINS;i++){
- for (j=0;j<GRXWND_COLS;j++){
- grx_text(s, XMIN+330+8*j, YMIN+278+10*i,10,0); //remote term
- };
- };
- i=0; j=0;
- }
-}
-
-
-/***************************************************************/
-
-TASK ppChat(void *arg)
-{
- char sysmsg[SYS_MSG_COLS+1];
- long xposTx;
- KEY_EVT k;
- BYTE b;
-
-
- k.ascii = 0;
- xposTx=9430 ; // any 16 bit test value...
-
- task_endcycle();
-
- while (1) {
-#if PP_DEBUG == 1
- //kern_printf("ppchat \n");
-#endif
- /* read char buffer */
- if (keyb_getcode(&k,NON_BLOCK))
- {
- /* if any send it to ppDrv ...*/
- b=k.ascii;
-#if PP_DEBUG == 1
- kern_printf("Send char: %i , %c \n",b,b);
-#endif
- //kern_printf("--- Transmit value for xposTx: %d \n",xposTx);
- //ppTxBytes( (BYTE *) &xposTx, sizeof(xposTx) );
- ppGrxWnd3(b);
- ppTxOneByte(b);
- }
-
- if (ppRxOneByte(&b)==PP_COMM_OK)
- //if (ppRxBytes((BYTE *) &xposRx, sizeof(xposRx))==PP_COMM_OK)
- {
- ppGrxWnd4(b);
- //kern_printf("%c",b);
- //kern_printf("--- Received value for xposRx: %d \n", xposRx);
- }
-
- if (ppReadSysMsg(sysmsg)==PP_SYSMSG_OK) ppGrxWnd2(sysmsg);
-
-
- /* ..and show it in upper screen..*/
-
- task_endcycle();
- }
-}
-
-
-/****************************************************************/
-
-/* This function is called when Alt-X is pressed.
- It simply shutdown the system using sys_end.
- Note that the byebye() function is called only if we exit from
- the system using sys_end()!!!!
-*/
-void my_end(KEY_EVT* e)
-{
-
- sys_end();
-}
-
-/******************************************************************/
-
-/* This function is called when the system exit correctly after Alt-X.
- It exits from the graphic mode and then it prints a small greeting.
- Note that:
- - The function calls grx_exit, so it must be registered using
- RUNLEVEL_BEFORE_EXIT (RUNLEVEL_AFTER_EXIT does not work because
- at that point the kernel is already returned in real mode!!!)
- - When an exception is raised, the exception handler is called.
- Since the exception handler already exits from the graphic mode,
- this funcion has not to be called. For this reason:
- . we registered byebye using the flag NO_AT_ABORT
- . the exception handler exits using sys_abort; in that way byebye is
- NOT called
-*/
-
-void byebye(void *arg)
-{
- grx_close();
- kern_printf("Bye Bye!\n");
-}
-
-/****************************** MAIN ******************************/
-
-int main(int argc, char **argv)
-{
- PID pid2, pid;
- KEY_EVT emerg;
-
- HARD_TASK_MODEL m2;
- SOFT_TASK_MODEL mp;
-
- /* Set the closing function */
- sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
-
-
-
-
- keyb_set_map(itaMap);
- /* set the keyboard handler to exit correctly */
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,my_end);
-
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTR_BIT;
- keyb_hook(emerg,my_end);
-
- /* a small banner */
- kern_printf("ppChat Demo\n");
- kern_printf("Press Alt-X to exit\n");
-
- /* graphics */
- ppInitGrxWnd();
-
-
- /* graphic card Initialization */
- //kern_printf("Video card ok!\n");
-
-
-
- /* ppDrv creation */
- ppGrxWnd2("Initing Drv...\n");
- ppInitDrv(ppGrxWnd2); /* pass output fnc for init debug...*/
-
- ppInitGrxWnd_b();
-
-
- /* MODEL TASK EXAMPLES */
- soft_task_default_model(mp);
- soft_task_def_level(mp,1);
- soft_task_def_ctrl_jet(mp);
- soft_task_def_arg(mp, (void *)0);
- soft_task_def_group(mp, 1);
- soft_task_def_met(mp, PPDRV_WCET);
- soft_task_def_period(mp,PPDRV_PERIOD);
- soft_task_def_usemath(mp);
- pid = task_create("ppDrv", ppPollingSvr, &mp, NULL);
- if (pid != NIL) task_activate(pid);
- /**/
-
- //hard_task_default_model(m1);
- //hard_task_def_ctrl_jet (m1);
- //hard_task_def_arg (m1, (void *)0);
- //hard_task_def_wcet (m1, PPDRV_WCET);
- //hard_task_def_mit (m1, PPDRV_PERIOD);
- //hard_task_def_group (m1,1);
- //pid1 = task_create("ppDrv", ppPollingSvr, &m1, NULL);
- //if (pid1 == NIL) {/*grx_close();*/ perror("Could not create task <ppDrv>");sys_abort(1);}
- //if(task_activate(pid1)==-1) {/*grx_close();*/ perror("Could not create task <ppDrv>");sys_abort(1);};
-
- //(" Task ppDrv Activate...PID: %i\n",pid1);
- // kern_printf("---------------------\n");
-
-
- /* ppChat creation */
- hard_task_default_model(m2);
- hard_task_def_ctrl_jet (m2);
- hard_task_def_arg (m2, (void *)1);
- hard_task_def_wcet (m2, TSK_WCET);
- hard_task_def_mit (m2, TSK_PERIOD);
- hard_task_def_group (m2,2);
- pid2 = task_create("ppChat", ppChat, &m2, NULL);
- if (pid2 == NIL) {/*grx_close();*/ perror("Could not create task <ppChat>");sys_abort(1);}
- task_activate(pid2);
- //kern_printf("Task Chat Activate...PID: %i\n",pid2);
-
- //kern_printf("---------------------\n");
-
-
- /*
- now the task main ends, but the system does not shutdown because
- there are the three task ego1, ego2, and ego3 running.
- The demo will finish if a Alt-X key is pressed.
- */
-
- return 0;
-}
-
-/* MODEL TASK EXAMPLES (from jumpball demo)
-
- SOFT_TASK_MODEL mp;
-
- soft_task_default_model(mp);
- soft_task_def_level(mp,1);
- soft_task_def_ctrl_jet(mp);
- soft_task_def_arg(mp, (void *)rgb16(r,g,b));
- soft_task_def_group(mp, BALL_GROUP);
- soft_task_def_met(mp, WCET_BALL);
- soft_task_def_period(mp,PERIOD_BALL);
- soft_task_def_usemath(mp);
- pid = task_create(palla_str, palla, &mp, NULL);
-
- if (pid != NIL) task_activate(pid);
-
-
- HARD TASK EXAMPLES
-
- HARD_TASK_MODEL mp;
-
- hard_task_default_model(mp);
- hard_task_def_ctrl_jet(mp);
- hard_task_def_arg(mp, (void *)rgb16(r,g,b));
- hard_task_def_wcet(mp, 380);
- hard_task_def_mit(mp,PERIOD_BALL);
- hard_task_def_usemath(mp);
- pid = task_create("pallaEDF", palla, &mp, NULL);
-
- if (pid != NIL) task_activate(pid);
-*/
Index: rel_1_2/first/test2.c
===================================================================
--- rel_1_2/first/test2.c (revision 1198)
+++ rel_1_2/first/test2.c (nonexistent)
@@ -1,241 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: test2.c,v 1.2 2003-01-07 17:10:17 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-01-07 17:10:17 $
- ------------
-
- The purpose of this test is to show that two budgets with different
- period and capacity schedules correctly.
-
- 4 periodic tasks are involved
-*/
-
-/*
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "cbsstar.h"
-#include "edfstar.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-// --------------------------------------------------
-// --------------------------------------------------
-// Init Part
-// --------------------------------------------------
-// --------------------------------------------------
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- int cbsstar_level, edfstar_level, edfstar_level2, mybudget, mybudget2;
- clear();
- EDF_register_level(EDF_ENABLE_ALL);
-
- cbsstar_level = CBSSTAR_register_level(3, 0);
-
- mybudget = CBSSTAR_setbudget(cbsstar_level, 1000, 50000);
- edfstar_level = EDFSTAR_register_level(mybudget, cbsstar_level);
-
- mybudget2 = CBSSTAR_setbudget(cbsstar_level, 10000, 25000);
- edfstar_level2 = EDFSTAR_register_level(mybudget2, cbsstar_level);
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- cprintf("edfstar_level=%d, edfstar_level2=%d\n",
- edfstar_level,edfstar_level2);
-
- // for the keyboard...
- CBS_register_level(CBS_ENABLE_ALL, 0);
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-// --------------------------------------------------
-// --------------------------------------------------
-// The Test
-// --------------------------------------------------
-// --------------------------------------------------
-
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-void *star(void *arg)
-{
- int i,j,z;
-
- for (i=0; i<100; i++) {
- for (z=0; z<5; z++) {
- for (j=0; j<60000; j++);
- cputs((char *)arg);
- }
- task_endcycle();
- }
-
- return NULL;
-}
-
-// version for the "slow" budget
-void *slow(void *arg)
-{
- int i,j,z;
-
- for (i=0; i<15; i++) {
- for (z=0; z<5; z++) {
- for (j=0; j<200000; j++);
- cputs((char *)arg);
- }
- task_endcycle();
- }
-
- return NULL;
-}
-
-void create1()
-{
- HARD_TASK_MODEL m1;
- PID p1a, p1b, p1c, p1d;
-
- hard_task_default_model(m1);
- hard_task_def_wcet(m1, 5000);
- hard_task_def_group(m1,1);
- hard_task_def_periodic(m1);
-
-
-
-
- hard_task_def_level(m1,2);
-
- hard_task_def_arg(m1,(void *)".");
- hard_task_def_mit(m1,5000);
- p1a = task_create("a", slow, &m1, NULL);
- if (p1a == -1) {
- perror("Could not create task a ...");
- sys_end();
- }
-
- hard_task_def_arg(m1,(void *)",");
- hard_task_def_mit(m1,5000);
- p1b = task_create("b", slow, &m1, NULL);
- if (p1b == -1) {
- perror("Could not create task b ...");
- sys_end();
- }
-
-
-
-
- hard_task_def_level(m1,3);
-
- hard_task_def_arg(m1,(void *)"o");
- hard_task_def_mit(m1,5000);
- p1c = task_create("c", star, &m1, NULL);
- if (p1c == -1) {
- perror("Could not create task c ...");
- sys_end();
- }
-
- hard_task_def_arg(m1,(void *)"O");
- hard_task_def_mit(m1,5000);
- p1d = task_create("d", star, &m1, NULL);
- if (p1d == -1) {
- perror("Could not create task d ...");
- sys_end();
- }
-
- group_activate(1);
-}
-
-int main(int argc, char **argv)
-{
- char c;
-
- cprintf("Hello, world!");
-
- create1();
-
- do {
- c =keyb_getch(BLOCK);
- } while (c != ESC);
-
- cprintf("ESC pressed!");
-
- sys_end();
-
- return 0;
-}
-
Index: rel_1_2/first/cbsstar.c
===================================================================
--- rel_1_2/first/cbsstar.c (revision 1198)
+++ rel_1_2/first/cbsstar.c (nonexistent)
@@ -1,674 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: cbsstar.c,v 1.6 2003-08-01 13:20:38 trimarchi Exp $
-
- File: $File$
- Revision: $Revision: 1.6 $
- Last update: $Date: 2003-08-01 13:20:38 $
- ------------
-
- Read CBSSTAR.h for general details.
-
- Basically, a budget can be in 2 states:
- - Active -> the budget queue is not empty
- - Idle -> the budget queue is empty
-
- The fact that a task into a budget is inserted into the master module depends
- on the value of the remaining time the tasks can spend in the period.
-
- The module does handle only one oslib event, used to enforce the
- temporal isolation between buffers. Note that all is implemented
- without using the CONTROL_CAP field.
-
- Basically, for each budget there can be at most one task inserted
- into the master level. Its deadline is modified according to the
- usage of its capacity, that is, when a budget is exausted its
- deadline is postponed.
-
-*/
-
-/*
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#include "cbsstar.h"
-#include <ll/string.h>
-
-#define ACTIVE 1
-#define NOACTIVE 0
-#define INIT 2
-
-#define CBSSTAR_IDLE APER_STATUS_BASE
-/*
- * DEBUG stuffs begin
- */
-
-//#define CBSSTAR_DEBUG
-int event_monitor;
-#ifdef CBSSTAR_DEBUG
-
-
-static __inline__ void fake_printf(char *fmt, ...) {}
-
-//#define cbsstar_printf kern_printf
-//#define cbsstar_printf2 kern_printf
-//#define cbsstar_printf3 kern_printf
-
-#define cbsstar_printf fake_printf
-#define cbsstar_printf2 fake_printf
-#define cbsstar_printf3 fake_printf
-
-#if 0
-void cbsstar_printq(QQUEUE *q)
-{
- PID p;
- kern_printf("[");
- p = q->first;
- kern_printf("->%d",p);
- while (p != NIL) {
- p = proc_table[p].next;
- kern_printf("->%d",p);
- }
- kern_printf("]");
-}
-#else
-static __inline__ void cbsstar_printq(QQUEUE *q) {}
-#endif
-
-#if 0
-static __inline__ void cbsstar_printblob(int x) { if (x) cputc('±'); else cputc('Û'); }
-#else
-static __inline__ void cbsstar_printblob(int x) {}
-#endif
-
-#endif
-
-/*
- * DEBUG stuffs end
- */
-/*+ Status used in the level +*/
-#define CBSSTAR_WAIT APER_STATUS_BASE /*+ waiting the service +*/
-
-/* this structure contains the status for a single budget */
-struct budget_struct {
- TIME Q; /* budget */
- TIME T; /* period */
-
- struct timespec dline; /* deadline */
- int dline_timer; /* oslib event for budget reactivation*/
- int avail; /* current budget */
-
- PID current; /* the task currently put in execution */
-
- int flags;
-
- IQUEUE tasks; /* a FIFO queue for the tasks handled
- using the budget */
-};
-
-typedef struct {
- level_des l; /* the standard level descriptor */
-
- struct budget_struct *b; /* the budgets! */
- int n; /* the maximum index for the budgets */
- int freebudgets; /* number of free budgets; starts from n */
-
- int tb[MAX_PROC]; /* link task->budget (used in guest_end) */
-
- bandwidth_t U; /*+ the used bandwidth by the server +*/
-
- int cap_lev;
-
- PID on_shadow;
-
- LEVEL scheduling_level;
-
-} CBSSTAR_level_des;
-
-
-static void CBSSTAR_deadline_timer_hardreservation(void *a)
-{
- struct budget_struct *b = a;
- struct timespec t;
-
- //kern_printf("*********** %d", b->dline_timer);
- b->dline_timer=NIL;
- /* we modify the deadline according to rule 4 ... */
- /* there is a while because if the wcet is << than the system tick
- we need to postpone the deadline many times */
- if (b->avail<=0) {
- b->avail += b->Q;
- if (b->avail>b->Q) b->avail=b->Q;
-
- //kern_printf("budget recharge %d", b);
- }
-
- if (b->avail>0) b->flags=ACTIVE;
-
- /* avail may be <0 because a task executed via a shadow fo many time
- b->current == NIL only if the prec task was finished and there
- was not any other task to be put in the ready queue
- ... we are now activating the next task */
- if (b->current == NIL && b->flags) {
- if (iq_query_first(&(b->tasks)) != NIL) {
- //struct timespec t;
- CBSSTAR_level_des *lev;
- PID p;
- JOB_TASK_MODEL job;
- //kern_gettime(&t);
- //TIMESPEC_ASSIGN(&b->dline, &schedule_time);
- //ADDUSEC2TIMESPEC(b->T, &b->dline);
- kern_gettime(&t);
- TIMESPEC_ASSIGN(&b->dline, &t);
- ADDUSEC2TIMESPEC(b->T, &b->dline);
-
- p = iq_getfirst(&(b->tasks));
- b->current=p;
- lev = (CBSSTAR_level_des *)(level_table[proc_table[p].task_level]);
- //kern_printf("reinsert task p = %d lev = %d ",p,proc_table[p].task_level);
- /* and, finally, we reinsert the task in the master level */
- job_task_default_model(job, b->dline);
- job_task_def_noexc(job);
- //kern_printf("(CR:iact p%d %ld.%ld av=%d)",p,b->dline.tv_sec,b->dline.tv_nsec/1000, b->avail);
- //kern_printf("**");
- level_table[ lev->scheduling_level ]->
- private_insert(lev->scheduling_level, p, (TASK_MODEL *)&job);
-
- event_need_reschedule();
- }
- } else
- if (b->current !=NIL && b->avail>0) {
- kern_printf("(cap&nil ");
- }
- if (b->flags==NOACTIVE && b->dline_timer!=NIL){
- kern_gettime(&t);
- TIMESPEC_ASSIGN(&b->dline, &t);
- ADDUSEC2TIMESPEC(b->T, &b->dline);
-
- b->dline_timer=kern_event_post(&b->dline, CBSSTAR_deadline_timer_hardreservation, b);
- event_monitor=b->dline_timer;
- //kern_printf("(dline hard %ld.%ld ev %d)",b->dline.tv_sec,b->dline.tv_nsec/1000, b->dline_timer);
- }
-}
-static void CBSSTAR_activation(CBSSTAR_level_des *lev,
- PID p,
- struct timespec *acttime)
-{
- JOB_TASK_MODEL job;
- struct budget_struct *b = &lev->b[lev->tb[p]];
- /* we have to check if the deadline and the wcet are correct before
- activating a new task or an old task... */
-
- /* check 1: if the deadline is before than the actual scheduling time */
-
- /* check 2: if ( avail_time >= (cbs_dline - acttime)* (wcet/period) )
- (rule 7 in the CBS article!) */
- TIME t;
- struct timespec t2,t3;
-
- t = (b->T * b->avail) / b->Q;
- t3.tv_sec = t / 1000000;
- t3.tv_nsec = (t % 1000000) * 1000;
-
- SUBTIMESPEC(&b->dline, acttime, &t2);
- if (/* 1 */ TIMESPEC_A_LT_B(&b->dline, acttime) ||
- /* 2 */ TIMESPEC_A_GT_B(&t3, &t2) ) {
- TIMESPEC_ASSIGN(&b->dline, acttime);
- ADDUSEC2TIMESPEC(b->T, &b->dline);
- }
-
- /* and the capacity */
- if (b->flags==INIT) {
- b->avail = b->Q;
- b->flags=ACTIVE;
- }
-
-
-#ifdef CBSSTAR_DEBUG
- cbsstar_printf3("±%d±",lev->tb[p]);
- cbsstar_printblob(lev->tb[p]);
-#endif
- //}
- //#endif
-
- /* record the current task inserted in the master module */
- b->current = p;
-
- //#ifdef CBSSTAR_DEBUG
- //kern_printf("(CA:iact p%d %ld.%ld av=%d at=%ld.%ld)",p,b->dline.tv_sec,b->dline.tv_nsec/1000, b->avail, acttime->tv_sec, acttime->tv_nsec/1000);
- //#endif
- /* and, finally, we reinsert the task in the master level */
- job_task_default_model(job, b->dline);
- job_task_def_noexc(job);
- level_table[ lev->scheduling_level ]->
- private_insert(lev->scheduling_level, p, (TASK_MODEL *)&job);
- //b->dline_timer=kern_event_post(&b->dline, CBSSTAR_deadline_timer_hardreservation, b);
-}
-
-static void CBSSTAR_account_capacity(CBSSTAR_level_des *lev, PID p)
-{
- struct timespec ty;
- TIME tx;
- struct budget_struct *b = &lev->b[lev->tb[p]];
- TIME t;
- struct timespec t2,t3, acttime;
-
- if (lev->cap_lev!=NIL && b->current==p) {
- kern_event_delete(lev->cap_lev);
- lev->cap_lev=NIL;
- }
-
- kern_gettime(&acttime);
- t = (b->T * b->avail) / b->Q;
- t3.tv_sec = t / 1000000;
- t3.tv_nsec = (t % 1000000) * 1000;
-
- SUBTIMESPEC(&b->dline, &acttime, &t2);
-
- SUBTIMESPEC(&schedule_time, &cap_lasttime, &ty);
- tx = TIMESPEC2USEC(&ty);
- lev->b[lev->tb[p]].avail -= tx;
-
-#ifdef CBSSTAR_DEBUG
- cbsstar_printf2("(C:cap p%d av=%d)", p, lev->b[lev->tb[p]].avail);
-#endif
- if (lev->b[lev->tb[p]].avail<=0 || TIMESPEC_A_GT_B(&t3, &t2)) lev->b[lev->tb[p]].flags=NOACTIVE;
-
- if ( TIMESPEC_A_LT_B(&b->dline, &schedule_time) ) {
-
- /* we modify the deadline ... */
- TIMESPEC_ASSIGN(&b->dline, &schedule_time);
- ADDUSEC2TIMESPEC(b->T, &b->dline);
- }
-
- //if (b->flags==NOACTIVE && b->dline_timer!=NIL)
- // kern_printf("flags %d, dline_timer %d", b->flags, b->dline_timer);
-
- if (b->flags==NOACTIVE && b->dline_timer==NIL) {
- b->dline_timer=kern_event_post(&b->dline, CBSSTAR_deadline_timer_hardreservation, b);
- event_monitor=b->dline_timer;
- //kern_printf("(dline %ld.%ld ev %d)",b->dline.tv_sec,b->dline.tv_nsec/1000, b->dline_timer);
- }
-
-
-}
-
-
-/* The on-line guarantee is enabled only if the appropriate flag is set... */
-static int CBSSTAR_public_guarantee(LEVEL l, bandwidth_t *freebandwidth)
-{
- CBSSTAR_level_des *lev = (CBSSTAR_level_des *)(level_table[l]);
-
-#ifdef CBSSTAR_DEBUG
- cbsstar_printf("(C:gua)");
-#endif
-
- if (*freebandwidth >= lev->U) {
- *freebandwidth -= lev->U;
- return 1;
- }
- else
- return 0;
-}
-
-static void capacity_handler(void *l)
-{
- //kern_printf("!");
- CBSSTAR_level_des *lev =l;
- lev->cap_lev=NIL;
- event_need_reschedule();
-
-}
-
-static int CBSSTAR_private_eligible(LEVEL l, PID p)
-{
- CBSSTAR_level_des *lev = (CBSSTAR_level_des *)(level_table[l]);
- struct budget_struct *b = &lev->b[lev->tb[p]];
- JOB_TASK_MODEL job;
-
-#ifdef CBSSTAR_DEBUG
- //kern_printf("(C:eli %d",p);
-#endif
-
- /* we have to check if the deadline and the wcet are correct...
- if the CBSSTAR level schedules in background with respect to others
- levels, there can be the case in witch a task is scheduled by
- schedule_time > CBSSTAR_deadline; in this case (not covered in the
- article because if there is only the standard scheduling policy
- this never apply) we reassign the deadline */
- if (b->current==p) {
- if ( TIMESPEC_A_LT_B(&b->dline, &schedule_time)) {
- if (lev->cap_lev!=NIL) {
- kern_event_delete(lev->cap_lev);
- lev->cap_lev=NIL;
- }
-
- /* we kill the current activation */
- level_table[ lev->scheduling_level ]->
- private_extract(lev->scheduling_level, p);
- /* we modify the deadline ... */
- TIMESPEC_ASSIGN(&b->dline, &schedule_time);
- ADDUSEC2TIMESPEC(b->T, &b->dline);
-
- /* and the capacity */
- b->avail = b->Q;
- b->flags=ACTIVE;
-
- if (b->dline_timer!=NIL) {
- kern_event_delete(b->dline_timer);
- b->dline_timer=NIL;
- }
-
- //#ifdef CBSSTAR_DEBUG
- //kern_printf(" %ld.%ld av=%d)",b->dline.tv_sec,b->dline.tv_nsec/1000, b->Q);
- //cbsstar_printf3("±%d±",lev->tb[p]);
- //cbsstar_printblob(lev->tb[p]);
- //#endif
-
- /* and, finally, we reinsert the task in the master level */
- job_task_default_model(job, b->dline);
- job_task_def_noexc(job);
- //kern_printf("(CE:iact p%d %ld.%ld av=%d)",p,b->dline.tv_sec,b->dline.tv_nsec/1000, b->avail);
- level_table[ lev->scheduling_level ]->
- private_insert(lev->scheduling_level, p, (TASK_MODEL *)&job);
- //kern_printf("task %d, avail %d", p, b->avail);
- return -1;
- }
-}
-#ifdef CBSSTAR_DEBUG
- cbsstar_printf(")");
-#endif
-
- return 0;
-}
-
-static void CBSSTAR_private_insert(LEVEL l, PID p, TASK_MODEL *m)
-{
- /* A task has been activated for some reason. Basically, the task is
- inserted in the queue if the queue is empty, otherwise the task is
- inserted into the master module, and an oslib event is posted. */
-
- CBSSTAR_level_des *lev = (CBSSTAR_level_des *)(level_table[l]);
- BUDGET_TASK_MODEL *budget;
-
- if (m->pclass != BUDGET_PCLASS ||
- (m->level != 0 && m->level != l)) {
- kern_raise(XINVALID_TASK, p);
- return;
- }
- budget = (BUDGET_TASK_MODEL *)m;
-
-#ifdef CBSSTAR_DEBUG
- cbsstar_printf("(C:gcr %d b%d", p, budget->b);
-#endif
-
- lev->tb[p] = budget->b;
-
- if (lev->b[budget->b].current == NIL && lev->b[budget->b].flags ) {
- /* This is the first task in the budget,
- the task have to be inserted into the master module */
- struct timespec t;
- kern_gettime(&t);
- CBSSTAR_activation(lev,p,&t);
- } else {
- /* The budget is not empty, another task is already into the
- master module, so the task is inserted at the end of the budget
- queue */
- iq_insertlast(p,&lev->b[budget->b].tasks);
-//#ifdef CBSSTAR_DEBUG
- //kern_printf(" ilast flag %d task %d",lev->b[budget->b].flags,lev->b[budget->b].current);
- // cbsstar_printq(&lev->b[budget->b].tasks);
-//#endif
- }
-#ifdef CBSSTAR_DEBUG
- cbsstar_printf(")");
-#endif
-}
-
-static void CBSSTAR_private_extract(LEVEL l, PID p)
-{
- CBSSTAR_level_des *lev = (CBSSTAR_level_des *)(level_table[l]);
-
-//#ifdef CBSSTAR_DEBUG
- //kern_printf("(C:gend p%d c%d av=%d)", p, lev->b[lev->tb[p]].current, lev->b[lev->tb[p]].avail);
- //cbsstar_printq(&lev->b[lev->tb[p]].tasks);
-//#endif
-
- /* a task is removed from execution for some reasons. It must be
- that it is the first in its budget queue (only the first task in
- a budget queue is put into execution!) */
-
- /* remove the task from execution (or from the ready queue) */
- if (lev->b[lev->tb[p]].current == p) {
-
- CBSSTAR_account_capacity(lev,p);
- /* remove the task from the master module */
- level_table[ lev->scheduling_level ]->
- private_extract(lev->scheduling_level, p);
-
-#ifdef CBSSTAR_DEBUG
- cbsstar_printq(&lev->b[lev->tb[p]].tasks);
-#endif
-
- /* check if the buffer has someone else to schedule */
- if (iq_query_first(&lev->b[lev->tb[p]].tasks) == NIL) {
- /* the buffer has no tasks! */
- lev->b[lev->tb[p]].current = NIL;
- }
- else if (lev->b[lev->tb[p]].flags) {
- /* if so, insert the new task into the master module */
- PID n;
- struct timespec t;
-
- kern_gettime(&t);
- n = iq_getfirst(&lev->b[lev->tb[p]].tasks);
-//#ifdef CBSSTAR_DEBUG
- //kern_printf("{p%d n%d}",p,n);
-//#endif
- CBSSTAR_activation(lev,n,&t); // it modifies b[lev->tb[p]].current
- }
- else
- lev->b[lev->tb[p]].current=NIL;
-
- }
- else {
- iq_extract(p, &lev->b[lev->tb[p]].tasks);
- }
-}
-
-static void CBSSTAR_private_dispatch(LEVEL l, PID p, int nostop)
-{
- CBSSTAR_level_des *lev = (CBSSTAR_level_des *)(level_table[l]);
- struct timespec ty;
-
-//#ifdef CBSSTAR_DEBUG
- //kern_printf("(C:gdisp p%d c%d av=%d)", p, lev->b[lev->tb[p]].current, lev->b[lev->tb[p]].avail);
-// cbsstar_printq(&lev->b[lev->tb[p]].tasks);
-//#endif
-
- /* the current task (that is the only one inserted in the master module
- for the corresponding budget) is dispatched. Note that the current
- task is not inserted in any FIFO queue, so the task does not have to
- be extracted! */
-
- /* ... then, we dispatch it to the master level */
- level_table[ lev->scheduling_level ]->
- private_dispatch(lev->scheduling_level,p,nostop);
-
- /* ...and finally, we have to post a capacity event */
- if (!nostop) {
- TIMESPEC_ASSIGN(&ty, &schedule_time);
- ADDUSEC2TIMESPEC(lev->b[lev->tb[p]].avail,&ty);
- lev->cap_lev = kern_event_post(&ty,capacity_handler, lev);
- }
-
-}
-
-static void CBSSTAR_private_epilogue(LEVEL l, PID p)
-{
- CBSSTAR_level_des *lev = (CBSSTAR_level_des *)(level_table[l]);
- struct budget_struct *b = &lev->b[lev->tb[p]];
-
-
- //#ifdef CBSSTAR_DEBUG
- //kern_printf("(C:gepi %d %d",p, b->current);
- //#endif
-
- if (p==b->current) {
-
- CBSSTAR_account_capacity(lev,p);
-
- // L'evento di capacità va cancellato perchè sarà ripristinato nella successiva dispatch
- /* we have to check if the capacity is still available */
- if (b->flags) {
- /* there is capacity available, maybe it is simply a preemption;
- the task have to return to the ready queue */
- level_table[ lev->scheduling_level ]->
- private_epilogue(lev->scheduling_level,p);
-#ifdef CBSSTAR_DEBUG
- //kern_printf("(ep *av=%d", b->avail);
-#endif
-
-
- } else {
- /* we kill the current activation */
- level_table[ lev->scheduling_level ]->
- private_extract(lev->scheduling_level, p);
- //kern_printf("extract");
- iq_insertfirst(p, &b->tasks);
- proc_table[p].status = CBSSTAR_IDLE;
- b->current = NIL;
-
- //kern_printf("budget finish %d", b);
- }
-#ifdef CBSSTAR_DEBUG
- cbsstar_printf(")");
-#endif
- }
-
-}
-
-/* Registration functions }*/
-
-/*+ Registration function:
- int flags the init flags ... see CBSSTAR.h +*/
-LEVEL CBSSTAR_register_level(int n, LEVEL master)
-{
- LEVEL l; /* the level that we register */
- CBSSTAR_level_des *lev; /* for readableness only */
- PID i; /* a counter */
-
-#ifdef CBSSTAR_DEBUG
- cbsstar_printf("CBSSTAR_register_level\n");
-#endif
-
- /* request an entry in the level_table */
- l = level_alloc_descriptor(sizeof(CBSSTAR_level_des));
-
- lev = (CBSSTAR_level_des *)level_table[l];
-
- printk(" lev=%d\n",(int)lev);
-
- /* fill the standard descriptor */
- lev->l.private_insert = CBSSTAR_private_insert;
- lev->l.private_extract = CBSSTAR_private_extract;
- lev->l.private_eligible = CBSSTAR_private_eligible;
- lev->l.private_dispatch = CBSSTAR_private_dispatch;
- lev->l.private_epilogue = CBSSTAR_private_epilogue;
-
- lev->l.public_guarantee = CBSSTAR_public_guarantee;
-
- /* fill the CBSSTAR descriptor part */
- lev->b = (struct budget_struct *)kern_alloc(sizeof(struct budget_struct)*n);
-
- for (i=0; i<n; i++) {
- lev->b[i].Q = 0;
- lev->b[i].T = 0;
- NULL_TIMESPEC(&lev->b[i].dline);
- lev->b[i].dline_timer = NIL;
- lev->b[i].avail = 0;
- lev->b[i].current = -1;
- lev->b[i].flags=INIT;
- iq_init(&lev->b[i].tasks, &freedesc, 0);
- }
-
- lev->n = n;
- lev->freebudgets = 0;
-
- for (i=0; i<MAX_PROC; i++)
- lev->tb[i] = NIL;
-
- lev->U = 0;
- lev->cap_lev=NIL;
- lev->scheduling_level = master;
- lev->on_shadow=NIL;
-
- return l;
-}
-
-int CBSSTAR_setbudget(LEVEL l, TIME Q, TIME T)
-{
- CBSSTAR_level_des *lev = (CBSSTAR_level_des *)(level_table[l]);
-
-#ifdef CBSSTAR_DEBUG
- cbsstar_printf("(C:sbud)");
-#endif
-
- if (lev->freebudgets != lev->n) {
- bandwidth_t b;
- b = (MAX_BANDWIDTH / T) * Q;
-
- /* really update lev->U, checking an overflow... */
- if (Q< T && MAX_BANDWIDTH - lev->U > b) {
- int r = lev->freebudgets; // the return value
-
- lev->U += b;
- lev->freebudgets++;
-
- lev->b[r].Q = Q;
- lev->b[r].T = T;
-
- return r;
- }
- else
- return -2;
- }
- else
- return -1;
-}
Index: rel_1_2/first/posixstar.h
===================================================================
--- rel_1_2/first/posixstar.h (revision 1198)
+++ rel_1_2/first/posixstar.h (nonexistent)
@@ -1,142 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: posixstar.h,v 1.1 2003-06-18 08:13:53 trimarchi Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2003-06-18 08:13:53 $
- ------------
-
- This file contains the scheduling module compatible with POSIX
- specifications
-
- Title:
- POSIX version 1
-
- Task Models Accepted:
- NRT_TASK_MODEL - Non-Realtime Tasks
- weight field is ignored
- slice field is used to set the slice of a task, if it is !=0
- policy field is ignored
- inherit field is ignored
-
- Description:
- This module schedule his tasks following the POSIX specifications...
-
- A task can be scheduled in a Round Robin way or in a FIFO way.
- The tasks have also a priority field.
-
- The slices can be different one task from one another.
-
- The module can SAVE or SKIP activations
-
- Exceptions raised:
- XUNVALID_GUEST
- This level doesn't support guests. When a guest operation
- is called, the exception is raised.
-
- Restrictions & special features:
- - if specified, it creates at init time a task,
- called "Main", attached to the function __init__().
- - There must be only one module in the system that creates a task
- attached to the function __init__().
- - The level tries to guarantee that a RR task uses a "full" timeslice
- before going to the queue tail. "full" means that a task can execute
- a maximum time of slice+sys_tick due to the approx. done by
- the Virtual Machine. If a task execute more time than the slice,
- the next time it execute less...
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#ifndef __POSIXSTAR_H__
-#define __POSIXSTAR_H__
-
-#include <ll/ll.h>
-#include <kernel/config.h>
-#include <sys/types.h>
-#include <kernel/types.h>
-//#define POSIXSTAR_DEBUG
-
-/*+ Const: +*/
-#define POSIXSTAR_MINIMUM_SLICE 1000 /*+ Minimum Timeslice +*/
-#define POSIXSTAR_MAXIMUM_SLICE 500000 /*+ Maximum Timeslice +*/
-
-/*+ Registration function:
- TIME slice the slice for the Round Robin queue
- int createmain 1 if the level creates the main task 0 otherwise
- struct multiboot_info *mb used if createmain specified
-
- returns the level number at which the module has been registered.
-+*/
-LEVEL POSIXSTAR_register_level(int budget, int master, TIME slice,
- int prioritylevels);
-
-/*+ this function forces the running task to go to his queue tail,
- then calls the scheduler and changes the context
- (it works only on the POSIX level) +*/
-int POSIXSTAR_sched_yield(LEVEL l);
-
-/* the following functions have to be called with interruptions DISABLED! */
-
-/*+ this function returns the maximum level allowed for the POSIX level +*/
-int POSIXSTAR_get_priority_max(LEVEL l);
-
-/*+ this function returns the default timeslice for the POSIX level +*/
-int POSIXSTAR_rr_get_interval(LEVEL l);
-
-/*+ this functions returns some paramaters of a task;
- policy must be NRT_RR_POLICY or NRT_FIFO_POLICY;
- priority must be in the range [0..prioritylevels]
- returns ENOSYS or ESRCH if there are problems +*/
-int POSIXSTAR_getschedparam(LEVEL l, PID p, int *policy, int *priority);
-
-/*+ this functions sets paramaters of a task +*/
-int POSIXSTAR_setschedparam(LEVEL l, PID p, int policy, int priority);
-
-#endif
-
-/*
-MANCANO
-13.3.6 GETPRIORITYMin da mettere a 0
-*/
Index: rel_1_2/first/test3.c
===================================================================
--- rel_1_2/first/test3.c (revision 1198)
+++ rel_1_2/first/test3.c (nonexistent)
@@ -1,213 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: test3.c,v 1.2 2003-01-07 17:10:17 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-01-07 17:10:17 $
- ------------
-
- The purpose of this test is to show that two budgets with different
- period and budgets schedules correctly.
-
- 2 never ending tasks are involved
-*/
-
-/*
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "cbsstar.h"
-#include "edfstar.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-// --------------------------------------------------
-// --------------------------------------------------
-// Init Part
-// --------------------------------------------------
-// --------------------------------------------------
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- int cbsstar_level, edfstar_level, edfstar_level2, mybudget, mybudget2;
- clear();
- EDF_register_level(EDF_ENABLE_ALL);
-
- cbsstar_level = CBSSTAR_register_level(3, 0);
-
- mybudget = CBSSTAR_setbudget(cbsstar_level, 2000, 50000);
- edfstar_level = EDFSTAR_register_level(mybudget, cbsstar_level);
-
- mybudget2 = CBSSTAR_setbudget(cbsstar_level, 10000, 25000);
- edfstar_level2 = EDFSTAR_register_level(mybudget2, cbsstar_level);
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- cprintf("edfstar_level=%d, edfstar_level2=%d\n",
- edfstar_level,edfstar_level2);
-
- // for the keyboard...
- CBS_register_level(CBS_ENABLE_ALL, 0);
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-// --------------------------------------------------
-// --------------------------------------------------
-// The Test
-// --------------------------------------------------
-// --------------------------------------------------
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-#include <semaphore.h>
-
-sem_t s;
-
-void *star(void *arg)
-{
- int j,z;
-
- for (;;) {
- for (z=0; z<5; z++) {
- for (j=0; j<60000; j++);
- sem_wait(&s);
- cputs((char *)arg);
- sem_post(&s);
- }
- }
-
- return NULL;
-}
-
-
-void create1()
-{
- HARD_TASK_MODEL m1;
- PID p1a, p1c;
-
- hard_task_default_model(m1);
- hard_task_def_wcet(m1, 5000);
- hard_task_def_group(m1,1);
- hard_task_def_periodic(m1);
-
-
-
-
- hard_task_def_level(m1,2);
-
- hard_task_def_arg(m1,(void *)"O");
- hard_task_def_mit(m1,5000);
- p1a = task_create("a", star, &m1, NULL);
- if (p1a == -1) {
- perror("Could not create task a ...");
- sys_end();
- }
-
-
- hard_task_def_level(m1,3);
-
- hard_task_def_arg(m1,(void *)".");
- hard_task_def_mit(m1,5000);
- p1c = task_create("c", star, &m1, NULL);
- if (p1c == -1) {
- perror("Could not create task c ...");
- sys_end();
- }
-
- group_activate(1);
-}
-
-void endfun(KEY_EVT *k)
-{
- cprintf("ESC pressed!");
-
- sys_end();
-}
-
-int main(int argc, char **argv)
-{
- KEY_EVT k;
-
- sem_init(&s,0,1);
-
- k.flag = 0;
- k.scan = KEY_ESC;
- k.ascii = 27;
- keyb_hook(k,endfun);
-
- create1();
-
- return 0;
-}
-
Index: rel_1_2/first/iqueue.h
===================================================================
--- rel_1_2/first/iqueue.h (revision 1198)
+++ rel_1_2/first/iqueue.h (nonexistent)
@@ -1,172 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: iqueue.h,v 1.1 2002-09-02 10:29:30 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2002-09-02 10:29:30 $
- ------------
-
-*/
-
-/*
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-/*
- IQUEUEs
-
- This file contains functions that helps to manage task queues.
-
- These functions are different from the functions that manages the
- QUEUE and QQUEUE types. In particular, these functions no more relies
- on the prev & next fields of the task descriptor. In that way, tasks
- can be inserted in more than one queue at a time.
-
- Basically, an IQUEUE has an "I"nternal prev/next structure, that may
- be shared between one or more queue. Of course, the user MUST
- guarantee that the same task will not be inserted in two IQUEUEs that
- share the same prev/next buffer.
-
- The queue insertion is made by the following functions:
- iq_insert -> insertion based on the priority field.
- iq_timespec_insert -> same as above but use the timespec_priority field
- iq_insertfirst -> insert in the first position of the queue
-*/
-
-#include <kernel/const.h>
-#include <kernel/types.h>
-#include <sys/types.h>
-
-#define IQUEUE_NO_PRIORITY 1
-#define IQUEUE_NO_TIMESPEC 2
-
-struct IQUEUE_shared {
- PID prev[MAX_PROC];
- PID next[MAX_PROC];
- struct timespec *timespec_priority;
- DWORD *priority;
-};
-
-typedef struct {
- PID first;
- PID last;
- struct IQUEUE_shared *s;
-} IQUEUE;
-
-
-
-/* Internal queue initialization:
-
- share = &x -> the internal data structure of the IQUEUE x is used
- to enqueue the tasks.
-
- share = NULL -> an internal data structure to handle prev/next
- pairs is dynamically allocated (The amount of
- memory that is allocated can be reduced using the
- flags).
-
- flags can be used to reduce the memory usage of an IQUEUE when share=NULL:
- IQUEUE_NO_PRIORITY -> the iqueue do not provide internally a priority field
- IQUEUE_NO_TIMESPEC -> the iqueue do not provide internally a timespec field
-
- - note that, if these flags are used, the corresponding insert
- functions will not work!
- - the default value for the flags is, of course, 0
-*/
-void iq_init (IQUEUE *q, IQUEUE *share, int flags);
-
-/* Queue insert functions:
-
- - inserts a p into the q. p must not be already inserted into q.
- - four versions of the function;
- - iq_priority_insert -> ordered insertion using the priority field
- - iq_timespec_insert -> ordered insertion using the timespec field
- - iq_insertfirst -> insert at the first position of the queue
- - iq_insertlast -> insert at the last position of the queue
-*/
-void iq_priority_insert (PID p, IQUEUE *q);
-void iq_timespec_insert (PID p, IQUEUE *q);
-void iq_insertfirst (PID p, IQUEUE *q);
-void iq_insertlast (PID p, IQUEUE *q);
-
-/* Queue extract functions:
-
- - extracts a task p from the queue q.
- - three versions of the function;
- - iq_extract -> extracts given a task p
- (that must be inserted in the queue)
-
- - iq_getfirst -> extracts the first task in the queue,
- NIL if the queue is empty
-
- - iq_getlast -> extracts the last task in the queue,
- NIL if the queue is empty
-
-*/
-void iq_extract (PID p, IQUEUE *q);
-PID iq_getfirst ( IQUEUE *q);
-PID iq_getlast ( IQUEUE *q);
-
-
-/* Queue query functions:
-
- The first two functions return the first and the last task in the queue,
- NIL if the queue is empty.
-
- The second two functions can be used to get/set the priority or the
- timespec field used when queuing.
-*/
-static __inline__ PID iq_queryfirst(IQUEUE *q)
-{
- return q->first;
-}
-
-static __inline__ PID iq_querylast(IQUEUE *q)
-{
- return q->last;
-}
-
-static __inline__ struct timespec *iq_query_timespec(PID p, IQUEUE *q)
-{
- return &q->s->timespec_priority[p];
-}
-
-static __inline__ DWORD *iq_query_priority (PID p, IQUEUE *q)
-{
- return &q->s->priority[p];
-}
Index: rel_1_2/first/test4.c
===================================================================
--- rel_1_2/first/test4.c (revision 1198)
+++ rel_1_2/first/test4.c (nonexistent)
@@ -1,231 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: test4.c,v 1.2 2003-01-07 17:10:17 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-01-07 17:10:17 $
- ------------
-
- The purpose of this test is to show that two budgets with different
- period and budgets schedules correctly.
-
- 2 never ending tasks are involved
-*/
-
-/*
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "cbsstar.h"
-#include "edfstar.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-// --------------------------------------------------
-// --------------------------------------------------
-// Init Part
-// --------------------------------------------------
-// --------------------------------------------------
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- int cbsstar_level;
- int edfstar_level, edfstar_level2, edfstar_level3;
- int mybudget, mybudget2;
-
- clear();
-
- EDF_register_level(EDF_ENABLE_ALL);
-
- cbsstar_level = CBSSTAR_register_level(3, 0);
-
- mybudget = CBSSTAR_setbudget(cbsstar_level, 2000, 50000);
- edfstar_level = EDFSTAR_register_level(mybudget, cbsstar_level);
-
- mybudget2 = CBSSTAR_setbudget(cbsstar_level, 10000, 25000);
- edfstar_level2 = EDFSTAR_register_level(mybudget2, cbsstar_level);
- edfstar_level3 = EDFSTAR_register_level(mybudget2, cbsstar_level);
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- cprintf("edfstar_level=%d, edfstar_level2=%d\n",
- edfstar_level,edfstar_level2);
-
- // for the keyboard...
- CBS_register_level(CBS_ENABLE_ALL, 0);
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- //keyb_def_ctrlC(kparms, NULL);
- //keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-// --------------------------------------------------
-// --------------------------------------------------
-// The Test
-// --------------------------------------------------
-// --------------------------------------------------
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-#include <semaphore.h>
-
-sem_t s;
-
-void *star(void *arg)
-{
- int j,z;
-
- for (;;) {
- for (z=0; z<50; z++) {
- for (j=0; j<60000; j++);
-// sem_wait(&s);
- cputs((char *)arg);
-// sem_post(&s);
- }
- task_endcycle();
- }
-
- return NULL;
-}
-
-
-void create1()
-{
- HARD_TASK_MODEL m1;
- PID p1a, p1b, p1c;
-
- hard_task_default_model(m1);
- hard_task_def_wcet(m1, 5000);
- hard_task_def_group(m1,1);
- hard_task_def_periodic(m1);
-
-
-
-
- hard_task_def_level(m1,2);
-
- hard_task_def_arg(m1,(void *)"O");
- hard_task_def_mit(m1,5000);
- p1a = task_create("a", star, &m1, NULL);
- if (p1a == -1) {
- perror("Could not create task a ...");
- sys_end();
- }
-
-
- hard_task_def_level(m1,3);
-
- hard_task_def_arg(m1,(void *)".");
- hard_task_def_mit(m1,5000);
- p1b = task_create("b", star, &m1, NULL);
- if (p1b == -1) {
- perror("Could not create task c ...");
- sys_end();
- }
-
- hard_task_def_level(m1,4);
-
- hard_task_def_arg(m1,(void *)",");
- hard_task_def_mit(m1,5000);
- p1c = task_create("c", star, &m1, NULL);
- if (p1c == -1) {
- perror("Could not create task c ...");
- sys_end();
- }
-
- group_activate(1);
-}
-
-void endfun(KEY_EVT *k)
-{
- cprintf("ESC pressed!");
-
- sys_end();
-}
-
-int main(int argc, char **argv)
-{
- KEY_EVT k;
-
- sem_init(&s,0,1);
-
- k.flag = 0;
- k.scan = KEY_ESC;
- k.ascii = 27;
- keyb_hook(k,endfun);
-
- create1();
-
- return 0;
-}
-
Index: rel_1_2/first/test5.c
===================================================================
--- rel_1_2/first/test5.c (revision 1198)
+++ rel_1_2/first/test5.c (nonexistent)
@@ -1,248 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: test5.c,v 1.2 2003-01-07 17:10:17 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-01-07 17:10:17 $
- ------------
-
- The purpose of this test is to show that two budgets with different
- period and budgets schedules correctly.
-
- 2 never ending tasks are involved
-*/
-
-/*
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "cbsstar.h"
-#include "edfstar.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-// --------------------------------------------------
-// --------------------------------------------------
-// Init Part
-// --------------------------------------------------
-// --------------------------------------------------
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- int cbsstar_level;
- int edfstar_level, edfstar_level2, edfstar_level3;
- int mybudget, mybudget2;
-
- clear();
-
- EDF_register_level(EDF_ENABLE_ALL);
-
- cbsstar_level = CBSSTAR_register_level(3, 0);
-
- mybudget = CBSSTAR_setbudget(cbsstar_level, 2000, 50000);
- edfstar_level = EDFSTAR_register_level(mybudget, cbsstar_level);
-
- mybudget2 = CBSSTAR_setbudget(cbsstar_level, 10000, 25000);
- edfstar_level2 = EDFSTAR_register_level(mybudget2, cbsstar_level);
- edfstar_level3 = EDFSTAR_register_level(mybudget2, cbsstar_level);
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- cprintf("edfstar_level=%d, edfstar_level2=%d\n",
- edfstar_level,edfstar_level2);
-
- // for the keyboard...
- CBS_register_level(CBS_ENABLE_ALL, 0);
-
- CBS_register_level(CBS_ENABLE_ALL, edfstar_level3);
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- //keyb_def_ctrlC(kparms, NULL);
- //keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-// --------------------------------------------------
-// --------------------------------------------------
-// The Test
-// --------------------------------------------------
-// --------------------------------------------------
-
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-#include <semaphore.h>
-
-sem_t s;
-
-void *star(void *arg)
-{
- int j,z;
-
- for (;;) {
- for (z=0; z<50; z++) {
- for (j=0; j<60000; j++);
-// sem_wait(&s);
- cputs((char *)arg);
-// sem_post(&s);
- }
- task_endcycle();
- }
-
- return NULL;
-}
-
-
-void create1()
-{
- HARD_TASK_MODEL m1;
- SOFT_TASK_MODEL ms;
- PID p1a, p1b, p1c, p2;
-
- hard_task_default_model(m1);
- hard_task_def_wcet(m1, 5000);
- hard_task_def_group(m1,1);
- hard_task_def_periodic(m1);
-
-
-
-
- hard_task_def_level(m1,2);
-
- hard_task_def_arg(m1,(void *)"O");
- hard_task_def_mit(m1,5000);
- p1a = task_create("a", star, &m1, NULL);
- if (p1a == -1) {
- perror("Could not create task a ...");
- sys_end();
- }
-
-
- hard_task_def_level(m1,3);
-
- hard_task_def_arg(m1,(void *)".");
- hard_task_def_mit(m1,50000);
- p1b = task_create("b", star, &m1, NULL);
- if (p1b == -1) {
- perror("Could not create task c ...");
- sys_end();
- }
-
- hard_task_def_level(m1,4);
-
- hard_task_def_arg(m1,(void *)",");
- hard_task_def_mit(m1,50000);
- p1c = task_create("c", star, &m1, NULL);
- if (p1c == -1) {
- perror("Could not create task c ...");
- sys_end();
- }
-
- soft_task_default_model(ms);
- soft_task_def_met(ms, 5000);
- soft_task_def_period(ms, 30000);
- soft_task_def_group(ms,1);
- soft_task_def_periodic(ms);
- soft_task_def_level(ms,8);
- soft_task_def_arg(ms,(void *)"X");
- p2 = task_create("S", star, &ms, NULL);
- if (p2 == -1) {
- perror("Could not create task S ...");
- sys_end();
- }
-
- group_activate(1);
-}
-
-void endfun(KEY_EVT *k)
-{
- cprintf("ESC pressed!");
-
- sys_end();
-}
-
-int main(int argc, char **argv)
-{
- KEY_EVT k;
-
- sem_init(&s,0,1);
-
- k.flag = 0;
- k.scan = KEY_ESC;
- k.ascii = 27;
- keyb_hook(k,endfun);
-
- create1();
-
- return 0;
-}
-
Index: rel_1_2/first/test6.c
===================================================================
--- rel_1_2/first/test6.c (revision 1198)
+++ rel_1_2/first/test6.c (nonexistent)
@@ -1,248 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: test6.c,v 1.2 2003-01-07 17:10:17 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-01-07 17:10:17 $
- ------------
-
- this test shows a set of 5 tasks (+main+dummy+keyboard driver).
-
- The first 4 tasks are scheduled by a RMSTAR Module, whereas the
- fifth one is a standard traditional EDF task. The 4 tasks uses a
- budget of 10000/100000.
-
- if edfstar.c is compiled with edfstar_printf3 active, a couple
- (dline, curtime) is showed (in ms).
-
- if cbsstar.c is compiled with cbsstar_printf3 active, the budget
- replenishments are showed.
-*/
-
-/*
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "cbsstar.h"
-#include "rmstar.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-// --------------------------------------------------
-// --------------------------------------------------
-// Init Part
-// --------------------------------------------------
-// --------------------------------------------------
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- int cbsstar_level, rmstar_level, mybudget;
-
- EDF_register_level(EDF_ENABLE_ALL);
-
- cbsstar_level = CBSSTAR_register_level(3, 0);
- mybudget = CBSSTAR_setbudget(cbsstar_level, 10000, 100000);
- rmstar_level = RMSTAR_register_level(mybudget, cbsstar_level);
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- // for the keyboard...
- CBS_register_level(CBS_ENABLE_ALL, 0);
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- //keyb_def_ctrlC(kparms, NULL);
- //keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-// --------------------------------------------------
-// --------------------------------------------------
-// The Test
-// --------------------------------------------------
-// --------------------------------------------------
-
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-void *star(void *arg)
-{
- int i,j;
-
- for (i=0; i<5; i++) {
- for (j=0; j<100000; j++);
- cputc('°');
- cputs((char *)arg);
- task_endcycle();
- }
-
- return NULL;
-}
-
-void *edftask(void *arg)
-{
- int i,j;
-
- for (i=0; i<5; i++) {
- for (j=0; j<100000; j++);
- cputc('°');
- cputs((char *)arg);
- task_endcycle();
- }
-
- return NULL;
-}
-
-void create1()
-{
- HARD_TASK_MODEL m1, m2;
- PID p1a, p1b, p1c, p1d, p2;
-
- hard_task_default_model(m1);
- hard_task_def_wcet(m1, 5000);
- hard_task_def_level(m1,2);
- hard_task_def_group(m1,1);
- hard_task_def_periodic(m1);
-
- hard_task_def_arg(m1,(void *)"a");
- hard_task_def_mit(m1,10000);
- p1a = task_create("a", star, &m1, NULL);
- if (p1a == -1) {
- perror("Could not create task a ...");
- sys_end();
- }
-
- hard_task_def_arg(m1,(void *)"b");
- hard_task_def_mit(m1,15000);
- p1b = task_create("b", star, &m1, NULL);
- if (p1b == -1) {
- perror("Could not create task b ...");
- sys_end();
- }
-
- hard_task_def_arg(m1,(void *)"c");
- hard_task_def_mit(m1,20000);
- p1c = task_create("c", star, &m1, NULL);
- if (p1c == -1) {
- perror("Could not create task c ...");
- sys_end();
- }
-
- hard_task_def_arg(m1,(void *)"d");
- hard_task_def_mit(m1,30000);
- p1d = task_create("d", star, &m1, NULL);
- if (p1d == -1) {
- perror("Could not create task d ...");
- sys_end();
- }
-
- hard_task_default_model(m2);
- hard_task_def_mit(m2,50000); // the budget has dline 100,000!
- hard_task_def_wcet(m2, 5000);
- hard_task_def_arg(m2,(void *)"Û");
- hard_task_def_group(m2,1);
- hard_task_def_periodic(m2);
-
- p2 = task_create("2", edftask, &m2, NULL);
- if (p2 == -1) {
- perror("Could not create task edf ...");
- sys_end();
- }
-
- cprintf("stars=%d %d %d %d, star2=%d\n", p1a, p1b, p1c, p1d, p2);
-
- group_activate(1);
-}
-
-int main(int argc, char **argv)
-{
- char c;
-
- clear();
-
- cprintf("Hello, world!");
-
- create1();
-
- do {
- c =keyb_getch(BLOCK);
- } while (c != ESC);
-
- cprintf("ESC pressed!");
-
- sys_end();
-
- return 0;
-}
-
Index: rel_1_2/first/cbsstar.h
===================================================================
--- rel_1_2/first/cbsstar.h (revision 1198)
+++ rel_1_2/first/cbsstar.h (nonexistent)
@@ -1,157 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/*
- ------------
- CVS : $Id: cbsstar.h,v 1.1 2002-09-02 10:29:30 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2002-09-02 10:29:30 $
- ------------
-
- This file contains the budget support for the multiapplication
- scheduling algorithm proposed in the framework of the FIRST Project
-
- Title:
- CBSSTAR
-
- Task Models Accepted:
- None!
-
- Guest Models Accepted:
- BUDGET_TASK_MODEL - A task that is attached to a budget
- int b; --> the number of the budget which the task is attached to
-
- Description:
- This module schedule its tasks following the CBS scheme.
- Every task is inserted using the guest calls.
-
- The module defines a limited set of budgets that the application
- can use. Every guest task will use a particular budget; FIFO
- scheduling is used inside a budget to schedule more than one ready
- task attached to the same budget.
-
- The tasks are inserted in an EDF level (or similar) with a JOB_TASK_MODEL,
- and the CBS level expects that the task is scheduled with the absolute
- deadline passed in the model.
-
- This module tries to implement a simplified version of the guest
- task interface:
- - To insert a guest task, use guest_create
- - When a task is dispatched, use guest_dispatch
- - When a task have to be suspended, you have to use:
- -> preemption: use guest_epilogue
- -> synchronization, end: use guest_end
- Remember: no check is done on the budget number passed with the model!!!
-
- Exceptions raised:
- XUNVALID_TASK
- This level doesn't support normal tasks, but just guest tasks.
- When a task operation is called, an exception is raised.
-
- Restrictions & special features:
- - This level doesn't manage the main task.
- - At init time we have to specify:
- . guarantee check
- (when all task are created the system will check that the task_set
- will not use more than the available bandwidth)
- - A function to return the used bandwidth of the level is provided.
-
- - A function is provided to allocate a buffer.
-*/
-
-/*
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#ifndef __CBSSTAR_H__
-#define __CBSSTAR_H__
-
-#include <kernel/kern.h>
-
-//#include <ll/ll.h>
-//#include <kernel/config.h>
-//#include <sys/types.h>
-//#include <kernel/types.h>
-//#include <modules/codes.h>
-
-/* -----------------------------------------------------------------------
- BUDGET_TASK_MODEL: a model for guest tasks
- ----------------------------------------------------------------------- */
-
-#define BUDGET_PCLASS 0x0600
-
-typedef struct {
- TASK_MODEL t;
- int b;
-} BUDGET_TASK_MODEL;
-
-#define budget_task_default_model(m,buf) \
- task_default_model((m).t, BUDGET_PCLASS), \
- (m).b = (buf);
-
-
-
-/* some constants for registering the Module in the right place */
-#define CBSSTAR_LEVELNAME "CBSSTAR"
-#define CBSSTAR_LEVEL_CODE 106
-#define CBSSTAR_LEVEL_VERSION 1
-
-
-
-
-/* Registration function:
- int N Maximum number of budgets allocated for the applications
- LEVEL master the level that must be used as master level for the
- CBS tasks
-*/
-LEVEL CBSSTAR_register_level(int n, LEVEL master);
-
-/* Allocates a budget to be used for an application.
- Input parameters:
- Q The budget
- T The period of the budget
- Return value:
- 0..N The ID of the budget
- -1 no more free budgets
- -2 The budgets allocated locally to this module have bandwidth > 1
- -3 wrong LEVEL id
-*/
-int CBSSTAR_setbudget(LEVEL l, TIME Q, TIME T);
-
-#endif
Index: rel_1_2/first/test7.c
===================================================================
--- rel_1_2/first/test7.c (revision 1198)
+++ rel_1_2/first/test7.c (nonexistent)
@@ -1,338 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: test7.c,v 1.2 2003-08-01 13:20:38 trimarchi Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-08-01 13:20:38 $
- ------------
-
- this test shows a set of 5 tasks (+main+dummy+keyboard driver).
-
- The first 4 tasks are scheduled by a EDFSTAR Module, whereas the
- fifth one is a standard traditional EDF task. The 4 tasks uses a
- budget of 10000/100000.
-
- if edfstar.c is compiled with edfstar_printf3 active, a couple
- (dline, curtime) is showed (in ms).
-
- if cbsstar.c is compiled with cbsstar_printf3 active, the budget
- replenishments are showed.
-*/
-
-/*
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "cbsstar.h"
-#include "posixstar.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "modules/pi.h"
-#include "modules/nop.h"
-
-// --------------------------------------------------
-// --------------------------------------------------
-// Init Part
-// --------------------------------------------------
-// --------------------------------------------------
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- int cbsstar_level, posixstar_level, mybudget, mybudget1, posixstar_level1;
-
- EDF_register_level(EDF_ENABLE_ALL);
-
- cbsstar_level = CBSSTAR_register_level(3, 0);
- mybudget = CBSSTAR_setbudget(cbsstar_level, 15000, 30000);
- mybudget1 = CBSSTAR_setbudget(cbsstar_level, 14000, 56000);
- posixstar_level = POSIXSTAR_register_level(mybudget, cbsstar_level, 3000,1);
- posixstar_level1 = POSIXSTAR_register_level(mybudget1, cbsstar_level, 5000,1);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- // for the keyboard...
- //CBS_register_level(CBS_ENABLE_ALL, 0);
-
- //SEM_register_module();
- PI_register_module();
- NOP_register_module();
- return TICK;
-}
-
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- //CABS_register_module();
- //keyb_def_map(kparms,itaMap);
- //KEYB_init(&kparms);
- __call_main__(mb);
-
- return (void *)0;
-}
-
-// --------------------------------------------------
-// --------------------------------------------------
-// The Test
-// --------------------------------------------------
-// --------------------------------------------------
-
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-#include <semaphore.h>
-
-mutex_t s;
-
-void *star(void *arg)
-{
- int j;
- for (;;) {
- for (j=0; j<5000; j++);
- //sem_wait(&s);
- mutex_lock(&s);
- cputc('°');
- cputs((char *)arg);
- mutex_unlock(&s);
- //kern_printf("ril");
- //sem_post(&s);
- //task_endcycle();
- }
-
- return NULL;
-}
-
-void *edftask(void *arg)
-{
- int i,j;
- while(1) {
- for (i=0;i<5; i++) {
- for (j=0; j<10; j++);
- //sem_wait(&s);
- //mutex_lock(&s);
- cputc('°');
- cputs((char *)arg);
- //mutex_unlock(&s);
- //sem_post(&s);
- }
-
- task_endcycle();
- }
-
- return NULL;
-}
-
-
-void create1()
-{
- int i;
- NRT_TASK_MODEL m1;
- HARD_TASK_MODEL m2;
- PID p1a, p1b, p1c[20],p2,p3;
- struct timespec fineprg;
- nrt_task_default_model(m1);
- nrt_task_def_group(m1, 1);
- nrt_task_def_level(m1,2);
- nrt_task_def_arg(m1,(void *)"A");
- nrt_task_def_weight(m1,0);
- p1a = task_create("a",star,&m1,NULL);
- if (p1a == -1) {
- perror("Could not create task <Write>");
- sys_abort(-1);
- }
-
- nrt_task_def_arg(m1,(void *)"B");
- nrt_task_def_group(m1, 1);
- nrt_task_def_level(m1,2);
- p1b = task_create("b", star, &m1, NULL);
- if (p1b == -1) {
- perror("Could not create task b ...");
- sys_end();
- }
-
- nrt_task_def_arg(m1,(void *)"1");
- nrt_task_def_group(m1, 1);
- nrt_task_def_level(m1,2);
-
- p1c[5] = task_create("1", star, &m1, NULL);
- if (p1c[5] == -1) {
- perror("Could not create task b ...");
- sys_end();
- }
-
-
- nrt_task_def_arg(m1,(void *)"C");
- nrt_task_def_group(m1, 1);
- nrt_task_def_level(m1,2);
-
- p1c[4] = task_create("c", star, &m1, NULL);
- if (p1c[4] == -1) {
- perror("Could not create task b ...");
- sys_end();
- }
-
- nrt_task_def_arg(m1,(void *)"D");
- nrt_task_def_group(m1, 1);
- nrt_task_def_level(m1,2);
-
- p1c[5] = task_create("d", star, &m1, NULL);
- if (p1c[5] == -1) {
- perror("Could not create task b ...");
- sys_end();
- }
-
- nrt_task_def_arg(m1,(void *)"E");
- nrt_task_def_group(m1, 1);
- nrt_task_def_level(m1,2);
-
- p1c[0] = task_create("e", star, &m1, NULL);
- if (p1c[0] == -1) {
- perror("Could not create task b ...");
- sys_end();
- }
-
- nrt_task_def_arg(m1,(void *)"F");
- p1c[1] = task_create("f", star, &m1, NULL);
- if (p1c[1] == -1) {
- perror("Could not create task b ...");
- sys_end();
- }
-
-
- nrt_task_def_arg(m1,(void *)"G");
- nrt_task_def_group(m1, 1);
- nrt_task_def_level(m1,2);
-
- p1c[2] = task_create("g", star, &m1, NULL);
- if (p1c[2] == -1) {
- perror("Could not create task b ...");
- sys_end();
- }
-
- nrt_task_def_arg(m1,(void *)"H");
- p1c[3] = task_create("h", star, &m1, NULL);
- if (p1c[3] == -1) {
- perror("Could not create task b ...");
- sys_end();
- }
-
- nrt_task_def_arg(m1,(void *)"I");
- p1c[4] = task_create("h", star, &m1, NULL);
- if (p1c[4] == -1) {
- perror("Could not create task b ...");
- sys_end();
- }
-
-
-
- hard_task_default_model(m2);
- hard_task_def_ctrl_jet(m2);
- hard_task_def_mit(m2,32000); // the budget has dline 100,000!
- hard_task_def_wcet(m2, 3000);
- hard_task_def_arg(m2,(void *)"X");
- hard_task_def_group(m2,1);
- hard_task_def_periodic(m2);
-
- p2 = task_create("2", edftask, &m2, NULL);
- if (p2 == -1) {
- perror("Could not create task edf ...");
- sys_end();
- }
-
- hard_task_def_mit(m2,32000); // the budget has dline 100,000!
- hard_task_def_wcet(m2, 3000);
- hard_task_def_arg(m2,(void *)"K");
- p3 = task_create("3", edftask, &m2, NULL);
- if (p3 == -1) {
- perror("Could not create task edf ...");
- sys_end();
- }
-
- cprintf("stars=%d", p2);
- fineprg.tv_sec=140;
- fineprg.tv_nsec=0;
- kern_event_post(&fineprg,(void(*)(void *))sys_end, NULL);
- group_activate(1);
-}
-
-int main(int argc, char **argv)
-{
- char c='t';
- PI_mutexattr_t a;
- PI_mutexattr_default(a);
-
- //NOP_mutexattr_t a;
- //NOP_mutexattr_default(a);
-
-
- mutex_init(&s,&a);
-
- clear();
-
-
- cprintf("Hello, world!\nPress ESC to end the demo...\n");
-
- create1();
-
- do {
- //c =keyb_getch(BLOCK);
- // cprintf("[]");
- } while (c != ESC);
-
- cprintf("ESC pressed!");
-
- sys_end();
-
- return 0;
-}
-
Index: rel_1_2/first/rmstar.c
===================================================================
--- rel_1_2/first/rmstar.c (revision 1198)
+++ rel_1_2/first/rmstar.c (nonexistent)
@@ -1,642 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: rmstar.c,v 1.4 2003-01-07 17:10:17 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.4 $
- Last update: $Date: 2003-01-07 17:10:17 $
- ------------
-**/
-
-/*
- * Copyright (C) 2001 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "rmstar.h"
-#include <ll/stdio.h>
-#include <ll/string.h>
-#include <kernel/model.h>
-#include <kernel/descr.h>
-#include <kernel/var.h>
-#include <kernel/func.h>
-#include <kernel/trace.h>
-
-/* for iqueues */
-/* #include "iqueue.h" Now iqueues are the only queue type into the kernel */
-
-/* for BUDGET_TASK_MODEL */
-#include "cbsstar.h"
-
-/*
- * DEBUG stuffs begin
- */
-
-//#define RMSTAR_DEBUG
-
-#ifdef RMSTAR_DEBUG
-
-static __inline__ fake_printf(char *fmt, ...) {}
-
-#define rmstar_printf fake_printf
-#define rmstar_printf2 fake_printf
-#define rmstar_printf3 fake_printf
-
-//#define rmstar_printf kern_printf
-//#define rmstar_printf2 kern_printf
-//#define rmstar_printf3 kern_printf
-#endif
-
-/*
- * DEBUG stuffs end
- */
-
-/* Status used in the level */
-#define RMSTAR_READY MODULE_STATUS_BASE /* - Ready status */
-#define RMSTAR_IDLE MODULE_STATUS_BASE+4 /* to wait the deadline */
-
-/* flags */
-#define RMSTAR_FLAG_NORAISEEXC 2
-
-/* the level redefinition for the Earliest Deadline First level */
-typedef struct {
- level_des l; /* the standard level descriptor */
-
- TIME period[MAX_PROC]; /* The task periods; the deadlines are
- stored in the priority field */
- int deadline_timer[MAX_PROC];
- /* The task deadline timers */
-
- struct timespec deadline_timespec[MAX_PROC];
-
- int dline_miss[MAX_PROC]; /* Deadline miss counter */
- int wcet_miss[MAX_PROC]; /* Wcet miss counter */
-
- int nact[MAX_PROC]; /* Wcet miss counter */
-
- int flag[MAX_PROC];
- /* used to manage the JOB_TASK_MODEL and the
- periodicity */
-
- IQUEUE ready; /* the ready queue */
-
- PID activated; /* the task that has been inserted into the
- master module */
-
- int budget;
-
- int scheduling_level;
-} RMSTAR_level_des;
-
-static void RMSTAR_check_preemption(RMSTAR_level_des *lev)
-{
- PID first;
-
-#ifdef RMSTAR_DEBUG
- rmstar_printf("(E:chk)");
-#endif
-
- if ((first = iq_query_first(&lev->ready)) != lev->activated) {
- if (lev->activated != NIL)
- level_table[ lev->scheduling_level ]->
- private_extract(lev->scheduling_level, lev->activated);
-
- lev->activated = first;
-
- if (first != NIL) {
- BUDGET_TASK_MODEL b;
- budget_task_default_model(b, lev->budget);
-
- level_table[ lev->scheduling_level ]->
- private_insert(lev->scheduling_level, first, (TASK_MODEL *)&b);
- }
- }
-}
-
-static void RMSTAR_timer_deadline(void *par);
-
-static void RMSTAR_internal_activate(RMSTAR_level_des *lev, PID p,
- struct timespec *t)
-{
-#ifdef RMSTAR_DEBUG
- rmstar_printf("(E:iact)");
-#endif
-
- ADDUSEC2TIMESPEC(lev->period[p], t);
-
- *iq_query_timespec(p, &lev->ready) = *t;
- lev->deadline_timespec[p] = *t;
-
- /* Insert task in the correct position */
- proc_table[p].status = RMSTAR_READY;
- iq_priority_insert(p,&lev->ready);
-
- /* needed because when there is a wcet miss I disable CONTROL_CAP */
- proc_table[p].control |= CONTROL_CAP;
-
- /* check for preemption */
- RMSTAR_check_preemption(lev);
-}
-
-static void RMSTAR_timer_deadline(void *par)
-{
- PID p = (PID) par;
- RMSTAR_level_des *lev;
-
-#ifdef RMSTAR_DEBUG
-// rmstar_printf("(E:tdl ");
-#endif
-
- lev = (RMSTAR_level_des *)level_table[proc_table[p].task_level];
-
- switch (proc_table[p].status) {
- case RMSTAR_IDLE:
-#ifdef RMSTAR_DEBUG
-// rmstar_printf2("I%d",p);
-#endif
- /* set the request time */
- RMSTAR_internal_activate(lev,p,iq_query_timespec(p, &lev->ready));
-
- event_need_reschedule();
- break;
-
- default:
-#ifdef RMSTAR_DEBUG
-// rmstar_printf2("D%d",p);
-#endif
- /* else, a deadline miss occurred!!! */
- lev->dline_miss[p]++;
-
- /* the task is into another state */
- lev->nact[p]++;
-
- /* Set the deadline timer */
- ADDUSEC2TIMESPEC(lev->period[p], &lev->deadline_timespec[p]);
- }
-
- /* Set the deadline timer */
- lev->deadline_timer[p] = kern_event_post(&lev->deadline_timespec[p],
- RMSTAR_timer_deadline,
- (void *)p);
-
-#ifdef RMSTAR_DEBUG
-// rmstar_printf(")");
-#endif
-}
-
-static void RMSTAR_timer_guest_deadline(void *par)
-{
- PID p = (PID) par;
-
-#ifdef RMSTAR_DEBUG
- rmstar_printf("(E:gdl)");
-#endif
-
- kern_raise(XDEADLINE_MISS,p);
-}
-
-static int RMSTAR_public_create(LEVEL l, PID p, TASK_MODEL *m)
-{
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
-
- /* if the RMSTAR_task_create is called, then the pclass must be a
- valid pclass. */
- HARD_TASK_MODEL *h;
-
- if (m->pclass != HARD_PCLASS) return -1;
- if (m->level != 0 && m->level != l) return -1;
- h = (HARD_TASK_MODEL *)m;
- if (!h->wcet || !h->mit || h->periodicity != PERIODIC) return -1;
- /* now we know that m is a valid model */
-
-#ifdef RMSTAR_DEBUG
- rmstar_printf("(E:tcr)");
-#endif
-
- lev->period[p] = h->mit;
- *iq_query_priority(p, &lev->ready) = h->mit;
-
- lev->flag[p] = 0;
- lev->deadline_timer[p] = -1;
- lev->dline_miss[p] = 0;
- lev->wcet_miss[p] = 0;
- lev->nact[p] = 0;
-
- /* Enable wcet check */
- proc_table[p].avail_time = h->wcet;
- proc_table[p].wcet = h->wcet;
- proc_table[p].control |= CONTROL_CAP;
-
- return 0; /* OK, also if the task cannot be guaranteed... */
-}
-
-static void RMSTAR_public_dispatch(LEVEL l, PID p, int nostop)
-{
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
-
-#ifdef RMSTAR_DEBUG
- rmstar_printf("(E:dis)");
-
- rmstar_printf3("(%d %d)",
- iq_query_timespec(p, &lev->ready)->tv_nsec/1000000,
- schedule_time.tv_nsec/1000000);
-#endif
-
- level_table[ lev->scheduling_level ]->
- private_dispatch(lev->scheduling_level,p,nostop);
-}
-
-static void RMSTAR_public_epilogue(LEVEL l, PID p)
-{
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
-
-#ifdef RMSTAR_DEBUG
- rmstar_printf("(E:epi ");
-#endif
-
- /* check if the wcet is finished... */
- if (proc_table[p].avail_time <= 0 && proc_table[p].control&CONTROL_CAP) {
- /* wcet finished: disable wcet event and count wcet miss */
-#ifdef RMSTAR_DEBUG
- rmstar_printf2("W%d",p);
-#endif
- proc_table[p].control &= ~CONTROL_CAP;
- lev->wcet_miss[p]++;
- }
-#ifdef RMSTAR_DEBUG
- rmstar_printf(")");
-#endif
-
- level_table[ lev->scheduling_level ]->
- private_epilogue(lev->scheduling_level,p);
-
- proc_table[p].status = RMSTAR_READY;
-}
-
-static void RMSTAR_public_activate(LEVEL l, PID p)
-{
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
- struct timespec t;
-
-#ifdef RMSTAR_DEBUG
- rmstar_printf("(E:act)");
-#endif
-
- /* Test if we are trying to activate a non sleeping task */
- /* save activation (only if needed... */
- if (proc_table[p].status != SLEEP) {
- /* a periodic task cannot be activated when it is already active */
- kern_raise(XACTIVATION,p);
- return;
- }
-
- kern_gettime(&t);
-
- RMSTAR_internal_activate(lev,p, &t);
-
- /* Set the deadline timer */
- lev->deadline_timer[p] = kern_event_post(&lev->deadline_timespec[p],
- RMSTAR_timer_deadline,
- (void *)p);
-
-}
-
-static void RMSTAR_public_unblock(LEVEL l, PID p)
-{
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
-
-#ifdef RMSTAR_DEBUG
- rmstar_printf("(E:ins)");
-#endif
-
- /* Insert task in the correct position */
- proc_table[p].status = RMSTAR_READY;
- iq_priority_insert(p,&lev->ready);
-
- /* and check for preemption! */
- RMSTAR_check_preemption(lev);
-}
-
-static void RMSTAR_public_block(LEVEL l, PID p)
-{
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
-
-#ifdef RMSTAR_DEBUG
- rmstar_printf("(E:ext)");
-#endif
-
- /* the task is blocked on a synchronization primitive. we have to
- remove it from the master module -and- from the local queue! */
- iq_extract(p,&lev->ready);
-
- /* and finally, a preemption check! (it will also call guest_end) */
- RMSTAR_check_preemption(lev);
-}
-
-static int RMSTAR_public_message(LEVEL l, PID p, void *m)
-{
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
- struct timespec temp;
-
-#ifdef RMSTAR_DEBUG
- rmstar_printf("(E:ecy ");
-#endif
-
- /* we call guest_end directly here because the same task may
- be reinserted in the queue before calling the preemption check! */
- level_table[ lev->scheduling_level ]->
- private_extract(lev->scheduling_level,p); lev->activated = NIL;
-
- iq_extract(p,&lev->ready);
-
- /* we reset the capacity counters... */
- proc_table[p].avail_time = proc_table[p].wcet;
-
- if (lev->nact[p] > 0) {
-#ifdef RMSTAR_DEBUG
- rmstar_printf2("E%d",p);
-#endif
-
- /* Pending activation: reactivate the thread!!! */
- lev->nact[p]--;
-
- /* see also RMSTAR_timer_deadline */
- kern_gettime(&temp);
-
- RMSTAR_internal_activate(lev,p,&temp);
-
- /* check if the deadline has already expired */
- temp = *iq_query_timespec(p, &lev->ready);
- if (TIMESPEC_A_LT_B(&temp, &schedule_time)) {
- /* count the deadline miss */
- lev->dline_miss[p]++;
- kern_event_delete(lev->deadline_timer[p]);
- }
-
- }
- else {
-#ifdef RMSTAR_DEBUG
- rmstar_printf("e%d",p);
-#endif
-
- /* the task has terminated his job before it consume the wcet. All OK! */
- proc_table[p].status = RMSTAR_IDLE;
-
- /* and finally, a preemption check! */
- RMSTAR_check_preemption(lev);
-
- /* when the deadline timer fire, it recognize the situation and set
- correctly all the stuffs (like reactivation, etc... ) */
- }
-#ifdef RMSTAR_DEBUG
- rmstar_printf(")");
-#endif
-
- jet_update_endcycle(); /* Update the Jet data... */
- trc_logevent(TRC_ENDCYCLE,&exec_shadow); /* tracer stuff */
-
- return 0;
-}
-
-static void RMSTAR_public_end(LEVEL l, PID p)
-{
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
-
-#ifdef RMSTAR_DEBUG
- rmstar_printf("(E:end)");
-#endif
-
- iq_extract(p,&lev->ready);
-
- /* we finally put the task in the ready queue */
- proc_table[p].status = FREE;
-
- iq_insertfirst(p,&freedesc);
-
- if (lev->deadline_timer[p] != -1) {
- kern_event_delete(lev->deadline_timer[p]);
- }
-
- /* and finally, a preemption check! (it will also call guest_end) */
- RMSTAR_check_preemption(lev);
-}
-
-
-/* Guest Functions
- These functions manages a JOB_TASK_MODEL, that is used to put
- a guest task in the RMSTAR ready queue. */
-
-static void RMSTAR_private_insert(LEVEL l, PID p, TASK_MODEL *m)
-{
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
- JOB_TASK_MODEL *job;
-
- if (m->pclass != JOB_PCLASS || (m->level != 0 && m->level != l) ) {
- kern_raise(XINVALID_TASK, p);
- return;
- }
-
- job = (JOB_TASK_MODEL *)m;
-
- *iq_query_timespec(p, &lev->ready) = job->deadline;
-
- lev->deadline_timer[p] = -1;
- lev->dline_miss[p] = 0;
- lev->wcet_miss[p] = 0;
- lev->nact[p] = 0;
-
- if (job->noraiseexc)
- lev->flag[p] = RMSTAR_FLAG_NORAISEEXC;
- else {
- lev->flag[p] = 0;
- lev->deadline_timer[p] = kern_event_post(iq_query_timespec(p, &lev->ready),
- RMSTAR_timer_guest_deadline,
- (void *)p);
- }
-
- lev->period[p] = job->period;
- *iq_query_priority(p, &lev->ready) = job->period;
-
- /* there is no bandwidth guarantee at this level, it is performed
- by the level that inserts guest tasks... */
-
- /* Insert task in the correct position */
- iq_priority_insert(p,&lev->ready);
- proc_table[p].status = RMSTAR_READY;
-
- /* check for preemption */
- RMSTAR_check_preemption(lev);
-}
-
-static void RMSTAR_private_dispatch(LEVEL l, PID p, int nostop)
-{
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
-
- level_table[ lev->scheduling_level ]->
- private_dispatch(lev->scheduling_level,p,nostop);
-}
-
-static void RMSTAR_private_epilogue(LEVEL l, PID p)
-{
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
-
- /* the task has been preempted. it returns into the ready queue... */
- level_table[ lev->scheduling_level ]->
- private_epilogue(lev->scheduling_level,p);
-
- proc_table[p].status = RMSTAR_READY;
-}
-
-static void RMSTAR_private_extract(LEVEL l, PID p)
-{
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
-
-#ifdef RMSTAR_DEBUG
- //kern_printf("RMSTAR_guest_end: dline timer %d\n",lev->deadline_timer[p]);
-#endif
-
- iq_extract(p, &lev->ready);
-
- /* we remove the deadline timer, because the slice is finished */
- if (lev->deadline_timer[p] != NIL) {
-#ifdef RMSTAR_DEBUG
-// kern_printf("RMSTAR_guest_end: dline timer %d\n",lev->deadline_timer[p]);
-#endif
- kern_event_delete(lev->deadline_timer[p]);
- lev->deadline_timer[p] = NIL;
- }
-
- /* and finally, a preemption check! (it will also call guest_end() */
- RMSTAR_check_preemption(lev);
-}
-
-/* Registration functions */
-
-/* Registration function:
- int flags the init flags ... see RMSTAR.h */
-LEVEL RMSTAR_register_level(int budget, int master)
-{
- LEVEL l; /* the level that we register */
- RMSTAR_level_des *lev; /* for readableness only */
- PID i; /* a counter */
-
-#ifdef RMSTAR_DEBUG
- printk("RMSTAR_register_level\n");
-#endif
-
- /* request an entry in the level_table */
- l = level_alloc_descriptor(sizeof(RMSTAR_level_des));
-
- lev = (RMSTAR_level_des *)level_table[l];
-
- printk(" lev=%d\n",(int)lev);
-
- /* fill the standard descriptor */
- lev->l.private_insert = RMSTAR_private_insert;
- lev->l.private_extract = RMSTAR_private_extract;
- lev->l.private_dispatch = RMSTAR_private_dispatch;
- lev->l.private_epilogue = RMSTAR_private_epilogue;
-
- lev->l.public_guarantee = NULL;
- lev->l.public_create = RMSTAR_public_create;
- lev->l.public_end = RMSTAR_public_end;
- lev->l.public_dispatch = RMSTAR_public_dispatch;
- lev->l.public_epilogue = RMSTAR_public_epilogue;
- lev->l.public_activate = RMSTAR_public_activate;
- lev->l.public_unblock = RMSTAR_public_unblock;
- lev->l.public_block = RMSTAR_public_block;
- lev->l.public_message = RMSTAR_public_message;
-
- /* fill the RMSTAR descriptor part */
- for(i=0; i<MAX_PROC; i++) {
- lev->period[i] = 0;
- lev->deadline_timer[i] = -1;
- lev->flag[i] = 0;
- lev->dline_miss[i] = 0;
- lev->wcet_miss[i] = 0;
- lev->nact[i] = 0;
- }
-
- iq_init(&lev->ready, NULL, 0);
- lev->activated = NIL;
-
- lev->budget = budget;
- lev->scheduling_level = master;
-
- return l;
-}
-
-int RMSTAR_get_dline_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
-
- return lev->dline_miss[p];
-}
-
-int RMSTAR_get_wcet_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
-
- return lev->wcet_miss[p];
-}
-
-int RMSTAR_get_nact(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
-
- return lev->nact[p];
-}
-
-int RMSTAR_reset_dline_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
-
- lev->dline_miss[p] = 0;
- return 0;
-}
-
-int RMSTAR_reset_wcet_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- RMSTAR_level_des *lev = (RMSTAR_level_des *)(level_table[l]);
-
- lev->wcet_miss[p] = 0;
- return 0;
-}
-
Index: rel_1_2/first/testiq.c
===================================================================
--- rel_1_2/first/testiq.c (revision 1198)
+++ rel_1_2/first/testiq.c (nonexistent)
@@ -1,260 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: testiq.c,v 1.3 2003-01-07 17:10:17 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.3 $
- Last update: $Date: 2003-01-07 17:10:17 $
- ------------
-
- The purpose of this test is to show that two budgets with different
- period and budgets schedules correctly.
-
- 2 never ending tasks are involved
-
- This test cannot compile because of the fact that QUEUE and QQUEUE
- types does not exist anymore!
-*/
-
-/*
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "cbsstar.h"
-#include "edfstar.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-// --------------------------------------------------
-// --------------------------------------------------
-// Init Part
-// --------------------------------------------------
-// --------------------------------------------------
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- clear();
-
- EDF_register_level(EDF_ENABLE_ALL);
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- // for the keyboard...
- CBS_register_level(CBS_ENABLE_ALL, 0);
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- //keyb_def_ctrlC(kparms, NULL);
- //keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-// --------------------------------------------------
-// --------------------------------------------------
-// The Test
-// --------------------------------------------------
-// --------------------------------------------------
-
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-#include "iqueue.h"
-
-sem_t s;
-
-PID p2,p3,p4;
-
-void *star(void *arg)
-{
- int j;
- TIME last[5];
-
- QUEUE i = NIL;
- IQUEUE ii;
-
- q_timespec_insert(p2,&i);
- q_timespec_insert(p3,&i);
-
- iq_init(&ii,NULL,0);
- *iq_query_timespec(p2,&ii) = proc_table[p2].timespec_priority;
- *iq_query_timespec(p3,&ii) = proc_table[p3].timespec_priority;
- *iq_query_timespec(p4,&ii) = proc_table[p4].timespec_priority;
- iq_timespec_insert(p2,&ii);
- iq_timespec_insert(p3,&ii);
-
- cprintf("p2=%ld.%ld\n",proc_table[p2].timespec_priority.tv_sec,proc_table[p2].timespec_priority.tv_nsec/1000);
- cprintf("p3=%ld.%ld\n",proc_table[p3].timespec_priority.tv_sec,proc_table[p3].timespec_priority.tv_nsec/1000);
- cprintf("p4=%ld.%ld\n",proc_table[p4].timespec_priority.tv_sec,proc_table[p4].timespec_priority.tv_nsec/1000);
-
- task_endcycle();
-
- for (j=0; j<200000; j++) {
- q_timespec_insert(p4,&i);
- q_extract(p4,&i);
- }
-
-
- task_endcycle();
-
- for (j=0; j<200000; j++) {
- iq_timespec_insert(p4,&ii);
- iq_extract(p4,&ii);
- }
-
- task_endcycle();
-
- jet_gettable(exec_shadow, &last[0], 3);
-
- cprintf("\ninit=%d queue=%d iqueue=%d\n",
- (int)last[0], (int)last[1], (int)last[2]);
-
- sys_end();
- return NULL;
-}
-
-void *fake(void *arg)
-{
- cputs("#");
- task_endcycle();
-
- return NULL;
-}
-
-
-void create1()
-{
- HARD_TASK_MODEL m1;
- PID p1a;
-
- hard_task_default_model(m1);
- hard_task_def_wcet(m1, 500000);
- hard_task_def_group(m1,1);
- hard_task_def_periodic(m1);
- hard_task_def_mit(m1,1000000);
- hard_task_def_ctrl_jet(m1);
- p1a = task_create("a", star, &m1, NULL);
- if (p1a == -1) {
- perror("Could not create task a ...");
- sys_end();
- }
-
- hard_task_default_model(m1);
- hard_task_def_wcet(m1, 5000);
- hard_task_def_aperiodic(m1);
- hard_task_def_group(m1,1);
-
- hard_task_def_mit(m1,100000);
- p2 = task_create("a", fake, &m1, NULL);
- if (p1a == -1) {
- perror("Could not create task a ...");
- sys_end();
- }
-
- hard_task_def_mit(m1,100001);
- p3 = task_create("a", fake, &m1, NULL);
- if (p1a == -1) {
- perror("Could not create task a ...");
- sys_end();
- }
-
- hard_task_def_mit(m1,100002);
- p4 = task_create("a", fake, &m1, NULL);
- if (p1a == -1) {
- perror("Could not create task a ...");
- sys_end();
- }
-
- group_activate(1);
-}
-
-void endfun(KEY_EVT *k)
-{
- cprintf("ESC pressed!");
-
- sys_end();
-}
-
-int main(int argc, char **argv)
-{
- KEY_EVT k;
-
- sem_init(&s,0,1);
-
- k.flag = 0;
- k.scan = KEY_ESC;
- k.ascii = 27;
- keyb_hook(k,endfun);
-
- create1();
-
- return 0;
-}
-
Index: rel_1_2/first/rmstar.h
===================================================================
--- rel_1_2/first/rmstar.h (revision 1198)
+++ rel_1_2/first/rmstar.h (nonexistent)
@@ -1,128 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: rmstar.h,v 1.2 2003-01-07 17:10:17 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-01-07 17:10:17 $
- ------------
-
- Title:
- RMSTAR
-
- Task Models Accepted:
- HARD_TASK_MODEL - Hard Tasks (only Periodic)
- wcet field and mit field must be != 0. They are used to set the wcet
- and period of the tasks.
- periodicity field can be only PERIODIC
- drel field is ignored
-
- Guest Models Accepted:
- JOB_TASK_MODEL - a single guest task activation
- Identified by an absolute deadline and a period.
- period field is ignored
-
- Description:
-
- This module schedule his tasks following the classic RM
- scheme.
-
- Note: This module is derived from the EDFSTAR Scheduling Module. I
- have just changed RM in EDF and iq_timespec_insert with
- iq_priority_insert...
-
- Exceptions raised:
- XUNVALID_GUEST XUNVALID_TASK
- some primitives are not implemented:
- task_sleep, task_delay, guest_endcycle, guest_sleep, guest_delay
-
- XACTIVATION
- If a task is actiated through task_activate or guest_activate more than
- one time
-
- Restrictions & special features:
- see edfstar.h
-
-**/
-
-/*
- * Copyright (C) 2001 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#ifndef __RMSTAR_H__
-#define __RMSTAR_H__
-
-#include <ll/ll.h>
-#include <kernel/config.h>
-#include <sys/types.h>
-#include <kernel/types.h>
-
-
-
-/* flags... */
-#define RMSTAR_ENABLE_GUARANTEE 1 /* Task Guarantee enabled */
-#define RMSTAR_ENABLE_ALL 1
-
-#define RMSTAR_FAILED_GUARANTEE 8 /* used in the module, unsettabl
- in RM_register_level... */
-
-
-
-#define RMSTAR_LEVELNAME "RMSTAR base"
-#define RMSTAR_LEVEL_CODE 166
-#define RMSTAR_LEVEL_VERSION 1
-
-
-/* Registration function:
- int budget The budget used by this module (see CBSSTAR.h)
- int master The master module used by RMSTAR
-*/
-LEVEL RMSTAR_register_level(int budget, int master);
-
-/* returns respectively the number of dline, wcet or nact; -1 if error */
-int RMSTAR_get_dline_miss(PID p);
-int RMSTAR_get_wcet_miss(PID p);
-int RMSTAR_get_nact(PID p);
-
-/* resets respectively the number of dline, wcet miss; -1 if error */
-int RMSTAR_reset_dline_miss(PID p);
-int RMSTAR_reset_wcet_miss(PID p);
-
-#endif
-
Index: rel_1_2/first/edfstar.c
===================================================================
--- rel_1_2/first/edfstar.c (revision 1198)
+++ rel_1_2/first/edfstar.c (nonexistent)
@@ -1,659 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: edfstar.c,v 1.5 2003-06-18 08:13:02 trimarchi Exp $
-
- File: $File$
- Revision: $Revision: 1.5 $
- Last update: $Date: 2003-06-18 08:13:02 $
- ------------
-**/
-
-/*
- * Copyright (C) 2001 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "edfstar.h"
-#include <ll/stdio.h>
-#include <ll/string.h>
-#include <kernel/model.h>
-#include <kernel/descr.h>
-#include <kernel/var.h>
-#include <kernel/func.h>
-#include <kernel/trace.h>
-
-/* for iqueues */
-/* #include "iqueue.h" Now iqueues are the only queue type available
- into the kernel */
-#include <kernel/iqueue.h>
-
-/* for BUDGET_TASK_MODEL */
-#include "cbsstar.h"
-
-/*
- * DEBUG stuffs begin
- */
-
-//#define EDFSTAR_DEBUG
-
-#ifdef EDFSTAR_DEBUF
-
-static __inline__ fake_printf(char *fmt, ...) {}
-
-#define edfstar_printf fake_printf
-#define edfstar_printf2 fake_printf
-#define edfstar_printf3 fake_printf
-
-//#define edfstar_printf kern_printf
-//#define edfstar_printf2 kern_printf
-//#define edfstar_printf3 kern_printf
-#endif
-
-/*
- * DEBUG stuffs end
- */
-
-/* Status used in the level */
-#define EDFSTAR_READY MODULE_STATUS_BASE /* - Ready status */
-#define EDFSTAR_IDLE MODULE_STATUS_BASE+4 /* to wait the deadline */
-
-/* flags */
-#define EDFSTAR_FLAG_NORAISEEXC 2
-
-/* the level redefinition for the Earliest Deadline First level */
-typedef struct {
- level_des l; /* the standard level descriptor */
-
- TIME period[MAX_PROC]; /* The task periods; the deadlines are
- stored in the priority field */
- int deadline_timer[MAX_PROC];
- /* The task deadline timers */
-
- struct timespec deadline_timespec[MAX_PROC];
-
- int dline_miss[MAX_PROC]; /* Deadline miss counter */
- int wcet_miss[MAX_PROC]; /* Wcet miss counter */
-
- int nact[MAX_PROC]; /* Wcet miss counter */
-
- int flag[MAX_PROC];
- /* used to manage the JOB_TASK_MODEL and the
- periodicity */
-
- IQUEUE ready; /* the ready queue */
-
- PID activated; /* the task that has been inserted into the
- master module */
-
- int budget;
-
- int scheduling_level;
-} EDFSTAR_level_des;
-
-static void EDFSTAR_check_preemption(EDFSTAR_level_des *lev)
-{
- PID first;
-
-#ifdef EDFSTAR_DEBUG
- edfstar_printf("(E:chk)");
-#endif
-
- if ((first = iq_query_first(&lev->ready)) != lev->activated) {
- if (lev->activated != NIL)
- level_table[ lev->scheduling_level ]->
- private_extract(lev->scheduling_level, lev->activated);
-
- lev->activated = first;
-
- if (first != NIL) {
- BUDGET_TASK_MODEL b;
- budget_task_default_model(b, lev->budget);
-
- level_table[ lev->scheduling_level ]->
- private_insert(lev->scheduling_level, first, (TASK_MODEL *)&b);
- }
- }
-}
-
-static void EDFSTAR_timer_deadline(void *par);
-
-static void EDFSTAR_internal_activate(EDFSTAR_level_des *lev, PID p,
- struct timespec *t)
-{
-#ifdef EDFSTAR_DEBUG
- edfstar_printf("(E:iact)");
-#endif
-
- ADDUSEC2TIMESPEC(lev->period[p], t);
-
- *iq_query_timespec(p, &lev->ready) = *t;
- lev->deadline_timespec[p] = *t;
-
- /* Insert task in the correct position */
- proc_table[p].status = EDFSTAR_READY;
- iq_timespec_insert(p,&lev->ready);
-
- /* needed because when there is a wcet miss I disable CONTROL_CAP */
- proc_table[p].control |= CONTROL_CAP;
-
- /* check for preemption */
- EDFSTAR_check_preemption(lev);
-}
-
-static void EDFSTAR_timer_deadline(void *par)
-{
- PID p = (PID) par;
- EDFSTAR_level_des *lev;
-
-#ifdef EDFSTAR_DEBUG
-// edfstar_printf("(E:tdl ");
-#endif
-
- lev = (EDFSTAR_level_des *)level_table[proc_table[p].task_level];
-
- switch (proc_table[p].status) {
- case EDFSTAR_IDLE:
-#ifdef EDFSTAR_DEBUG
-// edfstar_printf2("I%d",p);
-#endif
- /* set the request time */
- EDFSTAR_internal_activate(lev,p,iq_query_timespec(p, &lev->ready));
-
- event_need_reschedule();
- break;
-
- default:
-#ifdef EDFSTAR_DEBUG
-// edfstar_printf2("D%d",p);
-#endif
- /* else, a deadline miss occurred!!! */
- lev->dline_miss[p]++;
-
- /* the task is into another state */
- lev->nact[p]++;
-
- /* Set the deadline timer */
- ADDUSEC2TIMESPEC(lev->period[p], &lev->deadline_timespec[p]);
- }
-
- /* Set the deadline timer */
- lev->deadline_timer[p] = kern_event_post(&lev->deadline_timespec[p],
- EDFSTAR_timer_deadline,
- (void *)p);
-
-#ifdef EDFSTAR_DEBUG
-// edfstar_printf(")");
-#endif
-}
-
-static void EDFSTAR_timer_guest_deadline(void *par)
-{
- PID p = (PID) par;
-
-#ifdef EDFSTAR_DEBUG
- edfstar_printf("(E:gdl)");
-#endif
-
- kern_raise(XDEADLINE_MISS,p);
-}
-
-static int EDFSTAR_public_create(LEVEL l, PID p, TASK_MODEL *m)
-{
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
-
- /* if the EDFSTAR_task_create is called, then the pclass must be a
- valid pclass. */
- HARD_TASK_MODEL *h;
-
- if (m->pclass != HARD_PCLASS) return -1;
- if (m->level != 0 && m->level != l) return -1;
- h = (HARD_TASK_MODEL *)m;
- if (!h->wcet || !h->mit || h->periodicity != PERIODIC) return -1;
- /* now we know that m is a valid model */
-
-
-#ifdef EDFSTAR_DEBUG
- edfstar_printf("(E:tcr)");
-#endif
-
- lev->period[p] = h->mit;
-
- lev->flag[p] = 0;
- lev->deadline_timer[p] = -1;
- lev->dline_miss[p] = 0;
- lev->wcet_miss[p] = 0;
- lev->nact[p] = 0;
-
- /* Enable wcet check */
- proc_table[p].avail_time = h->wcet;
- proc_table[p].wcet = h->wcet;
- proc_table[p].control |= CONTROL_CAP;
-
- return 0; /* OK, also if the task cannot be guaranteed... */
-}
-
-static int EDFSTAR_public_eligible(LEVEL l, PID p)
-{
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
-
-#ifdef EDFSTAR_DEBUG
- edfstar_printf2("(E:eli)");
-#endif
-
- return level_table[ lev->scheduling_level ]->
- private_eligible(lev->scheduling_level,p);
-}
-
-static void EDFSTAR_public_dispatch(LEVEL l, PID p, int nostop)
-{
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
-
-#ifdef EDFSTAR_DEBUG
- edfstar_printf("(E:dis)");
-
- edfstar_printf3("(%d %d)",
- iq_query_timespec(p, &lev->ready)->tv_nsec/1000000,
- schedule_time.tv_nsec/1000000);
-#endif
-
- level_table[ lev->scheduling_level ]->
- private_dispatch(lev->scheduling_level,p,nostop);
-}
-
-static void EDFSTAR_public_epilogue(LEVEL l, PID p)
-{
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
-
-#ifdef EDFSTAR_DEBUG
- edfstar_printf("(E:epi ");
-#endif
-
- /* check if the wcet is finished... */
- if (proc_table[p].avail_time <= 0 && proc_table[p].control&CONTROL_CAP) {
- /* wcet finished: disable wcet event and count wcet miss */
-#ifdef EDFSTAR_DEBUG
- edfstar_printf2("W%d",p);
-#endif
- proc_table[p].control &= ~CONTROL_CAP;
- lev->wcet_miss[p]++;
- }
-#ifdef EDFSTAR_DEBUG
- edfstar_printf(")");
-#endif
-
- level_table[ lev->scheduling_level ]->
- private_epilogue(lev->scheduling_level,p);
-
- proc_table[p].status = EDFSTAR_READY;
-}
-
-static void EDFSTAR_public_activate(LEVEL l, PID p)
-{
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
- struct timespec t;
-
-#ifdef EDFSTAR_DEBUG
- edfstar_printf("(E:act)");
-#endif
-
- /* Test if we are trying to activate a non sleeping task */
- /* save activation (only if needed... */
- if (proc_table[p].status != SLEEP) {
- /* a periodic task cannot be activated when it is already active */
- kern_raise(XACTIVATION,p);
- return;
- }
-
- kern_gettime(&t);
-
- EDFSTAR_internal_activate(lev,p, &t);
-
- /* Set the deadline timer */
- lev->deadline_timer[p] = kern_event_post(&lev->deadline_timespec[p],
- EDFSTAR_timer_deadline,
- (void *)p);
-
-}
-
-static void EDFSTAR_public_unblock(LEVEL l, PID p)
-{
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
-
-#ifdef EDFSTAR_DEBUG
- edfstar_printf("(E:ins)");
-#endif
-
- /* Insert task in the correct position */
- proc_table[p].status = EDFSTAR_READY;
- iq_timespec_insert(p,&lev->ready);
-
- /* and check for preemption! */
- EDFSTAR_check_preemption(lev);
-}
-
-static void EDFSTAR_public_block(LEVEL l, PID p)
-{
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
-
-#ifdef EDFSTAR_DEBUG
- edfstar_printf("(E:ext)");
-#endif
-
- /* the task is blocked on a synchronization primitive. we have to
- remove it from the master module -and- from the local queue! */
- iq_extract(p,&lev->ready);
-
- /* and finally, a preemption check! (it will also call guest_end) */
- EDFSTAR_check_preemption(lev);
-}
-
-static int EDFSTAR_public_message(LEVEL l, PID p, void *m)
-{
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
- struct timespec temp;
-
-#ifdef EDFSTAR_DEBUG
- edfstar_printf("(E:ecy ");
-#endif
-
- /* we call guest_end directly here because the same task may
- be reinserted in the queue before calling the preemption check! */
- level_table[ lev->scheduling_level ]->
- private_extract(lev->scheduling_level,p);
- lev->activated = NIL;
-
- iq_extract(p,&lev->ready);
-
- /* we reset the capacity counters... */
- proc_table[p].avail_time = proc_table[p].wcet;
-
- if (lev->nact[p] > 0) {
-#ifdef EDFSTAR_DEBUG
- edfstar_printf2("E%d",p);
-#endif
-
- /* Pending activation: reactivate the thread!!! */
- lev->nact[p]--;
-
- /* see also EDFSTAR_timer_deadline */
- kern_gettime(&temp);
-
- EDFSTAR_internal_activate(lev,p, &temp);
-
- /* check if the deadline has already expired */
- temp = *iq_query_timespec(p, &lev->ready);
- if (TIMESPEC_A_LT_B(&temp, &schedule_time)) {
- /* count the deadline miss */
- lev->dline_miss[p]++;
- kern_event_delete(lev->deadline_timer[p]);
- }
-
- }
- else {
-#ifdef EDFSTAR_DEBUG
- edfstar_printf("e%d",p);
-#endif
-
- /* the task has terminated his job before it consume the wcet. All OK! */
- proc_table[p].status = EDFSTAR_IDLE;
-
- /* and finally, a preemption check! */
- EDFSTAR_check_preemption(lev);
-
- /* when the deadline timer fire, it recognize the situation and set
- correctly all the stuffs (like reactivation, etc... ) */
- }
-#ifdef EDFSTAR_DEBUG
- edfstar_printf(")");
-#endif
-
- jet_update_endcycle(); /* Update the Jet data... */
- trc_logevent(TRC_ENDCYCLE,&exec_shadow); /* tracer stuff */
-
- return 0;
-}
-
-static void EDFSTAR_public_end(LEVEL l, PID p)
-{
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
-
-#ifdef EDFSTAR_DEBUG
- edfstar_printf("(E:end)");
-#endif
-
- iq_extract(p,&lev->ready);
-
- /* we finally put the task in the ready queue */
- proc_table[p].status = FREE;
-
- iq_insertfirst(p,&freedesc);
-
- if (lev->deadline_timer[p] != -1) {
- kern_event_delete(lev->deadline_timer[p]);
- }
-
- /* and finally, a preemption check! (it will also call guest_end) */
- EDFSTAR_check_preemption(lev);
-}
-
-/* Guest Functions
- These functions manages a JOB_TASK_MODEL, that is used to put
- a guest task in the EDFSTAR ready queue. */
-
-static void EDFSTAR_private_insert(LEVEL l, PID p, TASK_MODEL *m)
-{
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
- JOB_TASK_MODEL *job;
-
- if (m->pclass != JOB_PCLASS || (m->level != 0 && m->level != l) ) {
- kern_raise(XINVALID_TASK, p);
- return;
- }
-
- job = (JOB_TASK_MODEL *)m;
-
- /* if the EDFSTAR_guest_create is called, then the pclass must be a
- valid pclass. */
-
- *iq_query_timespec(p, &lev->ready) = job->deadline;
-
- lev->deadline_timer[p] = -1;
- lev->dline_miss[p] = 0;
- lev->wcet_miss[p] = 0;
- lev->nact[p] = 0;
-
- if (job->noraiseexc)
- lev->flag[p] = EDFSTAR_FLAG_NORAISEEXC;
- else {
- lev->flag[p] = 0;
- lev->deadline_timer[p] = kern_event_post(iq_query_timespec(p, &lev->ready),
- EDFSTAR_timer_guest_deadline,
- (void *)p);
- }
-
- lev->period[p] = job->period;
-
- /* Insert task in the correct position */
- iq_timespec_insert(p,&lev->ready);
- proc_table[p].status = EDFSTAR_READY;
-
- /* check for preemption */
- EDFSTAR_check_preemption(lev);
-
- /* there is no bandwidth guarantee at this level, it is performed
- by the level that inserts guest tasks... */
-}
-
-static void EDFSTAR_private_dispatch(LEVEL l, PID p, int nostop)
-{
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
-
- level_table[ lev->scheduling_level ]->
- private_dispatch(lev->scheduling_level,p,nostop);
-}
-
-static void EDFSTAR_private_epilogue(LEVEL l, PID p)
-{
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
-
- /* the task has been preempted. it returns into the ready queue... */
- level_table[ lev->scheduling_level ]->
- private_epilogue(lev->scheduling_level,p);
-
- proc_table[p].status = EDFSTAR_READY;
-}
-
-static void EDFSTAR_private_extract(LEVEL l, PID p)
-{
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
-
-#ifdef EDFSTAR_DEBUG
- //kern_printf("EDFSTAR_guest_end: dline timer %d\n",lev->deadline_timer[p]);
-#endif
-
- iq_extract(p, &lev->ready);
-
- /* we remove the deadline timer, because the slice is finished */
- if (lev->deadline_timer[p] != NIL) {
-#ifdef EDFSTAR_DEBUG
-// kern_printf("EDFSTAR_guest_end: dline timer %d\n",lev->deadline_timer[p]);
-#endif
- kern_event_delete(lev->deadline_timer[p]);
- lev->deadline_timer[p] = NIL;
- }
-
- /* and finally, a preemption check! (it will also call guest_end() */
- EDFSTAR_check_preemption(lev);
-}
-
-/* Registration functions */
-
-/* Registration function:
- int flags the init flags ... see EDFSTAR.h */
-LEVEL EDFSTAR_register_level(int budget, int master)
-{
- LEVEL l; /* the level that we register */
- EDFSTAR_level_des *lev; /* for readableness only */
- PID i; /* a counter */
-
-#ifdef EDFSTAR_DEBUG
- printk("EDFSTAR_register_level\n");
-#endif
-
- /* request an entry in the level_table */
- l = level_alloc_descriptor(sizeof(EDFSTAR_level_des));
-
- lev = (EDFSTAR_level_des *)level_table[l];
-
- printk(" lev=%d\n",(int)lev);
-
- /* fill the standard descriptor */
- lev->l.private_insert = EDFSTAR_private_insert;
- lev->l.private_extract = EDFSTAR_private_extract;
- lev->l.private_dispatch = EDFSTAR_private_dispatch;
- lev->l.private_epilogue = EDFSTAR_private_epilogue;
-
- lev->l.public_guarantee = NULL;
- lev->l.public_eligible = EDFSTAR_public_eligible;
- lev->l.public_create = EDFSTAR_public_create;
- lev->l.public_end = EDFSTAR_public_end;
- lev->l.public_dispatch = EDFSTAR_public_dispatch;
- lev->l.public_epilogue = EDFSTAR_public_epilogue;
- lev->l.public_activate = EDFSTAR_public_activate;
- lev->l.public_unblock = EDFSTAR_public_unblock;
- lev->l.public_block = EDFSTAR_public_block;
- lev->l.public_message = EDFSTAR_public_message;
-
- /* fill the EDFSTAR descriptor part */
- for(i=0; i<MAX_PROC; i++) {
- lev->period[i] = 0;
- lev->deadline_timer[i] = -1;
- lev->flag[i] = 0;
- lev->dline_miss[i] = 0;
- lev->wcet_miss[i] = 0;
- lev->nact[i] = 0;
- }
-
- iq_init(&lev->ready, NULL, IQUEUE_NO_PRIORITY);
- lev->activated = NIL;
-
- lev->budget = budget;
- lev->scheduling_level = master;
-
- return l;
-}
-
-int EDFSTAR_get_dline_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
-
- return lev->dline_miss[p];
-}
-
-int EDFSTAR_get_wcet_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
-
- return lev->wcet_miss[p];
-}
-
-int EDFSTAR_get_nact(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
-
- return lev->nact[p];
-}
-
-int EDFSTAR_reset_dline_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
-
- lev->dline_miss[p] = 0;
- return 0;
-}
-
-int EDFSTAR_reset_wcet_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
-
- lev->wcet_miss[p] = 0;
- return 0;
-}
-
Index: rel_1_2/first/posixstar.c
===================================================================
--- rel_1_2/first/posixstar.c (revision 1198)
+++ rel_1_2/first/posixstar.c (nonexistent)
@@ -1,544 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Trimarchi Michael <trimarchi@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: posixstar.c,v 1.2 2003-08-01 13:20:38 trimarchi Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-08-01 13:20:38 $
- ------------
-
- This file contains the scheduling module compatible with POSIX
- specifications
-
- Read posixstar.h for further details.
-
- RR tasks have the CONTROL_CAP bit set
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARR2ANTY; without even the implied waRR2anty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#include <ll/stdio.h>
-#include <ll/string.h>
-#include <kernel/model.h>
-#include <kernel/descr.h>
-#include <kernel/var.h>
-#include <kernel/func.h>
-#include <kernel/trace.h>
-#include "posixstar.h"
-#include "cbsstar.h"
-//#define POSIXSTAR_DEBUG
-/*+ Status used in the level +*/
-#define POSIXSTAR_READY MODULE_STATUS_BASE
-
-/*+ the level redefinition for the Round Robin level +*/
-typedef struct {
- level_des l; /*+ the standard level descriptor +*/
-
- int nact[MAX_PROC]; /*+ number of pending activations +*/
-
- int priority[MAX_PROC]; /*+ priority of each task +*/
-
- IQUEUE *ready; /*+ the ready queue array +*/
-
- int slice; /*+ the level's time slice +*/
-
-// the multiboot is not usefull for this module
-// struct multiboot_info *multiboot; /*+ used if the level have to insert
- // the main task +*/
- int maxpriority; /*+ the priority are from 0 to maxpriority
- (i.e 0 to 31) +*/
-
- int yielding; /*+ equal to 1 when a sched_yield is called +*/
-
- int budget;
-
- PID activated;
- int scheduling_level;
-
-} POSIXSTAR_level_des;
-
-/* the private scheduler choice a task and insert in cbsstar module */
-/* This is not efficient but very fair :-)
- The need of all this stuff is because if a task execute a long time
- due to (shadow!) priority inheritance, then the task shall go to the
- tail of the queue many times... */
-
-static void POSIXSTAR_private_scheduler(POSIXSTAR_level_des * lev)
-{
- /* the old posix scheduler select the private job for CBS */
- PID p=NIL;
-
- int prio;
-
- prio = lev->maxpriority;
-
- for (;;) {
- p = iq_query_first(&lev->ready[prio]);
- if (p == NIL) {
- if (prio) {
- prio--;
- continue;
- }
- else {
- p=NIL;
- break;
- }
- }
- //if (p != NIL && (proc_table[p].control & CONTROL_CAP))
- // kern_printf("CC SET %d",p);
-
- //kern_printf("task %d", p);
-
- if ((proc_table[p].control & CONTROL_CAP) &&
- (proc_table[p].avail_time <= 0)) {
- if (proc_table[p].avail_time<=0)
- proc_table[p].avail_time += proc_table[p].wcet;
- //kern_printf("RR policy");
- iq_extract(p,&lev->ready[prio]);
- iq_insertlast(p,&lev->ready[prio]);
- }
- else {
- break;
- }
- }
-
- if (p!=lev->activated) {
- if (lev->activated != NIL ) {
- level_table[ lev->scheduling_level ]->
- private_extract(lev->scheduling_level, lev->activated);
- //kern_printf("CBS ext %d",p);
- }
- lev->activated = p;
-
- if (p != NIL) {
- BUDGET_TASK_MODEL b;
- budget_task_default_model(b, lev->budget);
- //kern_printf("(Act %d",p);
- level_table[ lev->scheduling_level ]->
- private_insert(lev->scheduling_level, p, (TASK_MODEL *)&b);
- }
- }
-}
-
-static int POSIXSTAR_public_eligible(LEVEL l, PID p)
-{
- POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]);
- if (p==lev->activated) {
- //kern_printf("eli %d", p);
-
- return level_table[ lev->scheduling_level ]->
- private_eligible(lev->scheduling_level,p);
- }
- return 0;
-}
-
-
-static int POSIXSTAR_public_create(LEVEL l, PID p, TASK_MODEL *m)
-{
- POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]);
- NRT_TASK_MODEL *nrt;
-
- if (m->pclass != NRT_PCLASS) return -1;
- if (m->level != 0 && m->level != l) return -1;
-
- nrt = (NRT_TASK_MODEL *)m;
-
- /* the task state is set at SLEEP by the general task_create */
-
- /* I used the wcet field because using wcet can account if a task
- consume more than the timeslice... */
-
- if (nrt->inherit == NRT_INHERIT_SCHED &&
- proc_table[exec_shadow].task_level == l) {
- /* We inherit the scheduling properties if the scheduling level
- *is* the same */
- lev->priority[p] = lev->priority[exec_shadow];
-
- proc_table[p].avail_time = proc_table[exec_shadow].avail_time;
- proc_table[p].wcet = proc_table[exec_shadow].wcet;
-
- proc_table[p].control = (proc_table[p].control & ~CONTROL_CAP) |
- (proc_table[exec_shadow].control & CONTROL_CAP);
-
- lev->nact[p] = (lev->nact[exec_shadow] == -1) ? -1 : 0;
- }
- else {
- if (nrt->weight<=lev->maxpriority)
- lev->priority[p] = nrt->weight;
- else lev->priority[p]=lev->maxpriority;
-
- if (nrt->slice) {
- proc_table[p].avail_time = nrt->slice;
- proc_table[p].wcet = nrt->slice;
- }
- else {
- proc_table[p].avail_time = lev->slice;
- proc_table[p].wcet = lev->slice;
- }
-
- if (nrt->policy == NRT_RR_POLICY) {
- proc_table[p].control |= CONTROL_CAP;
- //kern_printf("CCAP set:%d",p);
-
- }
- if (nrt->arrivals == SAVE_ARRIVALS)
- lev->nact[p] = 0;
- else
- lev->nact[p] = -1;
- }
-
- return 0; /* OK */
-}
-
-static void POSIXSTAR_public_dispatch(LEVEL l, PID p, int nostop)
-{
- POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]);
-
- //#ifdef POSIXSTAR_DEBUG
-
- //#endif
-
- /* the task state is set EXE by the scheduler()
- we extract the task from the ready queue
- NB: we can't assume that p is the first task in the queue!!! */
- //iq_extract(p, &lev->ready[lev->priority[p]]);
- //if (!nostop) {
- //kern_printf("PDisp:%d(%d)",p, lev->activated);
- if (p==lev->activated)
- level_table[lev->scheduling_level]->private_dispatch(lev->scheduling_level, p, nostop);
- //} else
- // kern_printf("PDisp:%d(%d)",p, lev->activated);
-}
-
-static void POSIXSTAR_public_epilogue(LEVEL l, PID p)
-{
- POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]);
- //#ifdef POSIXSTAR_DEBUG
- //kern_printf("PEpic:%d",p);
- //#endif
- if (p==lev->activated) {
- if (lev->yielding) {
- lev->yielding = 0;
- iq_extract(p,&lev->ready[lev->priority[p]]);
- iq_insertlast(p,&lev->ready[lev->priority[p]]);
- }
- /* check if the slice is finished and insert the task in the coPOSIXect
- qqueue position */
- else if (proc_table[p].control & CONTROL_CAP &&
- proc_table[p].avail_time <= 0) {
-
- //proc_table[p].avail_time += proc_table[p].wcet;
- //kern_printf("avail_time %d", proc_table[p].avail_time);
- iq_extract(p,&lev->ready[lev->priority[p]]);
- iq_insertlast(p,&lev->ready[lev->priority[p]]);
- //level_table[lev->scheduling_level]->private_extract(lev->scheduling_level,p);
- //lev->activated=NIL;
-
- POSIXSTAR_private_scheduler(lev);
- if (p==lev->activated)
- level_table[lev->scheduling_level]->private_epilogue(lev->scheduling_level,p);
-
- }
- else {
- //iq_insertfirst(p,&lev->ready[lev->priority[p]]);
- level_table[lev->scheduling_level]->private_epilogue(lev->scheduling_level,p);
-
- }
-
- proc_table[p].status = POSIXSTAR_READY;
-
- }
-
-
-}
-
-static void POSIXSTAR_internal_activate(POSIXSTAR_level_des *lev, PID p)
-{
-
- /* Insert task in the correct position */
- proc_table[p].status = POSIXSTAR_READY;
- iq_insertlast(p,&lev->ready[lev->priority[p]]);
-
-}
-
-
-static void POSIXSTAR_public_activate(LEVEL l, PID p)
-{
- POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]);
-
- /* Test if we are trying to activate a non sleeping task */
- /* save activation (only if needed...) */
- if (proc_table[p].status != SLEEP) {
- if (lev->nact[p] != -1)
- lev->nact[p]++;
- return;
- }
-#ifdef POSIXSTAR_DEBUG
- kern_printf("PA:%d",p);
-#endif
- POSIXSTAR_internal_activate(lev, p);
- POSIXSTAR_private_scheduler(lev);
-
-}
-
-
-static void POSIXSTAR_public_unblock(LEVEL l, PID p)
-{
- POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]);
-
- /* Similar to POSIX_task_activate, but we don't check in what state
- the task is */
-
- /* Insert task in the coPOSIXect position */
- //kern_printf("PU:%d", p);
- proc_table[p].status = POSIXSTAR_READY;
- iq_insertlast(p,&lev->ready[lev->priority[p]]);
- POSIXSTAR_private_scheduler(lev);
-}
-
-static void POSIXSTAR_public_block(LEVEL l, PID p)
-{
- POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]);
-
- /* Extract the running task from the level
- . we have already extract it from the ready queue at the dispatch time.
- . the capacity event have to be removed by the generic kernel
- . the wcet don't need modification...
- . the state of the task is set by the calling function
-
- So, we do nothing!!!
- */
-
-//#ifdef POSIXSTAR_DEBUG
-//kern_printf("PB:%d", p);
-//#endif
- iq_extract(p,&lev->ready[lev->priority[p]]);
- POSIXSTAR_private_scheduler(lev);
-
-}
-
-static int POSIXSTAR_public_message(LEVEL l, PID p, void *m)
-{
- POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]);
-
- if (lev->nact[p] > 0) {
- /* continue!!!! */
- lev->nact[p]--;
- iq_extract(p,&lev->ready[lev->priority[p]]);
- iq_insertfirst(p,&lev->ready[lev->priority[p]]);
- proc_table[p].status = POSIXSTAR_READY;
- }
- else {
- proc_table[p].status = SLEEP;
-
- }
- //#ifdef POSIXSTAR_DEBUG
- kern_printf("PM:%d",p);
- //#endif
- //jet_update_endcycle(); /* Update the Jet data... */
- //trc_logevent(TRC_ENDCYCLE,&exec_shadow); /* tracer stuff */
- POSIXSTAR_private_scheduler(lev);
- return 0;
-}
-
-static void POSIXSTAR_public_end(LEVEL l, PID p)
-{
- POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]);
-#ifdef POSIXSTAR_DEBUG
- kern_printf("PEnd:%d", p);
-#endif
- lev->nact[p] = -1;
-
- /* then, we insert the task in the free queue */
- proc_table[p].status = FREE;
- iq_priority_insert(p,NULL);
- POSIXSTAR_private_scheduler(lev);
-}
-
-/* Registration functions */
-
-/*+ Registration function:
- TIME slice the slice for the Round Robin queue
- struct multiboot_info *mb used if createmain specified +*/
-LEVEL POSIXSTAR_register_level(int budget, int master, TIME slice,
- int prioritylevels)
-{
- LEVEL l; /* the level that we register */
- POSIXSTAR_level_des *lev; /* for readableness only */
- PID i; /* a counter */
- int x; /* a counter */
-
- printk("POSIXSTAR_register_level\n");
-
- l = level_alloc_descriptor(sizeof(POSIXSTAR_level_des));
-
- lev = (POSIXSTAR_level_des *)level_table[l];
-
- printk(" lev=%d\n",(int)lev);
-
- /* fill the standard descriptor */
- /*
- lev->l.private_insert = NULL;
- lev->l.private_extract = NULL;
- lev->l.private_dispatch = NULL;
- lev->l.private_epilogue = NULL;
- */
-
- //lev->l.public_scheduler = NULL;
- lev->l.public_create = POSIXSTAR_public_create;
- lev->l.public_end = POSIXSTAR_public_end;
- lev->l.public_dispatch = POSIXSTAR_public_dispatch;
- lev->l.public_epilogue = POSIXSTAR_public_epilogue;
- lev->l.public_activate = POSIXSTAR_public_activate;
- lev->l.public_unblock = POSIXSTAR_public_unblock;
- lev->l.public_block = POSIXSTAR_public_block;
- lev->l.public_message = POSIXSTAR_public_message;
- lev->l.public_eligible = POSIXSTAR_public_eligible;
-
- /* fill the POSIX descriptor part */
- for (i = 0; i < MAX_PROC; i++)
- lev->nact[i] = -1;
-
- lev->maxpriority = prioritylevels -1;
-
- lev->ready = (IQUEUE *)kern_alloc(sizeof(IQUEUE) * prioritylevels);
-
- for (x = 0; x < prioritylevels; x++)
- iq_init(&lev->ready[x], NULL, 0);
-
- if (slice < POSIXSTAR_MINIMUM_SLICE) slice = POSIXSTAR_MINIMUM_SLICE;
- if (slice > POSIXSTAR_MAXIMUM_SLICE) slice = POSIXSTAR_MAXIMUM_SLICE;
- lev->slice = slice;
- lev->activated=NIL;
- lev->budget = budget;
- lev->scheduling_level = master;
- //lev->multiboot = mb;
-
- //if (createmain)
- // sys_atrunlevel(POSIXSTAR_call_main,(void *) l, RUNLEVEL_INIT);
-
- return l;
-}
-
-/*+ this function forces the running task to go to his queue tail;
- (it works only on the POSIX level) +*/
-int POSIXSTAR_sched_yield(LEVEL l)
-{
- POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]);
-
- if (proc_table[exec_shadow].task_level != l)
- return -1;
-
- proc_table[exec_shadow].context = kern_context_save();
- lev->yielding = 1;
- scheduler();
- kern_context_load(proc_table[exec_shadow].context);
- return 0;
-}
-
-/*+ this function returns the maximum level allowed for the POSIX level +*/
-int POSIXSTAR_get_priority_max(LEVEL l)
-{
- POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]);
- return lev->maxpriority;
-}
-
-/*+ this function returns the default timeslice for the POSIX level +*/
-int POSIXSTAR_rr_get_interval(LEVEL l)
-{
- POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]);
- return lev->slice;
-}
-
-/*+ this functions returns some paramaters of a task;
- policy must be NRT_RR_POLICY or NRT_FIFO_POLICY;
- priority must be in the range [0..prioritylevels]
- returns ENOSYS or ESRCH if there are problems +*/
-int POSIXSTAR_getschedparam(LEVEL l, PID p, int *policy, int *priority)
-{
- if (p<0 || p>= MAX_PROC || proc_table[p].status == FREE)
- return ESRCH;
-
- if (proc_table[p].task_level != l)
- return ENOSYS;
-
- if (proc_table[p].control & CONTROL_CAP)
- *policy = NRT_RR_POLICY;
- else
- *policy = NRT_FIFO_POLICY;
-
- *priority = ((POSIXSTAR_level_des *)(level_table[l]))->priority[p];
-
- return 0;
-}
-
-/*+ this functions sets paramaters of a task +*/
-int POSIXSTAR_setschedparam(LEVEL l, PID p, int policy, int priority)
-{
- POSIXSTAR_level_des *lev = (POSIXSTAR_level_des *)(level_table[l]);
-
- if (p<0 || p>= MAX_PROC || proc_table[p].status == FREE)
- return ESRCH;
-
- if (proc_table[p].task_level != l)
- return ENOSYS;
-
- if (policy == SCHED_RR)
- proc_table[p].control |= CONTROL_CAP;
- else if (policy == SCHED_FIFO)
- proc_table[p].control &= ~CONTROL_CAP;
- else
- return EINVAL;
-
- if (lev->priority[p] != priority) {
- if (proc_table[p].status == POSIXSTAR_READY) {
- iq_extract(p,&lev->ready[lev->priority[p]]);
- lev->priority[p] = priority;
- iq_insertlast(p,&lev->ready[priority]);
- }
- else
- lev->priority[p] = priority;
- }
-
- return 0;
-}
-
-
-
Index: rel_1_2/first/makefile
===================================================================
--- rel_1_2/first/makefile (revision 1198)
+++ rel_1_2/first/makefile (nonexistent)
@@ -1,35 +0,0 @@
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= test1 test2 test3 test4 test5 test6 test7 testiq
-
-include $(BASE)/config/example.mk
-
-test1:
- make -f $(SUBMAKE) APP=test1 INIT= OTHEROBJS="edfstar.o cbsstar.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-test2:
- make -f $(SUBMAKE) APP=test2 INIT= OTHEROBJS="edfstar.o cbsstar.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-test3:
- make -f $(SUBMAKE) APP=test3 INIT= OTHEROBJS="edfstar.o cbsstar.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-test4:
- make -f $(SUBMAKE) APP=test4 INIT= OTHEROBJS="edfstar.o cbsstar.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-test5:
- make -f $(SUBMAKE) APP=test5 INIT= OTHEROBJS="edfstar.o cbsstar.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-test6:
- make -f $(SUBMAKE) APP=test6 INIT= OTHEROBJS="rmstar.o cbsstar.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-test7:
- make -f $(SUBMAKE) APP=test7 INIT= OTHEROBJS="posixstar.o cbsstar.o" OTHERINCL= SHARKOPT=__OLDCHAR__
-
-#testiq:
-# make -f $(SUBMAKE) APP=testiq INIT= OTHEROBJS="iqueue.o " OTHERINCL=
Index: rel_1_2/first/iqueue.c
===================================================================
--- rel_1_2/first/iqueue.c (revision 1198)
+++ rel_1_2/first/iqueue.c (nonexistent)
@@ -1,221 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: iqueue.c,v 1.1 2002-09-02 10:29:30 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2002-09-02 10:29:30 $
- ------------
-
-*/
-
-/*
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "iqueue.h"
-#include <kernel/mem.h>
-
-void iq_init (IQUEUE *q, IQUEUE *share, int flags)
-{
- q->first = NIL;
- q->last = NIL;
-
- if (share)
- q->s = share->s;
- else {
- q->s = (struct IQUEUE_shared *)kern_alloc(sizeof(struct IQUEUE_shared));
-
- if (!(flags & IQUEUE_NO_PRIORITY))
- q->s->priority = (DWORD *)kern_alloc(sizeof(DWORD) * MAX_PROC);
- if (!(flags & IQUEUE_NO_TIMESPEC))
- q->s->timespec_priority = (struct timespec *)
- kern_alloc(sizeof(struct timespec) * MAX_PROC);
- }
-}
-
-/*+
- This function insert the task with PID i in the queue que.
- The insertion is made respecting the priority field.
- (the first item in the queue have the less priority)
-+*/
-void iq_priority_insert (PID i, IQUEUE *que)
-{
- DWORD prio;
- PID p,q;
-
- p = NIL;
- q = que->first;
- prio = que->s->priority[i];
-
- while ((q != NIL) && (prio >= que->s->priority[q])) {
- p = q;
- q = que->s->next[q];
- }
-
- if (p != NIL)
- que->s->next[p] = i;
- else
- que->first = i;
-
- if (q != NIL)
- que->s->prev[q] = i;
- else
- que->last = i;
-
- que->s->next[i] = q;
- que->s->prev[i] = p;
-}
-
-
-/*
- This function insert the task with PID i in the queue que.
- The insertion is made respecting the timespec priority field.
- (the first item in the queue have the less priority)
-*/
-void iq_timespec_insert(PID i, IQUEUE *que)
-{
- struct timespec prio;
- PID p,q;
-
- p = NIL;
- q = que->first;
-
- TIMESPEC_ASSIGN(&prio, &que->s->timespec_priority[i]);
-
- while ((q != NIL) &&
- !TIMESPEC_A_LT_B(&prio, &que->s->timespec_priority[q])) {
- p = q;
- q = que->s->next[q];
- }
-
- if (p != NIL)
- que->s->next[p] = i;
- else
- que->first = i;
-
- if (q != NIL)
- que->s->prev[q] = i;
- else
- que->last = i;
-
- que->s->next[i] = q;
- que->s->prev[i] = p;
-}
-
-
-
-void iq_insertfirst(PID p, IQUEUE *q)
-{
- if (q->first != NIL) {
- q->s->next[p] = q->first;
- q->s->prev[q->first] = p;
- }
- else {
- q->last = p;
- q->s->next[p] = NIL;
- }
- q->s->prev[p] = NIL;
- q->first = p;
-}
-
-
-void iq_insertlast(PID p, IQUEUE *q)
-{
- if (q->last != NIL) {
- q->s->prev[p] = q->last;
- q->s->next[q->last] = p;
- }
- else {
- q->first = p;
- q->s->prev[p] = NIL;
- }
- q->s->next[p] = NIL;
- q->last = p;
-}
-
-
-void iq_extract(PID i, IQUEUE *que)
-{
- PID p,q;
-
- p = que->s->prev[i];
- q = que->s->next[i];
-
- if (p != NIL)
- que->s->next[p] = que->s->next[i];
- else
- que->first = q;
-
- if (q != NIL)
- que->s->prev[q] = que->s->prev[i];
- else
- que->last = p;
-}
-
-PID iq_getfirst(IQUEUE *q)
-{
- PID p = q->first;
-
- if (p == NIL)
- return NIL;
-
- q->first = q->s->next[q->first];
-
- if (q->first != NIL)
- q->s->prev[q->first] = NIL;
- else
- q->last = NIL;
-
- return p;
-}
-
-PID iq_getlast(IQUEUE *q)
-{
- PID p = q->last;
-
- if (p == NIL)
- return NIL;
-
- q->last = q->s->prev[q->last];
-
- if (q->last != NIL)
- q->s->next[q->last] = NIL;
- else
- q->first = NIL;
-
- return p;
-}
Index: rel_1_2/first/edfstar.h
===================================================================
--- rel_1_2/first/edfstar.h (revision 1198)
+++ rel_1_2/first/edfstar.h (nonexistent)
@@ -1,138 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: edfstar.h,v 1.2 2003-01-07 17:10:17 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-01-07 17:10:17 $
- ------------
-
- Title:
- EDFSTAR
-
- Task Models Accepted:
- HARD_TASK_MODEL - Hard Tasks (only Periodic)
- wcet field and mit field must be != 0. They are used to set the wcet
- and period of the tasks.
- periodicity field can be only PERIODIC
- drel field is ignored
-
- Guest Models Accepted:
- JOB_TASK_MODEL - a single guest task activation
- Identified by an absolute deadline and a period.
- period field is ignored
-
- Description:
-
- This module schedule his tasks following the classic EDF
- scheme. This module is derived from the EDFACT Scheduling Module.
-
- This module can not stay alone: when it have to schedule a task, it
- simply inserts it into another master module using a
- BUDGET_TASK_MODEL.
-
- No Task guarantee is performed at all.
- The tasks scheduled are only periodic.
- All the task are put in a queue and the scheduling is based on the
- deadline value.
- If a task miss a deadline a counter is incremented.
- If a task exausts the wcet a counter is incremented
- No ZOMBIE support!!!!!!
-
- Exceptions raised:
- XUNVALID_GUEST XUNVALID_TASK
- some primitives are not implemented:
- task_sleep, task_delay, guest_endcycle, guest_sleep, guest_delay
-
- XACTIVATION
- If a task is actiated through task_activate or guest_activate more than
- one time
-
- Restrictions & special features:
- - This level doesn't manage the main task.
- - Functions to return and reset the nact, wcet and dline miss
- counters are provided
-
-**/
-
-/*
- * Copyright (C) 2001 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#ifndef __EDFSTAR_H__
-#define __EDFSTAR_H__
-
-#include <ll/ll.h>
-#include <kernel/config.h>
-#include <sys/types.h>
-#include <kernel/types.h>
-
-
-
-/* flags... */
-#define EDFSTAR_ENABLE_GUARANTEE 1 /* Task Guarantee enabled */
-#define EDFSTAR_ENABLE_ALL 1
-
-#define EDFSTAR_FAILED_GUARANTEE 8 /* used in the module, unsettabl
- in EDF_register_level... */
-
-
-
-#define EDFSTAR_LEVELNAME "EDFSTAR base"
-#define EDFSTAR_LEVEL_CODE 166
-#define EDFSTAR_LEVEL_VERSION 1
-
-
-/* Registration function:
- int budget The budget used by this module (see CBSSTAR.h)
- int master The master module used by EDFSTAR
-*/
-LEVEL EDFSTAR_register_level(int budget, int master);
-
-/* returns respectively the number of dline, wcet or nact; -1 if error */
-int EDFSTAR_get_dline_miss(PID p);
-int EDFSTAR_get_wcet_miss(PID p);
-int EDFSTAR_get_nact(PID p);
-
-/* resets respectively the number of dline, wcet miss; -1 if error */
-int EDFSTAR_reset_dline_miss(PID p);
-int EDFSTAR_reset_wcet_miss(PID p);
-
-#endif
-
Index: rel_1_2/first/test1.c
===================================================================
--- rel_1_2/first/test1.c (revision 1198)
+++ rel_1_2/first/test1.c (nonexistent)
@@ -1,247 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: test1.c,v 1.2 2003-01-07 17:10:17 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-01-07 17:10:17 $
- ------------
-
- this test shows a set of 5 tasks (+main+dummy+keyboard driver).
-
- The first 4 tasks are scheduled by a EDFSTAR Module, whereas the
- fifth one is a standard traditional EDF task. The 4 tasks uses a
- budget of 10000/100000.
-
- if edfstar.c is compiled with edfstar_printf3 active, a couple
- (dline, curtime) is showed (in ms).
-
- if cbsstar.c is compiled with cbsstar_printf3 active, the budget
- replenishments are showed.
-*/
-
-/*
- * Copyright (C) 2002 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "cbsstar.h"
-#include "edfstar.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-// --------------------------------------------------
-// --------------------------------------------------
-// Init Part
-// --------------------------------------------------
-// --------------------------------------------------
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- int cbsstar_level, edfstar_level, mybudget;
-
- EDF_register_level(EDF_ENABLE_ALL);
-
- cbsstar_level = CBSSTAR_register_level(3, 0);
- mybudget = CBSSTAR_setbudget(cbsstar_level, 10000, 100000);
- edfstar_level = EDFSTAR_register_level(mybudget, cbsstar_level);
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- // for the keyboard...
- CBS_register_level(CBS_ENABLE_ALL, 0);
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- //keyb_def_ctrlC(kparms, NULL);
- //keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
- __call_main__(mb);
-
- return (void *)0;
-}
-
-// --------------------------------------------------
-// --------------------------------------------------
-// The Test
-// --------------------------------------------------
-// --------------------------------------------------
-
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-void *star(void *arg)
-{
- int i,j;
-
- for (i=0; i<5; i++) {
- for (j=0; j<100000; j++);
- cputc('°');
- cputs((char *)arg);
- task_endcycle();
- }
-
- return NULL;
-}
-
-void *edftask(void *arg)
-{
- int i,j;
-
- for (i=0; i<5; i++) {
- for (j=0; j<100000; j++);
- cputc('°');
- cputs((char *)arg);
- task_endcycle();
- }
-
- return NULL;
-}
-
-void create1()
-{
- HARD_TASK_MODEL m1, m2;
- PID p1a, p1b, p1c, p1d, p2;
-
- hard_task_default_model(m1);
- hard_task_def_wcet(m1, 5000);
- hard_task_def_level(m1,2);
- hard_task_def_group(m1,1);
- hard_task_def_periodic(m1);
-
- hard_task_def_arg(m1,(void *)"a");
- hard_task_def_mit(m1,10000);
- p1a = task_create("a", star, &m1, NULL);
- if (p1a == -1) {
- perror("Could not create task a ...");
- sys_end();
- }
-
- hard_task_def_arg(m1,(void *)"b");
- hard_task_def_mit(m1,15000);
- p1b = task_create("b", star, &m1, NULL);
- if (p1b == -1) {
- perror("Could not create task b ...");
- sys_end();
- }
-
- hard_task_def_arg(m1,(void *)"c");
- hard_task_def_mit(m1,20000);
- p1c = task_create("c", star, &m1, NULL);
- if (p1c == -1) {
- perror("Could not create task c ...");
- sys_end();
- }
-
- hard_task_def_arg(m1,(void *)"d");
- hard_task_def_mit(m1,30000);
- p1d = task_create("d", star, &m1, NULL);
- if (p1d == -1) {
- perror("Could not create task d ...");
- sys_end();
- }
-
- hard_task_default_model(m2);
- hard_task_def_mit(m2,50000); // the budget has dline 100,000!
- hard_task_def_wcet(m2, 5000);
- hard_task_def_arg(m2,(void *)"Û");
- hard_task_def_group(m2,1);
- hard_task_def_periodic(m2);
-
- p2 = task_create("2", edftask, &m2, NULL);
- if (p2 == -1) {
- perror("Could not create task edf ...");
- sys_end();
- }
-
- cprintf("stars=%d %d %d %d, star2=%d\n", p1a, p1b, p1c, p1d, p2);
-
- group_activate(1);
-}
-
-int main(int argc, char **argv)
-{
- char c;
-
- clear();
-
- cprintf("Hello, world!\nPress ESC to end the demo...\n");
-
- create1();
-
- do {
- c =keyb_getch(BLOCK);
- } while (c != ESC);
-
- cprintf("ESC pressed!");
-
- sys_end();
-
- return 0;
-}
-
Index: rel_1_2/block/readme
===================================================================
--- rel_1_2/block/readme (revision 1198)
+++ rel_1_2/block/readme (nonexistent)
@@ -1,33 +0,0 @@
-Hi,
-
-These are the block devices demos.
-
-- THEY DO NOT WRITE ON YOUR HD, so they are not dangerous.
-
-- They do not require a FAT16 Filesystem.
-
-
-idetest0:
-The demo identifies your Hard Disk characteristics and prints it on
-the screen.
-
-idetest1:
-The demo identifies all the partitions of your HD.
-
-idetest2:
-The demo allows you to select a sector on the HD and to read it.
-
-idetest3:
-The demo reads a random sector and then it writes it in the same position.
-
-idelin:
-The demo reads 16Mb of data from the HD. The data is read block by
-block, linearly.
-
-idernd:
-The demo reads 512Kb of data from the HD. The data is read block by
-block, randomly.
-
-Enjoy,
-
-PJ
Index: rel_1_2/block/initblk.c
===================================================================
--- rel_1_2/block/initblk.c (revision 1198)
+++ rel_1_2/block/initblk.c (nonexistent)
@@ -1,113 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: initblk.c,v 1.1 2002-11-11 08:24:49 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1 $
- * Last update: $Date: 2002-11-11 08:24:49 $
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/cbs.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-#include "modules/nopm.h"
-
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- extern int __register_sub_init(void);
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- PC_register_module();
- NPP_register_module();
- SRP_register_module();
- NOP_register_module();
- NOPM_register_module();
-
- __register_sub_init();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- KEYB_PARMS keyb = BASE_KEYB;
- extern int __bdev_sub_init(void);
- extern void ctrlc_exit(KEY_EVT *k);
-
- HARTPORT_init();
-
- keyb_def_ctrlC(keyb, ctrlc_exit);
- KEYB_init(&keyb);
-
- __bdev_sub_init();
-
- __call_main__(mb);
-
- return (void *)0;
-}
Index: rel_1_2/block/makefile
===================================================================
--- rel_1_2/block/makefile (revision 1198)
+++ rel_1_2/block/makefile (nonexistent)
@@ -1,34 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS=idetest0 idetest1 idetest2 idetest3 idelin idernd idetx430
-
-include $(BASE)/config/example.mk
-
-#
-#
-#
-
-idetest0:
- make -f $(SUBMAKE) BASE=$(BASE) APP=idetest0 OTHEROBJS="common.o initblk.o" SHARKOPT=__OLDCHAR__
-
-idetest1:
- make -f $(SUBMAKE) BASE=$(BASE) APP=idetest1 OTHEROBJS="common.o initblk.o" SHARKOPT=__OLDCHAR__
-
-idetest2:
- make -f $(SUBMAKE) BASE=$(BASE) APP=idetest2 OTHEROBJS="common.o initblk.o" SHARKOPT=__OLDCHAR__
-
-idetest3:
- make -f $(SUBMAKE) BASE=$(BASE) APP=idetest3 OTHEROBJS="common.o initblk.o" SHARKOPT=__OLDCHAR__
-
-idelin:
- make -f $(SUBMAKE) BASE=$(BASE) APP=idelin OTHEROBJS="common.o initblk.o" SHARKOPT=__OLDCHAR__
-
-idernd:
- make -f $(SUBMAKE) BASE=$(BASE) APP=idernd OTHEROBJS="common.o initblk.o" SHARKOPT=__OLDCHAR__
Index: rel_1_2/block/common.h
===================================================================
--- rel_1_2/block/common.h (revision 1198)
+++ rel_1_2/block/common.h (nonexistent)
@@ -1,11 +0,0 @@
-
-#ifndef __COMMON_H
-#define __COMMON_H
-
-void showmessage(char *s);
-void waitend(void);
-
-void debug_dump_buffer(char *buf, int size);
-
-#endif
-
Index: rel_1_2/block/idetest0.c
===================================================================
--- rel_1_2/block/idetest0.c (revision 1198)
+++ rel_1_2/block/idetest0.c (nonexistent)
@@ -1,15 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <fs/bdev.h>
-
-#include "common.h"
-
-int main(int argc,char *argv[])
-{
- showmessage("Have ide devices been found?\n");
- return 0;
-}
Index: rel_1_2/block/idetest1.c
===================================================================
--- rel_1_2/block/idetest1.c (revision 1198)
+++ rel_1_2/block/idetest1.c (nonexistent)
@@ -1,20 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <fs/bdev.h>
-
-#include "common.h"
-
-int main(int argc,char *argv[])
-{
-
- showmessage("This test try to identify the partions of all hard disks\n");
-
- bdev_dump_names();
-
- waitend();
- return 0;
-}
Index: rel_1_2/block/idetest2.c
===================================================================
--- rel_1_2/block/idetest2.c (revision 1198)
+++ rel_1_2/block/idetest2.c (nonexistent)
@@ -1,77 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <ll/i386/cons.h>
-#include <drivers/keyb.h>
-
-#include <fs/bdevinit.h>
-#include <fs/bdev.h>
-
-#include <string.h>
-
-#include "common.h"
-
-#define DISKDEVICE "ide/hda1"
-
-__uint8_t buffer[2048] __attribute__ ((aligned (4)));
-__dev_t dev;
-
-extern char *ide_error_msg[];
-
-int main(int argc,char *argv[])
-{
- __blkcnt_t blk;
- int res;
- int c;
-
- showmessage("This test try to read some blocks from first hard disk\n");
-
- dev=bdev_find_byname(DISKDEVICE);
- if (dev<0) {
- cprintf("Can't find device to operate with\n");
- return -1;
- }
- cprintf("Using device %s (dev=%04x)\n",DISKDEVICE,dev);
-
- blk=0;
- for (;;) {
- cprintf("Commands: x-exit r-read n-next block p-prev block\n");
- c = keyb_getchar();
- switch(c) {
- case 'x':
- return 0;
-
- case 'n':
- blk++;
- cprintf("Block %li\n",(long)blk);
- break;
-
- case 'p':
- if (blk>=0) blk--;
- cprintf("Block %li\n",(long)blk);
- break;
-
- case 'r':
- cprintf("Reading block %li...\n",(long)blk);
- memset(buffer,0xff,sizeof(buffer));
- res=bdev_read(dev,blk,buffer);
- cprintf("Result %i\n",res);
- //cprintf("Soft reset done %i\n",ide[0].errors);
- if (res!=0) {
- cprintf(" %s\n",(char*)ide_error_msg[-res]);
- }
- debug_dump_buffer(buffer,64);
- break;
-
- default:
- cprintf("Invalid command!\n");
- break;
- }
- cprintf("\n");
- }
-
- return 0;
-}
Index: rel_1_2/block/idelin.c
===================================================================
--- rel_1_2/block/idelin.c (revision 1198)
+++ rel_1_2/block/idelin.c (nonexistent)
@@ -1,71 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <ll/i386/cons.h>
-#include <kernel/func.h>
-
-#include <fs/bdevinit.h>
-#include <fs/bdev.h>
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "common.h"
-
-#define DISKDEVICE "ide/hda"
-
-#define TEST_MB 16
-
-#define NUMBLOCK (TEST_MB*1024l*1024l/512l)
-
-__dev_t dev;
-
-__uint8_t buffer[2048];
-
-int main(int argc,char *argv[])
-{
- __blkcnt_t blk;
- int res;
- int errors;
- TIME sttime,etime;
-
- showmessage("\n"
- "This test read data from first hard disk to test\n"
- "disk throughtput.\n"
- "Remeber that the reads are made block by block so\n"
- "don't worry if you see a low throughtput.\n"
- );
-
- dev=bdev_find_byname(DISKDEVICE);
- if (dev<0) {
- cprintf("\nCan't find device to operate with\n");
- return -1;
- }
- cprintf("\nUsing device %s (dev=%04x)\n",DISKDEVICE,dev);
-
- cprintf("Please wait (reading %i MB linearly?!?)...",TEST_MB);
-
- sttime=sys_gettime(NULL);
- errors=0;
- for (blk=0;blk<NUMBLOCK;blk++) {
- res=bdev_read(dev,blk,buffer);
- //res=bdev_seek(dev,blk);
- if (res!=0) errors++;
- }
- etime=sys_gettime(NULL)-sttime;
-
- cprintf("\nDone\n\n");
- cprintf("elapse time : %li sec %li msec\n",
- etime/1000000l,
- (etime/1000l)%1000l);
- cprintf("throughtput : %6.3f MB/s\n",
- NUMBLOCK*512.0/1024.0/1024.0/etime*1000000.0);
- //cprintf("soft reset made: %i\n",ide[0].errors);
- cprintf("errors : %i\n",errors);
- cprintf("\n");
-
- return 0;
-}
Index: rel_1_2/block/idetest3.c
===================================================================
--- rel_1_2/block/idetest3.c (revision 1198)
+++ rel_1_2/block/idetest3.c (nonexistent)
@@ -1,66 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <ll/i386/cons.h>
-#include <drivers/keyb.h>
-
-#include <fs/bdevinit.h>
-#include <fs/bdev.h>
-
-#include <string.h>
-
-#include "common.h"
-
-#define DISKDEVICE "ide/hda1"
-#define BLOCKNUMBER 58549
-
-__uint8_t buffer[2048] __attribute__ ((aligned (4)));
-
-extern char *ide_error_msg[];
-
-int main(int argc,char *argv[])
-{
- __dev_t dev;
- __blkcnt_t blk;
- int res;
- // int c;
-
- showmessage("This test tries to read a block from the first hard disk\n"
- "and then it tries to write it to disk\n"
- "Press [CTRL-C] to abort...");
-
- dev=bdev_find_byname(DISKDEVICE);
- if ((int)dev<0) {
- cprintf("Can't find device to operate with\n");
- cprintf("%s not present!\n",DISKDEVICE);
- return -1;
- }
- cprintf("Using device %s (dev=%04x)\n",DISKDEVICE,dev);
-
- blk=BLOCKNUMBER;
-
- cprintf("Reading block %li...\n",(long)blk);
- memset(buffer,0xff,sizeof(buffer));
- res=bdev_read(dev,blk,buffer);
- cprintf("Result %i\n",res);
- //cprintf("Soft reset done %i\n",ide[0].errors);
- if (res!=0) {
- cprintf(" %s\n",(char*)ide_error_msg[-res]);
- return -1;
- }
- debug_dump_buffer(buffer,64);
-
- cprintf("Writing block %li...\n",(long)blk);
- res=bdev_write(dev,blk,buffer);
- cprintf("Result %i\n",res);
- //cprintf("Soft reset done %i\n",ide[0].errors);
- if (res!=0) {
- cprintf(" %s\n",(char*)ide_error_msg[-res]);
- }
-
- waitend();
- return 0;
-}
Index: rel_1_2/block/idernd.c
===================================================================
--- rel_1_2/block/idernd.c (revision 1198)
+++ rel_1_2/block/idernd.c (nonexistent)
@@ -1,68 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <ll/i386/cons.h>
-#include <kernel/func.h>
-
-#include <fs/bdevinit.h>
-#include <fs/bdev.h>
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "common.h"
-
-#define DISKDEVICE "ide/hda1"
-
-#define NUMBLOCK 1000
-
-__dev_t dev;
-__uint8_t buffer[2048];
-
-int main(int argc,char *argv[])
-{
- __blkcnt_t blk;
- int res;
- int errors;
- TIME sttime,etime;
-
- showmessage("\n"
- "This test read RAMDOMLY data from first hard disk to test\n"
- "disk throughtput.\n"
- "Remeber that the reads are made RANDOMLY block by block so\n"
- "don't worry if you see a VERY low throughtput.\n"
- );
- srand(7);
-
- dev=bdev_find_byname(DISKDEVICE);
- if (dev<0) {
- cprintf("\nCan't find device to operate with\n");
- return -1;
- }
- cprintf("\nUsing device %s (dev=%04x)\n",DISKDEVICE,dev);
-
- cprintf("Please wait (reading %i KB ramdomly)...",NUMBLOCK/2);
-
- sttime=sys_gettime(NULL);
- errors=0;
- for (blk=0;blk<NUMBLOCK;blk++) {
- res=bdev_read(dev,rand()%5000,buffer);
- if (res!=0) errors++;
- }
- etime=sys_gettime(NULL)-sttime;
-
- cprintf("\nDone\n\n");
- cprintf("elapse time : %li sec %li msec\n",
- etime/1000000l,
- (etime/1000l)%1000l);
- cprintf("throughtput : %6.3f KB/s\n",
- NUMBLOCK*512.0/1024.0/etime*1000000.0);
- //cprintf("soft reset made: %i\n",ide[0].errors);
- cprintf("errors : %i\n",errors);
- cprintf("\n");
-
- return 0;
-}
Index: rel_1_2/block/common.c
===================================================================
--- rel_1_2/block/common.c (revision 1198)
+++ rel_1_2/block/common.c (nonexistent)
@@ -1,74 +0,0 @@
-
-#include <kernel/func.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <drivers/keyb.h>
-
-#include <sys/mount.h>
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-
-/* -- */
-
-int __register_sub_init(void)
-{
- return 0;
-}
-
-/* -- */
-
-int __bdev_sub_init(void)
-{
- BDEV_PARMS bdev=BASE_BDEV;
-
- bdev_def_showinfo(bdev,TRUE);
- bdev_init(&bdev);
-
- return 0;
-}
-
-/* -- */
-
-void ctrlc_exit(KEY_EVT *k)
-{
- cprintf("CTRL-C pressed!\n");
- sys_end();
-}
-
-/* -- */
-
-void showmessage(char *s)
-{
- cputs(s);
- cprintf("Press [x] to begin...");
- while (keyb_getchar()!='x');
- cprintf("\n");
-}
-
-void waitend(void)
-{
- int c;
- cprintf("Press [x] to exit...");
- while ((c=keyb_getchar())!='x');
- cprintf("\n");
-}
-
-/* -- */
-
-void debug_dump_buffer(char *buf, int size)
-{
- int i;
- for (i=0;i<size;i++) {
- if (i%16==0) {
- if (i!=0) cprintf("\n");
- cprintf("%04x: ",i);
- }
- cprintf("%02x ",(unsigned char)*(buf+i));
- }
- cprintf("\n");
-}
Index: rel_1_2/pse51/makefile
===================================================================
--- rel_1_2/pse51/makefile (revision 1198)
+++ rel_1_2/pse51/makefile (nonexistent)
@@ -1,25 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS+= ptest1 ptest2 ptest3 ptest4 ptest5 ptest6
-
-include $(BASE)/config/example.mk
-
-ptest1:
- make -f $(SUBMAKE) APP=ptest1 INIT= OTHEROBJS="pinit.o" SHARKOPT=__OLDCHAR__
-ptest2:
- make -f $(SUBMAKE) APP=ptest2 INIT= OTHEROBJS="pinit.o" SHARKOPT=__OLDCHAR__
-ptest3:
- make -f $(SUBMAKE) APP=ptest3 INIT= OTHEROBJS="pinit.o" SHARKOPT=__OLDCHAR__
-ptest4:
- make -f $(SUBMAKE) APP=ptest4 INIT= OTHEROBJS="pinit.o" SHARKOPT=__OLDCHAR__
-ptest5:
- make -f $(SUBMAKE) APP=ptest5 INIT= OTHEROBJS="pinit.o" SHARKOPT=__OLDCHAR__
-ptest6:
- make -f $(SUBMAKE) APP=ptest6 INIT= OTHEROBJS="pinit.o" SHARKOPT=__OLDCHAR__
Index: rel_1_2/pse51/ptest1.c
===================================================================
--- rel_1_2/pse51/ptest1.c (revision 1198)
+++ rel_1_2/pse51/ptest1.c (nonexistent)
@@ -1,221 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ptest1.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:47 $
- ------------
-
- Posix test 1:
-
- the main task create 4 tasks, J1, J2, J3, J4
- at t = 0.2 sec. it raise a signal to J1
- at t = 0.4 sec. it raise a signal to J2
- at t = 0.8 sec. it kill J4
-
- J1: it simply calls sigwait
-
- J2: it simply calls sigwaitinfo
-
- J3: it simply calls sigtimedwait with a timeout of 0.5 sec.
-
- J4: it simply calls sigtimedwait with a -long- timeout
- (J4 will be killed by main)
-
- non standard function used:
- cprintf
- sys_gettime
- keyboard stuffs
- sys_end
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <sys/types.h>
-#include <pthread.h>
-#include <signal.h>
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-void *J1(void *arg)
-{
- int sig, err;
- sigset_t mask;
-
- cprintf("J1 starts and call sigwait(31)\n");
-
- sigemptyset(&mask);
- sigaddset(&mask,31);
- err = sigwait(&mask,&sig);
-
- cprintf("J1 exit from sigwait(), err=%d, sig=%d\n", err, sig);
-
- return 0;
-}
-
-void *J2(void *arg)
-{
- int err;
- siginfo_t info;
- sigset_t mask;
-
- cprintf("J2 starts and call sigwaitinfo(30)\n");
-
- sigemptyset(&mask);
- sigaddset(&mask,30);
- err = sigwaitinfo(&mask,&info);
-
- cprintf("J2 exit from sigwaitinfo(), err=%d, signo=%d code=%d value=%d\n",
- err, info.si_signo, info.si_code, info.si_value.sival_int);
-
- return 0;
-}
-
-void *J3(void *arg)
-{
- int err;
- siginfo_t info;
- sigset_t mask;
- struct timespec t;
-
- cprintf("J3 starts and call sigtimedwait(29)\n");
-
- sigemptyset(&mask);
- sigaddset(&mask,29);
- t.tv_sec = 0;
- t.tv_nsec = 300000000;
- err = sigtimedwait(&mask,&info,&t);
-
- cprintf("J3 exit from sigtimedwait(), err=%d, signo=%d code=%d value=%d\n",
- err, info.si_signo, info.si_code, info.si_value.sival_int);
-
- return 0;
-}
-
-void uscitaJ4(void *arg)
-{
- cprintf("J4: AAAARRRRGGGHHH!!! killed by someone...\n");
-}
-
-void *J4(void *arg)
-{
- int err;
- siginfo_t info;
- sigset_t mask;
- struct timespec t;
-
- cprintf("J4 starts and call sigtimedwait(28)\n");
-
- sigemptyset(&mask);
- sigaddset(&mask,28);
- t.tv_sec = 10;
- t.tv_nsec = 0;
-
- pthread_cleanup_push(uscitaJ4,NULL);
- err = sigtimedwait(&mask,&info,&t);
- pthread_cleanup_pop(0);
-
- cprintf("J4 exit from sigtimedwait(), err=%d, signo=%d code=%d value=%d\n",
- err, info.si_signo, info.si_code, info.si_value.sival_int);
-
- return 0;
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-
-int main(int argc, char **argv)
-{
- int err;
- sigset_t mask;
- pthread_t j1, j2, j3, j4;
- union sigval value;
-
- KEY_EVT emerg;
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
-
- /* main blocks signals for all the tasks */
- sigfillset(&mask);
- pthread_sigmask(SIG_BLOCK, &mask, NULL);
-
- cprintf("main: creating J1\n");
- err = pthread_create(&j1, NULL, J1, NULL);
- if (err) cprintf("Error creating J1\n");
-
- cprintf("main: creating J2\n");
- err = pthread_create(&j2, NULL, J2, NULL);
- if (err) cprintf("Error creating J2\n");
-
- cprintf("main: creating J3\n");
- err = pthread_create(&j3, NULL, J3, NULL);
- if (err) cprintf("Error creating J3\n");
-
- cprintf("main: creating J4\n");
- err = pthread_create(&j4, NULL, J4, NULL);
- if (err) cprintf("Error creating J4\n");
-
- cprintf("main: waiting 0.2 sec\n");
- while (sys_gettime(NULL) < 200000);
-
- cprintf("main: kill(31), then wait until t=0.4 sec \n");
- kill(0, 31);
-
- while (sys_gettime(NULL) < 400000);
- cprintf("main: sigqueue(30), then wait until t=0.8 sec \n");
- value.sival_int = 300;
- sigqueue(0, 30, value);
-
- while (sys_gettime(NULL) < 800000);
- cprintf("main: kill(J4)\n");
- pthread_cancel(j4);
-
- cprintf("main: ending...\n");
-
- return 0;
-}
Index: rel_1_2/pse51/ptest2.c
===================================================================
--- rel_1_2/pse51/ptest2.c (revision 1198)
+++ rel_1_2/pse51/ptest2.c (nonexistent)
@@ -1,152 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ptest2.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:47 $
- ------------
-
- Posix test 2:
-
- pthread_once + thread_specific_data
-
- the main task:
- creates a key
- creates 2 tasks, J1, J2
- at t = 0.4 sec. it kills J1 and J2
-
- J1 and J2 will set and check the thread specific data
- and when the die, a destructor is called (twice, because the value
- is not set to null...)
-
- non standard function used:
- cprintf
- sys_gettime
- keyboard stuffs
- sys_end
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <sys/types.h>
-#include <pthread.h>
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-pthread_key_t prova_key;
-
-pthread_once_t once = PTHREAD_ONCE_INIT;
-
-void once_init()
-{
- cprintf("ONCE: (pid=%d)\n", exec_shadow);
-}
-
-void destr_key(void *arg)
-{
- cprintf("J (pid=%d) destructor called with value %d\n", exec_shadow,(int)arg);
- pthread_setspecific(prova_key,(void *)((int)arg/100));
-}
-
-void print_test()
-{
- int val;
-
- val = (int)pthread_getspecific(prova_key);
- cprintf("J (pid=%d) printtest value=%d\n", exec_shadow, val);
-}
-
-void *J(void *arg)
-{
- pthread_once(&once, once_init);
- cprintf("J (pid=%d) starts and call setspecific\n", exec_shadow);
- pthread_setspecific(prova_key,arg);
- print_test();
- cprintf("J (pid=%d) exits\n", exec_shadow);
-
- return 0;
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-
-int main(int argc, char **argv)
-{
- int err;
- pthread_t j1, j2;
-
- KEY_EVT emerg;
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
-
- cprintf("main: creating prova_key\n");
- pthread_key_create(&prova_key, destr_key);
-
- cprintf("main: provakey =%d\n", prova_key);
-
- cprintf("main: creating J1\n");
- err = pthread_create(&j1, NULL, J, (void *)1414);
- if (err) cprintf("Error creating J1\n");
- cprintf("main: J1 has PID %d\n",j1);
-
- cprintf("main: creating J2\n");
- err = pthread_create(&j2, NULL, J, (void *)3141);
- if (err) cprintf("Error creating J2\n");
- cprintf("main: J2 has PID %d\n",j2);
-
- cprintf("main: waiting 0.4 sec\n");
- while (sys_gettime(NULL) < 400000);
-
- cprintf("main: kill J1 and J2\n");
- pthread_cancel(j1);
- pthread_cancel(j2);
-
- cprintf("main: ending...\n");
-
- return 0;
-}
Index: rel_1_2/pse51/ptest3.c
===================================================================
--- rel_1_2/pse51/ptest3.c (revision 1198)
+++ rel_1_2/pse51/ptest3.c (nonexistent)
@@ -1,229 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ptest3.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:47 $
- ------------
-
- Posix test 3:
-
- timers...
- it creates two periodic timers that queues signals, a periodic timer
- that create tasks and an one-shot timer.
-
- non standard function used:
- cprintf
- sys_gettime
- keyboard stuffs
- sys_end
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <sys/types.h>
-#include <pthread.h>
-#include <time.h>
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-int count25 = 0, count26 = 0;
-
-void signal_handler(int signo, siginfo_t *info, void *extra)
-{
- switch (signo) {
- case 25:
- count25++;
- break;
- case 26:
- count26++;
- break;
- }
-
- cprintf("Signal %d code=%s value=%d task=%d count25=%d count26=%d time=%ldusec\n",
- info->si_signo,
- (info->si_code == SI_TIMER) ? "Timer" : "Other",
- info->si_value.sival_int,
- info->si_task,
- count25,
- count26,
- sys_gettime(NULL));
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-void task_timer(union sigval value)
-{
- cprintf("task_timer: value = %d, time = %ldusec\n",
- value.sival_int, sys_gettime(NULL));
-}
-
-int main(int argc, char **argv)
-{
- int err;
- timer_t timer1, timer2, timer3;
- struct itimerspec timeout1, timeout2, timeout3, nulltimeout;
- struct sigaction sig_act;
- struct sigevent ev25, ev26, evtask;
- pthread_attr_t task_attr;
- struct sched_param task_param;
-
- KEY_EVT emerg;
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- sig_act.sa_sigaction = (void *) signal_handler;
- sig_act.sa_flags = SA_SIGINFO;
- sigemptyset(&sig_act.sa_mask);
-
- sigaction(25, &sig_act, NULL);
- sigaction(26, &sig_act, NULL);
-
- // set ev25, ev26, evtask
- ev25.sigev_notify = SIGEV_SIGNAL;
- ev25.sigev_signo = 25;
- ev25.sigev_value.sival_int = 555;
-
- ev26.sigev_notify = SIGEV_SIGNAL;
- ev26.sigev_signo = 26;
- ev26.sigev_value.sival_int = 666;
-
- evtask.sigev_notify = SIGEV_THREAD;
- evtask.sigev_value.sival_int = 777;
- evtask.sigev_notify_function = task_timer;
- evtask.sigev_notify_attributes = &task_attr;
-
- pthread_attr_init(&task_attr);
- pthread_attr_setdetachstate(&task_attr, PTHREAD_CREATE_DETACHED);
- pthread_attr_setschedpolicy(&task_attr, SCHED_FIFO);
- task_param.sched_priority = 10;
- pthread_attr_setschedparam(&task_attr, &task_param);
-
- // set timeout1, timeout2, nulltimeout
- timeout1.it_interval.tv_sec = 0;
- timeout1.it_interval.tv_nsec = 500000000;
- timeout1.it_value.tv_sec = 3;
- timeout1.it_value.tv_nsec = 0;
-
- timeout2.it_interval.tv_sec = 0;
- timeout2.it_interval.tv_nsec = 200000000;
- timeout2.it_value.tv_sec = 7;
- timeout2.it_value.tv_nsec = 0;
-
- timeout3.it_interval.tv_sec = 0;
- timeout3.it_interval.tv_nsec = 300000000;
- timeout3.it_value.tv_sec = 5;
- timeout3.it_value.tv_nsec = 0;
-
- NULL_TIMESPEC(&nulltimeout.it_value);
- NULL_TIMESPEC(&nulltimeout.it_interval);
-
- // create the timers
- err = timer_create(CLOCK_REALTIME, &ev25, &timer1);
- if (err == -1) { cprintf("main: unable to create timer 1\n"); }
-
- err = timer_create(CLOCK_REALTIME, &ev26, &timer2);
- if (err == -1) { cprintf("main: unable to create timer 2\n"); }
-
- err = timer_create(CLOCK_REALTIME, &evtask, &timer3);
- if (err == -1) { cprintf("main: unable to create timer 3\n"); }
-
- // arm the timers
- err = timer_settime(timer1, TIMER_ABSTIME, &timeout1, NULL);
- if (err == -1) { cprintf("main: unable to set timer 1\n"); }
-
- err = timer_settime(timer2, 0, &timeout2, NULL);
- if (err == -1) { cprintf("main: unable to set timer 2\n"); }
-
- err = timer_settime(timer3, TIMER_ABSTIME, &timeout3, NULL);
- if (err == -1) { cprintf("main: unable to set timer 3\n"); }
-
- cprintf("main: waiting signals...\n");
- while (sys_gettime(NULL) < 8500000) {
- //kern_deliver_pending_signals();
- }
-
- cprintf("main: disarm the timer2\n");
- err = timer_settime(timer2, 0, &nulltimeout, &timeout2);
- if (err == -1) { cprintf("main: unable to disarm timer 2\n"); }
-
- cprintf("main: timer2 disarmed, itvalue=%ld.%ld\n",
- timeout2.it_value.tv_sec,timeout2.it_value.tv_nsec/1000);
-
- while (sys_gettime(NULL) < 10000000) {
- //kern_deliver_pending_signals();
- }
-
- cprintf("main: disarm the timer1\n");
- err = timer_settime(timer1, TIMER_ABSTIME, &nulltimeout, &timeout1);
- if (err == -1) { cprintf("main: unable to disarm timer 1\n"); }
-
- cprintf("main: timer1 disarmed, itvalue=%ld.%ld\n",
- timeout1.it_value.tv_sec,timeout1.it_value.tv_nsec/1000);
-
- while (sys_gettime(NULL) < 12000000) {
- //kern_deliver_pending_signals();
- }
-
- cprintf("main: arm timer1\n");
- timeout1.it_interval.tv_sec = 0;
- timeout1.it_interval.tv_nsec = 0;
- timeout1.it_value.tv_sec = 13;
- timeout1.it_value.tv_nsec = 0;
- err = timer_settime(timer1, TIMER_ABSTIME, &timeout1, NULL);
- if (err == -1) { cprintf("main: unable to arm timer 1\n"); }
-
- while (sys_gettime(NULL) < 14000000) {
- //kern_deliver_pending_signals();
- }
-
-
-
- cprintf("main: ending...\n");
-
- return 0;
-}
Index: rel_1_2/pse51/pinit.c
===================================================================
--- rel_1_2/pse51/pinit.c (revision 1198)
+++ rel_1_2/pse51/pinit.c (nonexistent)
@@ -1,126 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: pinit.c,v 1.2 2003-10-07 09:30:18 giacomo Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-10-07 09:30:18 $
- ------------
-
- This is a minimal initialization file for the PSE51 profile.
-
- It initializes the POSIX scheduler, the Hartik Ports and the Keyboard driver.
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "modules/posix.h"
-#include "modules/dummy.h"
-
-#include "modules/pi.h"
-#include "modules/pc.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-
-#include "drivers/keyb.h"
-
-#include "pthread.h"
-#include "time.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- POSIX_register_level(RRTICK, POSIX_MAIN_YES, mb, 32);
- dummy_register_level();
-
- PI_register_module();
- PC_register_module();
-
- SEM_register_module();
-
- /* for the Pthread library */
- PTHREAD_register_module(0, 0, 1);
-
- /* for the real time clock extensions */
- TIMER_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- NRT_TASK_MODEL m; // the scheduling model for the Keyboard
-
- KEYB_PARMS k = BASE_KEYB;
- keyb_def_task(k, &m);
-
- nrt_task_default_model(m);
- nrt_task_def_arg(m,arg);
- nrt_task_def_usemath(m);
- nrt_task_def_ctrl_jet(m);
- nrt_task_def_save_arrivals(m);
- nrt_task_def_unjoinable(m);
- nrt_task_def_weight(m, sched_get_priority_max(SCHED_RR));
- nrt_task_def_policy(m,SCHED_RR);
- nrt_task_def_inherit(m,PTHREAD_EXPLICIT_SCHED);
- nrt_task_def_nokill(m);
- nrt_task_def_system(m);
-
- HARTPORT_init();
-
- if (KEYB_init(&k) < 0)
- kern_printf("Error during Keyboard Initialization!!!");
-
- __call_main__(mb);
-
- return (void *)0;
-}
Index: rel_1_2/pse51/ptest4.c
===================================================================
--- rel_1_2/pse51/ptest4.c (revision 1198)
+++ rel_1_2/pse51/ptest4.c (nonexistent)
@@ -1,151 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ptest4.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:47 $
- ------------
-
- Posix test 4:
-
- the main task create 3 tasks, J1, J2, J3
- at t = 1 sec. it raise a signal to J1
- at t = 2 sec. it kills J2
-
- J1,J2,J3: it simply calls nanosleep
-
- non standard function used:
- cprintf
- sys_gettime
- keyboard stuffs
- sys_end
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <sys/types.h>
-#include <pthread.h>
-#include <signal.h>
-#include <time.h>
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-void uscitaJ(void *arg)
-{
- cprintf("J: (pid=%d) AAAARRRRGGGHHH!!! killed by someone...\n", exec_shadow);
-}
-
-void *J(void *arg)
-{
- struct timespec t1, t2;
- int err;
-
- cprintf("J (pid=%d) starts and call nanosleep\n",exec_shadow);
-
- t1.tv_sec = 3;
- t1.tv_nsec = 0;
- NULL_TIMESPEC(&t2);
- pthread_cleanup_push(uscitaJ,NULL);
- err = nanosleep(&t1, &t2);
- pthread_cleanup_pop(0);
-
- cprintf("J (pid=%d) ending, nanosleep returns errno=%d, t2=%ld.%ld\n",
- exec_shadow, err, t2.tv_sec, t2.tv_nsec/1000);
-
- return 0;
-}
-
-void signal_handler(int signo, siginfo_t *info, void *extra)
-{
- cprintf("SIGNAL HANDLER: pid=%d\n",exec_shadow);
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-
-int main(int argc, char **argv)
-{
- int err;
- pthread_t j1, j2, j3;
- struct sigaction sig_act;
-
- KEY_EVT emerg;
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- sig_act.sa_sigaction = (void *) signal_handler;
- sig_act.sa_flags = SA_SIGINFO;
- sigemptyset(&sig_act.sa_mask);
-
- sigaction(31, &sig_act, NULL);
-
- cprintf("main: creating J1\n");
- err = pthread_create(&j1, NULL, J, NULL);
- if (err) cprintf("Error creating J1\n");
-
- cprintf("main: creating J2\n");
- err = pthread_create(&j2, NULL, J, NULL);
- if (err) cprintf("Error creating J2\n");
-
- cprintf("main: creating J3\n");
- err = pthread_create(&j3, NULL, J, NULL);
- if (err) cprintf("Error creating J3\n");
-
- cprintf("main: waiting 1 sec\n");
- while (sys_gettime(NULL) < 1000000);
-
- cprintf("main: pthread_kill on j1, then wait until t=2 sec \n");
- pthread_kill(j1, 31);
-
- while (sys_gettime(NULL) < 2000000);
- cprintf("main: pthread_cancel(J2)\n");
- pthread_cancel(j2);
-
- cprintf("main: ending...\n");
-
- return 0;
-}
Index: rel_1_2/pse51/ptest5.c
===================================================================
--- rel_1_2/pse51/ptest5.c (revision 1198)
+++ rel_1_2/pse51/ptest5.c (nonexistent)
@@ -1,109 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ptest5.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:47 $
- ------------
-
- Posix test 5:
- an alarm test
-
- non standard function used:
- cprintf
- sys_gettime
- keyboard stuffs
- sys_end
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <sys/types.h>
-#include <pthread.h>
-#include <signal.h>
-#include <unistd.h>
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-
-
-void signal_handler(int signo, siginfo_t *info, void *extra)
-{
- cprintf("SIGNAL HANDLER: pid=%d\n",exec_shadow);
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-
-int main(int argc, char **argv)
-{
- struct sigaction sig_act;
-
- KEY_EVT emerg;
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- sig_act.sa_sigaction = (void *) signal_handler;
- sig_act.sa_flags = SA_SIGINFO;
- sigemptyset(&sig_act.sa_mask);
-
- sigaction(SIGALRM, &sig_act, NULL);
-
- cprintf("main: alarm(5), waiting t=2 sec\n");
- alarm(5);
-
- while (sys_gettime(NULL) < 2000000);
-
- cprintf("main: alarm(3) return %d, waiting t=6 sec\n",alarm(3));
-
- pause();
-// while (sys_gettime(NULL) < 6000000);
-
- cprintf("main: ending...\n");
-
- return 0;
-}
Index: rel_1_2/pse51/ptest6.c
===================================================================
--- rel_1_2/pse51/ptest6.c (revision 1198)
+++ rel_1_2/pse51/ptest6.c (nonexistent)
@@ -1,300 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ptest6.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:47 $
- ------------
-
- Posix test 6:
-
- message queues
-
- main thread:
- set a sigevent to sigev_thread on a mailbox (that creates thread 2)
- creates thread 1
- waits t=3.5 sec.
- pthread_cancel(T4)
-
- thread 1:
- send a msg to the mailbox (the event fires and thread 2 is created)
-
- thread 2:
- receive the msg sent by thread 1
- set the event to a signal
- creates thread 3 and 4
- waits t = 1 sec
- send another msg
-
- thread 3:
- receive the msg sent by 2 (it blocks!)
- waits t = 2 sec
- send 5 msgs (with different priorities!!!
-
- thread 4:
- receives 5 msgs every 0.5 sec.
- then receive another message that never will arrive...
-
- non standard function used:
- cprintf
- sys_gettime
- keyboard stuffs
- sys_end
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <sys/types.h>
-#include <pthread.h>
-#include <mqueue.h>
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-struct sigevent ev25, evtask;
-pthread_attr_t task_attr;
-struct sched_param task_param;
-mqd_t mq;
-pthread_t T1,T2,T3,T4,T5;
-
-#define MESSAGE_LENGTH 100
-
-void *t1(void *arg)
-{
- cprintf("T1: started, sending a message\n");
- if (mq_send(mq,"Donald Duck",12,1))
- { cprintf("T1: mq_send returns errno %d\n",errno); return 0; }
-
- cprintf("T1: ending...\n");
- return 0;
-}
-
-void *t4(void *arg);
-void *t3(void *arg);
-
-void t2(union sigval value)
-{
- ssize_t x;
- char buf[MESSAGE_LENGTH];
- int prio;
-
- cprintf("T2: value = %d, receiving a message\n", value.sival_int);
-
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
-
- cprintf("T2: received message: length=%ld, prio=%d, text=°%s°, notify...\n",
- x,prio,buf);
-
- if (mq_notify(mq, &ev25))
- { cprintf("T2: mq_notify returns errno %d\n",errno); sys_end(); }
-
- cprintf("T2: waiting t = 1 sec.\n");
- while (sys_gettime(NULL)<1000000);
- cprintf("T2: 1 sec. reached, sending another message and creating T3 and T4, \n");
-
- if (mq_send(mq,"Mickey Mouse",13,1))
- { cprintf("T2: mq_send returns errno %d\n",errno); sys_end(); }
-
- pthread_create(&T3, NULL, t3, NULL);
- pthread_create(&T4, NULL, t4, NULL);
-
- cprintf("T2: ending...\n");
-}
-
-void *t3(void *arg)
-{
- ssize_t x;
- char buf[MESSAGE_LENGTH];
- int prio;
-
- cprintf("T3: waiting a message...\n");
-
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
-
- // mickey mouse
- cprintf("T3: received message: length=%ld, prio=%d, text=°%s°\n",
- x,prio,buf);
-
- cprintf("T3: waiting t = 1.5 sec.\n");
- while (sys_gettime(NULL)<1500000);
- cprintf("T3: 2 sec. reached, sending 5 messages\n");
-
- if (mq_send(mq,"Goofy",6,1))
- { cprintf("T3: mq_send1 returns errno %d\n",errno); sys_end(); }
- cprintf("Û");
-
- if (mq_send(mq,"Minnie",7,1))
- { cprintf("T3: mq_send2 returns errno %d\n",errno); sys_end(); }
- cprintf("Û");
-
- if (mq_send(mq,"Pluto",6,2)) // NB: different priority!!!
- { cprintf("T3: mq_send3 returns errno %d\n",errno); sys_end(); }
- cprintf("Û");
-
- if (mq_send(mq,"Rocker Duck",12,2)) // NB: different priority!!!
- { cprintf("T3: mq_send4 returns errno %d\n",errno); sys_end(); }
- cprintf("Û");
-
- if (mq_send(mq,"Oncle Scroodge",15,2)) // NB: different priority!!!
- { cprintf("T3: mq_send5 returns errno %d\n",errno); sys_end(); }
- cprintf("Û");
-
- cprintf("T3: ending...\n");
-
- return 0;
-}
-
-void t4exit(void *arg)
-{
- cprintf("T4: AAAARRRRGGGHHH!!! killed by someone...\n");
-}
-
-void *t4(void *arg)
-{
- ssize_t x;
- char buf[MESSAGE_LENGTH];
- int prio;
-
- cprintf("T4: waiting t = 2.2 sec.\n");
-
- while (sys_gettime(NULL)<2200000);
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
- cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
-
- while (sys_gettime(NULL)<2400000);
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
- cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
- while (sys_gettime(NULL)<2600000);
-
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
- cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
- while (sys_gettime(NULL)<2800000);
-
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
- cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
- while (sys_gettime(NULL)<3000000);
-
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
- cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
-
- pthread_cleanup_push(t4exit,NULL);
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
- cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
- pthread_cleanup_pop(0);
-
- return 0;
-}
-
-void signal_handler(int signo, siginfo_t *info, void *extra)
-{
- cprintf("Signal %d code=%s value=%d task=%d time=%ldusec\n",
- info->si_signo,
- (info->si_code == SI_TIMER) ? "Timer" : "Other",
- info->si_value.sival_int,
- info->si_task,
- sys_gettime(NULL));
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-int main(int argc, char **argv)
-{
-// int err;
- struct sigaction sig_act;
- struct mq_attr attr;
-
- KEY_EVT emerg;
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- sig_act.sa_sigaction = (void *) signal_handler;
- sig_act.sa_flags = SA_SIGINFO;
- sigemptyset(&sig_act.sa_mask);
- sigaction(25, &sig_act, NULL);
-
- // set ev25, evtask
- ev25.sigev_notify = SIGEV_SIGNAL;
- ev25.sigev_signo = 25;
- ev25.sigev_value.sival_int = 555;
-
- evtask.sigev_notify = SIGEV_THREAD;
- evtask.sigev_value.sival_int = 777;
- evtask.sigev_notify_function = t2;
- evtask.sigev_notify_attributes = &task_attr;
-
- // set pthread attributes
- pthread_attr_init(&task_attr);
- pthread_attr_setdetachstate(&task_attr, PTHREAD_CREATE_DETACHED);
- pthread_attr_setschedpolicy(&task_attr, SCHED_FIFO);
- task_param.sched_priority = 10;
- pthread_attr_setschedparam(&task_attr, &task_param);
-
- // set mqueue attributes
- attr.mq_flags = 0;
- attr.mq_maxmsg = 3;
- attr.mq_msgsize = MESSAGE_LENGTH;
-
- // create the message queue
- if ((mq = mq_open("mq", O_CREAT|O_RDWR, 0, &attr)) == -1)
- { cprintf("main: mq_open returns errno %d\n",errno); return 0; }
-
- if (mq_notify(mq, &evtask))
- { cprintf("main: mq_notify returns errno %d\n",errno); return 0; }
-
- cprintf("main: created mq, creating T1...\n");
-
- pthread_create(&T1, NULL, t1, NULL);
-
- cprintf("main: waiting t= 3.5 sec., then kill T4...\n");
-
- while (sys_gettime(NULL)<3500000);
-
- pthread_cancel(T4);
-
- cprintf("main: ending...\n");
-
- return 0;
-}
Index: rel_1_2/mix/readme
===================================================================
--- rel_1_2/mix/readme (revision 1198)
+++ rel_1_2/mix/readme (nonexistent)
@@ -1,7 +0,0 @@
-MIX
----
-
-This simple applications is a pout-pourri of simple graphic tasks
-that does different things with different timing constraints...
-
-Paolo
\ No newline at end of file
Index: rel_1_2/mix/makefile
===================================================================
--- rel_1_2/mix/makefile (revision 1198)
+++ rel_1_2/mix/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= mix
-
-include $(BASE)/config/example.mk
-
-mix:
- make -f $(SUBMAKE) APP=mix INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
-
Index: rel_1_2/mix/mix.c
===================================================================
--- rel_1_2/mix/mix.c (revision 1198)
+++ rel_1_2/mix/mix.c (nonexistent)
@@ -1,761 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: mix.c,v 1.4 2003-03-24 11:18:19 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.4 $
- Last update: $Date: 2003-03-24 11:18:19 $
- ------------
-*/
-
-/*
- * Copyright (C) 2000 Giorgio Buttazzo and Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*--------------------------------------------------------------*/
-/* DEMO with 9 INDEPENDENT TASKS */
-/*--------------------------------------------------------------*/
-
-#include <kernel/kern.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <semaphore.h>
-#include <stdlib.h>
-#include <math.h>
-
-#define PIG 3.1415
-#define ESC 27 /* ASCII code for ESCAPE */
-#define DURATA 10000 /* counter duration in tick */
-
-#define LW 200 /* window length */
-#define HW 150 /* window height */
-#define HLOAD 30 /* Y level for the max load */
-#define LLOAD (HW-HLOAD-5) /* length for the max load */
-
-#define XWL 10 /* left X of LEFT window */
-#define XWM 220 /* left X of MIDDLE window */
-#define XWR 430 /* left X RIGHT window */
-
-#define YWH 5 /* top Y of HIGH window */
-#define YWM 165 /* top Y of MIDDLE window */
-#define YWL 325 /* top Y of LOW window */
-
-char fbuf[1000]; /* buffer for reading a file */
-int flen; /* file length */
-int fine = 0; /* ending flag */
-
-sem_t mx_mat, mx_grf; /* mutex semaphores */
-
-int wcet[10]; /* array of task wcets */
-int period[10]; /* array of task periods */
-double load(long); /* load evaluation function */
-
-PID ptas;
-char talk[5][25] = {" SHARK Demonstration ",
- " RETIS Lab -- Scuola ",
- " Superiore S. Anna ",
- " HARD REAL-TIME DEMO ",
- " June 5, 2001 "};
-
-/*------------------------------------------------------*/
-/* file reading */
-/*------------------------------------------------------*/
-
-void read_file(void)
-{
- int err;
- DOS_FILE *fp;
-
- fp = DOS_fopen("mix.dat","r");
-
- if (!fp) {
- err = DOS_error();
- cprintf("Error %d opening myfile.txt...\n", err);
- flen = 0;
- return;
- }
-
- flen = DOS_fread(&fbuf, 1, 1000, fp);
- cprintf("Read %d bytes from file\n", flen);
- DOS_fclose(fp);
-}
-
-/*------------------------------------------------------*/
-/* get data from buffer */
-/*------------------------------------------------------*/
-
-void get_par(void)
-{
- int x = 0;
- int i;
-
- for (i=1; i<=8; i++) {
- while ((fbuf[x] != ':') && (x < flen)) x++;
- x++;
- sscanf(&fbuf[x], "%d %d", &period[i], &wcet[i]);
- cprintf("per[%d] = %d, wcet[%d] = %d\n",
- i, period[i], i, wcet[i]);
- }
-}
-
-/*--------------------------------------------------------------*/
-
-void byebye()
-{
- grx_close();
- kern_printf("Bye Bye!\n");
-}
-
-/*--------------------------------------------------------------*/
-
-void finish1()
-{
- sys_end();
-}
-
-/*--------------------------------------------------------------*/
-
-void finish2()
-{
- fine = 1;
-}
-
-/****************************************************************/
-/* PROCESSO OROLOGIO */
-/****************************************************************/
-
-#define LLAN 40 /* length of watch stick */
-
-TASK watch()
-{
- int x0 = XWL + LW/2;
- int y0 = YWH + HW/2;
- int grad;
- int xg, yg;
- int xt, yt, d;
- int sec, min;
- char s[5];
- double rad, x, y;
-
- xg = x0;
- yg = y0 - LLAN;
- xt = XWL + 78;
- yt = YWH + 12;
- sec = min = 0;
-
- while (1) {
- sec = (sec + 1) % 60;
- if (sec == 0) min++;
- grad = 90 - sec * 6;
- rad = (double)grad * PIG / 180.;
-
- sem_wait(&mx_mat);
- x = (double)x0 + (double)LLAN * cos(rad);
- y = (double)y0 - (double)LLAN * sin(rad);
- sem_post(&mx_mat);
-
- sem_wait(&mx_grf);
- grx_line(x0, y0, xg, yg, 0);
- sem_post(&mx_grf);
-
- xg = x;
- yg = y;
-
- sem_wait(&mx_grf);
- grx_line(x0, y0, xg, yg, 14);
- sem_post(&mx_grf);
-
- sem_wait(&mx_grf);
- grx_text("0 :0 ", xt, yt, 14, 0);
- sprintf(s, "%d", min);
- grx_text(s, xt+8, yt, 14, 0);
- sprintf(s, "%d", sec);
- if (sec > 9) d = 24; else d = 32;
- grx_text(s, xt+d, yt, 14, 0);
- sem_post(&mx_grf);
-
- task_endcycle();
- }
-}
-
-/****************************************************************/
-/* PROCESSO DI RIEMPIMENTO */
-/****************************************************************/
-
-#define CIMA (YWH+5) /* fondo del recipiente */
-#define FONDO (YWH+HW-5) /* cima del recipiente */
-#define LREC (XWM+75) /* lato sinistro recipiente */
-#define DREC 50 /* diametro del recipiente */
-
-TASK tasto()
-{
- int x, y;
- int x0; /* coord. sinistra recipiente */
- int col, cliq, bkg;
- int i;
- int liv; /* livello del liquido */
-
- cliq = 9;
- bkg = 14;
- x0 = LREC;
- x = x0 + DREC/2;
- y = CIMA;
- liv = FONDO;
-
- while (1) {
-
- col = cliq;
- for (i=0; i<2; i++) { /* disegna goccia */
- while (y < liv) {
- sem_wait(&mx_grf);
- grx_plot(x,y,col);
- sem_post(&mx_grf);
- y++;
- }
- y = CIMA;
- col = bkg;
- }
-
- liv--;
- sem_wait(&mx_grf);
- grx_line(x0+1, liv, x0+DREC-1, liv, cliq);
- sem_post(&mx_grf);
-
- if (liv <= CIMA+1) { /* swap colors */
- i = bkg; bkg = cliq; cliq = i;
- liv = FONDO;
- }
-
- task_endcycle();
- }
-}
-
-/****************************************************************/
-
-void kboar()
-{
- task_activate(ptas);
-}
-
-/****************************************************************/
-/* PROCESSO PALLA */
-/****************************************************************/
-
-#define VMIN 11. /* velocit… minima per suono */
-#define LP 3 /* lato della pallina */
-
-TASK palla()
-{
- int ox, oy; /* vecchia posizione pallina */
- int x0; /* posizione iniziale pallina */
- int xmin, xmax;
- int base, top;
- int xg, yg; /* coordinate grafiche pallina */
- double x, y; /* coordinate pallina */
- double G = 9.8;
- double vx, vy, v0; /* velocit… della pallina */
- double t, tx; /* variabile temporale */
- double dt; /* incremento temporale */
- double arg; /* variabile di appoggio */
-
- xmin = XWR+LP+1;
- xmax = XWR+LW-LP-1;
- base = YWH+HW-LP-1;
- top = HW-10-LP;
- x = ox = x0 = xmin;
- y = oy = top;
- arg = 2.*G*(double)top;
- vy = v0 = sqrt(arg);
- vx = 15.;
- tx = 0.0;
- t = vy / G;
- dt = .02;
-
- while (1) {
- x = x0 + vx*tx;
- y = base - vy*t + .5*G*t*t;
- if (y >= base) {
- t = 0.0;
- vy = v0;
- y = base - vy*t + .5*G*t*t;
- }
- if (x >= xmax) {
- tx = 0.0;
- x0 = xmax;
- vx = -vx;
- x = x0 + vx*tx;
- }
- if (x <= xmin) {
- tx = 0.0;
- x0 = xmin;
- vx = -vx;
- x = x0 + vx*tx;
- }
- xg = x; yg = y;
- sem_wait(&mx_grf);
- grx_disc(ox,oy,LP,0);
- grx_disc(xg,yg,LP,10);
- sem_post(&mx_grf);
- oy = yg; ox = xg;
- t += dt;
- tx += dt;
- task_endcycle();
- }
-}
-
-/****************************************************************/
-/* PROCESSO MOSCA */
-/****************************************************************/
-
-TASK mosca()
-{
- int x, y, Ax, Ay, h;
- int x0, y0, tet;
- int xmax,ymax;
- double A, B;
- double r;
- double rnd;
-
- xmax = LW/2-1; ymax = HW/2-1;
- x = 0; y = 0; tet = 0;
- x0 = XWL+LW/2; y0 = YWM+HW/2;
- A = 5.; B = 30.;
-
- while (1) {
-
- rnd = (rand()%100)/100.; /* rnd = [0,1] */
- h = (2. * B * rnd) - B; /* h = [-B,B] */
- tet = tet + h;
-
- if (tet > 360) tet = tet - 360;
- if (tet < 0) tet = tet + 360;
- r = tet * PIG / 180.;
-
- sem_wait(&mx_mat);
- Ax = (double)(A * cos(r));
- Ay = (double)(A * sin(r));
- sem_post(&mx_mat);
- x = x + Ax;
- y = y + Ay;
-
- if ((x >= xmax) || (x <= -xmax) ||
- (y >= ymax) || (y <= -ymax)) {
- x = x - Ax;
- y = y - Ay;
- tet = tet - 180;
- if (tet > 360) tet = tet - 360;
- if (tet < 0) tet = tet + 360;
- r = tet * PIG / 180.;
- sem_wait(&mx_mat);
- Ax = (double)(A * cos(r));
- Ay = (double)(A * sin(r));
- sem_post(&mx_mat);
- x = x + Ax;
- y = y + Ay;
- }
- sem_wait(&mx_grf);
- grx_plot(x+x0, y+y0, 10);
- sem_post(&mx_grf);
- task_endcycle();
- }
-}
-
-/****************************************************************/
-/* PROCESSO INFORMAZIONI */
-/****************************************************************/
-
-TASK infor()
-{
- char s[2];
- int x, y;
- int r;
- int i = 0;
- int leng;
- int col = 0;
-
- r = 0;
- x = XWM + 16;
- y = YWM + 40;
- s[1] = 0;
-
- leng = 0;
- while (talk[0][leng] != 0) leng++;
-
- while (1) {
- s[0] = talk[r][i];
- sem_wait(&mx_grf);
- grx_text(s,x+i*8,y+r*8,col+10,1);
- sem_post(&mx_grf);
- i++;
- if (i == leng) {
- i = 0;
- r = (r + 1) % 5;
- if (r == 0) col = (col + 1) % 6;
- }
- task_endcycle();
- }
-}
-
-/****************************************************************/
-/* PROCESSO RUOTA */
-/****************************************************************/
-
-TASK ruota()
-{
- int x0 = XWR + LW/2;
- int y0 = YWM + HW/2;
- int grad = 90;
- int xg, yg;
- double rad, x, y;
-
- xg = x0;
- yg = y0 + LLAN;
-
- while (1) {
-
- rad = (double)grad * PIG / 180.;
-
- sem_wait(&mx_mat);
- x = (double)x0 + (double)LLAN * cos(rad);
- y = (double)y0 + (double)LLAN * sin(rad);
- sem_post(&mx_mat);
-
- sem_wait(&mx_grf);
- grx_disc(xg, yg, 4, 0);
- sem_post(&mx_grf);
-
- xg = x; yg = y;
-
- sem_wait(&mx_grf);
- grx_disc(xg, yg, 4, 13);
- sem_post(&mx_grf);
-
- grad = (grad + 1) % 360;
-
- task_endcycle();
- }
-}
-
-/****************************************************************/
-/* PROCESSO COLORI */
-/****************************************************************/
-
-TASK color()
-{
- int xx0 = XWL+5;
- int yy0 = YWL+5;
- int n, col;
- int x, y;
-
- x = 0; y = 0;
-
- while (1) {
- n = 19. * ((rand()%100)/100.);
- x = xx0 + n * 10;
- n = 14. * ((rand()%100)/100.);
- y = yy0 + n * 10;
- col = 16. * ((rand()%100)/100.);
-
- /* xg = xx0 + x;
- yg = yy0 + y;
- x = (x + 10)%(LW-10);
- y = (y + 10)%(HW-10);
- */
- sem_wait(&mx_grf);
- grx_box(x, y, x+9, y+9, col);
- sem_post(&mx_grf);
-
- task_endcycle();
- }
-}
-
-/****************************************************************/
-/* PROCESSO PENDOLO */
-/****************************************************************/
-
-TASK pendo()
-{
- int x0 = XWM+LW/2;
- int y0 = YWL+10;
- int xg, yg;
- int col = 11;
- double x, y, teta;
- double v, a, dt;
- double g, l;
-
- g = 9.8;
- l = 80.;
- dt = 0.1;
- teta = 40. * PIG / 180.;
- v = 0.;
- sem_wait(&mx_mat);
- x = l * sin((double)teta);
- y = l * cos((double)teta);
- a = -(g/l) * sin((double)teta);
- sem_post(&mx_mat);
- xg = x0 + x;
- yg = y0 + y;
-
- while (1) {
-
- v += a * dt;
- teta += v * dt;
- sem_wait(&mx_mat);
- x = l * sin((double)teta);
- y = l * cos((double)teta);
- a = -(g/l) * sin((double)teta);
- sem_post(&mx_mat);
-
- sem_wait(&mx_grf);
- grx_line(x0, y0, xg, yg, 0);
- grx_circle(xg, yg, 5, 0);
- grx_disc(xg, yg, 4, 0);
- sem_post(&mx_grf);
-
- xg = x0+x; yg = y0+y;
-
- sem_wait(&mx_grf);
- grx_line(x0, y0, xg, yg, col);
- grx_circle(xg, yg, 5, col+2);
- grx_disc(xg, yg, 4, col+1);
- sem_post(&mx_grf);
-
- task_endcycle();
- }
-}
-
-/****************************** gener ******************************/
-
-TASK gener()
-{
- HARD_TASK_MODEL m;
- SOFT_TASK_MODEL am;
- PID pid;
-
- //---------------------------------------------
- hard_task_default_model(m);
- hard_task_def_wcet (m, wcet[1]);
- hard_task_def_mit (m, period[1]);
- hard_task_def_usemath (m);
- pid = task_create("watch", watch, &m, NULL);
- task_activate(pid);
- keyb_getch(BLOCK);
- //---------------------------------------------
- soft_task_default_model(am);
- soft_task_def_met (am, wcet[2]);
- soft_task_def_period (am, period[2]);
- soft_task_def_aperiodic(am);
- soft_task_def_usemath (am);
- ptas = task_create("tasto", tasto, &am, NULL);
- task_activate(ptas);
- keyb_getch(BLOCK);
- //---------------------------------------------
- hard_task_default_model(m);
- hard_task_def_wcet (m, wcet[3]);
- hard_task_def_mit (m, period[3]);
- hard_task_def_usemath (m);
- pid = task_create("palla", palla, &m, NULL);
- task_activate(pid);
- keyb_getch(BLOCK);
- //---------------------------------------------
- hard_task_default_model(m);
- hard_task_def_wcet (m, wcet[4]);
- hard_task_def_mit (m, period[4]);
- hard_task_def_usemath (m);
- pid = task_create("mosca", mosca, &m, NULL);
- task_activate(pid);
- keyb_getch(BLOCK);
- //---------------------------------------------
- hard_task_default_model(m);
- hard_task_def_wcet (m, wcet[5]);
- hard_task_def_mit (m, period[5]);
- hard_task_def_usemath (m);
- pid = task_create("infor", infor, &m, NULL);
- task_activate(pid);
- keyb_getch(BLOCK);
- //---------------------------------------------
- hard_task_default_model(m);
- hard_task_def_wcet (m, wcet[6]);
- hard_task_def_mit (m, period[6]);
- hard_task_def_usemath (m);
- pid = task_create("ruota", ruota, &m, NULL);
- task_activate(pid);
- keyb_getch(BLOCK);
- //---------------------------------------------
- hard_task_default_model(m);
- hard_task_def_wcet (m, wcet[7]);
- hard_task_def_mit (m, period[7]);
- hard_task_def_usemath (m);
- pid = task_create("color", color, &m, NULL);
- task_activate(pid);
- keyb_getch(BLOCK);
- //---------------------------------------------
- hard_task_default_model(m);
- hard_task_def_wcet (m, wcet[8]);
- hard_task_def_mit (m, period[8]);
- hard_task_def_usemath (m);
- pid = task_create("pendo", pendo, &m, NULL);
- task_activate(pid);
- //---------------------------------------------
-
- return NULL;
-}
-
-/****************************** MAIN ******************************/
-
-int main()
-{
- char s[20]; /* carattere letto da tastiera */
- int x0, y0;
- int x, y;
- TIME t1, count; /* contatori valutazione carico */
- double car; /* valore del carico corrente */
- TIME seme;
- PID pid;
- NRT_TASK_MODEL m2;
- KEY_EVT eva, evx, evs;
-
- sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
-
- /* set the keyboard handler */
- eva.ascii = 'a';
- eva.scan = KEY_A;
- eva.flag = 0;
- keyb_hook(eva,kboar);
-
- evx.ascii = 'x';
- evx.scan = KEY_X;
- evx.flag = ALTL_BIT;
- keyb_hook(evx,finish1);
-
- evs.ascii = ESC;
- evs.scan = KEY_ESC;
- evs.flag = 0;
- keyb_hook(evs,finish2);
-
- sem_init(&mx_mat,0,1);
- sem_init(&mx_grf,0,1);
-
- seme = sys_gettime(NULL);
- srand(seme);
-
- get_par();
- keyb_getch(BLOCK);
-
- grx_init();
- grx_open(640, 480, 8);
-
- grx_rect(XWL,YWH,XWL+LW,YWH+HW,14);
- grx_rect(XWM,YWH,XWM+LW,YWH+HW,14);
- grx_rect(XWR,YWH,XWR+LW,YWH+HW,14);
-
- grx_rect(XWL,YWM,XWL+LW,YWM+HW,14);
- grx_rect(XWM,YWM,XWM+LW,YWM+HW,14);
- grx_rect(XWR,YWM,XWR+LW,YWM+HW,14);
-
- grx_rect(XWL,YWL,XWL+LW,YWL+HW,14);
- grx_rect(XWM,YWL,XWM+LW,YWL+HW,14);
- grx_rect(XWR,YWL,XWR+LW,YWL+HW,14);
-
- x0 = XWL + LW/2;
- y0 = YWH + HW/2;
- grx_circle(x0, y0, LLAN+3, 12);
- grx_rect(XWL+74, YWH+7, XWL+120, YWH+22, 12);
-
- x0 = LREC;
- grx_line(x0, CIMA, x0, FONDO, 15);
- grx_line(x0+DREC, CIMA, x0+DREC, FONDO, 15);
- grx_line(x0, FONDO, x0+DREC, FONDO, 15);
- grx_box(x0+1, CIMA, x0+DREC-1, FONDO-1, 14);
- grx_text("Press A", XWM+16, YWH+48, 10, 0);
- grx_text("to fill", XWM+16, YWH+64, 10, 0);
-
- grx_text("Press:", XWM+18, YWM+HW-50, 10, 0);
- grx_text("ESC to exit", XWM+18, YWM+HW-40, 10, 0);
- grx_text("SPACE to create", XWM+18, YWM+HW-30, 10, 0);
-
- x0 = XWR + LW/2;
- y0 = YWM + HW/2;
- grx_circle(x0, y0, LLAN/3, 14);
- grx_disc(x0, y0, LLAN/3-1, 12);
-
- x0 = XWR+5;
- y0 = YWL+HW-5;
- grx_line(x0, YWL+HLOAD, x0+LW-10, YWL+HLOAD, 12);
- grx_text("SYSTEM WORKLOAD:", x0+5, YWL+HLOAD-10, 10, 0);
-
- count = 0;
- t1 = sys_gettime(NULL);
- do count++; while (sys_gettime(NULL) < (t1 + DURATA));
-
- nrt_task_default_model(m2);
- pid = task_create("gener", gener, &m2, NULL);
- task_activate(pid);
-
- x = 0;
- while (!fine) {
- car = load(count);
- y = (double)LLOAD*car;
- sem_wait(&mx_grf);
- grx_line(x0+x, y0-LLOAD+1, x0+x, y0, 0);
- grx_line(x0+x, y0-y, x0+x, y0, 15);
- grx_text(" ", x0+LW-60, YWL+HLOAD-10, 0, 0);
- sprintf(s, "%.3f", car);
- grx_text(s, x0+LW-50, YWL+HLOAD-10, 15, 0);
- sem_post(&mx_grf);
- x = (x + 1) % (LW-10);
- }
-
- sys_end();
-
- return 0;
-}
-
-/****************************************************************/
-
-double load(long n)
-{
- TIME i, t1;
- double carico;
-
- i = 0;
- t1 = sys_gettime(NULL);
- do i++; while (sys_gettime(NULL) < (t1 + DURATA));
- carico = 1. - (double)i / (double)n;
- return(carico);
-}
-
-/****************************************************************/
Index: rel_1_2/mix/mix.dat
===================================================================
--- rel_1_2/mix/mix.dat (revision 1198)
+++ rel_1_2/mix/mix.dat (nonexistent)
@@ -1,12 +0,0 @@
-TASK NAME PERIOD WCET
-------------------------------------------
-task1 watch: 1000000 200
-task2 tasto: 2000 200
-task3 palla: 2000 200
-task4 mosca: 20000 200
-task5 infor: 20000 300
-task6 ruota: 5000 400
-task7 color: 2000 200
-task8 pendo: 5000 400
-------------------------------------------
-
Index: rel_1_2/mix/initfile.c
===================================================================
--- rel_1_2/mix/initfile.c (revision 1198)
+++ rel_1_2/mix/initfile.c (nonexistent)
@@ -1,124 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:45 $
- ------------
-
- System initialization file
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- NRT_TASK_MODEL at level 2
-
- This file is similar to the configuration of kernel/init/hartik3.c
-
- TICK is set to 0 (one-shot timer is used)
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-void read_file();
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(0);
- CBS_register_level(0, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- read_file();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/auto/tracks/demo1.raw
===================================================================
--- rel_1_2/auto/tracks/demo1.raw (revision 1198)
+++ rel_1_2/auto/tracks/demo1.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/tracks/demo2.raw
===================================================================
--- rel_1_2/auto/tracks/demo2.raw (revision 1198)
+++ rel_1_2/auto/tracks/demo2.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/tracks/monaco.raw
===================================================================
--- rel_1_2/auto/tracks/monaco.raw (revision 1198)
+++ rel_1_2/auto/tracks/monaco.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/tracks/brazil.raw
===================================================================
--- rel_1_2/auto/tracks/brazil.raw (revision 1198)
+++ rel_1_2/auto/tracks/brazil.raw (nonexistent)
@@ -1,2 +0,0 @@
- -!"#
\ No newline at end of file
Index: rel_1_2/auto/jetctrl.c
===================================================================
--- rel_1_2/auto/jetctrl.c (revision 1198)
+++ rel_1_2/auto/jetctrl.c (nonexistent)
@@ -1,155 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: jetctrl.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * this file is directly derived from the demos/jumpball/jetctrl.c .
- * I just added this controls to check when the system will become overloaded
- */
-
-#define WCET_JETDUMMY 200
-#define PERIOD_JETDUMMY 100000
-#define DUMMY_PID 1
-
-#define JET_DUMMY_WIDTH (CMD_WIDTH-370)
-#define JET_DUMMY_HEIGHT (CMD_HEIGHT-40)
-
-/* the point (x, y) is the top left corner */
-#define JET_DUMMY_X (TRACK_X1+360)
-#define JET_DUMMY_Y (TRACK_Y2+32)
-
-// JetControl
-
-#include "semaphore.h"
-#include "include/const.h"
-#include "kernel/func.h"
-#include "drivers/glib.h"
-
-extern sem_t grx_mutex;
-
-/* useful colors... */
-int white;
-int black;
-extern int red;
-extern int lightgray;
-
-TASK jetdummy_task(void *arg)
-{
- TIME now_dummy, last_dummy, diff_dummy, slice;
- struct timespec now, last, diff;
- int x = 0;
- int height;
-
- NULL_TIMESPEC(&last);
- last_dummy = 0;
- for (;;) {
- task_nopreempt();
- jet_getstat(DUMMY_PID, NULL, NULL, NULL, &now_dummy);
- sys_gettime(&now);
- task_preempt();
-
- SUBTIMESPEC(&now, &last, &diff);
- slice = diff.tv_sec * 1000000 + diff.tv_nsec/1000;
- diff_dummy = now_dummy - last_dummy;
-
- height = (int)(JET_DUMMY_HEIGHT*((float)diff_dummy)/((float)slice));
-
- TIMESPEC_ASSIGN(&last, &now);
- last_dummy = now_dummy;
-
- sem_wait(&grx_mutex);
- grx_line(JET_DUMMY_X+x,JET_DUMMY_Y,
- JET_DUMMY_X+x,JET_DUMMY_Y+height ,black);
- grx_line(JET_DUMMY_X+x,JET_DUMMY_Y+height,
- JET_DUMMY_X+x,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
- grx_line(JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y,
- JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y+JET_DUMMY_HEIGHT,255);
- sem_post(&grx_mutex);
-
- x = (x+1)%JET_DUMMY_WIDTH;
-
- task_endcycle();
- }
-}
-
-void init_jetcontrol(void)
-{
- SOFT_TASK_MODEL m4;
-
- PID p4;
-
- /* useful colors ... */
- white = WHITE;
- black = BLACK;
-
- /* scenario */
- sem_wait(&grx_mutex);
- grx_text("System load",
- JET_DUMMY_X+8, JET_DUMMY_Y-10, lightgray, black);
- grx_rect(JET_DUMMY_X-1, JET_DUMMY_Y-1,
- JET_DUMMY_X+JET_DUMMY_WIDTH, JET_DUMMY_Y+JET_DUMMY_HEIGHT+1, lightgray);
-
- grx_text("100%", JET_DUMMY_X-40, JET_DUMMY_Y, lightgray, black);
- grx_text(" 0%", JET_DUMMY_X-40, JET_DUMMY_Y+JET_DUMMY_HEIGHT-8, lightgray, black);
-
- grx_line(JET_DUMMY_X-1, JET_DUMMY_Y, JET_DUMMY_X-5, JET_DUMMY_Y, lightgray);
- grx_line(JET_DUMMY_X-1, JET_DUMMY_Y+JET_DUMMY_HEIGHT, JET_DUMMY_X-5, JET_DUMMY_Y+JET_DUMMY_HEIGHT, lightgray);
- sem_post(&grx_mutex);
-
- /* jetdummy task */
- soft_task_default_model(m4);
- soft_task_def_period(m4, PERIOD_JETDUMMY);
- soft_task_def_met(m4, WCET_JETDUMMY);
- soft_task_def_usemath(m4);
- p4 = task_create("jdmy", jetdummy_task, &m4, NULL);
- if (p4 == -1) {
- grx_close();
- perror("Could not create task <jetdummy>");
- sys_end();
- }
- task_activate(p4);
-}
-
Index: rel_1_2/auto/cars/car14.raw
===================================================================
--- rel_1_2/auto/cars/car14.raw (revision 1198)
+++ rel_1_2/auto/cars/car14.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/cars/car15.raw
===================================================================
--- rel_1_2/auto/cars/car15.raw (revision 1198)
+++ rel_1_2/auto/cars/car15.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/cars/car0.raw
===================================================================
--- rel_1_2/auto/cars/car0.raw (revision 1198)
+++ rel_1_2/auto/cars/car0.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/cars/car1.raw
===================================================================
--- rel_1_2/auto/cars/car1.raw (revision 1198)
+++ rel_1_2/auto/cars/car1.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/cars/car2.raw
===================================================================
--- rel_1_2/auto/cars/car2.raw (revision 1198)
+++ rel_1_2/auto/cars/car2.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/cars/car3.raw
===================================================================
--- rel_1_2/auto/cars/car3.raw (revision 1198)
+++ rel_1_2/auto/cars/car3.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/cars/car4.raw
===================================================================
--- rel_1_2/auto/cars/car4.raw (revision 1198)
+++ rel_1_2/auto/cars/car4.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/cars/car5.raw
===================================================================
--- rel_1_2/auto/cars/car5.raw (revision 1198)
+++ rel_1_2/auto/cars/car5.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/cars/car6.raw
===================================================================
--- rel_1_2/auto/cars/car6.raw (revision 1198)
+++ rel_1_2/auto/cars/car6.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/cars/car7.raw
===================================================================
--- rel_1_2/auto/cars/car7.raw (revision 1198)
+++ rel_1_2/auto/cars/car7.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/cars/boom.raw
===================================================================
--- rel_1_2/auto/cars/boom.raw (revision 1198)
+++ rel_1_2/auto/cars/boom.raw (nonexistent)
@@ -1 +0,0 @@
-      
\ No newline at end of file
Index: rel_1_2/auto/cars/car8.raw
===================================================================
--- rel_1_2/auto/cars/car8.raw (revision 1198)
+++ rel_1_2/auto/cars/car8.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/cars/car9.raw
===================================================================
--- rel_1_2/auto/cars/car9.raw (revision 1198)
+++ rel_1_2/auto/cars/car9.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/cars/car10.raw
===================================================================
--- rel_1_2/auto/cars/car10.raw (revision 1198)
+++ rel_1_2/auto/cars/car10.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/cars/fumo.raw
===================================================================
--- rel_1_2/auto/cars/fumo.raw (revision 1198)
+++ rel_1_2/auto/cars/fumo.raw (nonexistent)
@@ -1 +0,0 @@
-!!!!!!!!!!!!!!!!!!!!!!
\ No newline at end of file
Index: rel_1_2/auto/cars/car11.raw
===================================================================
--- rel_1_2/auto/cars/car11.raw (revision 1198)
+++ rel_1_2/auto/cars/car11.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/cars/car12.raw
===================================================================
--- rel_1_2/auto/cars/car12.raw (revision 1198)
+++ rel_1_2/auto/cars/car12.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/cars/car13.raw
===================================================================
--- rel_1_2/auto/cars/car13.raw (revision 1198)
+++ rel_1_2/auto/cars/car13.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: rel_1_2/auto/auto.c
===================================================================
--- rel_1_2/auto/auto.c (revision 1198)
+++ rel_1_2/auto/auto.c (nonexistent)
@@ -1,530 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: auto.c,v 1.2 2003-01-07 17:10:15 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-01-07 17:10:15 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-#include "include/auto.h"
-#include "include/const.h"
-#include "include/utils.h"
-
-int car_number;
-car_params cars[MAX_CAR_NUMBER];
-char drivers[DRIVERS_NUMBER][MAX_DRIVER_NAME_LENGTH] = {
- "M.Schumacher",
- "D.Coulthard",
- "R.Schumacher",
- "M.Hakkinen",
- "R.Barrichello",
- "J.P.Montoya",
- "E.Irvine",
- "J.Trulli",
- "H.Frentzen",
- "J.Villeneuve",
- "J.Alesi",
- "G.Fisichella",
- "O.Panis",
- "O.Wurz",
- "J.Button",
- "P.P.Diniz",
- "P.De La Rosa",
- "T.Marques",
- "R.Zonta",
- "G.Mazzacane"
-};
-
-extern char sprite[18][CAR_WIDTH*CAR_HEIGHT];
-
-/* Semaphores */
-sem_t grx_mutex;
-
-/* Useful colors */
-int red = rgb16(255, 0, 0);
-int green = rgb16( 0, 255, 0);
-int blue = rgb16( 0, 0, 255);
-int lightgray = rgb16(192, 192, 192);
-
-/* JetCTRL Initialization */
-void init_jetcontrol(void);
-
-/* -------------------------------------------------------*/
-
-/* --------------------- */
-/* Handling car status */
-/* --------------------- */
-
-int set_car_status(car_status cs, CAB cab_id) {
- char *msg;
-
- msg = cab_reserve(cab_id);
- memcpy(msg, &cs, CAR_MSG_DIM);
- return(cab_putmes(cab_id, msg));
-}
-
-car_status get_car_status(CAB cab_id) {
- char *msg;
- car_status status;
-
- msg = cab_getmes(cab_id);
- memcpy(&status, msg, CAR_MSG_DIM);
- cab_unget(cab_id, msg);
-
- return (status);
-}
-
-/* ---------------------------- */
-/* Handling road informations */
-/* ---------------------------- */
-
-int set_road_info(road_info info, CAB road_status_cab) {
- char *msg;
-
- msg = cab_reserve(road_status_cab);
- memcpy(msg, &info, ROAD_MSG_DIM);
- return(cab_putmes(road_status_cab, msg));
-}
-
-road_info get_road_info(CAB road_status_cab) {
- char *msg;
- road_info info;
-
- msg = cab_getmes(road_status_cab);
- memcpy(&info, msg, ROAD_MSG_DIM);
- cab_unget(road_status_cab, msg);
-
- return (info);
-}
-
-/* -------------------------------------------------------*/
-
-/* Closing function */
-void byebye()
-{
- grx_close();
-
- // we need clear to reposition the cursor in the right place after
- // going back from the graphical mode.
- clear();
-
- kern_printf("Race is over!\n");
-}
-
-/* -------------------------------------------------------*/
-
-/* ------------------- */
-/* Hard car creation */
-/* ------------------- */
-
-void hard_car_create() {
- car_params cp;
- HARD_TASK_MODEL sensor_m, control_m;
- PID sensor_pid, control_pid;
- TIME seed; /* used to init the random seed */
- int drv_ind;
-
- if (car_number >= MAX_CAR_NUMBER) return;
-
- /* Randomize!!!! */
- seed = sys_gettime(NULL);
- srand(seed);
-
- /* CAB creation */
- cp.road_status_cab = cab_create("road_cab", ROAD_MSG_DIM, ROAD_MSG_READER);
- cp.car_status_cab = cab_create("car_cab", CAR_MSG_DIM, CAR_MSG_READER);
-
- /* Car parameters initialization */
- cp.max_speed = rand_01();
- cp.min_acc = cp.max_speed;
- cp.max_acc = cp.max_speed;
- cp.rage = cp.max_speed;
- cp.color = 3+car_number;
- cp.number = car_number;
- drv_ind = DRIVERS_NUMBER-1 - (int)(((cp.rage-0.8+0.005) * (float)DRIVERS_NUMBER) / 0.2);
-
- /* Sets driver's name without duplications */
- strcpy(cp.driver, drivers[drv_ind]);
- while (!strcmp(cp.driver,"***"))
- strcpy(cp.driver, drivers[++drv_ind%DRIVERS_NUMBER]);
- strcpy(drivers[drv_ind],"***");
-
- cars[car_number] = cp;
-
- /* ------------ */
- /* Task Calls */
- /* ------------ */
-
- /* sensor task creation */
- hard_task_default_model(sensor_m);
-
- hard_task_def_arg(sensor_m, (void *)car_number);
- hard_task_def_wcet(sensor_m, SENSOR_WCET);
- hard_task_def_mit(sensor_m, SENSOR_PERIOD);
- hard_task_def_usemath(sensor_m);
- sensor_pid = task_create("camera", sensor, &sensor_m, NULL);
- if(sensor_pid == -1)
- sys_end();
-
- /* control task creation */
- hard_task_default_model(control_m);
- hard_task_def_arg(control_m, (void *)car_number);
- hard_task_def_wcet(control_m, CONTROL_WCET);
- hard_task_def_mit(control_m, CONTROL_PERIOD);
- hard_task_def_usemath(control_m);
- control_pid = task_create("controller", control, &control_m, NULL);
- if(control_pid == -1)
- sys_end();
-
- cars[car_number].sensor_pid = sensor_pid;
- cars[car_number].control_pid = control_pid;
- car_number++; // increases cars number
-
- task_activate(sensor_pid);
- task_activate(control_pid);
-}
-
-/* -------------------------------------------------------*/
-
-/* ------------------- */
-/* Soft car creation */
-/* ------------------- */
-
-void soft_car_create() {
- car_params cp;
- SOFT_TASK_MODEL sensor_m, control_m;
- PID sensor_pid, control_pid;
- TIME seed; /* used to init the random seed */
- int drv_ind;
-
- if (car_number >= MAX_CAR_NUMBER) return;
-
- /* Randomize!!!! */
- seed = sys_gettime(NULL);
- srand(seed);
-
- /* CAB creation */
- cp.road_status_cab = cab_create("road_cab", ROAD_MSG_DIM, ROAD_MSG_READER);
- cp.car_status_cab = cab_create("car_cab", CAR_MSG_DIM, CAR_MSG_READER);
-
- /* Car parameters initialization */
- cp.max_speed = rand_01();
- cp.min_acc = cp.max_speed;
- cp.max_acc = cp.max_speed;
- cp.rage = cp.max_speed;
- cp.color = 8+car_number;
- cp.number = car_number;
- drv_ind = DRIVERS_NUMBER-1 - (int)(((cp.rage-0.8+0.005) * (float)DRIVERS_NUMBER) / 0.2);
-
- /* Sets driver's name without duplications */
- strcpy(cp.driver, drivers[drv_ind]);
- while (!strcmp(cp.driver,"***"))
- strcpy(cp.driver, drivers[++drv_ind%DRIVERS_NUMBER]);
- strcpy(drivers[drv_ind],"***");
- cars[car_number] = cp;
-
- /* ------------ */
- /* Task Calls */
- /* ------------ */
-
- /* sensor task creation */
- soft_task_default_model(sensor_m);
-
- soft_task_def_arg(sensor_m, (void *)car_number);
- soft_task_def_met(sensor_m, SENSOR_WCET);
- soft_task_def_period(sensor_m, SENSOR_PERIOD);
- soft_task_def_usemath(sensor_m);
- sensor_pid = task_create("camera", sensor, &sensor_m, NULL);
- if(sensor_pid == -1)
- sys_end();
-
- /* control task creation */
- soft_task_default_model(control_m);
- soft_task_def_arg(control_m, (void *)car_number);
- soft_task_def_met(control_m, CONTROL_WCET);
- soft_task_def_period(control_m, CONTROL_PERIOD);
- soft_task_def_usemath(control_m);
- control_pid = task_create("controller", control, &control_m, NULL);
- if(control_pid == -1)
- sys_end();
-
- cars[car_number].sensor_pid = sensor_pid;
- cars[car_number].control_pid = control_pid;
- car_number++; // increases cars number
-
- task_activate(sensor_pid);
- task_activate(control_pid);
-}
-
-/* -------------------------------------------------------*/
-
-/* ------------------- */
-/* The main function */
-/* ------------------- */
-
-int main(int argc, char **argv) {
- TIME seed; /* used to init the random seed */
-
- if (MAX_CAB < 30) {
- cprintf("The application needs at least 30 CABS.\n"
- "Please set the MAX_CAB #define to 30 or more...\n"
- "...(see include/modules/cabs.h)\n");
- sys_end();
- }
-
- /* Set the closing function */
- sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
-
- /* Keyboard handling */
- keyb_handler();
- kern_printf("KEYBOARD initialized...\n");
-
- /* Graphics mutex */
- sem_init(&grx_mutex, 0, 1);
-
- /* Graphics init */
- grx_init();
- grx_open(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BIT_COLORS);
-
- /* Track drawing */
- sem_wait(&grx_mutex);
- grx_setcolor(46,0,0,0);
- grx_setcolor(43,255,255,255);
- grx_setcolor(26,255,74,33);
- grx_setcolor(27,255,255,255);
- grx_setcolor(1,8,8,8);
- grx_setcolor(3,255,0,0);
- grx_setcolor(28,255,50,0);
- grx_setcolor(29,255,90,0);
- grx_setcolor(30,255,130,0);
- grx_setcolor(31,255,170,0);
- grx_setcolor(32,255,210,0);
- grx_setcolor(33,48,48,48);
-
- grx_putimage(TRACK_X1, TRACK_Y1, TRACK_X2, TRACK_Y2, track_img);
- sem_post(&grx_mutex);
-
- /* Command and info display */
- cmd_display();
-
- /* JetCTRL Initialization */
- init_jetcontrol();
-
- /* Randomize!!!! */
- seed = sys_gettime(NULL);
- srand(seed);
-
- car_number = 0;
-
- /* ------------ */
- /* Task Calls */
- /* ------------ */
-
- hard_car_create();
-
- return 0;
-}
-
-/* -------------------------------------------------------*/
-
-void read_track(int i)
-{
- DOS_FILE *f; // DOS file descriptor
- int file_length;
- int index;
- char filename[100];
- int err; // Error code
-
- /* Init track_list */
- track_init();
-
- /* Set the selected track from track_list */
- if (i < TRACK_NUMBER)
- index = i;
- else
- index = 0;
- cprintf("Selected index = %d\n", index);
-
- strcpy(filename, strcat("tracks/", track_list[index].name));
- cprintf("File to open = %s\n", filename);
- track_list[index].selected = 1;
-
- /* open the DOS file for reading (you can specify only "r" or "w") */
- f = DOS_fopen(filename,"r");
-
- /* check for open errors */
- if (!f) {
- err = DOS_error(); // error!!
-
- /* note that if you call DOS_error() here, it return 0!!! */
- cprintf("Error %d opening %s...\n", err, filename);
- file_length = 0;
- byebye();
- return;
- }
-
- /* read track file */
- file_length = DOS_fread(&track_img, 1, TRACK_WIDTH*TRACK_HEIGHT, f);
-
- /* check for errors */
- err = DOS_error();
-
- cprintf("Read %d bytes from %s...\n", file_length, filename);
-
- if (err) {
- cprintf("Error %d reading %s...\n", err, filename);
- file_length = 0;
- /* there is not return because I want to close the file! */
- }
-
- /* Close the file */
- cprintf("Closing file %s...\n", filename);
- DOS_fclose(f);
- cprintf("File %s closed successfully!\n", filename);
-
-}
-
-/* -------------------------------------------------------*/
-
-void read_sprites()
-{
- /* DOS file descriptor */
- DOS_FILE *f;
- int myfilebuf_length,i;
- char filename[100];
-
- /* Error code */
- int err;
- i=0;
-
- for ( i=0; i < 16; i++) {
- sprintf(filename,"cars/car%d.raw",i);
- f = DOS_fopen(filename,"r");
-
- // check for open errors
- if (!f) {
- // error!!
- err = DOS_error();
-
- // note that if you call DOS_error() here, it return 0!!!
- cprintf("Error %d opening %s...\n", err, filename);
- myfilebuf_length = 0;
- return;
- }
-
- // read from file
- myfilebuf_length = DOS_fread(&sprite[i][0],1,CAR_WIDTH*CAR_HEIGHT,f);
-
- // check for errors
- err = DOS_error();
-
- cprintf("Read %d bytes from %s...\n", myfilebuf_length, filename);
-
- if (err) {
- cprintf("Error %d reading %s...\n", err, filename);
- myfilebuf_length = 0;
- // there is not return because I want to close the file!
- }
-
- // Close the file
- DOS_fclose(f);
- }
-
- f = DOS_fopen("cars/boom.raw","r");
- if (!f) {
- err = DOS_error();
-
- cprintf("Error %d opening boom.raw...\n", err);
- myfilebuf_length = 0;
- return;
- }
-
- myfilebuf_length = DOS_fread(&sprite[16][0],1,CAR_WIDTH*CAR_HEIGHT,f);
-
- err = DOS_error();
-
- cprintf("Read %d bytes from boom.raw...\n", myfilebuf_length);
-
- if (err) {
- cprintf("Error %d reading boom.raw...\n", err);
- myfilebuf_length = 0;
- }
-
- DOS_fclose(f);
-
- f = DOS_fopen("cars/fumo.raw","r");
- if (!f) {
- err = DOS_error();
-
- cprintf("Error %d opening fumo.raw...\n", err);
- myfilebuf_length = 0;
- return;
- }
-
- myfilebuf_length = DOS_fread(&sprite[17][0],1,CAR_WIDTH*CAR_HEIGHT,f);
-
- err = DOS_error();
-
- cprintf("Read %d bytes from fumo.raw...\n", myfilebuf_length);
-
- if (err) {
- cprintf("Error %d reading fumo.raw...\n", err);
- myfilebuf_length = 0;
- }
-
- DOS_fclose(f);
-
-}
-
Index: rel_1_2/auto/sensor.c
===================================================================
--- rel_1_2/auto/sensor.c (revision 1198)
+++ rel_1_2/auto/sensor.c (nonexistent)
@@ -1,650 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: sensor.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------ */
-/* Camera car */
-/* ------------ */
-
-#include "include/auto.h"
-#include "include/const.h"
-#include "include/utils.h"
-#include <drivers/glib.h>
-
-#define RADIUS 1
-#define TOLL_FACTOR 4.0
-#define MIN_DIFF 3
-#define ROAD_COLOR 27
-#define OFFROAD_COLOR 0
-#define DEBUG_COLOR GREEN
-#define OUT_OF_TRACK 230
-#define STRIP_DEFAULT TEL_WIDTH+1
-
-extern sem_t grx_mutex;
-extern car_params cars[MAX_CAR_NUMBER];
-
-void scanline(point_f *buffer, float x1, float y1, float x2, float y2, int factor);
-void get_camera_car(BYTE *buffer, car_status status);
-int find_track(BYTE *image, road_info *info);
-int find_opps(BYTE *image, road_info *info);
-void find_collision(BYTE *image, road_info *info, car_status status);
-
-/* ----------------------------------------------------------------- */
-
-TASK sensor(int index) {
- car_status actual_car_status; // the actual car state
- road_info actual_road_info; // the actual road informations
- BYTE image[TEL_WIDTH*TEL_HEIGHT]; // buffer contenente la visione della telecamera ruotata
-
- point sq1, sq2;
- point im1, im2;
-
- CAB road_status_cab = cars[index].road_status_cab;
- CAB car_status_cab = cars[index].car_status_cab;
-
- // Draws display squares
- sq1.x = TRACK_X1 + TRACK_WIDTH + TEL_HEIGHT;
- sq1.y = TEL_HEIGHT*index + 1 + index;
- sq2.x = sq1.x + TEL_WIDTH + 1;
- sq2.y = sq1.y + TEL_HEIGHT + 1;
-
- // Sets viewer coords
- im1.x = sq1.x + 1;
- im1.y = sq1.y + 1;
- im2.x = im1.x + TEL_WIDTH - 1;
- im2.y = im1.y + TEL_HEIGHT - 1;
-
- // Inizializza il cab della strada
- actual_road_info.left_border = TEL_WIDTH/2;
- actual_road_info.right_border = TEL_WIDTH/2;
- actual_road_info.distance = TEL_HEIGHT;
- actual_road_info.curve = 0.0;
- actual_road_info.opps_number = 0;
- actual_road_info.flag = ROAD_OK;
- actual_road_info.collision = NO_COLL;
- set_road_info(actual_road_info, road_status_cab);
-
- task_endcycle();
-
- while(1) {
- /* reads car informations */
- actual_car_status = get_car_status(car_status_cab);
-
- /* implementazione riconoscimento strada (sti cazzi!!!) */
- get_camera_car(image, actual_car_status);
- find_track(image, &actual_road_info);
- find_opps(image, &actual_road_info);
- find_collision(image, &actual_road_info, actual_car_status);
-
- sem_wait(&grx_mutex);
- grx_rect(sq1.x, sq1.y, sq2.x, sq2.y, cars[index].color);
- grx_putimage(im1.x, im1.y, im2.x, im2.y, image);
- sem_post(&grx_mutex);
-
- /* sends informations to control task */
- set_road_info(actual_road_info, road_status_cab);
- task_endcycle();
- }
-
-}
-
-/* ----------------------------------------------------------------- */
-
-void find_collision(BYTE *image, road_info *info, car_status status)
-{
- point_f lt,rt,lb,rb,ct;
- /* the lines used to scan the quadrilate */
- point_f height_line[CAR_HEIGHT];
- int i;
- BYTE pix;
-
- info->collision = NO_COLL;
-
- ct.x = status.pos.x + (float)(CAR_HEIGHT/2 + 1) * cos(degree_to_rad(status.orient));
- ct.y = status.pos.y - (float)(CAR_WIDTH/2 + 1) * sin(degree_to_rad(status.orient));
-
- lb.x = ct.x - (float)(CAR_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
- rb.x = ct.x + (float)(CAR_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
- lt.x = lb.x - (float)(CAR_HEIGHT) * cos(degree_to_rad(status.orient));
- rt.x = rb.x - (float)(CAR_HEIGHT) * cos(degree_to_rad(status.orient));
-
- lb.y = ct.y - (float)(CAR_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
- rb.y = ct.y + (float)(CAR_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
- lt.y = lb.y + (float)(CAR_HEIGHT) * sin(degree_to_rad(status.orient));
- rt.y = rb.y + (float)(CAR_HEIGHT) * sin(degree_to_rad(status.orient));
-
- sem_wait(&grx_mutex);
- scanline(height_line,rb.x,rb.y,rt.x,rt.y,CAR_HEIGHT);
- for (i=0; i < CAR_HEIGHT; i++) {
- pix = grx_getpixel(round(height_line[i].x),round(height_line[i].y));
- if (pix != OFFROAD_COLOR && pix != ROAD_COLOR)
- info->collision = COLLISION_RIGHT;
- }
- scanline(height_line,lb.x,lb.y,lt.x,lt.y,CAR_HEIGHT);
- for (i=0; i < CAR_HEIGHT; i++) {
- pix = grx_getpixel(round(height_line[i].x),round(height_line[i].y));
- if (pix != OFFROAD_COLOR && pix != ROAD_COLOR)
- info->collision = COLLISION_LEFT;
- }
- sem_post(&grx_mutex);
-
-}
-
-/* ----------------------------------------------------------------- */
-
-/* Puts in a buffer the image viewed from the camera according to the car status */
-void get_camera_car(BYTE *buffer, car_status status) {
- /*
- * lt ------ rt
- * | |
- * | |
- * lb --ct-- rb
- */
- point_f lt,rt,lb,rb,ct;
- /* the lines used to scan the quadrilate */
- point_f width_line[TEL_WIDTH];
- point_f height_line[TEL_HEIGHT];
- int i,j;
- int tmpx,tmpy,tx,ty;
- float x,y;
- BYTE *row;
-
- ct.x = status.pos.x + (float)(CAR_WIDTH/2 + 1) * cos(degree_to_rad(status.orient));
- ct.y = status.pos.y - (float)(CAR_WIDTH/2 + 1) * sin(degree_to_rad(status.orient));
-
- /* for now the visual starts from the center of the car */
- lb.x = ct.x - (float)(TEL_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
- rb.x = ct.x + (float)(TEL_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
- lt.x = lb.x + (float)(TEL_HEIGHT) * cos(degree_to_rad(status.orient));
- rt.x = rb.x + (float)(TEL_HEIGHT) * cos(degree_to_rad(status.orient));
-
- lb.y = ct.y - (float)(TEL_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
- rb.y = ct.y + (float)(TEL_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
- lt.y = lb.y - (float)(TEL_HEIGHT) * sin(degree_to_rad(status.orient));
- rt.y = rb.y - (float)(TEL_HEIGHT) * sin(degree_to_rad(status.orient));
-
- /* scan only 2 sense thanks to parallelism */
- /* ^ <-(height)
- * ! lt
- * ! |
- * ! |
- * ! lb ------ rb )
- * 0 -------------> <-(width
- */
- /* the width_line coordinates are relative, so in the for cycle
- they are summarized to absolute height_line values */
- scanline(width_line,0,0,rb.x - lb.x,rb.y - lb.y,TEL_WIDTH);
- scanline(height_line,lb.x,lb.y,lt.x,lt.y,TEL_HEIGHT);
-
- /* First fill row TEL_HEIGHT-1 of image and so on until row 0 */
- sem_wait(&grx_mutex);
- for (i=0; i < TEL_HEIGHT; i++) {
- x = height_line[i].x;
- y = height_line[i].y;
- row = &buffer[TEL_WIDTH * (TEL_HEIGHT-1-i)];
- for (j=0; j < TEL_WIDTH; j++) {
- tmpx = round(x + width_line[j].x);
- tmpy = round(y + width_line[j].y);
-
- // Test rispetto ai bordi
- if (tmpx >= 0 && tmpx < SCREEN_WIDTH && tmpy >= 0 && tmpy < SCREEN_HEIGHT) {
- tx = tmpx - TRACK_X1-1;
- ty = tmpy - TRACK_Y1-1;
- if (tx >= 0 && tx < TRACK_WIDTH && ty >= 0 && ty < TRACK_HEIGHT)
- row[j] = grx_getpixel(tmpx,tmpy);
- else
- row[j] = OUT_OF_TRACK;
- } else {
- row[j] = OUT_OF_TRACK;
- }
- }
- }
- sem_post(&grx_mutex);
-}
-
-/* ----------------------------------------------------------------- */
-
-void scanline(point_f *buffer, float x1, float y1, float x2, float y2, int factor) {
- int i;
- float x,y;
- float xstep,ystep;
-
- xstep = (x2 - x1) / factor;
- ystep = (y2 - y1) / factor;
-
- // Start scan at <x1, y1>
- x = x1;
- y = y1;
-
- for (i = 0; i < factor; i++) {
- buffer[i].x = x;
- buffer[i].y = y;
- x += xstep;
- y += ystep;
- }
-}
-
-/* ----------------------------------------------------------------- */
-
-/*
- * Approssima la curva quando non è più possibile farlo con la scansione
- * orizzontale
- * - image
- * - index l'indice da cui cominciare la ricerca della curva
- * - distance la distanza dalla curva
- */
-float approx_curve(BYTE *image, int index, int distance, int d_center, road_strip *strips) {
- BYTE *p,tmp;
- int i,j,k,ctrl=0;
- point ms_center,ct;
-
- // Decide se la curva e' verso sinistra o verso destra
- p = &image[(TEL_HEIGHT - index - 1) * TEL_WIDTH];
-
- ms_center.x = strips[index-1].left;
- for (i = 0; i < min(3,strips[index-1].left); i++) {
- // La curva è a destra
- tmp = *(p + round(ms_center.x) - i);
- if (tmp != ROAD_COLOR) {
- ms_center.x = strips[index-1].right;
- break;
- }
- }
-
- p += round(ms_center.x);
- // Scandisce la colonna fino alla fine della strada
- for (i = index; i < TEL_HEIGHT; i++, p -= TEL_WIDTH) {
- if (*p != ROAD_COLOR) break;
- }
-
- // Imposta il nuovo max_scost empirico
- ms_center.y = (i-1 + index) / 2;
-
- // i-1 è l'indice dell'ultima riga bianca
- p = &image[(TEL_HEIGHT - (i-1) - 1) * TEL_WIDTH + round(ms_center.x)];
- // scandisce da destra a sinistra
- if (round(ms_center.x) > 0) {
- for (j = 0; j < (round(ms_center.x) - strips[index-1].left); j++, p--) {
- if (*p != ROAD_COLOR) break;
- // scandisce dall'alto in basso finchè non trova nero
- for (k = i-1; k > index; k--) {
- tmp = *(p + (i-1-k)*TEL_WIDTH);
- if (tmp != ROAD_COLOR) {
- ms_center.y = (k + index) / 2;
- ctrl = 1;
- break;
- }
- }
- if (ctrl) break;
- }
- ct.x = ms_center.x - j/2;
- ct.y = ms_center.y;
- } else {
- // scandisce da sinistra a destra
- for (j = 0; j < (strips[index-1].right - round(ms_center.x)); j++, p++) {
- if (*p != ROAD_COLOR) break;
- // scandisce dall'alto in basso finchè non trova nero
- for (k = i-1; k > index; k--) {
- tmp = *(p + (i-1-k)*TEL_WIDTH);
- if (tmp != ROAD_COLOR) {
- ms_center.y = (k + index) / 2;
- ctrl = 1;
- break;
- }
- }
- if (ctrl) break;
- }
- ct.x = ms_center.x + j/2;
- ct.y = ms_center.y;
- }
-
- return rad_to_degree(atan2((double)(ct.y - distance),(double)(ct.x - d_center)));
-}
-
-/* ----------------------------------------------------------------- */
-
-int find_distance(road_strip *strips, int max_scost, int rett_tol) {
- int i, distance;
- int center_car = TEL_WIDTH/2;
-
- // La distanza non puo' essere maggiore del max_scost
- distance = max_scost;
-
- for (i=1; i < max_scost; i++) {
- // Calcola la distanza dalla curva
- if (abs(strips[i].center - center_car) > rett_tol) {
- distance = i;
- break;
- }
- }
- return distance;
-}
-
-/* ----------------------------------------------------------------- */
-
-/* Scandisce la linea row e inserisce nella strip index le informazioni.
- * Ritorna 1 se trova entrambi i bordi, altrimenti 0
- */
-int scan_strip(BYTE *row, int index, road_strip *strips) {
- // Tiene conto della posizione dei bordi precedenti per trattare
- // meglio il caso di curve molto strette, dove possono esistere
- // 2 bordi destri o sinistri
-
- // Per evitare problemi nei casi in cui siano possibili 2
- // bordi destri o sinistri
- int lfound = 0;
- int rfound = 0;
- int center_car = TEL_WIDTH/2;
- int i;
-
- // Parte dal secondo pixel e finisce al penultimo
- for(i=1; i < (TEL_WIDTH-1); i++) {
- // Se trova la strada controlla se si tratta di bordo
- // destro o sinistro
- if (row[i] == ROAD_COLOR) {
- // bordo sinistro
- if (row[i - 1] != ROAD_COLOR) {
- // Se ho già trovato questo tipo di bordo cerco
- // quello + plausibile ...
- if (lfound) {
- // Test sulla striscia precedente
- if (index > 0) {
- if (abs(i - strips[index-1].left) <
- abs(strips[index].left - strips[index-1].left))
- strips[index].left = i;
- } else {
- // Test sul centro della macchina
- if (abs(i - center_car) < abs(strips[0].left - center_car))
- strips[index].left = i;
- }
- lfound++;
- } else {
- // ... altrimenti lo inizializzo
- strips[index].left = i;
- lfound = 1;
- }
- // bordo destro
- } else if ((row[i + 1] != ROAD_COLOR) && lfound) {
- // Se ho già trovato questo tipo di bordo cerco
- // quello + plausibile ...
- if (rfound) {
- // Test sulla striscia precedente
- if (index > 0) {
- if (abs(i - strips[index-1].right) <
- abs(strips[index].right - strips[index-1].right))
- strips[index].right = i;
- } else {
- // Test sul centro della macchina
- if (abs(i - center_car) < abs(strips[0].right - center_car))
- strips[index].right = i;
- }
- rfound++;
- } else {
- // ... altrimenti lo inizializzo
- strips[index].right = i;
- rfound = 1;
- }
- }
- }
- }
-
- // Calcola il centro della strada se trova i bordi
- if (lfound && rfound)
- strips[index].center = (strips[index].left + strips[index].right) / 2;
-
- return (lfound && rfound);
-}
-
-/* ----------------------------------------------------------------- */
-
-void where_am_i(BYTE *row, road_strip strip, road_info *info) {
- int i;
- int lfound = 0;
- int rfound = 0;
- int car_center = TEL_WIDTH/2;
-
- for(i=1; i < (TEL_WIDTH-1); i++) {
- // Se trova la strada controlla se si tratta di bordo
- // destro o sinistro
- if (row[i] == ROAD_COLOR) {
- // bordo sinistro
- if (row[i - 1] != ROAD_COLOR) {
- strip.left = i;
- lfound = 1;
- break;
- } else if (row[i + 1] != ROAD_COLOR) {
- strip.right = i;
- rfound = 1;
- break;
- }
- }
- }
-
- if (lfound && rfound) {
- info->flag = ROAD_OK;
- }
- else if (lfound && !rfound) info->flag = LEFT_ONLY;
- else if (!lfound && rfound) info->flag = RIGHT_ONLY;
- else {
- if (row[car_center] == OFFROAD_COLOR) info->flag = NO_ROAD;
- else info->flag = ROAD_OK;
- }
- info->left_border = car_center - strip.left;
- info->right_border = strip.right - car_center;
-}
-
-/* ----------------------------------------------------------------- */
-
-/* Analizza l'immagine vista dalla telecamera inserendo le informazioni
- * necessarie in info, ovvero la distanza dai bordi destro e sinistro,
- * la distanza dalla prossima curva e il suo angolo di curvatura.
- * Per il momento ritorna -1 se non riesce a trovare entrambi i bordi della
- * strada; in futuro gestiremo anche questa situazione.
- */
-int find_track(BYTE *image, road_info *info) {
- // vettore contenente le informazioni su ogni striscia
- road_strip strips[TEL_HEIGHT];
- BYTE *row;
- int car_center = TEL_WIDTH/2;
- int max_scost=0;
- int once_scost=0;
- int j, rett_tol=0;
-
- info->flag = ROAD_OK;
-
- strips[0].left = STRIP_DEFAULT;
- strips[0].right = STRIP_DEFAULT;
- /* Tratta in modo personalizzato il primo tratto di strada per
- inizializzare alcune variabili e per capire situazioni particolari */
- row = &image[(TEL_HEIGHT - 1)*TEL_WIDTH];
- // Se trova i bordi ...
- if (scan_strip(row,0,strips)) {
- // ... calcola i bordi della strada e ...
- info->left_border = car_center - strips[0].left;
- info->right_border = strips[0].right - car_center;
- // ... inizializza la tolleranza per il rettilineo.
- rett_tol = (strips[0].right - strips[0].left) / TOLL_FACTOR;
- } else {
- // Se non trova il bordo ...
- // Mi sono perso, cercami la strada
- where_am_i(row,strips[0],info);
- return 1;
- }
-
- /* Ora controlla le altre strisce della strada */
-
- for(j=1; j < TEL_HEIGHT ; j++) {
- row = &image[(TEL_HEIGHT - j - 1)*TEL_WIDTH];
- // Se trova i bordi ...
- if (scan_strip(row, j, strips)) {
- // ... aggiorna l'indice di max scostamento.
- if (abs(strips[j].center - car_center) >
- abs(strips[max_scost].center - car_center)
- && abs(strips[j].center - car_center) > rett_tol) {
-
- max_scost = j;
- once_scost=1; // ha trovato almeno un max scost
- }
- } else {
- // Se max_scost non è mai stato settato, prendo il max
- if (!once_scost) {
- max_scost = j-1;
- once_scost = 1;
- }
-
- // se la distanza e il max_scost sono troppo vicini approssima la curva
- info->distance = find_distance(strips, max_scost, rett_tol);
- if ((max_scost - info->distance) < MIN_DIFF) {
- info->curve = approx_curve(image, j, info->distance,
- strips[info->distance].center,strips) - 90.0;
- return 1;
- }
- break;
- }
- }
-
- // Se max_scost non è mai stato settato, prendo il max
- if (!once_scost) max_scost = TEL_HEIGHT-1;
- max_scost = min(max_scost,TEL_HEIGHT-1);
-
- info->distance = find_distance(strips,max_scost,rett_tol);
-
- // calcola l'angolo di curvatura solo se il conto e' attendibile
- if ((info->distance < (TEL_HEIGHT*0.9)) &&
- ((max_scost - info->distance) >= MIN_DIFF))
- info->curve = rad_to_degree(atan2((double)(max_scost - info->distance),
- (double)(strips[max_scost].center - strips[info->distance].center)));
- else {
- // se i conti sono empirici, si guarda la posizione dei due centri
- if (strips[max_scost].center > strips[info->distance].center)
- info->curve = 88.0;
- else if (strips[max_scost].center < strips[info->distance].center)
- info->curve = 92.0;
- else
- info->curve = 90.0;
- }
- info->curve -= 90.0;
- return 0;
-}
-
-/* ----------------------------------------------------------------- */
-
-int find_opps(BYTE *image, road_info *info)
-{
- int i, j;
- int l_limit, r_limit; // the opposite empiric limits
- BYTE *row;
- int car_center = TEL_WIDTH/2;
- int opps_number = 0;
-
- // by default it needs to scan the entire row
- l_limit = TEL_WIDTH - 1;
- r_limit = 0;
-
- // Scans one row at a time
- for(j=1; j<TEL_HEIGHT; j++) {
- row = &image[(TEL_HEIGHT - j - 1) * TEL_WIDTH];
-
- // if some of the previous row has been identified as a car...
- if (opps_number > 0 &&
- j < (info->opps_list[opps_number - 1].y + CAR_HEIGHT + 1)) {
- // excludes CAR_HEIGHT lines from the bottom if the car
- l_limit = (car_center + info->opps_list[opps_number - 1].x) - CAR_WIDTH;
- r_limit = (car_center + info->opps_list[opps_number - 1].x) + CAR_WIDTH;
- }
- else {
- // it needs to scan the entire row
- l_limit = TEL_WIDTH - 1;
- r_limit = 0;
- }
-
- // Scans the current row
- for (i=0; i<TEL_WIDTH; i++) {
- if( (i < l_limit || i > r_limit) &&
- row[i] != ROAD_COLOR && row[i] != OFFROAD_COLOR &&
- row[i] != DEBUG_COLOR && row[i] != OUT_OF_TRACK) {
- // there is an opponent car!!
- // stores its position
- info->opps_list[opps_number].x = i - car_center; // left -, right +
- info->opps_list[opps_number].y = j;
-
- // increases number of opposites car in the sensor view range
- opps_number++;
- }
- }
- }
-
- info->opps_number = opps_number;
-
- return 0;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Index: rel_1_2/auto/readme
===================================================================
--- rel_1_2/auto/readme (revision 1198)
+++ rel_1_2/auto/readme (nonexistent)
@@ -1,51 +0,0 @@
-AUTO - Another Unuseful Track simulatOr
----------------------------------------
-
-by Marco Dallera and Marco Fiocca, 2001
-
----------------------------------------
-
-This project was done as a Lab assignment during the course of
-"Informatica Industriale" at the University of Pavia, Italy.
-
-It simulates a race between cars under a set of 4 tracks.
-
-The authors provided also some pages that describes the application
-(auto.ps, in italian, on the website).
-
-To run the application, just compile it and call "x auto th" where tn is
-the track number (0 to 4).
-
-Since the control algorithm is quite complex, you need a quite powerful
-machine. If you get an exception 8 (WCET violation), you need a faster PC.
-You can anyway run the application making "auto2", that uses RR instead of
-EDF or CBS, or "auto3", that uses the EDFACT Module (you need yo copy
-the edfact.c and edfact.h files in the application directory to do that).
-
-To be run, the application needs to be compiled with the
-#define MAX_CAB set to a number greater than 20 (see include/modules/cabs.h).
-
-The control algorithm of the cars is not yet perfect, and if you look to
-the race for a long time, sometimes some cars go in the wrong direction.
-If you find a better algorithm, send me a patch :-)
-
-The code you can find in this directory is the original code of the
-students except for the MAX_CAB test into main(), and for the idle time
-monitor (that I took from the jumpball example) that can be useful to know
-when the system is overloaded. For example, on my PC there is idle time until
-the system has 9 cars. The tenth make the PC overloaded until one of them
-crashes :-).
-
-Finally note that the WCET and PERIODS specified by the authors are not so
-correct, and with this setting you can run 8 cars maximum before crashing the
-system.
-
-Have a nice race...
-
-Paolo
-pj@sssup.it
-
-PS: Sometimes on my portable the demo crashes. I wonder why!... If someone
-finds why, please tell me, I will patch it...
-
-
Index: rel_1_2/auto/initfil1.c
===================================================================
--- rel_1_2/auto/initfil1.c (revision 1198)
+++ rel_1_2/auto/initfil1.c (nonexistent)
@@ -1,108 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfil1.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 2000
-
-void read_track(int);
-void read_sprites();
-
-int argc;
-char *argv[100];
-
-int main(int argc, char **argv);
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- __compute_args__(mb, &argc, argv);
-
- if (argc == 2)
- read_track(strtoi(argv[1], 10, NULL));
- else
- read_track(2);
-
- read_sprites();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- KEYB_init(&kparms);
-
- return (void *)main(argc,argv);
-}
Index: rel_1_2/auto/initfil2.c
===================================================================
--- rel_1_2/auto/initfil2.c (revision 1198)
+++ rel_1_2/auto/initfil2.c (nonexistent)
@@ -1,108 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfil2.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/rr.h"
-#include "modules/rrsoft.h"
-#include "modules/dummy.h"
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 2000
-
-void read_track(int);
-void read_sprites();
-
-int argc;
-char *argv[100];
-int main(int argc, char **argv);
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- __compute_args__(mb, &argc, argv);
-
- if (argc == 2)
- read_track(strtoi(argv[1], 10, NULL));
- else
- read_track(0);
-
- read_sprites();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- KEYB_init(&kparms);
-
- return (void *)main(argc,argv);
-}
-
-
-
-
Index: rel_1_2/auto/control.c
===================================================================
--- rel_1_2/auto/control.c (revision 1198)
+++ rel_1_2/auto/control.c (nonexistent)
@@ -1,701 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: control.c,v 1.2 2003-03-24 13:29:08 giacomo Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-03-24 13:29:08 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------- */
-/* Car control */
-/* ------------- */
-
-#include "include/auto.h"
-#include "include/const.h"
-#include "include/utils.h"
-
-#define TURN_QUANTUM 2
-#define KM 18.0 // pixel
-#define HOUR 3600.0 // seconds
-#define KPH (KM/HOUR) // 0.005 pixel/second
-#define HIGHWAY_LIMIT 6
-#define MAZE_LIMIT 45
-#define CURVE_LIMIT 25 // il limite della curva per cui imposta la traiettoria
-#define BORDER_LIMIT ((1.0 / params.rage) * 2.0)
-#define STEERING_LIMIT 3 // limite di sterzata
-
-/* Road state */
-#define HIGHWAY 1
-#define MIXED 2
-#define MAZE 3
-#define CENTER 10
-#define TOO_LEFT 11
-#define TOO_RIGHT 12
-
-/* Opponents relationship */
-#define ATTACK 20
-#define DEFENSE 21
-#define SUPERATTACK 22
-
-/* Car parameters */
-#define MAX_SPEED (300 * KPH)
-#define MIN_SPEED (10 * KPH)
-#define MIN_ACC (-0.1)
-#define MAX_ACC (0.02)
-
-extern sem_t grx_mutex;
-
-char track_img[TRACK_WIDTH*TRACK_HEIGHT];
-char sprite[18][CAR_WIDTH*CAR_HEIGHT];
-
-/* Display functions */
-void put_transimage(int x1, int y1, int x2, int y2, BYTE *img,int car_color, int color);
-void draw_car(point_f old_pos, car_status cs, int car_color, int fumo);
-void put_trackbox(int x1, int y1, int x2, int y2);
-void show_display(int, int, float, float, float, float);
-void car_crash(PID sp, PID cp, point_f old_pos, int free);
-
-/* ------------------------------------------------------------------ */
-
-TASK control(int index) {
- int i = 0; // general purpose counter
- car_status old_car_status; // the previous car state
- car_status actual_car_status; // the actual car state
- road_info actual_road_info; // the actual road informations
- int road_state; // the state of the road: HIGHWAY, MIXED; MAZE
- int car_align; // the car alignment with respect to road limits
- int opps_state; // the relationship with other cars
- float old_speed = 0; // the previous car speed value
- float actual_speed = 0; // the actual car speed value
- float old_acc = 0; // the previous acceleration value
- float acc = 0; // the new acceleration
- point polepos;
-
- // Variabili che dipendono dal tipo di macchina
- float max_speed; // maximum car speed
- float min_acc; // minimum acceleration
- float max_acc; // maximum acceleration
-
- int killed = 0; // flag for killed cars
- int crashed = 0; // flag for crashed cars
-
- /* Timing variables */
- float t = 0;
- float dt = (float)CONTROL_PERIOD/100000.0; // time quantum
- time ts = int2time(t);
- float crash_t = 0;
- time crash_ts = int2time(crash_t);
- float bestlap = 999999999.9;
- time bestlap_s = int2time(bestlap);
- int bestlap_done = 0;
- int laps = 0;
-
- /* Display vars */
- point spd_p, acc_p, time_p, drv_p;
- char *txt;
-
- /* Car data */
- car_params params; // car data structure
-
- /* ----------------------------------------------------- */
-
- txt = (char *)malloc(15*sizeof(char));
-
- params = cars[index];
-
- max_speed = params.max_speed * MAX_SPEED; // maximum car speed
- min_acc = params.min_acc * MIN_ACC; // minimum acceleration
- max_acc = params.max_acc * MAX_ACC; // maximum acceleration
-
- /* Get track data */
- while (track_list[i].selected == 0)
- i++;
-
- /* Same pole for all */
- polepos.x = track_list[i].pole_pos.x;
- polepos.y = track_list[i].pole_pos.y;
- actual_car_status.pos.x = polepos.x;
- actual_car_status.pos.y = polepos.y;
- actual_car_status.orient = track_list[i].pole_orient;
- set_car_status(actual_car_status, params.car_status_cab);
-
- /* Initialize old values */
- old_car_status = actual_car_status;
- old_acc = acc;
- old_speed = actual_speed;
-
- /* POWER IS NOTHING WITHOUT CONTROL */
- while(1) {
-
- if (crashed) {
- crash_t += dt;
- crash_ts = int2time(crash_t);
- if (crash_ts.sec > 2) {
- car_crash(params.sensor_pid,params.control_pid,
- old_car_status.pos, 1);
- killed=1;
- }
- }
-
- else {
-
- /* Reads road informations */
- actual_road_info = get_road_info(params.road_status_cab);
-
- /* Defines the state of the road */
- if (fabs(actual_road_info.curve) < HIGHWAY_LIMIT ||
- actual_road_info.distance > 0.9*TEL_HEIGHT) {
- road_state = HIGHWAY;
- } else if (fabs(actual_road_info.curve) > MAZE_LIMIT ||
- actual_road_info.distance < 0.1*TEL_HEIGHT) {
- road_state = MAZE;
- } else {
- road_state = MIXED;
- }
-
- /* Defines the car position whitin road borders */
- if (actual_road_info.left_border < BORDER_LIMIT)
- car_align = TOO_LEFT;
- else if (actual_road_info.right_border < BORDER_LIMIT)
- car_align = TOO_RIGHT;
- else car_align = CENTER;
-
- /* Sets the power percentage */
- switch (road_state)
- {
- case HIGHWAY:
- acc = max_acc; // tarella!!!!
- break;
- case MIXED:
- actual_speed = params.rage * (((float)actual_road_info.distance/(float)TEL_HEIGHT) /
- (fabs(actual_road_info.curve)/90.0)) * max_speed;
- acc = (actual_speed - old_speed) / dt;
- break;
- case MAZE:
- actual_speed = params.rage * (1.0 - (fabs(actual_road_info.curve)/90.0)) * max_speed;
- acc = (actual_speed - old_speed) / dt;
- break;
- default:
- acc = 0.0;
- }
-
- /* Can't go off road */
- /* When car is near a border, it steers to come in */
- switch (car_align)
- {
- case TOO_LEFT:
- actual_car_status.orient -= TURN_QUANTUM;
- break;
- case TOO_RIGHT:
- actual_car_status.orient += TURN_QUANTUM;
- break;
- }
-
- if (road_state != HIGHWAY) {
- // C'e' una curva vicina.
- // Se la curva e' a destra si tiene vicino al bordo di sinistra
- // per impostare la traiettoria migliore e viceversa
- if (actual_road_info.curve < 0 && actual_road_info.left_border > BORDER_LIMIT
- && fabs(actual_road_info.curve) > CURVE_LIMIT)
- actual_car_status.orient += TURN_QUANTUM;
- else if (actual_road_info.curve > 0 && actual_road_info.right_border > BORDER_LIMIT
- && fabs(actual_road_info.curve) > CURVE_LIMIT)
- actual_car_status.orient -= TURN_QUANTUM;
-
- // Fa la curva dolcemente
- if (actual_road_info.distance < ((1.0/params.rage) * (TEL_HEIGHT * 0.25))) {
- actual_car_status.orient += actual_road_info.curve * (params.rage/8.0);
- //actual_car_status.orient += actual_road_info.curve / 4.0;
- }
- }
-
- /* Defines the state of interactions with other cars */
- if (actual_road_info.opps_number > 0)
- {
- if (road_state == HIGHWAY && actual_road_info.opps_list[0].y > (TEL_HEIGHT/3.0))
- opps_state = ATTACK;
- else if (road_state == MAZE && actual_road_info.opps_list[0].y < (TEL_HEIGHT/3.0))
- opps_state = DEFENSE;
- else if (actual_road_info.opps_list[0].y < (TEL_HEIGHT/6.0) &&
- actual_road_info.opps_list[0].x != 0 &&
- (abs(actual_road_info.opps_list[0].x) < CAR_W/2)) {
- // Defends and steers to avoid opponents
- opps_state = DEFENSE;
- acc *= -((TEL_HEIGHT/6.0) / (actual_road_info.opps_list[0].y));
- actual_car_status.orient -= ((actual_road_info.opps_list[0].x) /
- abs(actual_road_info.opps_list[0].x)) * TURN_QUANTUM/2;
- }
- else if (actual_road_info.opps_list[0].y < (TEL_HEIGHT/3.0) &&
- actual_road_info.opps_list[0].x != 0 &&
- abs(actual_road_info.opps_list[0].x) < CAR_W/2) {
- // Attacks and steers to override the opponent
- opps_state = ATTACK;
- actual_car_status.orient -= ((actual_road_info.opps_list[0].x) /
- abs(actual_road_info.opps_list[0].x)) * TURN_QUANTUM;
- }
- else
- opps_state = DEFENSE;
-
- // Response to opponents positions
- if (opps_state == ATTACK)
- acc = max_acc;
- else if (opps_state == DEFENSE)
- acc *= 0.5;
- }
-
-
- /* Checking car position: road/offroad */
- if (actual_road_info.left_border * actual_road_info.right_border < 0)
- acc = 0.5 * min_acc;
-
- if (actual_road_info.flag != ROAD_OK) {
- switch (actual_road_info.flag) {
- case LEFT_ONLY:
- if (actual_road_info.left_border < 0)
- actual_car_status.orient -= TURN_QUANTUM;
- acc = 0.5 * max_acc;
- break;
- case RIGHT_ONLY:
- if (actual_road_info.right_border < 0)
- actual_car_status.orient += TURN_QUANTUM;
- acc = 0.5 * max_acc;
- break;
- case NO_ROAD:
- crashed = 1;
- car_crash(params.sensor_pid,params.control_pid,
- old_car_status.pos, 0);
- break;
- }
- }
-
- /* Checking collisions... */
- if (actual_road_info.collision != NO_COLL) {
- switch(actual_road_info.collision) {
- case COLLISION_LEFT:
- actual_car_status.orient -= TURN_QUANTUM;
- acc *= (0.5 * params.rage);
- break;
- case COLLISION_RIGHT:
- actual_car_status.orient += TURN_QUANTUM;
- acc *= (0.5 * params.rage);
- break;
- }
- }
-
- /* Checking acceleration range... */
- acc = max(min(max_acc,acc),min_acc);
- actual_speed = old_speed + acc*dt;
-
- /* Checking speed range... */
- actual_speed = min(max(actual_speed,MIN_SPEED),max_speed);
-
- /* Checking steering angle ... */
- if (fabs(actual_car_status.orient - old_car_status.orient) >
- STEERING_LIMIT) {
- if ((actual_car_status.orient - old_car_status.orient) > 0)
- actual_car_status.orient = old_car_status.orient + STEERING_LIMIT;
- else
- actual_car_status.orient = old_car_status.orient - STEERING_LIMIT;
- }
-
- /* Setting new car position... */
- actual_car_status.pos.x += actual_speed * cos(degree_to_rad(actual_car_status.orient));
- actual_car_status.pos.y -= actual_speed * sin(degree_to_rad(actual_car_status.orient));
-
- /* Checking track limits... */
- if (actual_car_status.pos.x < MIN_CAR_X)
- actual_car_status.pos.x = MIN_CAR_X;
- if (actual_car_status.pos.x > MAX_CAR_X)
- actual_car_status.pos.x = MAX_CAR_X;
- if (actual_car_status.pos.y < MIN_CAR_Y)
- actual_car_status.pos.y = MIN_CAR_Y;
- if (actual_car_status.pos.y > MAX_CAR_Y)
- actual_car_status.pos.y = MAX_CAR_Y;
-
- /* Sends new status to car_status_cab */
- set_car_status(actual_car_status, params.car_status_cab);
-
- if (!crashed) {
- /* Updates car */
- if (acc == min_acc)
- draw_car(old_car_status.pos,actual_car_status, params.color, 1);
- else
- draw_car(old_car_status.pos,actual_car_status, params.color, 0);
- }
-
- /* Sets display points */
- spd_p.x = TRACK_X1 + TRACK_WIDTH + TEL_HEIGHT + TEL_WIDTH + 9;
- spd_p.y = TEL_HEIGHT*index + 1 + index + 1;
- bar_display(spd_p, 70, 4, GREEN, actual_speed, max_speed, LIGHTGRAY, "Spd");
-
- acc_p.x = spd_p.x;
- acc_p.y = spd_p.y + 24;
- bidir_bar_display(acc_p, 70, 4, GREEN, acc, max(fabs(min_acc), max_acc), LIGHTGRAY, "Acc");
-
- sem_wait(&grx_mutex);
-
- /* Displays driver's name */
- drv_p.x = spd_p.x + 80;
- drv_p.y = spd_p.y;
- grx_text(params.driver, drv_p.x, drv_p.y, params.color, BLACK);
-
- /* Displays timer */
- time_p.x = spd_p.x + 80;
- time_p.y = spd_p.y + 8;
- if( (!bestlap_done) || (bestlap_done && t > 50))
- {
- /* Mins */
- txt = itoa(ts.min, txt);
- grx_text(txt, time_p.x, time_p.y, WHITE, BLACK);
- grx_text(":", time_p.x + 8, time_p.y, WHITE, BLACK);
- /* Secs */
- txt = itoa(ts.sec, txt);
- if (ts.sec < 10) {
- grx_text("0", time_p.x+16, time_p.y, WHITE, BLACK);
- grx_text(txt, time_p.x+24, time_p.y, WHITE, BLACK);
- }
- else
- grx_text(txt, time_p.x+16, time_p.y, WHITE, BLACK);
- /* Decs */
- grx_text(":", time_p.x+32, time_p.y, WHITE, BLACK);
- txt = itoa(ts.dec, txt);
- grx_text(txt, time_p.x+40, time_p.y, WHITE, BLACK);
- }
-
- /* Displays the best lap */
- if(bestlap_done == 1)
- {
- time_p.x = spd_p.x + 80;
- time_p.y = spd_p.y + 16;
- /* Mins */
- txt = itoa(bestlap_s.min, txt);
- grx_text(txt, time_p.x, time_p.y, YELLOW, BLACK);
- grx_text(":", time_p.x + 8, time_p.y, YELLOW, BLACK);
- /* Secs */
- txt = itoa(bestlap_s.sec, txt);
- if (bestlap_s.sec < 10) {
- grx_text("0", time_p.x+16, time_p.y, YELLOW, BLACK);
- grx_text(txt, time_p.x+24, time_p.y, YELLOW, BLACK);
- }
- else
- grx_text(txt, time_p.x+16, time_p.y, YELLOW, BLACK);
- /* Decs */
- grx_text(":", time_p.x+32, time_p.y, YELLOW, BLACK);
- txt = itoa(bestlap_s.dec, txt);
- grx_text(txt, time_p.x+40, time_p.y, YELLOW, BLACK);
- }
-
- /* Displays lap number */
- time_p.x = spd_p.x + 80;
- time_p.y = spd_p.y + 24;
- grx_text("Lap ", time_p.x, time_p.y, LIGHTGRAY, BLACK);
- txt = itoa(laps, txt);
- grx_text(txt, time_p.x+32, time_p.y, LIGHTGRAY, BLACK);
-
- sem_post(&grx_mutex);
-
- /* Control the best lap */
- t += dt;
- ts = int2time(t);
-
- /* Finish line */
- if ((track_list[i].lap == CLOCK &&
- (actual_car_status.pos.x >= polepos.x) && (old_car_status.pos.x < polepos.x)
- && (actual_car_status.pos.y > polepos.y-20) && (actual_car_status.pos.y < polepos.y+20)) ||
- (track_list[i].lap == ANTICLOCK &&
- (actual_car_status.pos.x <= polepos.x) && (old_car_status.pos.x > polepos.x)
- && (actual_car_status.pos.y > polepos.y-20) && (actual_car_status.pos.y < polepos.y+20))) {
- laps++; // increases lap number
-
- bestlap = min(bestlap,t);
- bestlap_s = int2time(bestlap);
- bestlap_done = 1;
- t = 0;
- ts = int2time(t);
- }
-
- /* Updates old values */
- old_car_status = actual_car_status;
- old_acc = acc;
- old_speed = actual_speed;
-
- } // end crashed
-
- task_endcycle();
-
- // Esce se e' morto
- if (killed) return 0;
- }
-}
-
-/* ------------------------------------------------------------------ */
-
-void car_crash(PID sp, PID cp, point_f old_pos, int free)
-{
- point p1, p2;
- p1.x = round(old_pos.x) - CAR_WIDTH/2 - 1;
- p1.y = round(old_pos.y) - CAR_HEIGHT/2 - 1;
- p2.x = p1.x + CAR_WIDTH + 1;
- p2.y = p1.y + CAR_HEIGHT + 1;
-
- sem_wait(&grx_mutex);
- /* Find the track box to redraw */
- put_trackbox(p1.x,p1.y,p2.x,p2.y);
-
- if (free == 0) {
- // Draw the explosion
- put_transimage(p1.x+1,p1.y+1,p2.x-1,p2.y-1,&sprite[16][0],0,0);
- }
- else if (free == 1) {
- // Delete the explosion
- put_trackbox(p1.x,p1.y,p2.x,p2.y);
- task_kill(sp);
- task_kill(cp);
- }
- sem_post(&grx_mutex);
-}
-
-/* ------------------------------------------------------------------ */
-
-void draw_car(point_f old_pos, car_status cs, int car_color, int fumo)
-{
- int index;
- point p1, p2;
- p1.x = round(old_pos.x) - CAR_WIDTH/2 - 1;
- p1.y = round(old_pos.y) - CAR_HEIGHT/2 - 1;
- p2.x = p1.x + CAR_WIDTH + 1;
- p2.y = p1.y + CAR_HEIGHT + 1;
-
- sem_wait(&grx_mutex);
- /* Find the track box to redraw */
- put_trackbox(p1.x,p1.y,p2.x,p2.y);
-
-
- p1.x = round(cs.pos.x) + (CAR_WIDTH/2 * cos(degree_to_rad(cs.orient)));
- p1.y = round(cs.pos.y) - (CAR_HEIGHT/2 * sin(degree_to_rad(cs.orient)));
- p2.x = round(cs.pos.x) - (CAR_WIDTH/2 * cos(degree_to_rad(cs.orient)));
- p2.y = round(cs.pos.y) + (CAR_HEIGHT/2 * sin(degree_to_rad(cs.orient)));
-
- index = ((((int)cs.orient%360)+360)%360);
- index = (int)(index + 11.25)%360;
- index /= 22.5;
-
- put_transimage(round(cs.pos.x) - CAR_WIDTH/2 + 1,round(cs.pos.y) - CAR_HEIGHT/2 + 1,
- round(cs.pos.x) + CAR_WIDTH/2 ,round(cs.pos.y) + CAR_HEIGHT/2,
- &sprite[index][0], car_color, 0);
- if (fumo)
- put_transimage(round(cs.pos.x) - CAR_WIDTH/2 + 1,round(cs.pos.y) - CAR_HEIGHT/2 + 1,
- round(cs.pos.x) + CAR_WIDTH/2 ,round(cs.pos.y) + CAR_HEIGHT/2,
- &sprite[17][0], car_color, 0);
- sem_post(&grx_mutex);
-}
-
-/* ------------------------------------------------------------------ */
-
-/* Copy a box of track_image to screen */
-void put_trackbox(int x1, int y1, int x2, int y2)
-{
- int y;
- int tx1,ty1,tx2,ty2;
- BYTE *addr;
-
- tx1 = x1-TRACK_X1+1;
- ty1 = y1-TRACK_Y1;
- tx2 = x2-TRACK_X1+1;
- ty2 = y2-TRACK_Y1;
-
- if (tx1 < 0) tx1 = 0;
- if (ty1 < 0) ty1 = 0;
- if (tx2 > TRACK_WIDTH-1) tx2 = TRACK_WIDTH-1;
- if (ty2 > TRACK_HEIGHT-1) ty2 = TRACK_HEIGHT-1;
-
- tx1 = max(tx1,0);
- ty1 = max(ty1,0);
- tx2 = min(tx2,TRACK_WIDTH-1);
- ty2 = min(ty2,TRACK_HEIGHT-1);
-
- addr = &track_img[0] + tx1 + TRACK_WIDTH * ty1;
-
- x1 = max(0,x1);
- y1 = max(0,y1);
-
- for (y = y1; y <= y2; y++) {
- grx_putimage(x1+1, y, x2, y, addr);
- addr += TRACK_WIDTH;
- }
-}
-
-/* ------------------------------------------------------------------ */
-
-void put_transimage(int x1, int y1, int x2, int y2, BYTE *img, int car_color,
- int color)
-{
- int x,y;
- BYTE *addr;
- addr = img;
-
-
- for (y = y1; y < y2; y++) {
- for ( x = x1; x < x2; x++, addr++) {
- if (*addr != color) {
- if (*addr == 26)
- grx_plot(x,y,car_color);
- else
- grx_plot(x,y,*addr);
-
- }
- }
- addr++;
- }
-}
-
-/* ------------------------------------------------------------------ */
-
-void show_display(int rs, int ca, float speed, float max_speed,
- float acc, float max_acc)
-{
- point hw, mx, mz; // three road states
- point tl, ct, tr; // three car alignments
- point sp1, sp2; // speed display coordinates
- point ap1, ap2; // acceleration display coordinates
- int s_amp = 0;
- int a_amp = 0;
-
- /* Leds coordinates */
- hw.x = 10;
- hw.y = SCREEN_HEIGHT-50;
- mx.x = 25;
- mx.y = SCREEN_HEIGHT-50;
- mz.x = 40;
- mz.y = SCREEN_HEIGHT-50;
- tl.x = 10;
- tl.y = SCREEN_HEIGHT-35;
- ct.x = 25;
- ct.y = SCREEN_HEIGHT-35;
- tr.x = 40;
- tr.y = SCREEN_HEIGHT-35;
- sp1.x = 10;
- sp1.y = SCREEN_HEIGHT-75;
- sp2.x = 110;
- sp2.y = SCREEN_HEIGHT-65;
- ap1.x = 10;
- ap1.y = SCREEN_HEIGHT-90;
- ap2.x = 110;
- ap2.y = SCREEN_HEIGHT-80;
-
- sem_wait(&grx_mutex);
-
- /* Writes out controller titles */
- grx_text("Road", mz.x+15, mz.y, YELLOW, BLACK);
- grx_text("Curve", tr.x+15, tr.y, YELLOW, BLACK);
- switch (rs)
- {
- case HIGHWAY:
- grx_box(hw.x, hw.y, hw.x+10, hw.y+10, GREEN);
- grx_box(mx.x, mx.y, mx.x+10, mx.y+10, BLACK);
- grx_box(mz.x, mz.y, mz.x+10, mz.y+10, BLACK);
- break;
- case MIXED:
- grx_box(hw.x, hw.y, hw.x+10, hw.y+10, BLACK);
- grx_box(mx.x, mx.y, mx.x+10, mx.y+10, YELLOW);
- grx_box(mz.x, mz.y, mz.x+10, mz.y+10, BLACK);
- break;
- case MAZE:
- grx_box(hw.x, hw.y, hw.x+10, hw.y+10, BLACK);
- grx_box(mx.x, mx.y, mx.x+10, mx.y+10, BLACK);
- grx_box(mz.x, mz.y, mz.x+10, mz.y+10, RED);
- break;
- }
-
- switch (ca)
- {
- case TOO_LEFT:
- grx_box(tl.x, tl.y, tl.x+10, tl.y+10, RED);
- grx_box(ct.x, ct.y, ct.x+10, ct.y+10, BLACK);
- grx_box(tr.x, tr.y, tr.x+10, tr.y+10, BLACK);
- break;
- case TOO_RIGHT:
- grx_box(tl.x, tl.y, tl.x+10, tl.y+10, BLACK);
- grx_box(ct.x, ct.y, ct.x+10, ct.y+10, BLACK);
- grx_box(tr.x, tr.y, tr.x+10, tr.y+10, BLUE);
- break;
- default:
- grx_box(tl.x, tl.y, tl.x+10, tl.y+10, BLACK);
- grx_box(ct.x, ct.y, ct.x+10, ct.y+10, WHITE);
- grx_box(tr.x, tr.y, tr.x+10, tr.y+10, BLACK);
- }
-
- /* Draws speed display */
- grx_text("Speed", sp1.x+120, sp1.y, YELLOW, BLACK);
- grx_rect(sp1.x-1, sp1.y-1, sp2.x+1, sp2.y+1, GREEN);
- /* Updates speed display */
- grx_box(sp1.x, sp1.y, sp2.x, sp2.y, BLACK);
- s_amp = round( (speed * (float)(sp2.x-sp1.x)) / max_speed );
- grx_box(sp1.x, sp1.y, sp1.x+s_amp, sp2.y, LIGHTGRAY);
-
- /* Draws acceleration display */
- grx_text("Acceleration", ap1.x+120, ap1.y, YELLOW, BLACK);
- grx_rect(ap1.x-1, ap1.y-1, ap2.x+1, ap2.y+1, GREEN);
- /* Updates acceleration display */
- grx_box(ap1.x, ap1.y, ap2.x, ap2.y, BLACK);
- a_amp = round( (float)acc * (float)((ap2.x-ap1.x)/2) / (float)max_acc );
- if (a_amp >= 0)
- grx_box((ap1.x+ap2.x)/2, ap1.y, ((ap1.x+ap2.x)/2)+a_amp, ap2.y, LIGHTGRAY);
- else
- grx_box((ap1.x+ap2.x)/2+a_amp, ap1.y, ((ap1.x+ap2.x)/2), ap2.y, LIGHTGRAY);
- grx_line((ap1.x+ap2.x)/2, ap1.y-2, (ap1.x+ap2.x)/2, ap2.y+2, WHITE);
- sem_post(&grx_mutex);
-}
-
Index: rel_1_2/auto/initfil3.c
===================================================================
--- rel_1_2/auto/initfil3.c (revision 1198)
+++ rel_1_2/auto/initfil3.c (nonexistent)
@@ -1,107 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfil3.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "edfact.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 2000
-
-void read_track(int);
-void read_sprites();
-
-int argc;
-char *argv[100];
-int main(int argc, char **argv);
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDFACT_register_level(0);
- CBS_register_level(0, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- __compute_args__(mb, &argc, argv);
-
- if (argc == 2)
- read_track(strtoi(argv[1], 10, NULL));
- else
- read_track(2);
-
- read_sprites();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- KEYB_init(&kparms);
-
- return (void *) main(argc,argv);
-}
Index: rel_1_2/auto/edfact.c
===================================================================
--- rel_1_2/auto/edfact.c (revision 1198)
+++ rel_1_2/auto/edfact.c (nonexistent)
@@ -1,567 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: edfact.c,v 1.4 2003-01-07 17:10:15 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.4 $
- Last update: $Date: 2003-01-07 17:10:15 $
- ------------
-**/
-
-/*
- * Copyright (C) 2001 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "edfact.h"
-#include <ll/stdio.h>
-#include <ll/string.h>
-#include <kernel/model.h>
-#include <kernel/descr.h>
-#include <kernel/var.h>
-#include <kernel/func.h>
-#include <kernel/trace.h>
-
-//#define edfact_printf kern_printf
-#define edfact_printf printk
-
-/*+ Status used in the level +*/
-#define EDFACT_READY MODULE_STATUS_BASE /*+ - Ready status +*/
-#define EDFACT_IDLE MODULE_STATUS_BASE+4 /*+ to wait the deadline +*/
-
-/*+ flags +*/
-#define EDFACT_FLAG_NORAISEEXC 2
-
-/*+ the level redefinition for the Earliest Deadline First level +*/
-typedef struct {
- level_des l; /*+ the standard level descriptor +*/
-
- TIME period[MAX_PROC]; /*+ The task periods; the deadlines are
- stored in the priority field +*/
- int deadline_timer[MAX_PROC];
- /*+ The task deadline timers +*/
-
- struct timespec deadline_timespec[MAX_PROC];
-
- int dline_miss[MAX_PROC]; /*+ Deadline miss counter +*/
- int wcet_miss[MAX_PROC]; /*+ Wcet miss counter +*/
-
- int nact[MAX_PROC]; /*+ Wcet miss counter +*/
-
- int flag[MAX_PROC];
- /*+ used to manage the JOB_TASK_MODEL and the
- periodicity +*/
-
- IQUEUE ready; /*+ the ready queue +*/
-
- int flags; /*+ the init flags... +*/
-
- bandwidth_t U; /*+ the used bandwidth +*/
-
-} EDFACT_level_des;
-
-
-static void EDFACT_timer_deadline(void *par);
-
-static void EDFACT_internal_activate(EDFACT_level_des *lev, PID p,
- struct timespec *t)
-{
- struct timespec *temp;
-
- temp = iq_query_timespec(p, &lev->ready);
-
- TIMESPEC_ASSIGN(temp,t);
- ADDUSEC2TIMESPEC(lev->period[p], temp);
-
- TIMESPEC_ASSIGN(&lev->deadline_timespec[p],
- temp);
-
- /* Insert task in the correct position */
- proc_table[p].status = EDFACT_READY;
- iq_timespec_insert(p,&lev->ready);
-
- /* needed because when there is a wcet miss I disable CONTROL_CAP */
- proc_table[p].control |= CONTROL_CAP;
-}
-
-static void EDFACT_timer_deadline(void *par)
-{
- PID p = (PID) par;
- EDFACT_level_des *lev;
-
- lev = (EDFACT_level_des *)level_table[proc_table[p].task_level];
-
- switch (proc_table[p].status) {
- case EDFACT_IDLE:
- edfact_printf("I%d",p);
-
- EDFACT_internal_activate(lev,p, &lev->deadline_timespec[p]);
-
- event_need_reschedule();
- break;
-
- default:
- edfact_printf("D%d",p);
- /* else, a deadline miss occurred!!! */
- lev->dline_miss[p]++;
-
- /* the task is into another state */
- lev->nact[p]++;
-
- /* Set the deadline timer */
- ADDUSEC2TIMESPEC(lev->period[p], &lev->deadline_timespec[p]);
- }
-
- /* Set the deadline timer */
- lev->deadline_timer[p] = kern_event_post(&lev->deadline_timespec[p],
- EDFACT_timer_deadline,
- (void *)p);
-
-}
-
-static void EDFACT_timer_guest_deadline(void *par)
-{
- PID p = (PID) par;
-
- edfact_printf("AAARRRGGGHHH!!!");
- kern_raise(XDEADLINE_MISS,p);
-}
-
-
-/* The scheduler only gets the first task in the queue */
-static PID EDFACT_public_scheduler(LEVEL l)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- return iq_query_first(&lev->ready);
-}
-
-/* The on-line guarantee is enabled only if the appropriate flag is set... */
-static int EDFACT_public_guarantee(LEVEL l, bandwidth_t *freebandwidth)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- if (lev->flags & EDFACT_FAILED_GUARANTEE) {
- *freebandwidth = 0;
- return 0;
- }
- else
- if (*freebandwidth >= lev->U) {
- *freebandwidth -= lev->U;
- return 1;
- }
- else
- return 0;
-
-}
-
-static int EDFACT_public_create(LEVEL l, PID p, TASK_MODEL *m)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- HARD_TASK_MODEL *h;
-
- if (m->pclass != HARD_PCLASS) return -1;
- if (m->level != 0 && m->level != l) return -1;
- h = (HARD_TASK_MODEL *)m;
- if (!h->wcet || !h->mit || h->periodicity != PERIODIC) return -1;
- /* now we know that m is a valid model */
-
- lev->period[p] = h->mit;
-
- lev->flag[p] = 0;
- lev->deadline_timer[p] = -1;
- lev->dline_miss[p] = 0;
- lev->wcet_miss[p] = 0;
- lev->nact[p] = 0;
-
- /* Enable wcet check */
- proc_table[p].avail_time = h->wcet;
- proc_table[p].wcet = h->wcet;
- proc_table[p].control |= CONTROL_CAP;
-
- /* update the bandwidth... */
- if (lev->flags & EDFACT_ENABLE_GUARANTEE) {
- bandwidth_t b;
- b = (MAX_BANDWIDTH / h->mit) * h->wcet;
-
- /* really update lev->U, checking an overflow... */
- if (MAX_BANDWIDTH - lev->U > b)
- lev->U += b;
- else
- /* The task can NOT be guaranteed (U>MAX_BANDWIDTH)...
- in this case, we don't raise an exception... in fact, after the
- EDFACT_task_create the task_create will call level_guarantee that return
- -1... return -1 in EDFACT_task_create isn't correct, because:
- . generally, the guarantee must be done when also the resources
- are registered
- . returning -1 will cause the task_create to return with an errno
- ETASK_CREATE instead of ENO_GUARANTEE!!!
-
- Why I use the flag??? because if the lev->U overflows, if i.e. I set
- it to MAX_BANDWIDTH, I lose the correct allocated bandwidth...
- */
- lev->flags |= EDFACT_FAILED_GUARANTEE;
- }
-
- return 0; /* OK, also if the task cannot be guaranteed... */
-}
-
-static void EDFACT_public_detach(LEVEL l, PID p)
-{
- /* the EDFACT level doesn't introduce any dinamic allocated new field.
- we have only to reset the NO_GUARANTEE FIELD and decrement the allocated
- bandwidth */
-
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- if (lev->flags & EDFACT_FAILED_GUARANTEE)
- lev->flags &= ~EDFACT_FAILED_GUARANTEE;
- else
- lev->U -= (MAX_BANDWIDTH / lev->period[p]) * proc_table[p].wcet;
-}
-
-static void EDFACT_public_dispatch(LEVEL l, PID p, int nostop)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- /* the task state is set EXE by the scheduler()
- we extract the task from the ready queue
- NB: we can't assume that p is the first task in the queue!!! */
- iq_extract(p, &lev->ready);
-}
-
-static void EDFACT_public_epilogue(LEVEL l, PID p)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- /* check if the wcet is finished... */
- if (proc_table[p].avail_time <= 0 && proc_table[p].control&CONTROL_CAP) {
- /* wcet finished: disable wcet event and count wcet miss */
- edfact_printf("W%d",p);
- proc_table[p].control &= ~CONTROL_CAP;
- lev->wcet_miss[p]++;
- }
-
- /* the task it returns into the ready queue... */
- iq_timespec_insert(p,&lev->ready);
- proc_table[p].status = EDFACT_READY;
-}
-
-static void EDFACT_public_activate(LEVEL l, PID p)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
- struct timespec t;
-
- /* Test if we are trying to activate a non sleeping task */
- /* save activation (only if needed... */
- if (proc_table[p].status != SLEEP) {
- /* a periodic task cannot be activated when it is already active */
- kern_raise(XACTIVATION,p);
- return;
- }
-
- kern_gettime(&t);
- EDFACT_internal_activate(lev,p, &t);
-
- /* Set the deadline timer */
- lev->deadline_timer[p] = kern_event_post(&lev->deadline_timespec[p],
- EDFACT_timer_deadline,
- (void *)p);
-
-}
-
-static void EDFACT_public_unblock(LEVEL l, PID p)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- /* Insert task in the coEDFect position */
- proc_table[p].status = EDFACT_READY;
- iq_timespec_insert(p,&lev->ready);
-}
-
-static void EDFACT_public_block(LEVEL l, PID p)
-{
-}
-
-static int EDFACT_public_message(LEVEL l, PID p, void *m)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
- struct timespec t;
-
- /* we reset the capacity counters... */
- proc_table[p].avail_time = proc_table[p].wcet;
-
- if (lev->nact[p] > 0) {
- edfact_printf("E%d",p);
-
- /* Pending activation: reactivate the thread!!! */
- lev->nact[p]--;
-
- /* see also EDFACT_timer_deadline */
- kern_gettime(&t);
- EDFACT_internal_activate(lev,p, &t);
-
- /* check if the deadline has already expired */
- if (TIMESPEC_A_LT_B(iq_query_timespec(p, &lev->ready), &schedule_time)) {
- /* count the deadline miss */
- lev->dline_miss[p]++;
- kern_event_delete(lev->deadline_timer[p]);
- }
-
- }
- else {
- edfact_printf("e%d",p);
-
- /* the task has terminated his job before it consume the wcet. All OK! */
- proc_table[p].status = EDFACT_IDLE;
-
- /* when the deadline timer fire, it recognize the situation and set
- correctly all the stuffs (like reactivation, etc... ) */
- }
-
- jet_update_endcycle(); /* Update the Jet data... */
- trc_logevent(TRC_ENDCYCLE,&exec_shadow); /* tracer stuff */
-
- return 0;
-}
-
-static void EDFACT_public_end(LEVEL l, PID p)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- edfact_printf("Û%d",p);
-
- /* we finally put the task in the ready queue */
- proc_table[p].status = FREE;
- iq_insertfirst(p,&freedesc);
- /* and free the allocated bandwidth */
- lev->U -= (MAX_BANDWIDTH/lev->period[p]) * proc_table[p].wcet;
-
- if (lev->deadline_timer[p] != -1) {
- edfact_printf("²%d",p);
- kern_event_delete(lev->deadline_timer[p]);
- }
-}
-
-
-/* Guest Functions
- These functions manages a JOB_TASK_MODEL, that is used to put
- a guest task in the EDFACT ready queue. */
-
-static void EDFACT_private_insert(LEVEL l, PID p, TASK_MODEL *m)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- JOB_TASK_MODEL *job;
-
- if (m->pclass != JOB_PCLASS || (m->level != 0 && m->level != l) ) {
- kern_raise(XINVALID_TASK, p);
- return;
- }
-
- job = (JOB_TASK_MODEL *)m;
-
- TIMESPEC_ASSIGN(iq_query_timespec(p, &lev->ready), &job->deadline);
-
- lev->deadline_timer[p] = -1;
- lev->dline_miss[p] = 0;
- lev->wcet_miss[p] = 0;
- lev->nact[p] = 0;
-
- if (job->noraiseexc)
- lev->flag[p] = EDFACT_FLAG_NORAISEEXC;
- else {
- lev->flag[p] = 0;
- lev->deadline_timer[p] = kern_event_post(iq_query_timespec(p, &lev->ready),
- EDFACT_timer_guest_deadline,
- (void *)p);
- }
-
- lev->period[p] = job->period;
-
- /* Insert task in the correct position */
- iq_timespec_insert(p,&lev->ready);
- proc_table[p].status = EDFACT_READY;
-
- /* there is no bandwidth guarantee at this level, it is performed
- by the level that inserts guest tasks... */
-}
-
-static void EDFACT_private_dispatch(LEVEL l, PID p, int nostop)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- /* the task state is set to EXE by the scheduler()
- we extract the task from the ready queue
- NB: we can't assume that p is the first task in the queue!!! */
- iq_extract(p, &lev->ready);
-}
-
-static void EDFACT_private_epilogue(LEVEL l, PID p)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- /* the task has been preempted. it returns into the ready queue... */
- iq_timespec_insert(p,&lev->ready);
- proc_table[p].status = EDFACT_READY;
-}
-
-static void EDFACT_private_extract(LEVEL l, PID p)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- //kern_printf("EDFACT_guest_end: dline timer %d\n",lev->deadline_timer[p]);
- if (proc_table[p].status == EDFACT_READY)
- {
- iq_extract(p, &lev->ready);
- //kern_printf("(g_end rdy extr)");
- }
-
- /* we remove the deadline timer, because the slice is finished */
- if (lev->deadline_timer[p] != NIL) {
-// kern_printf("EDFACT_guest_end: dline timer %d\n",lev->deadline_timer[p]);
- kern_event_delete(lev->deadline_timer[p]);
- lev->deadline_timer[p] = NIL;
- }
-
-}
-
-/* Registration functions */
-
-/*+ Registration function:
- int flags the init flags ... see EDFACT.h +*/
-LEVEL EDFACT_register_level(int flags)
-{
- LEVEL l; /* the level that we register */
- EDFACT_level_des *lev; /* for readableness only */
- PID i; /* a counter */
-
- printk("EDFACT_register_level\n");
-
- /* request an entry in the level_table */
- l = level_alloc_descriptor(sizeof(EDFACT_level_des));
-
- lev = (EDFACT_level_des *)level_table[l];
-
- printk(" lev=%d\n",(int)lev);
-
- /* fill the standard descriptor */
- lev->l.private_insert = EDFACT_private_insert;
- lev->l.private_extract = EDFACT_private_extract;
- lev->l.private_dispatch = EDFACT_private_dispatch;
- lev->l.private_epilogue = EDFACT_private_epilogue;
-
- lev->l.public_scheduler = EDFACT_public_scheduler;
- if (flags & EDFACT_ENABLE_GUARANTEE)
- lev->l.public_guarantee = EDFACT_public_guarantee;
- else
- lev->l.public_guarantee = NULL;
- lev->l.public_create = EDFACT_public_create;
- lev->l.public_detach = EDFACT_public_detach;
- lev->l.public_end = EDFACT_public_end;
- lev->l.public_dispatch = EDFACT_public_dispatch;
- lev->l.public_epilogue = EDFACT_public_epilogue;
- lev->l.public_activate = EDFACT_public_activate;
- lev->l.public_unblock = EDFACT_public_unblock;
- lev->l.public_block = EDFACT_public_block;
- lev->l.public_message = EDFACT_public_message;
-
- /* fill the EDFACT descriptor part */
- for(i=0; i<MAX_PROC; i++) {
- lev->period[i] = 0;
- lev->deadline_timer[i] = -1;
- lev->flag[i] = 0;
- lev->dline_miss[i] = 0;
- lev->wcet_miss[i] = 0;
- lev->nact[i] = 0;
- }
-
- iq_init(&lev->ready,&freedesc, 0);
- lev->flags = flags & 0x07;
- lev->U = 0;
-
- return l;
-}
-
-bandwidth_t EDFACT_usedbandwidth(LEVEL l)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- return lev->U;
-}
-
-int EDFACT_get_dline_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- return lev->dline_miss[p];
-}
-
-int EDFACT_get_wcet_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- return lev->wcet_miss[p];
-}
-
-int EDFACT_get_nact(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- return lev->nact[p];
-}
-
-int EDFACT_reset_dline_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- lev->dline_miss[p] = 0;
- return 0;
-}
-
-int EDFACT_reset_wcet_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- lev->wcet_miss[p] = 0;
- return 0;
-}
-
Index: rel_1_2/auto/tracks.c
===================================================================
--- rel_1_2/auto/tracks.c (revision 1198)
+++ rel_1_2/auto/tracks.c (nonexistent)
@@ -1,111 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: tracks.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* -------------- */
-/* Track loader */
-/* -------------- */
-
-#include "include/auto.h"
-#include "include/const.h"
-
-track track_list[TRACK_NUMBER];
-
-int track_init()
-{
- track demo1;
- track demo2;
- track brazil;
- track monaco;
-
- strcpy(demo1.name, "demo1.raw");
- demo1.pole_pos.x = 150;
- demo1.pole_pos.y = 35;
- demo1.pole_orient = 0.0;
- demo1.lap = CLOCK;
- demo1.selected = 0;
-
- strcpy(demo2.name, "demo2.raw");
- demo2.pole_pos.x = 150;
- demo2.pole_pos.y = 30;
- demo2.pole_orient = 0.0;
- demo2.lap = CLOCK;
- demo2.selected = 0;
-
- strcpy(brazil.name, "brazil.raw");
- brazil.pole_pos.x = 140;
- brazil.pole_pos.y = 185;
- brazil.pole_orient = 225.0;
- brazil.lap = ANTICLOCK;
- brazil.selected = 0;
-
- strcpy(monaco.name, "monaco.raw");
- monaco.pole_pos.x = 35;
- monaco.pole_pos.y = 315;
- monaco.pole_orient = 85.0;
- monaco.lap = CLOCK;
- monaco.selected = 0;
-
- track_list[0] = demo1;
- track_list[1] = demo2;
- track_list[2] = brazil;
- track_list[3] = monaco;
-
- return 0;
-}
Index: rel_1_2/auto/keyb.c
===================================================================
--- rel_1_2/auto/keyb.c (revision 1198)
+++ rel_1_2/auto/keyb.c (nonexistent)
@@ -1,105 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: keyb.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------------ */
-/* Keyboard handler */
-/* ------------------ */
-
-#include "include/auto.h"
-#include "include/const.h"
-
-
-void keyb_handler() {
- KEY_EVT k;
- keyb_set_map(itaMap);
-
- /* Exit keys: ENTER */
- k.flag = 0;
- k.scan = KEY_ENT;
- k.ascii = 13;
- keyb_hook(k, endfun);
-
- /* Creates a new HARD car */
- k.flag = 0;
- k.scan = KEY_H;
- k.ascii = 'h';
- keyb_hook(k, hard_car_create);
-
- /* Creates a new SOFT car */
- k.flag = 0;
- k.scan = KEY_S;
- k.ascii = 's';
- keyb_hook(k, soft_car_create);
-}
-
-
-void endfun(KEY_EVT *k)
-{
- grx_close();
- cprintf("Ctrl-Brk pressed! Ending...\n");
- sys_end();
-}
-
-
-void my_close(void *arg)
-{
- kern_printf("my_close\n");
-}
-
Index: rel_1_2/auto/edfact.h
===================================================================
--- rel_1_2/auto/edfact.h (revision 1198)
+++ rel_1_2/auto/edfact.h (nonexistent)
@@ -1,152 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: edfact.h,v 1.2 2003-01-07 17:10:15 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-01-07 17:10:15 $
- ------------
-
- This file contains the server EDFACT (EDF with pending activations)
-
- Title:
- EDFACT
-
- Task Models Accepted:
- HARD_TASK_MODEL - Hard Tasks (only Periodic)
- wcet field and mit field must be != 0. They are used to set the wcet
- and period of the tasks.
- periodicity field can be only PERIODIC
- drel field is ignored
-
- Guest Models Accepted:
- JOB_TASK_MODEL - a single guest task activation
- Identified by an absolute deadline and a period.
- period field is ignored
-
- Description:
- This module schedule his tasks following the classic EDF scheme.
- The task guarantee is based on the factor utilization approach.
- The tasks scheduled are only periodic.
- All the task are put in a queue and the scheduling is based on the
- deadline value.
- NO GUARANTEE is performed on guest tasks. The guarantee must be performed
- by the level that inserts guest tasks in the EDF level.
- If a task miss a deadline a counter is incremented.
- If a task exausts the wcet a counter is incremented
- No ZOMBIE support!!!!!!
-
- Exceptions raised:
- XUNVALID_GUEST XUNVALID_TASK
- some primitives are not implemented:
- task_sleep, task_delay, guest_endcycle, guest_sleep, guest_delay
-
- XACTIVATION
- If a task is actiated through task_activate or guest_activate more than
- one time
-
- Restrictions & special features:
- - This level doesn't manage the main task.
- - At init time we have to specify:
- . guarantee check
- (when all task are created the system will check that the task_set
- will not use more than the available bandwidth)
- - A function to return the used bandwidth of the level is provided.
- - Functions to return and reset the nact, wcet and dline miss counters
-
-**/
-
-/*
- * Copyright (C) 2001 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#ifndef __EDFACT_H__
-#define __EDFACT_H__
-
-#include <ll/ll.h>
-#include <kernel/config.h>
-#include <sys/types.h>
-#include <kernel/types.h>
-
-
-
-
-
-
-
-
-/*+ flags... +*/
-#define EDFACT_ENABLE_GUARANTEE 1 /*+ Task Guarantee enabled +*/
-#define EDFACT_ENABLE_ALL 1
-
-#define EDFACT_FAILED_GUARANTEE 8 /*+ used in the module, unsettabl
- in EDF_register_level... +*/
-
-
-
-
-
-#define ELASTIC_HARD_PCLASS 0x0600
-
-#define EDFACT_LEVELNAME "EDFACT base"
-#define EDFACT_LEVEL_CODE 166
-#define EDFACT_LEVEL_VERSION 1
-
-
-/*+ Registration function:
- int flags Options to be used in this level instance...
-
- returns the level number at which the module has been registered.
-+*/
-LEVEL EDFACT_register_level(int flags);
-
-/*+ Returns the used bandwidth of a level +*/
-bandwidth_t EDFACT_usedbandwidth(LEVEL l);
-
-/*+ returns respectively the number of dline, wcet or nact; -1 if error +*/
-int EDFACT_get_dline_miss(PID p);
-int EDFACT_get_wcet_miss(PID p);
-int EDFACT_get_nact(PID p);
-
-/*+ resets respectively the number of dline, wcet miss; -1 if error +*/
-int EDFACT_reset_dline_miss(PID p);
-int EDFACT_reset_wcet_miss(PID p);
-
-#endif
-
Index: rel_1_2/auto/info.c
===================================================================
--- rel_1_2/auto/info.c (revision 1198)
+++ rel_1_2/auto/info.c (nonexistent)
@@ -1,154 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: info.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------------- */
-/* Information panel */
-/* ------------------- */
-
-#include "include/auto.h"
-#include "include/const.h"
-#include "include/utils.h"
-
-extern sem_t grx_mutex;
-
-/* ------------------------------------------------------------------ */
-
-void bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name)
-{
- int background = BLACK;
- int amp = 0;
- point p2;
-
- p2.x = p1.x + width;
- p2.y = p1.y + height;
-
- sem_wait(&grx_mutex);
-
- grx_text(name, p1.x, p1.y + height + 3, color, background);
- grx_rect(p1.x - 1, p1.y - 1, p2.x + 1, p2.y + 1, border);
-
- grx_box(p1.x, p1.y, p2.x, p2.y, BLACK);
- amp = abs(round( var * (float)(p2.x - p1.x) / max ));
- grx_box(p1.x, p1.y, p1.x + amp, p2.y, color);
-
- sem_post(&grx_mutex);
-}
-
-/* ------------------------------------------------------------------ */
-
-void bidir_bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name)
-{
- int background = BLACK;
- int amp = 0;
- point p2;
-
- p2.x = p1.x + width;
- p2.y = p1.y + height;
-
- sem_wait(&grx_mutex);
-
- grx_text(name, p1.x, p1.y + height + 3, color, background);
- grx_rect(p1.x - 1, p1.y - 1, p2.x + 1, p2.y + 1, border);
-
- grx_box(p1.x, p1.y, p2.x, p2.y, BLACK);
- amp = round( var * (float)((p2.x - p1.x)/2) / max );
- if (amp >= 0)
- grx_box((p1.x+p2.x)/2, p1.y, ((p1.x+p2.x)/2)+amp, p2.y, color);
- else
- grx_box((p1.x+p2.x)/2+amp, p1.y, ((p1.x+p2.x)/2), p2.y, color);
- grx_line((p1.x+p2.x)/2, p1.y-2, (p1.x+p2.x)/2, p2.y+2, border);
-
- sem_post(&grx_mutex);
-}
-
-/* ------------------------------------------------------------------ */
-
-void cmd_display()
-{
- point p1;
-
- p1.x = TRACK_X1;
- p1.y = TRACK_Y2+3;
-
- sem_wait(&grx_mutex);
- grx_rect(p1.x, p1.y, p1.x+CMD_WIDTH, p1.y+CMD_HEIGHT, BLUE);
- grx_rect(p1.x+1, p1.y+1, p1.x+CMD_WIDTH-1, p1.y+CMD_HEIGHT-1, CYAN);
- grx_rect(p1.x+2, p1.y+2, p1.x+CMD_WIDTH-2, p1.y+CMD_HEIGHT-2, LIGHTBLUE);
- grx_text("## Another Unuseful Track simulatOr ##",
- p1.x+8, p1.y+8, YELLOW, BLACK);
- grx_text("## -------------------------------- ##",
- p1.x+8, p1.y+16, YELLOW, BLACK);
- grx_text("Marco Dallera", p1.x+8, p1.y+24, GREEN, BLACK);
- grx_text("marchicchio@libero.it", p1.x+120, p1.y+24, GREEN, BLACK);
- grx_text("Marco Fiocca", p1.x+8, p1.y+32, GREEN, BLACK);
- grx_text("marqinho@tiscalinet.it", p1.x+120, p1.y+32, GREEN, BLACK);
-
- grx_text("Command keys ", p1.x+8, p1.y+48, LIGHTBLUE, BLACK);
- grx_text("------------------------", p1.x+8, p1.y+56, LIGHTBLUE, BLACK);
- grx_text("h create a HARD car", p1.x+8, p1.y+64, CYAN, BLACK);
- grx_text("s create a SOFT car", p1.x+8, p1.y+72, CYAN, BLACK);
- grx_text("ENTER exit to DOS", p1.x+8, p1.y+80, CYAN, BLACK);
-
- sem_post(&grx_mutex);
-
-}
-
-/* ------------------------------------------------------------------ */
-
Index: rel_1_2/auto/makefile
===================================================================
--- rel_1_2/auto/makefile (revision 1198)
+++ rel_1_2/auto/makefile (nonexistent)
@@ -1,22 +0,0 @@
-#
-# Auto Makefile
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= auto auto2 auto3
-
-include $(BASE)/config/example.mk
-
-auto:
- make -f $(SUBMAKE) APP=auto INIT= OTHEROBJS="initfil1.o sensor.o control.o keyb.o info.o utils.o tracks.o jetctrl.o" SHARKOPT="__OLDCHAR__ __GRX__"
-
-auto2:
- make -f $(SUBMAKE) APP=auto INIT= OTHEROBJS="initfil2.o sensor.o control.o keyb.o info.o utils.o tracks.o jetctrl.o" SHARKOPT="__OLDCHAR__ __GRX__"
-
-auto3:
- make -f $(SUBMAKE) APP=auto INIT= OTHEROBJS="initfil3.o sensor.o control.o keyb.o info.o utils.o tracks.o edfact.o jetctrl.o" SHARKOPT="__OLDCHAR__ __GRX__"
-
Index: rel_1_2/auto/utils.c
===================================================================
--- rel_1_2/auto/utils.c (revision 1198)
+++ rel_1_2/auto/utils.c (nonexistent)
@@ -1,131 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: utils.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-#include "include/auto.h"
-#include "include/utils.h"
-#include <string.h>
-#include <stdlib.h>
-
-float rand_01()
-{
- return (((float)(rand()%20) / 100.0) + 0.8);
-}
-
-int rand_color()
-{
- return (rand()%16);
-}
-
-int round(float value)
-{
- return ((int)(value + 0.5));
-}
-
-void reverse(char s[]) {
- int c, i, j;
-
- for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
- c = s[i];
- s[i] = s[j];
- s[j] = c;
- }
-}
-
-char * itoa(int n, char *s) {
- int i, sign;
-
- if ((sign = n) < 0)
- n = -n;
- i = 0;
-
- do {
- s[i++] = n % 10 + '0';
- } while ((n /= 10) > 0);
-
- if (sign < 0)
- s[i++] = '-';
- s[i] = 0;
-
- reverse(s);
-
- return s;
-}
-
-time int2time(int t)
-{
- time ts;
-
- ts.dec = t % 10;
- ts.sec = (t/10) % 60;
- ts.min = (int)(t / 600);
-
- return ts;
-}
-
-
-
-
-
-
-
-
-
-
-
Index: rel_1_2/auto/include/utils.h
===================================================================
--- rel_1_2/auto/include/utils.h (revision 1198)
+++ rel_1_2/auto/include/utils.h (nonexistent)
@@ -1,76 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: utils.h,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------------ */
-/* Useful functions */
-/* ------------------ */
-
-#ifndef __UTILS_H_
-
-#define __UTILS_H_
-
-float rand_01();
-int rand_color();
-int round(float value);
-char * itoa(int n, char *s);
-void reverse(char s[]);
-time int2time(int t);
-
-#endif
Index: rel_1_2/auto/include/const.h
===================================================================
--- rel_1_2/auto/include/const.h (revision 1198)
+++ rel_1_2/auto/include/const.h (nonexistent)
@@ -1,141 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: const.h,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------------ */
-/* Useful constants */
-/* ------------------ */
-
-#ifndef __CONST_H_
-
-#define __CONST_H_
-
-/* Screen dimensions */
-#define SCREEN_WIDTH 800
-#define SCREEN_HEIGHT 600
-#define SCREEN_BIT_COLORS 8
-
-/* Visible area */
-#define TEL_WIDTH 50
-#define TEL_HEIGHT 50
-
-/* Car dimensions */
-#define CAR_WIDTH 12
-#define CAR_HEIGHT 12
-#define CAR_W 8
-#define CAR_H 10
-
-/* Track dimensions */
-#define TRACK_WIDTH 500
-#define TRACK_HEIGHT 500
-
-/* Track position */
-#define TRACK_X1 0
-#define TRACK_Y1 0
-#define TRACK_X2 TRACK_X1+TRACK_WIDTH-1
-#define TRACK_Y2 TRACK_Y1+TRACK_HEIGHT-1
-
-/* Max number of car on track */
-#define MAX_CAR_NUMBER 10
-#define DRIVERS_NUMBER 20
-#define MAX_DRIVER_NAME_LENGTH 20
-#define MAX_TRACK_NAME_LENGTH 20
-#define TRACK_NUMBER 4
-
-/* Lap direction */
-#define CLOCK 0
-#define ANTICLOCK 1
-
-/* Information display coords */
-#define CMD_WIDTH TRACK_WIDTH
-#define CMD_HEIGHT (SCREEN_HEIGHT-TRACK_HEIGHT-3)
-
-/* Car position limits */
-#define MIN_CAR_X (TRACK_X1 + CAR_WIDTH/2 + 4)
-#define MIN_CAR_Y (TRACK_Y1 + CAR_HEIGHT/2 + 4)
-#define MAX_CAR_X (TRACK_X2 - CAR_WIDTH/2 - 4)
-#define MAX_CAR_Y (TRACK_Y2 - CAR_HEIGHT/2 - 4)
-
-/* Road constants */
-#define LEFT_ONLY 10
-#define RIGHT_ONLY 11
-#define ROAD_OK 12
-#define NO_ROAD 13
-
-/* Collision constants */
-#define COLLISION_LEFT 20
-#define COLLISION_RIGHT 21
-#define COLLISION_BACK 22
-#define NO_COLL 0
-
-/* CAB constants */
-#define ROAD_MSG_DIM sizeof(road_info)
-#define ROAD_MSG_READER 4
-
-#define CAR_MSG_DIM sizeof(car_status)
-#define CAR_MSG_READER 5
-
-/* Tasks parameters */
-#define SENSOR_WCET 3000
-#define SENSOR_PERIOD 40000
-#define CONTROL_WCET 1000
-#define CONTROL_PERIOD 40000
-
-#endif
-
Index: rel_1_2/auto/include/auto.h
===================================================================
--- rel_1_2/auto/include/auto.h (revision 1198)
+++ rel_1_2/auto/include/auto.h (nonexistent)
@@ -1,188 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: auto.h,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------------- */
-/* Useful structures */
-/* ------------------- */
-
-#ifndef __CAR_H_
-
-#define __CAR_H_
-
-#include <modules/cabs.h>
-#include <kernel/func.h>
-#include <kernel/model.h>
-#include <kernel/types.h>
-#include <drivers/keyb.h>
-#include <drivers/glib.h>
-#include <semaphore.h>
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "const.h"
-
-#define degree_to_rad(a) ((M_PI/180.0)*(a))
-#define rad_to_degree(a) ((180.0/M_PI)*(a))
-
-typedef struct {
- int x;
- int y;
-} point;
-
-typedef struct {
- float x,y;
-} point_f;
-
-typedef struct {
- float mod;
- float phase;
-} vector;
-
-typedef struct {
- point_f pos;
- float orient;
-} car_status;
-
-typedef struct {
- int left_border;
- int right_border;
- int distance;
- float curve;
- point opps_list[MAX_CAR_NUMBER];
- int opps_number;
- int collision;
- int flag;
-} road_info;
-
-typedef struct {
- int left,center,right;
-} road_strip;
-
-typedef struct {
- PID sensor_pid,control_pid;
- int number;
- char driver[MAX_DRIVER_NAME_LENGTH];
- float max_speed, min_acc, max_acc;
- float rage;
- CAB road_status_cab;
- CAB car_status_cab;
- int color;
-} car_params;
-
-typedef struct {
- char name[MAX_TRACK_NAME_LENGTH]; // il nome del file
- point pole_pos; // la posizione di partenza
- float pole_orient; // la direzione di partenza
- int lap; // il senso di marcia: CLOCK, ANTICLOCK
- int selected; // it's a flag marking the actually selected track
-} track;
-
-typedef struct {
- int min;
- int sec;
- int dec;
-} time;
-
-extern car_params cars[MAX_CAR_NUMBER];
-extern char track_img[TRACK_WIDTH*TRACK_HEIGHT];
-extern track track_list[TRACK_NUMBER];
-
-/* ---------------------------------------- */
-/* Functions definition */
-/* ---------------------------------------- */
-
-/* CABs R/W functions */
-int set_car_status(car_status, CAB); // sends the new status according to the control law
-car_status get_car_status(CAB); // reads car status from a CAB
-int set_road_info(road_info, CAB); // sends the new road informations
-road_info get_road_info(CAB); // reads road status values from a CAB
-
-/* Keyboard functions */
-void keyb_handler();
-void endfun(KEY_EVT *);
-void my_close(void *);
-
-/* Display functions */
-void bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name);
-void bidir_bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name);
-void cmd_display();
-
-/* Closing function */
-void byebye();
-void error_msg();
-
-/* Tasks */
-TASK sensor(); // Camera car task
-TASK control(); // Car controller task
-TASK manual(); // Manual driving task
-TASK actuator(); // Graphic drawing task
-TASK info(); // Car informations display task
-
-/* Tasks management */
-void hard_car_create();
-void soft_car_create();
-void killcar();
-
-/* Tracks management */
-int track_init();
-
-#endif
-
Index: rel_1_2/robots/lab3.txt
===================================================================
--- rel_1_2/robots/lab3.txt (revision 1198)
+++ rel_1_2/robots/lab3.txt (nonexistent)
@@ -1,11 +0,0 @@
-3
-540 380 15 270
-510 380 15 270
-480 380 15 270
-380 300 400 5
-430 060 460 400 0
-350 100 430 130 0
-000 100 300 130 0
-150 200 430 230 0
-120 300 150 400 0
-
Index: rel_1_2/robots/initfile.c
===================================================================
--- rel_1_2/robots/initfile.c (revision 1198)
+++ rel_1_2/robots/initfile.c (nonexistent)
@@ -1,104 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:43 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:43 $
- ------------
-**/
-
-/*
- * Copyright (C) 2001 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 2000
-
-void read_cfgfile(int);
-
-int argc;
-char *argv[100];
-
-void read_cfg_file(int argc, char **argv);
-
-int main(int argc, char **argv);
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(0);
- CBS_register_level(0, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- __compute_args__(mb, &argc, argv);
-
- read_cfg_file(argc, argv);
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- KEYB_init(&kparms);
-
- return (void *)main(argc,argv);
-}
Index: rel_1_2/robots/lab1m.txt
===================================================================
--- rel_1_2/robots/lab1m.txt (revision 1198)
+++ rel_1_2/robots/lab1m.txt (nonexistent)
@@ -1,9 +0,0 @@
-1
-540 380 15 270
-380 300 400 5
-430 060 460 400 0
-350 100 430 130 0
-000 100 300 130 0
-150 200 430 230 0
-120 300 150 400 0
-
Index: rel_1_2/robots/mouse2.c
===================================================================
--- rel_1_2/robots/mouse2.c (revision 1198)
+++ rel_1_2/robots/mouse2.c (nonexistent)
@@ -1,933 +0,0 @@
-/*--------------------------------------------------------------*/
-/* Title: Mouse */
-/* Autor: João Capucho */
-/* Date: 9/12/2000 */
-/* Description: */
-/* Simulation of small automats based on the */
-/* "micro-rato" conteste */
-/*--------------------------------------------------------------*/
-
-/*
- * Copyright (C) 2001 João Capucho
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-// Includes
-#include <ll/i386/x-dos.h>
-#include <kernel/kern.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <math.h>
-#include <stdlib.h>
-#include <limits.h>
-
-#define sqr(x) (x*x)
-
-// Error Types
-#define OK 0
-#define MEMORY_ERROR -1
-#define ILEGAL_PARAMETER -2
-
-// Types of sensors and motors
-#define NONE 0
-#define OBSTACLE 1
-#define BEACON 2
-#define GROUND 3
-#define STEP 4
-
-// Maze limits
-#define LAB_XMIN 40
-#define LAB_XMAX 600
-#define LAB_YMIN 40
-#define LAB_YMAX 440
-
-#define MOTOR_RIGHT 1
-#define MOTOR_LEFT 0
-
-#define BACKCOLOR 0 // Background color
-#define OUTCOLOR 14 // Color of the outside walls
-#define FINISHCOLOR 7 // Finishin area color
-#define NONBLOCKCOLOR 14 // Non block boxs
-#define BLOCKCOLOR 13 // Block boxs
-
-#define BOX_BLOCK 1 // The box blocks the beacon
-#define BOX_NON_BLOCK 2 // The box doesn´t block the beacon
-
-#define MAX_MOUSES 5 // Maximum of mouses in the Maze
-#define MAX_BOXS 100 // Maximum of boxs in the Maze
-#define MAX_SENSORS 20 // Maximum of sensors in each mouse
-#define SENSOR_MIN_GROUND 0 // Minimum value of a ground sensor
-#define SENSOR_MAX_GROUND 255 // Maximum value of a ground sensor
-#define SENSOR_MIN_OBSTACLE 77 // Minimum value of a obstacle sensor
-#define SENSOR_MAX_OBSTACLE 128 // Maximum value of a obstacle sensor
-#define SENSOR_MIN_BEACON 77 // Minimum value of a beacon sensor
-#define SENSOR_MAX_BEACON 128 // Maximum value of a beacon sensor
-#define BEACON_INTENSITY 400 // Maximun intensity of the beacon
-
-#define MOUSE_PERIOD 20000 // Period
-#define CALC_PERIOD 2000 // Period
-#define REFEREE_PERIOD 1000 // Period of the referee
-#define REDRAW_MOUSE_PERIOD 25000 // Period for redraw mouse
-#define REDRAW_MAZE_PERIOD 100000 // Period for redraw maze
-#define MOUSEGROUP 511
-
-struct SENSOR
-{
- int Type; // Tipe of sensor ( None - Obstacle - Beacon - Ground)
- int Radius; // Distance from de center of the mouse
- int Pos_Angle; // Angle between the sensor and the front of the mouse
- int Dir; // Angle between the direction of the sensores and the front of the mouse
- int Angle; // Half angle of visual field (between (Dir-Angle) and (Dir+Angle))
- int Intensity; // Sensativity of the sensor
- float Value; // Last value readed
-};
-
-struct MOTOR
-{
- int Radius; // Distance from de center of the mouse
- int V; // Current velocity
- float Old_V; // Previews velocity
-};
-
-struct MOUSE
-{
- float X, Y; // Current position of the center
- float Old_X, Old_Y; // Previous position of the center
- int Radius; // Size of the mouse ( every mouse is considered round )
- float Dir; // Points to the front
- float Old_Dir; // Previous front
- int NSensors; // Number of sensors in the mouse
- struct SENSOR Sensors[MAX_SENSORS]; // Pointer to the structer that contains the information of the sensors
- struct MOTOR Motors[2]; // Pointer to the structer that contains the information of the motors
- WORD NColision; // Total of colisions
- WORD PColision; // Auxiliar for colisions
- char Flag; // Initialization flag
-};
-
-
-
-struct BOX // Structer that represents the obstacles
-{ //in this case all the obstacles are boxs
- int Type; // Type of the obstatcle
- int X1, Y1, X2, Y2; // position of the box
-};
-
-struct SBEACON // Beacon information
-{
- int Intensity; // Intensity of the beacon
- int X, Y; // position of the beacon
-};
-
-struct MAZE
-{
- int X1, Y1, X2, Y2; // limites of the maze
- int NBoxs; // Number of objstacles in the maze
- struct BOX Boxs[MAX_BOXS]; // Information about all thr obstacles
- struct SBEACON Beacon; // Beacon data
- int Radius; // Size of the finishing area
-};
-
-int Seno[360+90]; // Sine table
-int Tang[180]; // Tangente table
-int NMouses=0;
-struct MOUSE Mouse[MAX_MOUSES]; // Global variable that represents all the mouses
-struct MAZE Maze; // Global variable that represents the maze
-
-// Init_Maze - Initialize the Maze
-// Beacon_X - Coordinate X of the beacon
-// Beacon_Y - Coordinate Y of the beacon
-// Intensity - Intensity of the beacon
-// NBoxs - Number of boxs in the maze
-// Return: OK - Sucess
-
-int Init_Maze(int Beacon_X, int Beacon_Y, int Intensity, int NBoxs)
-{
- int i;
- Maze.X1=LAB_XMIN;
- Maze.Y1=LAB_YMIN;
- Maze.X2=LAB_XMAX;
- Maze.Y2=LAB_YMAX;
- Maze.Beacon.X=Beacon_X+LAB_XMIN;
- Maze.Beacon.Y=Beacon_Y+LAB_YMIN;
- if (Intensity<BEACON_INTENSITY)
- Maze.Beacon.Intensity=Intensity;
- else
- Maze.Beacon.Intensity=BEACON_INTENSITY;
- if (NBoxs<MAX_BOXS)
- Maze.NBoxs=NBoxs;
- else
- Maze.NBoxs=MAX_BOXS;
- Maze.Radius=50;
- for(i=0; i < Maze.NBoxs; i++)
- Maze.Boxs[i].Type=NONE;
- return OK;
-}
-
-// Init_Box - Initialize data of the NBox obstacle
-// NBox - Identifier of the obstacle
-// X1 - Coordinate X
-// Y1 - Coordinate Y
-// X2 - Coordinate X
-// Y2 - Coordinate Y
-// Type - Type of the obstacle
-// Return: OK - Sucess
-
-int Init_Box(int NBox, int X1, int Y1, int X2, int Y2, int Type)
-{
- Maze.Boxs[NBox].Type=Type;
- if (X1<X2)
- {
- Maze.Boxs[NBox].X1=X1+LAB_XMIN;
- Maze.Boxs[NBox].X2=X2+LAB_XMIN;
- }
- else
- {
- Maze.Boxs[NBox].X1=X2+LAB_XMIN;
- Maze.Boxs[NBox].X2=X1+LAB_XMIN;
- }
- if (Y1<Y2)
- {
- Maze.Boxs[NBox].Y1=Y1+LAB_YMIN;
- Maze.Boxs[NBox].Y2=Y2+LAB_YMIN;
- }
- else
- {
- Maze.Boxs[NBox].Y1=Y2+LAB_YMIN;
- Maze.Boxs[NBox].Y2=Y1+LAB_YMIN;
- }
- return OK;
-}
-
-// Draw_Maze - Draws the outline of the maze and the obstacles
-// Return: OK - Sucess
-int Draw_Maze(void)
-{
- int i;
- grx_rect( Maze.X1, Maze.Y1, Maze.X2, Maze.Y2, OUTCOLOR);
- grx_rect( Maze.X1-1, Maze.Y1+1, Maze.X2+1, Maze.Y2+1, OUTCOLOR);
- grx_rect( Maze.X1-2, Maze.Y1+2, Maze.X2+2, Maze.Y2+2, OUTCOLOR);
- grx_circle(Maze.Beacon.X, Maze.Beacon.Y, Maze.Radius, FINISHCOLOR);
- grx_disc(Maze.Beacon.X, Maze.Beacon.Y, 10, 7);
- for (i=0; i<Maze.NBoxs; i++)
- {
- if (Maze.Boxs[i].Type==BOX_NON_BLOCK)
- grx_box(Maze.Boxs[i].X1, Maze.Boxs[i].Y1,
- Maze.Boxs[i].X2, Maze.Boxs[i].Y2, NONBLOCKCOLOR);
- if (Maze.Boxs[i].Type==BOX_BLOCK)
- grx_box(Maze.Boxs[i].X1, Maze.Boxs[i].Y1,
- Maze.Boxs[i].X2, Maze.Boxs[i].Y2, BLOCKCOLOR);
- }
- return OK;
-}
-
-int Init_Motor(int NMouse, int Motor, int Radius)
-{
- if ((NMouse<0) || (NMouse>=MAX_MOUSES))
- return ILEGAL_PARAMETER;
- if ((Motor<0) || (Motor>=2))
- return ILEGAL_PARAMETER;
- Mouse[NMouse].Motors[Motor].Radius=Radius;
- Mouse[NMouse].Motors[Motor].V=0;
- Mouse[NMouse].Motors[Motor].Old_V=0.0;
- return OK;
-}
-
-// Init_Mouse - inicialize the parameters of each mouse
-// NMouse - Identifier of the mouse
-// X - Coordinate X of the center
-// Y - Coordinate Y of the center
-// Radius - Radius of the mouse (size)
-// Dir - Angle of direction in witch i will start
-// NSensors - Number of sensors in the mouse (all types)
-//
-// Return: OK - Sucess
-// ILEGAL_PARAMETER - If NMouse negative of greater than maximum number of mouses
-// Note: All the types of sensors and motors are initialize to NONE
-
-int Init_Mouse(int NMouse, int X, int Y, int Radius, int Dir, int NSensors)
-{
- int i;
- if ((NMouse<0) || (NMouse>=MAX_MOUSES))
- return ILEGAL_PARAMETER;
- if ((NSensors<0) || (NSensors>MAX_SENSORS))
- return ILEGAL_PARAMETER;
- Mouse[NMouse].X=(float)X+LAB_XMIN;
- Mouse[NMouse].Y=(float)Y+LAB_YMIN;
- Mouse[NMouse].Radius=Radius;
- Mouse[NMouse].Dir=Dir;
- Mouse[NMouse].Old_Dir=Mouse[NMouse].Dir;
- Mouse[NMouse].NSensors=NSensors;
- Mouse[NMouse].Old_X=Mouse[NMouse].X;
- Mouse[NMouse].Old_Y=Mouse[NMouse].Y;
- Mouse[NMouse].NColision=0;
- Mouse[NMouse].PColision=0;
- for(i=0; i < Mouse[NMouse].NSensors; i++)
- Mouse[NMouse].Sensors[i].Type=NONE;
-
- Init_Motor(NMouse, MOTOR_LEFT, 10);
- Init_Motor(NMouse, MOTOR_RIGHT, -10);
-
- return OK;
-}
-
-// Init_Sensor - Initializes the sensor information
-// NMouse - Identifier of the mouse
-// Sensor - Identifier of the sensor to be used
-// Type - Type of sensor ( Ground, obstacle or beacon sensor )
-// Radius and Pos_Angle - Polar coordinates to determen the sensor position
-// Dir - Diretion of the sensor ( angle between the front and the sensor )
-// Angle - Half of the visual range
-// Intensity - Maximun distance of detect
-int Init_Sensor(int NMouse, int Sensor, int Type, int Radius,
- int Pos_Angle, int Dir, int Angle, int Intensity)
-{
- if ((NMouse<0) || (NMouse>=MAX_MOUSES))
- return ILEGAL_PARAMETER;
- if ((Sensor<0) || (Sensor>=Mouse[NMouse].NSensors))
- return ILEGAL_PARAMETER;
- Mouse[NMouse].Sensors[Sensor].Type=Type;
- Mouse[NMouse].Sensors[Sensor].Radius=Radius;
- Mouse[NMouse].Sensors[Sensor].Pos_Angle=Pos_Angle;
- Mouse[NMouse].Sensors[Sensor].Dir=Dir;
- Mouse[NMouse].Sensors[Sensor].Angle=Angle;
- Mouse[NMouse].Sensors[Sensor].Intensity=Intensity;
- if (Type == GROUND)
- Mouse[NMouse].Sensors[Sensor].Value=(float)SENSOR_MIN_GROUND;
- if (Type == OBSTACLE)
- Mouse[NMouse].Sensors[Sensor].Value=(float)SENSOR_MIN_OBSTACLE;
- if (Type == BEACON)
- Mouse[NMouse].Sensors[Sensor].Value=(float)SENSOR_MIN_BEACON;
- return OK;
-}
-
-int Set_Motor_Vel(int NMouse, int NMotor, int Vel)
-{
- if ((NMouse<0) || (NMouse>=MAX_MOUSES))
- return ILEGAL_PARAMETER;
- if ((NMotor<0) || (NMotor>2))
- return ILEGAL_PARAMETER;
- Mouse[NMouse].Motors[NMotor].V=Vel;
- return OK;
-}
-
-int Read_Sensor(int NMouse, int NSensor)
-{
- int X, Y, Dir, cr, sr, AuxX, AuxY;
- int Count, AuxCount, AngCount, AuxAngCount, RetColor, Intensity;
- float Auxf;
-
- /* Inicial verifications */
- if ((NMouse<0) || (NMouse>=MAX_MOUSES))
- return ILEGAL_PARAMETER;
- if ((NSensor<0) || (NSensor>Mouse[NMouse].NSensors))
- return ILEGAL_PARAMETER;
-
- /* If Sensor Not define exit */
- if ( Mouse[NMouse].Sensors[NSensor].Type == NONE )
- return OK;
-
- /* Calculate de position of the sensor and is direction */
- Dir=(int)Mouse[NMouse].Old_Dir+Mouse[NMouse].Sensors[NSensor].Dir;
- if (Dir >= 360)
- Dir -= 360;
- if (Dir < 0)
- Dir += 360;
- X= Mouse[NMouse].Old_X*65536.0+((Mouse[NMouse].Sensors[NSensor].Radius*Seno[Dir+90]));
- Y= Mouse[NMouse].Old_Y*65536.0+((Mouse[NMouse].Sensors[NSensor].Radius*Seno[Dir]));
-
- /* if the Sensor type is OBSTACLE */
- if ( Mouse[NMouse].Sensors[NSensor].Type == OBSTACLE )
- {
- Intensity=Mouse[NMouse].Sensors[NSensor].Intensity;
- AuxCount=Intensity;
- /* Scan all the visual field */
- for (AngCount=(-Mouse[NMouse].Sensors[NSensor].Angle);
- AngCount<=Mouse[NMouse].Sensors[NSensor].Angle;
- AngCount++)
- {
- AuxAngCount=Dir+AngCount;
- if (AuxAngCount >= 360)
- AuxAngCount -= 360;
- if (AuxAngCount < 0)
- AuxAngCount += 360;
- sr=Seno[AuxAngCount];
- cr=Seno[AuxAngCount+90];
- Count=Mouse[NMouse].Radius-Mouse[NMouse].Sensors[NSensor].Radius+2;
- AuxX = X+cr*Count;
- AuxY = Y+sr*Count;
- for (; Count<=AuxCount; Count++)
- {
- AuxX += cr;
- AuxY += sr;
- RetColor = grx_getpixel(AuxX >> 16, AuxY >> 16);
- if ((RetColor != BACKCOLOR)&&(RetColor != FINISHCOLOR))
- AuxCount=Count;
- }
- }
- Count=Mouse[NMouse].Sensors[NSensor].Intensity;
- Count*=Count;
- AuxCount*=AuxCount;
- Count = SENSOR_MAX_OBSTACLE-((SENSOR_MAX_OBSTACLE-SENSOR_MIN_OBSTACLE)
- *AuxCount)/Count;
- Mouse[NMouse].Sensors[NSensor].Value=
- (0.5*Mouse[NMouse].Sensors[NSensor].Value+0.5*(float)Count);
- }
- if ( Mouse[NMouse].Sensors[NSensor].Type == GROUND )
- {
- Mouse[NMouse].Sensors[NSensor].Value=(float)SENSOR_MIN_GROUND;
- AuxX=abs((X>>16)-Maze.Beacon.X);
- AuxY=abs((Y>>16)-Maze.Beacon.Y);
- if ((AuxX>50) || (AuxY>50))
- return OK;
- if ((AuxX*AuxX+AuxY*AuxY)<Maze.Radius*Maze.Radius)
- Mouse[NMouse].Sensors[NSensor].Value=(float)SENSOR_MAX_GROUND;
- }
-
- if ( Mouse[NMouse].Sensors[NSensor].Type == BEACON )
- {
- AuxX=(X>>16)-Maze.Beacon.X;
- AuxY=(Y>>16)-Maze.Beacon.Y;
- AngCount=0;
- if (AuxX!=0)
- {
- AuxAngCount=(AuxY<<16)/AuxX;
- if (AuxAngCount<0)
- AngCount=90;
- for (Count=AngCount;Count<AngCount+90;Count++)
- {
- if ((Tang[Count]<=AuxAngCount) && (Tang[Count+1]>AuxAngCount))
- break;
- }
- }
- else
- Count=90;
- if (AuxY<0)
- Count+=180;
- AuxAngCount=abs(180-abs(Dir-Count));
- Count=SENSOR_MIN_BEACON;
- if (AuxAngCount<Mouse[NMouse].Sensors[NSensor].Angle)
- {
- Count=AuxX*AuxX+AuxY*AuxY;
- AuxCount=(int)((float)Maze.Beacon.Intensity*(1.0+(0.4*(float)AuxAngCount)/(float)Mouse[NMouse].Sensors[NSensor].Angle));
- AuxCount*=AuxCount;
- if (Count<AuxCount)
- Count = SENSOR_MAX_OBSTACLE-((SENSOR_MAX_OBSTACLE-SENSOR_MIN_OBSTACLE)*Count)/AuxCount;
- else
- Count=SENSOR_MIN_BEACON;
- }
- Auxf=0.5*((float)Count);
- Auxf+=0.5*((float)Mouse[NMouse].Sensors[NSensor].Value);
- Mouse[NMouse].Sensors[NSensor].Value=Auxf;
- }
- return OK;
-}
-
-int GetSensor(int NMouse, int NSensor)
-{
- if ((NMouse<0) || (NMouse>=MAX_MOUSES))
- return ILEGAL_PARAMETER;
- if ((NSensor<0) || (NSensor>Mouse[NMouse].NSensors))
- return ILEGAL_PARAMETER;
- return (int)Mouse[NMouse].Sensors[NSensor].Value;
-}
-
-int Draw_Mouse(int NMouse, int Flag)
-{
- int Color;
- if (!Flag)
- Color=BACKCOLOR;
- else
- {
- Mouse[NMouse].Old_X=Mouse[NMouse].X;
- Mouse[NMouse].Old_Y=Mouse[NMouse].Y;
- Mouse[NMouse].Old_Dir=Mouse[NMouse].Dir;
- Color=2;
- }
- grx_circle(Mouse[NMouse].Old_X, Mouse[NMouse].Old_Y, Mouse[NMouse].Radius, Color);
- grx_line(Mouse[NMouse].Old_X, Mouse[NMouse].Old_Y,
- Mouse[NMouse].Old_X+((Mouse[NMouse].Radius*Seno[(int)Mouse[NMouse].Old_Dir+90]) >> 16),
- Mouse[NMouse].Old_Y+((Mouse[NMouse].Radius*Seno[(int)Mouse[NMouse].Old_Dir]) >> 16), Color);
- return OK;
-}
-
-TASK Redraw_Mouse_Task(int NMouse)
-{
- char str[40];
- TIME dwTicks;
- while(1)
- {
- dwTicks=sys_gettime(NULL);
- Draw_Mouse(NMouse, FALSE);
- Draw_Mouse(NMouse, TRUE);
- sprintf(str,"Colision: %4d", (int)Mouse[NMouse].NColision);
- grx_text(str, NMouse*150, 21, 7, 0);
- sprintf(str,"Motor: %4d Sensor 0: %4d Sensor 1: %4d Sensor 2: %4d Sensor 3: %4d",
- (int)Mouse[NMouse].Motors[0].Old_V+(int)Mouse[NMouse].Motors[1].Old_V,
- (int)Mouse[NMouse].Sensors[0].Value, (int)Mouse[NMouse].Sensors[1].Value,
- (int)Mouse[NMouse].Sensors[2].Value, (int)Mouse[NMouse].Sensors[3].Value);
- if (NMouse==0)
- grx_text(str, 1, 1, 7, 0);
- sprintf(str,"Sensor 4: %4d Sensor 5: %4d Ticks: %4d",
- (int)Mouse[NMouse].Sensors[4].Value, (int)Mouse[NMouse].Sensors[5].Value,
- (int)(sys_gettime(NULL)-dwTicks)/1000);
- if (NMouse==0)
- grx_text(str, 1, 11, 7, 0);
- task_endcycle();
- }
-}
-
-TASK Redraw_Maze_Task(void)
-{
- while(1)
- {
- Draw_Maze();
- task_endcycle();
- }
-}
-
-TASK Referee(void)
-{
- int Counter, Box_Min_X, Box_Max_X ,Box_Min_Y, Box_Max_Y;
- int deltaX, deltaY, Radius;
- int Colision;
- int NMouse;
-
- while(1)
- {
- for(NMouse=0;NMouse<NMouses;NMouse++)
- {
- Colision=0;
- Radius=Mouse[NMouse].Radius;
- if(Mouse[NMouse].Y<(Maze.Y1+Radius))
- Colision++;
- if(Mouse[NMouse].Y>(Maze.Y2-Radius))
- Colision++;
- if(Mouse[NMouse].X<(Maze.X1+Radius))
- Colision++;
- if(Mouse[NMouse].X>(Maze.X2-Radius))
- Colision++;
- for(Counter=0; Counter<Maze.NBoxs; Counter++)
- {
- Box_Min_X=Maze.Boxs[Counter].X1-1;
- Box_Max_X=Maze.Boxs[Counter].X2+1;
- Box_Min_Y=Maze.Boxs[Counter].Y1-1;
- Box_Max_Y=Maze.Boxs[Counter].Y2+1;
- Radius=Mouse[NMouse].Radius;
- if(Mouse[NMouse].Y<(Box_Min_Y-Radius))
- continue;
- if(Mouse[NMouse].Y>(Box_Max_Y+Radius))
- continue;
- if(Mouse[NMouse].X<(Box_Min_X-Radius))
- continue;
- if(Mouse[NMouse].X>(Box_Max_X+Radius))
- continue;
- if((Mouse[NMouse].X>=Box_Min_X) && (Mouse[NMouse].X<=Box_Max_X))
- if((Mouse[NMouse].Y>=(Box_Min_Y-Radius))
- && (Mouse[NMouse].Y<=(Box_Max_Y+Radius)))
- Colision++;
- if((Mouse[NMouse].Y>=Box_Min_Y) && (Mouse[NMouse].Y<=Box_Max_Y))
- if((Mouse[NMouse].X>=(Box_Min_X-Radius))
- && (Mouse[NMouse].X<=(Box_Max_X+Radius)))
- Colision++;
- Radius=sqr(Radius);
- deltaX=sqr(Mouse[NMouse].X-Box_Min_X);
- deltaY=sqr(Mouse[NMouse].Y-Box_Min_Y);
- if(deltaX+deltaY<=Radius)
- Colision++;
- deltaY=sqr(Mouse[NMouse].Y-Box_Max_Y);
- if(deltaX+deltaY<=Radius)
- Colision++;
- deltaX=sqr(Mouse[NMouse].X-Box_Max_X);
- deltaY=sqr(Mouse[NMouse].Y-Box_Min_Y);
- if(deltaX+deltaY<=Radius)
- Colision++;
- deltaY=sqr(Mouse[NMouse].Y-Box_Max_Y);
- if(deltaX+deltaY<=Radius)
- Colision++;
- }
- if (Mouse[NMouse].PColision && !Colision)
- Mouse[NMouse].NColision++;
-
- Mouse[NMouse].PColision=Colision;
- }
- task_endcycle();
- }
- return (void *)0;
-}
-
-TASK Calculate_Position(int NMouse)
-{
- float w, v, dt;
- int b;
- while(1)
- {
- b=(Mouse[NMouse].Motors[MOTOR_LEFT].Radius-
- Mouse[NMouse].Motors[MOTOR_RIGHT].Radius);
- if (b<0)
- b=-b;
- w=(Mouse[NMouse].Motors[MOTOR_LEFT].Old_V-
- Mouse[NMouse].Motors[MOTOR_RIGHT].Old_V);
- w/=(float)b;
- v=(Mouse[NMouse].Motors[MOTOR_LEFT].Old_V+
- Mouse[NMouse].Motors[MOTOR_RIGHT].Old_V);
- v/=2.0;
- dt=CALC_PERIOD/1000000.0;
- Mouse[NMouse].Dir += (180.0*w/PI)*dt;
- if (Mouse[NMouse].Dir >= 360)
- Mouse[NMouse].Dir -= 360;
- if (Mouse[NMouse].Dir < 0)
- Mouse[NMouse].Dir += 360;
- v *= dt/65536.0;
- b=(float)Seno[(int)Mouse[NMouse].Dir+90];
- Mouse[NMouse].X += v*b;
- b=(float)Seno[(int)Mouse[NMouse].Dir];
- Mouse[NMouse].Y += v*b;
- Mouse[NMouse].Motors[0].Old_V=
- (0.8187*Mouse[NMouse].Motors[0].Old_V+
- 0.1813*(float)Mouse[NMouse].Motors[0].V);
- Mouse[NMouse].Motors[1].Old_V=
- (0.8187*Mouse[NMouse].Motors[1].Old_V+
- 0.1813*(float)Mouse[NMouse].Motors[1].V);
- task_endcycle();
- }
-}
-
-#define SENSOR_LEFT 0
-#define SENSOR_FRONT 1
-#define SENSOR_RIGTH 2
-#define SENSOR_GROUND 3
-#define SENSOR_B_LEFT 4
-#define SENSOR_B_RIGHT 5
-#define MAX_SPEED 50
-#define DIST_DIR GetSensor(NMouse, SENSOR_RIGTH)
-#define DIST_ESQ GetSensor(NMouse, SENSOR_LEFT)
-#define DIST_FRENTE GetSensor(NMouse, SENSOR_FRONT)
-#define FAROL_ESQ GetSensor(NMouse, SENSOR_B_LEFT)
-#define FAROL_DIR GetSensor(NMouse, SENSOR_B_RIGHT)
-#define FAROL_LIM_INF SENSOR_MIN_BEACON+5
-
-#define DIST0 88 //Distancia minima optima
-#define DIST1 DIST0 + 5 // 60%
-#define DIST2 DIST1 + 10 // PARADO
-#define DIST3 DIST2 + 10 // TRAS
-
-#define DISTMAX 120
-#define NENHUM 0
-#define ESQUERDA 1
-#define DIREITA 2
-#define contorno ContornoArr[NMouse]
-
-TASK MouseTask(int NMouse)
-{
- int i;
- //char str[100];
- unsigned char flag;
- static unsigned char ContornoArr[MAX_MOUSES];
- signed char modulo;
-
- Init_Sensor(NMouse, SENSOR_LEFT, OBSTACLE, 14, -45, -45, 25, 15); // Left
- Init_Sensor(NMouse, SENSOR_FRONT, OBSTACLE, 14, 0, 0, 25, 15); // Center
- Init_Sensor(NMouse, SENSOR_RIGTH, OBSTACLE, 14, 45, 45, 25, 15); // Rigth
- Init_Sensor(NMouse, SENSOR_GROUND, GROUND, 10, 180, 180, 0, 20); // Ground
- Init_Sensor(NMouse, SENSOR_B_LEFT, BEACON, 4, -45, -25, 30, 0); // Left
- Init_Sensor(NMouse, SENSOR_B_RIGHT, BEACON, 4, 45, 25, 30, 0); // Rigth
- contorno = NENHUM;
- Mouse[NMouse].Flag=1;
-
- while(1)
- {
- for(i=0; i<8; i++)
- Read_Sensor(NMouse, i);
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED);
- Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED);
-
- flag = ((DIST_DIR>DIST3) && contorno==ESQUERDA) ||
- ((DIST_ESQ>DIST3) && contorno==DIREITA);
-
- if ( (DIST_FRENTE>DISTMAX) || flag) {
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED/2);
- Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED/2);
- if (contorno == ESQUERDA)
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, -MAX_SPEED/2);
- else
- Set_Motor_Vel(NMouse, MOTOR_LEFT, -MAX_SPEED/2);
- }
- else {
-
- // ---------------- Contorno da Esquerda ---------------
- if (contorno!=DIREITA){
- if (DIST_ESQ>DIST1) { // Sensor da esquerda
- contorno = ESQUERDA;
- if (DIST_ESQ>DIST3) {
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, -MAX_SPEED/2);
- Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED/2);
- }
- else
- if (DIST_ESQ>DIST2)
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, 10);
- else
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED*3/4);
- }
- else
- if (contorno== ESQUERDA) {
- if(DIST_ESQ<DIST0)
- Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED*3/10);
- }
- }
-
- // ---------------- Contorno da Direita ---------------
- if (contorno!=ESQUERDA){
- if (DIST_DIR>DIST1) { // Sensor da direita
- contorno = DIREITA;
- if (DIST_DIR>DIST3) {
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED/2);
- Set_Motor_Vel(NMouse, MOTOR_LEFT, -MAX_SPEED/2);
- }
- else
- if (DIST_DIR>DIST2)
- Set_Motor_Vel(NMouse, MOTOR_LEFT, 10);
- else
- Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED*3/4);
- }
- else
- if (contorno== DIREITA) {
- if (DIST_DIR<DIST0)
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED*3/10);
- }
- }
-
- // --------------- Desempancar contornos com o farol ------------
-
- if ((contorno == ESQUERDA && FAROL_DIR > FAROL_ESQ && FAROL_DIR > FAROL_LIM_INF) ||
- (contorno == DIREITA && FAROL_ESQ > FAROL_DIR && FAROL_ESQ > FAROL_LIM_INF) )
- contorno = NENHUM;
-
-
-
- if (contorno == NENHUM)
- {
- modulo = FAROL_DIR - FAROL_ESQ;
- if (modulo < 0 )
- modulo = - modulo;
-
- // Se nao estiver na direçao certa, ajustar
- if (modulo > 10) {
- if (FAROL_DIR > FAROL_ESQ)
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, 0);
- else
- Set_Motor_Vel(NMouse, MOTOR_LEFT, 0);
- }
- else //velocidade controlada
- if (modulo > 2) {
- if (FAROL_DIR > FAROL_ESQ)
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED*6/10);
- else
- Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED*6/10);
- }
- }
- }
- if (GetSensor(NMouse, SENSOR_GROUND)==SENSOR_MAX_GROUND)
- {
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, 0);
- Set_Motor_Vel(NMouse, MOTOR_LEFT, 0);
- }
-
- task_endcycle();
- }
- return (void *)0;
-}
-
-void my_end(void *arg)
-{
- grx_close();
-}
-
-/* --------------------------------- Main program -----------------------------*/
-
-int main(int argc, char *argv[])
-{
- int i;
- char c;
- int pid;
-
- HARD_TASK_MODEL mp;
- SOFT_TASK_MODEL ms;
-
- // char StrAux[15];
-
- for (i=0; i<NMouses; i++)
- Mouse[i].Flag=0;
- for (i=0; i<(360+90); i++) // Inicializar a tabela de senos
- Seno[i]=(int)(65536.0*sin((float)i/180.0*PI));
-
- for (i=0; i<180; i++) // Inicializar a tabela de tangente
- if (i!=90)
- Tang[i]=(int)(((float)Seno[i]/(float)Seno[i+90])*65536.0);
- else
- Tang[i]=INT_MAX;
-
- // Definir fun‡Æo de saida
- sys_atrunlevel(my_end, (void *)NULL, RUNLEVEL_BEFORE_EXIT);
-
- hard_task_default_model(mp);
- hard_task_def_usemath(mp);
- hard_task_def_group(mp, MOUSEGROUP);
- hard_task_def_wcet(mp, 1); // wcet ignored by the configuration file!
-
- soft_task_default_model(ms);
- soft_task_def_group(ms, MOUSEGROUP);
- soft_task_def_met(ms, 1000);
-
- for (i=0;i<NMouses;i++)
- {
- hard_task_def_arg(mp, (void *)i);
- soft_task_def_arg(ms, (void *)i);
-
- hard_task_def_mit(mp, MOUSE_PERIOD);
- pid = task_create("Mouse", MouseTask, &mp, NULL);
- if (pid == NIL)
- {
- perror("Creating Mouse:");
- sys_end();
- }
-
- hard_task_def_mit(mp, CALC_PERIOD);
- pid = task_create("Calc", Calculate_Position, &mp, NULL);
- if (pid == NIL)
- {
- perror("Creating Calc:");
- sys_end();
- }
-
- soft_task_def_period(ms, REDRAW_MOUSE_PERIOD);
- pid = task_create("Redraw_Mouse", Redraw_Mouse_Task, &ms, NULL);
- if (pid == NIL)
- {
- perror("Creating Redraw_Moude:");
- sys_end();
- }
- }
-
- hard_task_def_mit(mp, REFEREE_PERIOD);
- pid = task_create("Referee1", Referee, &mp, NULL);
-
- hard_task_def_mit(mp, REDRAW_MAZE_PERIOD);
- pid = task_create("Redraw_Maze", Redraw_Maze_Task, &mp, NULL);
-
- grx_open(640,480,8);
- group_activate(MOUSEGROUP);
- do
- {
- c = keyb_getch(BLOCK);
- } while (c != ESC);
-
- task_nopreempt();
- sys_end();
- return 0;
-}
-
-/* the buffer b is scannedc to search for numbers
- at the first non-number the function stops */
-void geti(char *b, int *pos, int *res)
-{
- // skip first chars
- while (!isdigit(b[*pos]))
- (*pos)++;
-
-
- // read the numbers
- *res = 0;
- do {
- *res = (*res * 10) + b[*pos] - '0';
- (*pos)++;
- } while (isdigit(b[*pos]));
-}
-
-void read_cfg_file(int argc, char **argv)
-{
- int i, err, Temp1, Temp2, Temp3, Temp4, Temp5;
- DOS_FILE *fp;
- char myfilebuf[1000];
- int myfilebuf_length;
-
- int pos = 0;
-
- if (argc==2) {
- fp = DOS_fopen(argv[1],"r");
-
- if (fp) {
- /* read up to 1000 chars */
- myfilebuf_length = DOS_fread(&myfilebuf,1,1000,fp);
-
- /* check for errors */
- err = DOS_error();
-
- cprintf("Read %d bytes...\n", myfilebuf_length);
-
- if (err) {
- cprintf("Error %d reading file...Using default values\n", err);
- }
- else
- {
- geti(myfilebuf, &pos, &NMouses); // Number of Mouses
- for (i=0;i<NMouses;i++) {
- geti(myfilebuf, &pos, &Temp1); // Mouse X coordinate
- geti(myfilebuf, &pos, &Temp2); // Mouse Y coordinate
- geti(myfilebuf, &pos, &Temp3); // Mouse radius
- geti(myfilebuf, &pos, &Temp4); // Mouse orientation
- Init_Mouse(i, Temp1, Temp2, Temp3, Temp4, 6);
- }
- geti(myfilebuf, &pos, &Temp1); // Beacon X coordinate
- geti(myfilebuf, &pos, &Temp2); // Beacon Y coordinate
- geti(myfilebuf, &pos, &Temp3); // Beacon intensity
- geti(myfilebuf, &pos, &i); // Number of boxs
- Init_Maze(Temp1, Temp2, Temp3, i);
- for(; i>0; i--) {
- geti(myfilebuf, &pos, &Temp1); // Box X1 Coordinate
- geti(myfilebuf, &pos, &Temp2); // Box Y1 Coordinate
- geti(myfilebuf, &pos, &Temp3); // Box X2 Coordinate
- geti(myfilebuf, &pos, &Temp4); // Box Y2 Coordinate
- geti(myfilebuf, &pos, &Temp5); // Type of Box
- if (Temp5)
- Init_Box(i-1, Temp1, Temp2, Temp3, Temp4, BOX_BLOCK);
- else
- Init_Box(i-1, Temp1, Temp2, Temp3, Temp4, BOX_NON_BLOCK);
- }
- DOS_fclose(fp);
- return;
- }
- }
- else {
- /* error!! */
- err = DOS_error();
- /* note that if you call DOS_error() here, it return 0!!! */
- cprintf("Error %d opening myfile.txt...Using default values\n", err);
- }
-
- // Default value if no file is passed
- NMouses=2;
- Init_Maze(500, 350, 400, 1);
- Init_Box(0, 200, 200, 300, 250, BOX_NON_BLOCK);
- Init_Mouse(0, 100, 100, 15, 45, 6);
- Init_Mouse(1, 100, 150, 15, 90, 6);
- }
- else {
- cprintf("Wrong number of arguments...\n");
- l1_exit(0);
- }
-}
Index: rel_1_2/robots/lab.txt
===================================================================
--- rel_1_2/robots/lab.txt (revision 1198)
+++ rel_1_2/robots/lab.txt (nonexistent)
@@ -1,10 +0,0 @@
-2
-530 380 15 270
-480 380 15 270
-380 300 400 5
-430 060 460 400 0
-350 100 430 130 0
-000 100 300 130 0
-150 200 430 230 0
-120 300 150 400 0
-
Index: rel_1_2/robots/readme
===================================================================
--- rel_1_2/robots/readme (revision 1198)
+++ rel_1_2/robots/readme (nonexistent)
@@ -1,9 +0,0 @@
-Robots demo
------------
-
-This demo has been developed in the University of Alveiro, Portugal.
-
-See the included PDF files for more informations.
-
-Paolo
-pj@sssup.it
Index: rel_1_2/robots/makefile
===================================================================
--- rel_1_2/robots/makefile (revision 1198)
+++ rel_1_2/robots/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS = mouse2
-
-include $(BASE)/config/example.mk
-
-mouse2:
- make -f $(SUBMAKE) APP=mouse2 INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
-
Index: rel_1_2/eli/initfile.c
===================================================================
--- rel_1_2/eli/initfile.c (revision 1198)
+++ rel_1_2/eli/initfile.c (nonexistent)
@@ -1,100 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:45 $
- ------------
-
- This file is similar to the configuration of Hartik 3.3.1
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/eli/eli.c
===================================================================
--- rel_1_2/eli/eli.c (revision 1198)
+++ rel_1_2/eli/eli.c (nonexistent)
@@ -1,787 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: eli.c,v 1.3 2003-01-07 17:10:16 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.3 $
- Last update: $Date: 2003-01-07 17:10:16 $
- ------------
-
- This file is similar to the configuration of Hartik 3.3.1
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai and ALLEN-DESTRO
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "eli.h"
-
-#include <time.h>
-
-//########################################
-// Definizione variabili globali
-//########################################
-char tastiera;
-long double Forza_x,Forza_y,Velocita_x,Velocita_y,Acc_x,Acc_y,Pos_x,Pos_y;
-long double Pos_pe_y[5];
-long double Pos_pe_x[5];
-long double T1=0;
-long double r;
-int n_peso=0;
-int peso_agganciato[5]={0,0,0,0,0};
-int pre_peso[5]={0,0,0,0,0};
-int libero_peso[5]={0,0,0,0,0};
-PID pid_peso[5];
-PID pid_ruspa[5];
-int x_r=200;
-int n_ruspa=5;
-int indietro;
-int eli_occ=0;
-int kill_p;
-
-//PID pid_r0,pid_r1,pid_r2,pid_r3,pid_r4;
-PID pid_kill_p,pid_pulisci_p,pid_kill_e,pid_pulisci_e;
-
-
-// Definizione del semaforo per l'utilizzo della modalita' grafica
-sem_t mutex;
-sem_t pu;
-
-
-
-
-//#######################################################################
-//############### DEFINIZIONE TASK ######################################
-//#######################################################################
-
-TASK kill_task(int i)
-{ int x,y,dim;
- while (1)
- {
-
- if(i==1)
- {
- x=Pos_pe_x[kill_p];
- y=Pos_pe_y[kill_p];
- dim=25;
- }
- else
- {
- x=Pos_x;
- y=Pos_y;
- dim=35;
- }
-
- PULISCI(x,y,dim);
- ESPLOSIONE(x,y);
-
- sem_wait(&pu);
-
- if(i==1) task_activate(pid_pulisci_p);
- else task_activate(pid_pulisci_e);
-
- task_endcycle();
-
- }
-
-
-}
-
-TASK pulisci(int i)
-{
- int x,y,dim;
- struct timespec delay;
-
- delay.tv_sec=0;
- delay.tv_nsec=3000000;
-
- while (1)
- {
-
- if(i==1)
- {
- x=Pos_pe_x[kill_p];
- y=Pos_pe_y[kill_p];
- dim=25;
- }
- else
- {
- x=Pos_x;
- y=Pos_y;
- dim=35;
- }
-
-
- nanosleep(&delay, NULL);
- PULISCI(x,y,dim);
-
- sem_post(&pu);
-
- task_endcycle();
- }
-}
-
-
-
-
-TASK elicottero(int i)
-{ long double x_old,x_new,y_old,y_new;
- TIME us_old,us_new;
- long double delta_T;
- long double Fx,Fy,Ax,Ay,Vx,Vy,m_el;
- int Destra_old,Destra_new;
- // int uccidi,colore;
- // int prova;
-
- m_el=1;
- Vx=0;Vy=0;
- Ax=0;Ay=0;
- Fx=0;Fy=0-m_el*G; // Fy=0;
- x_old=150;
- y_old=150;
- Destra_old=1;
- Destra_new=1;
-
- us_old=sys_gettime(NULL);
-
- while (1)
- {
-
- // prova=2;
-
-
- us_new=sys_gettime(NULL);
- delta_T=(us_new-us_old)/100000;
- // if(delta_T<0.9) prova=1;
- // if(delta_T<0) prova=4;
- // if(delta_T>1.1) prova=3;
-
-
- delta_T=1;
- Ax=(Fx-(r*Vx))/m_el;
- Ay=(Fy-(r*Vy)+m_el*G+T1)/m_el;
- x_new=x_old+Vx*delta_T+0.5*Ax*delta_T*delta_T;
- y_new=y_old+Vy*delta_T+0.5*Ay*delta_T*delta_T;
-
- // if(prova==1) {x_new=300; y_new=150;}
- // if(prova==3) {x_new=150; y_new=300;}
- // if(prova==2) {x_new=300; y_new=300;}
- // if(prova==4) {x_new=400; y_new=400;}
-
- Vx=Vx+Ax*delta_T;
- Vy=Vy+Ay*delta_T;
- if ((Vx>0)|| ((Vx==0) && (Destra_old==1))) Destra_new=1;
- else Destra_new=0;
-
- if ( ((y_new>=(Y0max-DIM_EL/2-2)) || ( (y_old<=400-DIM_EL/2-2) && (y_new>=400-DIM_EL/2-2) && (x_new>=X0min+151) && (x_new<=X0min+280) )) )
- {
- if ((x_new>=X0min+151) && (x_new<=X0min+280)) y_new=400-DIM_EL/2-2;
- else y_new=Y0max-DIM_EL/2-2;
- Vy=0;
- Vx=0;
- x_new=x_old;
- Ay=0;
- Ax=0;
- }
-
-
-
-
- sem_wait(&mutex);
-
- /*
- uccidi=0;
-
- colore=grx_getpixel(x_new-2*DIM_EL,y_new-DIM_EL);
- if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
- colore=grx_getpixel(x_new+2*DIM_EL,y_new-DIM_EL);
- if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
- colore=grx_getpixel(x_new-2*DIM_EL,y_new+DIM_EL/2);
- if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
- colore=grx_getpixel(x_new+2*DIM_EL,y_new+DIM_EL/2);
- if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
- colore=grx_getpixel(x_new,y_new);
- if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
- */
-
- if ((x_old>100) && (y_old>100) && (x_old<X0max) )
- {
- if (Destra_old==0) {ELICOTTERO_S(x_old,y_old,DIM_EL,COL_SFONDO,COL_SFONDO);}
- else {ELICOTTERO_D(x_old,y_old,DIM_EL,COL_SFONDO,COL_SFONDO);}
- }
-
- if ((x_new>100) && (y_new>100) && (x_new<X0max) )
- {
- /*
- if ( uccidi==1)
- {
- // grx_box(10,10,100,100,RED);
- // task_activate(pid_kill_e);
- // sem_post(&mutex);
- // eli_occ=0;
- sem_post(&mutex);
- task_abort();
- }
- */
-
-
- if (Destra_new==0) {ELICOTTERO_S(x_new,y_new,DIM_EL,COL_EL,COL_SFONDO);}
- else {ELICOTTERO_D(x_new,y_new,DIM_EL,COL_EL,COL_SFONDO);}
- }
- sem_post(&mutex);
-
- if (tastiera=='c') Fx=Fx+0.25;
- if (tastiera=='z') Fx=Fx-0.25;
- if (tastiera=='x') Fy=Fy+0.25;
- if (tastiera=='s') Fy=Fy-0.25;
-
- if (Fx>2) Fx=2;
- if (Fx<-2) Fx=-2;
- if (Fy>0) Fy=0;
- if (Fy<-17.5) Fy=-17.5;
-
- Forza_x=Fx;
- Forza_y=Fy;
- Acc_x=Ax;
- Acc_y=Ay;
- Velocita_x=Vx;
- Velocita_y=Vy;
- Pos_x=x_new;
- Pos_y=y_new;
-
-
- if ( (tastiera=='z') || (tastiera=='x') || (tastiera=='c') || (tastiera=='s') )
- tastiera='q';
-
-
- us_old=us_new;
- x_old=x_new;
- y_old=y_new;
- Destra_old=Destra_new;
-
- task_endcycle();
- }
-}
-
-
-
-TASK peso(int i)
-{
- long double delta_T;
- long double Ay,Vy;
- long double x_new,x_old,y_old,y_new;
- int scelta=0;
- int rit,colore,uccidi;
- double m_peso[5]={0.5,0.4,0.3,0.1,0.6};
- int delta_y1,delta_y2;
-
-
- // PID pid;
- // MODEL m = BASE_MODEL;
-
- Vy=0;
- Ay=0;
-
- x_old=700-DIM_PESO-1;
- y_old=Y0max-DIM_PESO*2-1;
- delta_T=1;
- x_new=700-DIM_PESO-1;
-
- libero_peso[i]=0;
-
- while (1 )
- {
- uccidi=0;
-
- if (scelta==0 )
- {
-
- y_new=y_old;
- if (x_new+DIM_PESO==x_r-1) x_new=x_new-1;
- else x_new=x_new;
- if (indietro==1) {scelta=1; libero_peso[i]=1;}
- }
-
- if (scelta==1 )
- {
- y_new=y_old;
- x_new=x_old;
- if (peso_agganciato[i]==1) scelta=2;
- }
- if (scelta==2)
- {
- eli_occ=1;
- Ay=(m_peso[i]*G-(r*Vy)-T1)/m_peso[i];
- if(peso_agganciato[i]==1) x_new=Pos_x;
- else x_new=x_old;
- y_new=y_old+Vy*delta_T+0.5*Ay*delta_T*delta_T;
- Vy=Vy+Ay*delta_T;
-
- delta_y1=Y0max-y_new;
- delta_y2=400-y_new;
-
- if ( (y_new>=(Y0max-2*DIM_PESO-1)) || ( (y_old<400-2*DIM_PESO-1) && (y_new>=400-2*DIM_PESO-1) && (x_new>=X0min+151-DIM_PESO) && (x_new<=X0min+280+DIM_PESO) ) )
- {
- if ((x_new>=X0min+151-DIM_PESO) && (x_new<=X0min+280+DIM_PESO))
- {
- if (delta_y2<6) uccidi=1;
- y_new=400-2*DIM_PESO-2;
- }
- else {
- if (delta_y1<6) uccidi=1;
- y_new=Y0max-2*DIM_PESO-2;
- }
- Vy=0;
- if(peso_agganciato[i]==0) {scelta=3; rit=0;}
- }
- }
- if (scelta==3)
- {
- x_new=x_new;
- y_new=y_new;
- eli_occ=0;
- if (y_new==400-2*DIM_PESO-2) rit++;
-
-
-
- if (rit==100) {
- peso_agganciato[i]=0;
- pre_peso[i]=0;
- sem_wait(&mutex);
- PESO(x_old,y_old,DIM_PESO,COL_SFONDO);
- sem_post(&mutex);
-
- return NULL;
- }
-
- if(peso_agganciato[i]==1) scelta=2;
- }
-
- sem_wait(&mutex);
-
-
- colore=grx_getpixel(x_new-DIM_PESO,y_new);
- if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
-
- colore=grx_getpixel(x_new+DIM_PESO,y_new);
- if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
-
- colore=grx_getpixel(x_new-DIM_PESO,y_new+2*DIM_PESO);
- if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
-
- colore=grx_getpixel(x_new+DIM_PESO,y_new+2*DIM_PESO);
- if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
-
- colore=grx_getpixel(x_new,y_new+DIM_PESO);
- if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
-
-
-
- if ((x_old>100) && (y_old>100) && (x_old<X0max) )
- {
- PESO(x_old,y_old,DIM_PESO,COL_SFONDO);
- }
-
- y_old=y_new;
- x_old=x_new;
- Pos_pe_y[i]=y_new;
- Pos_pe_x[i]=x_new;
-
-
- if ((x_new>100) && (y_new>100) && (x_new<X0max) )
- {
- if ( uccidi==1)
- {
- kill_p=i;
- task_activate(pid_kill_p);
- sem_post(&mutex);
- eli_occ=0;
- pre_peso[i]=0;
- peso_agganciato[i]=0;
- return NULL;
- }
-
- PESO(x_new,y_new,DIM_PESO,DELTA_COL+i*2);
- }
- sem_post(&mutex);
-
-
- task_endcycle();
- }
-
-
-}
-
-TASK ruspa(int i)
-{
- int x,y,ii;
- int end_peso[5]={370,420,470,520,570};
-
- PID pid;
- HARD_TASK_MODEL m_hard;
-
- pre_peso[i]=1;
-
- hard_task_default_model(m_hard);
- hard_task_def_wcet(m_hard,1); // wcet ignored!!!
- hard_task_def_mit(m_hard,PER_DISEGNA);
- hard_task_def_usemath(m_hard);
- hard_task_def_arg(m_hard,(void *)i);
- pid=task_create("peso2",peso,&m_hard,NULL);
- pid_peso[i]=pid;
- task_activate(pid_peso[i]);
-
-
- x=720;
- y=Y0max;
-
- indietro=0;
- while (x!=end_peso[i]+DIM_PESO)
- {
- sem_wait(&mutex);
- RUSPA_S(x+1,y,COL_SFONDO,COL_SFONDO);
- RUSPA_S(x,y,YELLOW-1,LIGHTBLUE);
- sem_post(&mutex);
- x_r=x;
- x--;
- task_endcycle();
- }
- sem_wait(&mutex);
- RUSPA_S(x+1,y,COL_SFONDO,COL_SFONDO);
- sem_post(&mutex);
- indietro=1;
- while (x!=730 )
- {
- sem_wait(&mutex);
- RUSPA_D(x-1+40,y,COL_SFONDO,COL_SFONDO);
- RUSPA_D(x+40,y,YELLOW-1,LIGHTBLUE);
- sem_post(&mutex);
- x++;
- task_endcycle();
- }
-
- ii=i+1;
-
- while(ii>4)
- {
- n_ruspa=5;
- if(pre_peso[4]==0){
- ii=4;
- if(pre_peso[3]==0){
- ii=3;
- if(pre_peso[2]==0){
- ii=2;
- if(pre_peso[1]==0){
- ii=1;
- if(pre_peso[0]==0){
- ii=0;
- }
- }
- }
- }
- }
- task_endcycle();
-
- }
-
- hard_task_def_arg(m_hard,(void *)ii);
- pid_ruspa[ii]=task_create("ruspa",ruspa,&m_hard,NULL);
- task_activate(pid_ruspa[ii]);
- n_ruspa=ii;
-
- return NULL;
-}
-
-
-
-
-TASK molla(int i)
-{
- double k=0.05;
- double x,x_old,y1_old,y2_old;
- double T1_old; //,T2_old;
-
- x_old=Pos_x;
- y1_old=Pos_y;
- y2_old=Pos_pe_y[n_peso];
-
- while (1)
- {
-
- sem_wait(&mutex);
- if ((x_old>100-DIM_EL) && (y1_old>100-DIM_EL) && (x_old<X0max) )
- {
- MOLLA(x_old,y1_old+DIM_EL,y2_old,COL_SFONDO)
- }
- else if( (y2_old>100) && (x_old<X0max) && (x_old>100) )
- {
- MOLLA(x_old,X0min+100,y2_old,COL_SFONDO)
- }
-
- x_old=Pos_x;
- y1_old=Pos_y;
-
- if(peso_agganciato[n_peso]==0) y2_old=y1_old+20;
- else y2_old=Pos_pe_y[n_peso];
-
- if ((x_old>100) && (y1_old>100-DIM_EL) && (x_old<X0max) )
- {
- MOLLA(x_old,y1_old+DIM_EL,y2_old,RED)
- }
- else if( (y2_old>100) && (x_old<X0max) && (x_old>100))
- {
- MOLLA(x_old,X0min+100,y2_old,RED)
- }
- sem_post(&mutex);
-
- x=y2_old-y1_old;
- x=x-20;
- T1=x*k;
- T1_old=T1;
-
- task_endcycle();
-
- }
-}
-
-TASK seleziona(int i)
-{ int w,deltax,deltay,disegna;
-
- eli_occ=0;
- disegna=0;
-
- while (1)
- {
- disegna=0;
- for (w=0;w<5;w++)
- {
- deltax=Pos_pe_x[w]-Pos_x;
- deltay=Pos_pe_y[w]-Pos_y-DIM_PESO-20+DIM_EL;
- if ( (pre_peso[w]==1) && (eli_occ==0) && (deltax<4) && (deltax>-4) && (deltay<3) && (deltay>-3) )
- {
- disegna=1;
- if ( (tastiera=='p') && (libero_peso[w]==1) )
- {
- eli_occ=1;
- peso_agganciato[w]=1;
- n_peso=w;
-
- }
- }
- }
-
- if(disegna==1)
- {
- sem_wait(&mutex);
- grx_box(X0max-90,Y0min+5,X0max-5,Y0min+95,RED);
- // grx_text("Ok", X0max-40, Y0min+50, COL_TESTO, RED);
- sem_post(&mutex);
- } else
- {
- sem_wait(&mutex);
- grx_box(X0max-95,Y0min+5,X0max-5,Y0min+95,COL_SFONDO);
- sem_post(&mutex);
- }
-
- if(eli_occ==1)
- {
- sem_wait(&mutex);
- grx_box(X0max-90-100,Y0min+5,X0max-5-100,Y0min+95,GREEN);
- // grx_text("Go", X0max-35-100, Y0min+50, COL_TESTO, GREEN);
- sem_post(&mutex);
- } else
- {
- sem_wait(&mutex);
- grx_box(X0max-90-100,Y0min+5,X0max-5-100,Y0min+95,COL_SFONDO);
- sem_post(&mutex);
- }
-
-
- if (tastiera=='l') peso_agganciato[n_peso]=0;
-
- task_endcycle();
-
- }
-}
-
-
-//###############################################################
-// ##
-// Funzione di uscita dal programma ##
-// ##
-//################################################################
-void my_end(KEY_EVT* e)
-{
- //####################################
- // Sezione esecutiva della funzione ##
- //####################################
-
- grx_close();
- cprintf("Ctrl-brk pressed!\n");
- sys_end();
-} // Fine della funzionemy_end
-
-//################################################################
-// ##
-// Funzione di uscita dal programma ##
-// ##
-//################################################################
-void end()
-{
- //####################################
- // Sezione esecutiva della funzione ##
- //####################################
-
- grx_close();
-} // Fine della funzione my_end
-
-
-
-//##############################################################
-// ##
-// Main ##
-// ##
-//##############################################################
-int main()
-{
- //########################################
- // Sezione dichiarativa delle variabili ##
- //########################################
- // Identficativi di task generici
- PID pid0, pid1, pid3, pid5; //, pid2,pid4,pid6;
-
- HARD_TASK_MODEL m_hard;
- NRT_TASK_MODEL m_nrt;
-
- // Ascoltatore di eventi
- KEY_EVT emerg;
- // Contatori
- int j;
-
-
- //####################################
- // Sezione esecutiva del main ##
- //####################################
-
- // Inizializzazione dei parametri hartik
- sem_init(&mutex,0,1);
- sem_init(&pu,0,1);
-
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg, my_end);
- sys_atrunlevel(end, NULL, RUNLEVEL_BEFORE_EXIT);
-
- if (grx_open(800, 600, 8) < 0)
- {
- cprintf("GRX Err\n");
- sys_abort(300);
- }
- cprintf("scheda ok\n");
-
- r=0.1;
-
- /* Disposizione degli elementi grafici statici */
- sem_wait(&mutex);
- draw_static();
- sem_post(&mutex);
-
- // Attivazione dei task
- hard_task_default_model(m_hard);
- hard_task_def_wcet(m_hard,1); // wcet ignored!!!
- hard_task_def_usemath(m_hard);
-
- hard_task_def_mit(m_hard,PER_DISEGNA);
- pid0=task_create("elicottero",elicottero,&m_hard,NULL);
- task_activate(pid0);
-
- hard_task_def_mit(m_hard,PER_DISEGNA);
- pid1=task_create("indicometro",disegna_stato,&m_hard,NULL);
- task_activate(pid1);
-
- hard_task_def_mit(m_hard,PER_MOLLA);
- pid3=task_create("molla",molla,&m_hard,NULL);
- task_activate(pid3);
-
- hard_task_def_mit(m_hard,PER_DISEGNA);
- pid5=task_create("seleziona",seleziona,&m_hard,NULL);
- task_activate(pid5);
-
-
- hard_task_def_mit(m_hard,PER_DISEGNA);
- hard_task_def_arg(m_hard,0);
- pid_ruspa[0]=task_create("ruspa",ruspa,&m_hard,NULL);
- task_activate(pid_ruspa[0]);
- n_ruspa=0;
-
- nrt_task_default_model(m_nrt);
- nrt_task_def_usemath(m_nrt);
- nrt_task_def_arg(m_nrt,0);
- pid_kill_e = task_create("kill_task",kill_task, &m_nrt, NULL);
- pid_pulisci_e = task_create("pulisci",pulisci, &m_nrt, NULL);
-
- nrt_task_def_arg(m_nrt,(void *)1);
- pid_kill_p = task_create("kill_task",kill_task, &m_nrt, NULL);
- pid_pulisci_p = task_create("pulisci",pulisci, &m_nrt, NULL);
-
-
-
-
- do {
- tastiera = keyb_getch(BLOCK);
-
- } while(tastiera!=ESC);
-
- task_kill(pid5);
- task_kill(pid3);
- task_kill(pid1);
- task_kill(pid0);
-
- task_kill(pid_kill_p);
- task_kill(pid_kill_e);
-
- if (n_ruspa!=5) task_kill(pid_ruspa[n_ruspa]);
- for(j=0;j<5;j++) { if (pre_peso[j]==1) task_kill(pid_peso[j]); }
-
- grx_close();
- sys_end();
-
- return 0;
-} // Fine del main
-
-/***************************<Fine del file>*******************************/
Index: rel_1_2/eli/makefile
===================================================================
--- rel_1_2/eli/makefile (revision 1198)
+++ rel_1_2/eli/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= eli
-
-include $(BASE)/config/example.mk
-
-eli:
- make -f $(SUBMAKE) APP=eli INIT= OTHEROBJS="initfile.o draw.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
-
Index: rel_1_2/eli/draw.c
===================================================================
--- rel_1_2/eli/draw.c (revision 1198)
+++ rel_1_2/eli/draw.c (nonexistent)
@@ -1,519 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: draw.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:45 $
- ------------
-
- This file is similar to the configuration of Hartik 3.3.1
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai and ALLEN-DESTRO
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "eli.h"
-
-void draw_static()
-{
- int i;
- /************************************/
- /* Sezione esecutiva della funzione */
- /************************************/
-
- grx_rect(X0min,Y0min,X0max,Y0max,COL_CORNICE);
- // grx_rect(X0min+100,Y0min+100,X0max,Y0max,COL_CORNICE);
- grx_line(X0min,Y0min+100,X0min+100,Y0min+100,COL_CORNICE);
- // grx_line(X0min,Y0min+350,X0min+100,Y0min+350,COL_CORNICE);
-
- grx_line(X0min+25,Y0min+100,X0min+25,Y0max,COL_CORNICE);
- grx_line(X0min+50,Y0min+100,X0min+50,Y0max,COL_CORNICE);
- grx_line(X0min+75,Y0min+100,X0min+75,Y0max,COL_CORNICE);
-
- grx_line(X0min,Y0min+100+127,X0min+25,Y0min+100+127,LIGHTBLUE);
- grx_line(X0min+50,Y0min+100+127,X0min+100,Y0min+100+127,LIGHTBLUE);
- grx_line(X0min+50,Y0min+100+127+250,X0min+100,Y0min+100+127+250,LIGHTBLUE);
-
-
- grx_box(X0min+101+50,400,X0min+230+50,Y0max-1,BROWN);
- for(i=1;i<6;i++){
- grx_box(X0min+101+50+38,400+35*i-10,X0min+101+50+48,400+35*i,CYAN);
- grx_box(X0min+101+50+81,400+35*i-10,X0min+101+50+91,400+35*i,CYAN);
- }
- grx_box(X0min+101+50+60,Y0max-30,X0min+101+50+70,Y0max-1,GREEN);
-
-
- grx_box(700,520,X0max-1,Y0max-1,CYAN);
-
-
-
- grx_text("Fx", X0min+5, Y0min+90, COL_TESTO, COL_SFONDO);
- grx_text("Fy", X0min+30, Y0min+90, COL_TESTO, COL_SFONDO);
- grx_text("Ax", X0min+55, Y0min+90, COL_TESTO, COL_SFONDO);
- grx_text("Ay", X0min+80, Y0min+90, COL_TESTO, COL_SFONDO);
- // grx_text("M", X0min+10, Y0min+351, COL_TESTO, COL_SFONDO);
- // grx_text("P", X0min+35, Y0min+351, COL_TESTO, COL_SFONDO);
- grx_text("Vx", X0min+55, Y0min+351, COL_TESTO, COL_SFONDO);
- grx_text("Vy", X0min+80, Y0min+351, COL_TESTO, COL_SFONDO);
-
- grx_text("S : Su", X0min+110, Y0min+15, COL_TESTO, COL_SFONDO);
- grx_text("Z : Sinistra", X0min+110, Y0min+25, COL_TESTO, COL_SFONDO);
- grx_text("X : Giu", X0min+110, Y0min+35, COL_TESTO, COL_SFONDO);
- grx_text("C : Destra", X0min+110, Y0min+45, COL_TESTO, COL_SFONDO);
- grx_text("P : aggancia Peso", X0min+110, Y0min+55, COL_TESTO, COL_SFONDO);
- grx_text("L : Libera peso", X0min+110, Y0min+65, COL_TESTO, COL_SFONDO);
- grx_text("Esc : Usita Programma", X0min+110, Y0min+75, COL_TESTO, COL_SFONDO);
-
-
-} // Fine della funzione draw_static
-
-TASK disegna_stato(int i)
-{ //double j;
-
- while (1)
- {
-
- sem_wait(&mutex);
-
- grx_rect(X0min+100,Y0min+100,X0max,Y0max,COL_CORNICE);
-
- grx_box(700,565,770,Y0max-1,LIGHTCYAN);
-
- grx_box(X0min+101+50,400,X0min+230+50,420,BROWN);
-
-
- //####################### FORZA X #############################
- if ( 0.25<=Forza_x) grx_box(7,Y0min+210,26,Y0min+220,GREEN);
- else grx_box(7,Y0min+210,26,Y0min+220,COL_SFONDO);
- if ( 0.5<=Forza_x) grx_box(7,Y0min+195,26,Y0min+205,GREEN);
- else grx_box(7,Y0min+195,26,Y0min+205,COL_SFONDO);
- if ( 0.75<=Forza_x) grx_box(7,Y0min+180,26,Y0min+190,GREEN);
- else grx_box(7,Y0min+180,26,Y0min+190,COL_SFONDO);
- if ( 1<=Forza_x) grx_box(7,Y0min+165,26,Y0min+175,GREEN);
- else grx_box(7,Y0min+165,26,Y0min+175,COL_SFONDO);
- if ( 1.25<=Forza_x) grx_box(7,Y0min+150,26,Y0min+160,GREEN);
- else grx_box(7,Y0min+150,26,Y0min+160,COL_SFONDO);
- if ( 1.50<=Forza_x) grx_box(7,Y0min+135,26,Y0min+145,YELLOW);
- else grx_box(7,Y0min+135,26,Y0min+145,COL_SFONDO);
- if ( 1.75<=Forza_x) grx_box(7,Y0min+120,26,Y0min+130,RED);
- else grx_box(7,Y0min+120,26,Y0min+130,COL_SFONDO);
- if ( 2<=Forza_x) grx_box(7,Y0min+105,26,Y0min+115,RED);
- else grx_box(7,Y0min+105,26,Y0min+115,COL_SFONDO);
- //########### ------
- if (-0.25>=Forza_x) grx_box(7,Y0min+230,26,Y0min+240,GREEN);
- else grx_box(7,Y0min+230,26,Y0min+240,COL_SFONDO);
- if ( -0.5>=Forza_x) grx_box(7,Y0min+245,26,Y0min+255,GREEN);
- else grx_box(7,Y0min+245,26,Y0min+255,COL_SFONDO);
- if ( -0.75>=Forza_x) grx_box(7,Y0min+260,26,Y0min+270,GREEN);
- else grx_box(7,Y0min+260,26,Y0min+270,COL_SFONDO);
- if ( -1>=Forza_x) grx_box(7,Y0min+275,26,Y0min+285,GREEN);
- else grx_box(7,Y0min+275,26,Y0min+285,COL_SFONDO);
- if ( -1.25>=Forza_x) grx_box(7,Y0min+290,26,Y0min+300,GREEN);
- else grx_box(7,Y0min+290,26,Y0min+300,COL_SFONDO);
- if ( -1.50>=Forza_x) grx_box(7,Y0min+305,26,Y0min+315,YELLOW);
- else grx_box(7,Y0min+305,26,Y0min+315,COL_SFONDO);
- if ( -1.75>=Forza_x) grx_box(7,Y0min+320,26,Y0min+330,RED);
- else grx_box(7,Y0min+320,26,Y0min+330,COL_SFONDO);
- if ( -2>=Forza_x) grx_box(7,Y0min+335,26,Y0min+345,RED);
- else grx_box(7,Y0min+335,26,Y0min+345,COL_SFONDO);
- //####################### FORZA Y #############################
- if ( -0.5>=Forza_y) grx_box(32,Y0min+340,51,Y0min+345,GREEN);
- else grx_box(32,Y0min+340,51,Y0min+345,COL_SFONDO);
- if ( -1>=Forza_y) grx_box(32,Y0min+333,51,Y0min+338,GREEN);
- else grx_box(32,Y0min+333,51,Y0min+338,COL_SFONDO);
- if ( -1.5>=Forza_y) grx_box(32,Y0min+326,51,Y0min+331,GREEN);
- else grx_box(32,Y0min+326,51,Y0min+331,COL_SFONDO);
- if ( -2>=Forza_y) grx_box(32,Y0min+319,51,Y0min+324,GREEN);
- else grx_box(32,Y0min+319,51,Y0min+324,COL_SFONDO);
- if ( -2.5>=Forza_y) grx_box(32,Y0min+312,51,Y0min+317,GREEN);
- else grx_box(32,Y0min+312,51,Y0min+317,COL_SFONDO);
- if ( -3>=Forza_y) grx_box(32,Y0min+305,51,Y0min+310,GREEN);
- else grx_box(32,Y0min+305,51,Y0min+310,COL_SFONDO);
- if ( -3.5>=Forza_y) grx_box(32,Y0min+298,51,Y0min+303,GREEN);
- else grx_box(32,Y0min+298,51,Y0min+303,COL_SFONDO);
- if ( -4>=Forza_y) grx_box(32,Y0min+291,51,Y0min+296,GREEN);
- else grx_box(32,Y0min+291,51,Y0min+296,COL_SFONDO);
- if ( -4.5>=Forza_y) grx_box(32,Y0min+284,51,Y0min+289,GREEN);
- else grx_box(32,Y0min+284,51,Y0min+289,COL_SFONDO);
- if ( -5>=Forza_y) grx_box(32,Y0min+277,51,Y0min+282,GREEN);
- else grx_box(32,Y0min+277,51,Y0min+282,COL_SFONDO);
- if ( -5.5>=Forza_y) grx_box(32,Y0min+270,51,Y0min+275,GREEN);
- else grx_box(32,Y0min+270,51,Y0min+275,COL_SFONDO);
- if ( -6>=Forza_y) grx_box(32,Y0min+263,51,Y0min+268,GREEN);
- else grx_box(32,Y0min+263,51,Y0min+268,COL_SFONDO);
- if ( -6.5>=Forza_y) grx_box(32,Y0min+256,51,Y0min+261,GREEN);
- else grx_box(32,Y0min+256,51,Y0min+261,COL_SFONDO);
- if ( -7>=Forza_y) grx_box(32,Y0min+249,51,Y0min+254,GREEN);
- else grx_box(32,Y0min+249,51,Y0min+254,COL_SFONDO);
- if ( -7.5>=Forza_y) grx_box(32,Y0min+242,51,Y0min+247,GREEN);
- else grx_box(32,Y0min+242,51,Y0min+247,COL_SFONDO);
- if ( -8>=Forza_y) grx_box(32,Y0min+235,51,Y0min+240,GREEN);
- else grx_box(32,Y0min+235,51,Y0min+240,COL_SFONDO);
- if ( -8.5>=Forza_y) grx_box(32,Y0min+228,51,Y0min+233,GREEN);
- else grx_box(32,Y0min+228,51,Y0min+233,COL_SFONDO);
- if ( -9>=Forza_y) grx_box(32,Y0min+221,51,Y0min+226,GREEN);
- else grx_box(32,Y0min+221,51,Y0min+226,COL_SFONDO);
- if ( -9.5>=Forza_y) grx_box(32,Y0min+214,51,Y0min+219,GREEN);
- else grx_box(32,Y0min+214,51,Y0min+219,COL_SFONDO);
- if ( -10>=Forza_y) grx_box(32,Y0min+207,51,Y0min+212,GREEN);
- else grx_box(32,Y0min+207,51,Y0min+212,COL_SFONDO);
- if ( -10.5>=Forza_y) grx_box(32,Y0min+200,51,Y0min+205,GREEN);
- else grx_box(32,Y0min+200,51,Y0min+205,COL_SFONDO);
- if ( -11>=Forza_y) grx_box(32,Y0min+193,51,Y0min+198,GREEN);
- else grx_box(32,Y0min+193,51,Y0min+198,COL_SFONDO);
- if ( -11.5>=Forza_y) grx_box(32,Y0min+186,51,Y0min+191,GREEN);
- else grx_box(32,Y0min+186,51,Y0min+191,COL_SFONDO);
- if ( -12>=Forza_y) grx_box(32,Y0min+179,51,Y0min+184,GREEN);
- else grx_box(32,Y0min+179,51,Y0min+184,COL_SFONDO);
- if ( -12.5>=Forza_y) grx_box(32,Y0min+172,51,Y0min+177,GREEN);
- else grx_box(32,Y0min+172,51,Y0min+177,COL_SFONDO);
- if ( -13>=Forza_y) grx_box(32,Y0min+165,51,Y0min+170,GREEN);
- else grx_box(32,Y0min+165,51,Y0min+170,COL_SFONDO);
- if ( -13.5>=Forza_y) grx_box(32,Y0min+158,51,Y0min+163,GREEN);
- else grx_box(32,Y0min+158,51,Y0min+163,COL_SFONDO);
- if ( -14>=Forza_y) grx_box(32,Y0min+151,51,Y0min+156,GREEN);
- else grx_box(32,Y0min+151,51,Y0min+156,COL_SFONDO);
- if ( -14.5>=Forza_y) grx_box(32,Y0min+144,51,Y0min+149,GREEN);
- else grx_box(32,Y0min+144,51,Y0min+149,COL_SFONDO);
- if ( -15>=Forza_y) grx_box(32,Y0min+137,51,Y0min+142,YELLOW);
- else grx_box(32,Y0min+137,51,Y0min+142,COL_SFONDO);
- if ( -15.5>=Forza_y) grx_box(32,Y0min+130,51,Y0min+135,YELLOW);
- else grx_box(32,Y0min+130,51,Y0min+135,COL_SFONDO);
- if ( -16>=Forza_y) grx_box(32,Y0min+123,51,Y0min+128,RED);
- else grx_box(32,Y0min+123,51,Y0min+128,COL_SFONDO);
- if ( -16.5>=Forza_y) grx_box(32,Y0min+116,51,Y0min+121,RED);
- else grx_box(32,Y0min+116,51,Y0min+121,COL_SFONDO);
- if ( -17>=Forza_y) grx_box(32,Y0min+109,51,Y0min+114,RED);
- else grx_box(32,Y0min+109,51,Y0min+114,COL_SFONDO);
- if ( -17.5>=Forza_y) grx_box(32,Y0min+102,51,Y0min+107,RED);
- else grx_box(32,Y0min+102,51,Y0min+107,COL_SFONDO);
-
- //####################### ACCELERAZIONE X #############################
- if ( -2.125>=Acc_x)grx_box(56,Y0min+340,75,Y0min+345,RED);
- else grx_box(55,Y0min+340,75,Y0min+345,COL_SFONDO);
- if ( -2>=Acc_x) grx_box(56,Y0min+333,75,Y0min+338,RED);
- else grx_box(56,Y0min+333,75,Y0min+338,COL_SFONDO);
- if ( -1.875>=Acc_x)grx_box(56,Y0min+326,75,Y0min+331,RED);
- else grx_box(56,Y0min+326,75,Y0min+331,COL_SFONDO);
- if ( -1.750>=Acc_x) grx_box(56,Y0min+319,75,Y0min+324,YELLOW);
- else grx_box(56,Y0min+319,75,Y0min+324,COL_SFONDO);
- if ( -1.625>=Acc_x)grx_box(56,Y0min+312,75,Y0min+317,YELLOW);
- else grx_box(56,Y0min+312,75,Y0min+317,COL_SFONDO);
- if ( -1.5>=Acc_x) grx_box(56,Y0min+305,75,Y0min+310,GREEN);
- else grx_box(56,Y0min+305,75,Y0min+310,COL_SFONDO);
- if ( -1.375>=Acc_x)grx_box(56,Y0min+298,75,Y0min+303,GREEN);
- else grx_box(56,Y0min+298,75,Y0min+303,COL_SFONDO);
- if ( -1.250>=Acc_x) grx_box(56,Y0min+291,75,Y0min+296,GREEN);
- else grx_box(56,Y0min+291,75,Y0min+296,COL_SFONDO);
- if ( -1.125>=Acc_x)grx_box(56,Y0min+284,75,Y0min+289,GREEN);
- else grx_box(56,Y0min+284,75,Y0min+289,COL_SFONDO);
- if ( -1>=Acc_x) grx_box(56,Y0min+277,75,Y0min+282,GREEN);
- else grx_box(56,Y0min+277,75,Y0min+282,COL_SFONDO);
- if ( -0.875>=Acc_x)grx_box(56,Y0min+270,75,Y0min+275,GREEN);
- else grx_box(56,Y0min+270,75,Y0min+275,COL_SFONDO);
- if ( -0.750>=Acc_x) grx_box(56,Y0min+263,75,Y0min+268,GREEN);
- else grx_box(56,Y0min+263,75,Y0min+268,COL_SFONDO);
- if ( -0.625>=Acc_x)grx_box(56,Y0min+256,75,Y0min+261,GREEN);
- else grx_box(56,Y0min+256,75,Y0min+261,COL_SFONDO);
- if ( -0.5>=Acc_x) grx_box(56,Y0min+249,75,Y0min+254,GREEN);
- else grx_box(56,Y0min+249,75,Y0min+254,COL_SFONDO);
- if ( -0.375>=Acc_x)grx_box(56,Y0min+242,75,Y0min+247,GREEN);
- else grx_box(56,Y0min+242,75,Y0min+247,COL_SFONDO);
- if ( -0.250>=Acc_x) grx_box(56,Y0min+235,75,Y0min+240,GREEN);
- else grx_box(56,Y0min+235,75,Y0min+240,COL_SFONDO);
- if ( -0.125>=Acc_x)grx_box(56,Y0min+228,75,Y0min+233,GREEN);
- else grx_box(56,Y0min+228,75,Y0min+233,COL_SFONDO);
- //############# ------
- if ( 0.125<=Acc_x) grx_box(56,Y0min+221,75,Y0min+226,GREEN);
- else grx_box(56,Y0min+221,75,Y0min+226,COL_SFONDO);
- if ( 0.250<=Acc_x)grx_box(56,Y0min+214,75,Y0min+219,GREEN);
- else grx_box(56,Y0min+214,75,Y0min+219,COL_SFONDO);
- if ( 0.375<=Acc_x) grx_box(56,Y0min+207,75,Y0min+212,GREEN);
- else grx_box(56,Y0min+207,75,Y0min+212,COL_SFONDO);
- if (0.5<=Acc_x)grx_box(56,Y0min+200,75,Y0min+205,GREEN);
- else grx_box(56,Y0min+200,75,Y0min+205,COL_SFONDO);
- if ( 0.625<=Acc_x) grx_box(56,Y0min+193,75,Y0min+198,GREEN);
- else grx_box(56,Y0min+193,75,Y0min+198,COL_SFONDO);
- if (0.750<=Acc_x)grx_box(56,Y0min+186,75,Y0min+191,GREEN);
- else grx_box(56,Y0min+186,75,Y0min+191,COL_SFONDO);
- if (0.875<=Acc_x) grx_box(56,Y0min+179,75,Y0min+184,GREEN);
- else grx_box(56,Y0min+179,75,Y0min+184,COL_SFONDO);
- if (1<=Acc_x)grx_box(56,Y0min+172,75,Y0min+177,GREEN);
- else grx_box(56,Y0min+172,75,Y0min+177,COL_SFONDO);
- if (1.125<=Acc_x) grx_box(56,Y0min+165,75,Y0min+170,GREEN);
- else grx_box(56,Y0min+165,75,Y0min+170,COL_SFONDO);
- if (1.250<=Acc_x)grx_box(56,Y0min+158,75,Y0min+163,GREEN);
- else grx_box(56,Y0min+158,75,Y0min+163,COL_SFONDO);
- if (1.375<=Acc_x) grx_box(56,Y0min+151,75,Y0min+156,GREEN);
- else grx_box(56,Y0min+151,75,Y0min+156,COL_SFONDO);
- if (1.5<=Acc_x)grx_box(56,Y0min+144,75,Y0min+149,GREEN);
- else grx_box(56,Y0min+144,75,Y0min+149,COL_SFONDO);
- if (1.625<=Acc_x) grx_box(56,Y0min+137,75,Y0min+142,YELLOW);
- else grx_box(56,Y0min+137,75,Y0min+142,COL_SFONDO);
- if (1.750<=Acc_x)grx_box(56,Y0min+130,75,Y0min+135,YELLOW);
- else grx_box(56,Y0min+130,75,Y0min+135,COL_SFONDO);
- if (1.875<=Acc_x) grx_box(56,Y0min+123,75,Y0min+128,RED);
- else grx_box(56,Y0min+123,75,Y0min+128,COL_SFONDO);
- if (2<=Acc_x)grx_box(56,Y0min+116,75,Y0min+121,RED);
- else grx_box(56,Y0min+116,75,Y0min+121,COL_SFONDO);
- if (2.125<=Acc_x) grx_box(56,Y0min+109,75,Y0min+114,RED);
- else grx_box(56,Y0min+109,75,Y0min+114,COL_SFONDO);
- //####################### ACCELERAZIONE Y #############################
- if ( 2.5<=Acc_y) { grx_box(81,Y0min+340,100,Y0min+345,RED);
- grx_box(81+5,Y0min+340+1,100-5,Y0min+345-1,BLUE);
- }
- else grx_box(81,Y0min+340,100,Y0min+345,COL_SFONDO);
- if ( 2.200<=Acc_y) grx_box(81,Y0min+333,100,Y0min+338,RED);
- else grx_box(81,Y0min+333,100,Y0min+338,COL_SFONDO);
- if ( 1.950<=Acc_y) grx_box(81,Y0min+326,100,Y0min+331,RED);
- else grx_box(81,Y0min+326,100,Y0min+331,COL_SFONDO);
- if ( 1.750<=Acc_y) grx_box(81,Y0min+319,100,Y0min+324,YELLOW);
- else grx_box(81,Y0min+319,100,Y0min+324,COL_SFONDO);
- if ( 1.625<=Acc_y) grx_box(81,Y0min+312,100,Y0min+317,YELLOW);
- else grx_box(81,Y0min+312,100,Y0min+317,COL_SFONDO);
- if ( 1.5<=Acc_y) grx_box(81,Y0min+305,100,Y0min+310,GREEN);
- else grx_box(81,Y0min+305,100,Y0min+310,COL_SFONDO);
- if ( 1.375<=Acc_y) grx_box(81,Y0min+298,100,Y0min+303,GREEN);
- else grx_box(81,Y0min+298,100,Y0min+303,COL_SFONDO);
- if ( 1.250<=Acc_y) grx_box(81,Y0min+291,100,Y0min+296,GREEN);
- else grx_box(81,Y0min+291,100,Y0min+296,COL_SFONDO);
- if ( 1.125<=Acc_y) grx_box(81,Y0min+284,100,Y0min+289,GREEN);
- else grx_box(81,Y0min+284,100,Y0min+289,COL_SFONDO);
- if ( 1<=Acc_y) grx_box(81,Y0min+277,100,Y0min+282,GREEN);
- else grx_box(81,Y0min+277,100,Y0min+282,COL_SFONDO);
- if ( 0.875<=Acc_y) grx_box(81,Y0min+270,100,Y0min+275,GREEN);
- else grx_box(81,Y0min+270,100,Y0min+275,COL_SFONDO);
- if ( 0.750<=Acc_y) grx_box(81,Y0min+263,100,Y0min+268,GREEN);
- else grx_box(81,Y0min+263,100,Y0min+268,COL_SFONDO);
- if ( 0.625<=Acc_y) grx_box(81,Y0min+256,100,Y0min+261,GREEN);
- else grx_box(81,Y0min+256,100,Y0min+261,COL_SFONDO);
- if ( 0.5<=Acc_y) grx_box(81,Y0min+249,100,Y0min+254,GREEN);
- else grx_box(81,Y0min+249,100,Y0min+254,COL_SFONDO);
- if ( 0.375<=Acc_y) grx_box(81,Y0min+242,100,Y0min+247,GREEN);
- else grx_box(81,Y0min+242,100,Y0min+247,COL_SFONDO);
- if ( 0.25<=Acc_y) grx_box(81,Y0min+235,100,Y0min+240,GREEN);
- else grx_box(81,Y0min+235,100,Y0min+240,COL_SFONDO);
- if ( 0.125<=Acc_y) grx_box(81,Y0min+228,100,Y0min+233,GREEN);
- else grx_box(81,Y0min+228,100,Y0min+233,COL_SFONDO);
- //############# ------
- if ( -0.125>=Acc_y) grx_box(81,Y0min+221,100,Y0min+226,GREEN);
- else grx_box(81,Y0min+221,100,Y0min+226,COL_SFONDO);
- if ( -0.250>=Acc_y) grx_box(81,Y0min+214,100,Y0min+219,GREEN);
- else grx_box(81,Y0min+214,100,Y0min+219,COL_SFONDO);
- if ( -0.375>=Acc_y) grx_box(81,Y0min+207,100,Y0min+212,GREEN);
- else grx_box(81,Y0min+207,100,Y0min+212,COL_SFONDO);
- if (-0.5>=Acc_y) grx_box(81,Y0min+200,100,Y0min+205,GREEN);
- else grx_box(81,Y0min+200,100,Y0min+205,COL_SFONDO);
- if ( -0.625>=Acc_y) grx_box(81,Y0min+193,100,Y0min+198,GREEN);
- else grx_box(81,Y0min+193,100,Y0min+198,COL_SFONDO);
- if (-0.750>=Acc_y) grx_box(81,Y0min+186,100,Y0min+191,GREEN);
- else grx_box(81,Y0min+186,100,Y0min+191,COL_SFONDO);
- if (-0.875>=Acc_y) grx_box(81,Y0min+179,100,Y0min+184,GREEN);
- else grx_box(81,Y0min+179,100,Y0min+184,COL_SFONDO);
- if (-1>=Acc_y) grx_box(81,Y0min+172,100,Y0min+177,GREEN);
- else grx_box(81,Y0min+172,100,Y0min+177,COL_SFONDO);
- if (-1.125>=Acc_y) grx_box(81,Y0min+165,100,Y0min+170,YELLOW);
- else grx_box(81,Y0min+165,100,Y0min+170,COL_SFONDO);
- if (-1.250>=Acc_y) grx_box(81,Y0min+158,100,Y0min+163,YELLOW);
- else grx_box(81,Y0min+158,100,Y0min+163,COL_SFONDO);
- if (-1.375>=Acc_y) grx_box(81,Y0min+151,100,Y0min+156,YELLOW);
- else grx_box(81,Y0min+151,100,Y0min+156,COL_SFONDO);
- if (-1.5>=Acc_y) grx_box(81,Y0min+144,100,Y0min+149,YELLOW);
- else grx_box(81,Y0min+144,100,Y0min+149,COL_SFONDO);
- if (-1.625>=Acc_y) grx_box(81,Y0min+137,100,Y0min+142,RED);
- else grx_box(81,Y0min+137,100,Y0min+142,COL_SFONDO);
- if (-1.750>=Acc_y) grx_box(81,Y0min+130,100,Y0min+135,RED);
- else grx_box(81,Y0min+130,100,Y0min+135,COL_SFONDO);
- if (-1.875>=Acc_y) grx_box(81,Y0min+123,100,Y0min+128,RED);
- else grx_box(81,Y0min+123,100,Y0min+128,COL_SFONDO);
- if (-2>=Acc_y) grx_box(81,Y0min+116,100,Y0min+121,RED);
- else grx_box(81,Y0min+116,100,Y0min+121,COL_SFONDO);
- if (-2.3>=Acc_y) grx_box(81,Y0min+109,100,Y0min+114,RED);
- else grx_box(81,Y0min+109,100,Y0min+114,COL_SFONDO);
- //####################### VELOCITA X #############################
- //if ( -21.25>=Velocita_x)grx_box(56,Y0min+340+250,75,Y0min+345+250,RED);
- //else grx_box(55,Y0min+340+250,75,Y0min+345+250,COL_SFONDO);
- if ( -20>=Velocita_x) grx_box(56,Y0min+333+250,75,Y0min+338+250,RED);
- else grx_box(56,Y0min+333+250,75,Y0min+338+250,COL_SFONDO);
- if ( -18.75>=Velocita_x)grx_box(56,Y0min+326+250,75,Y0min+331+250,RED);
- else grx_box(56,Y0min+326+250,75,Y0min+331+250,COL_SFONDO);
- if ( -17.50>=Velocita_x)grx_box(56,Y0min+319+250,75,Y0min+324+250,YELLOW);
- else grx_box(56,Y0min+319+250,75,Y0min+324+250,COL_SFONDO);
- if ( -16.25>=Velocita_x)grx_box(56,Y0min+312+250,75,Y0min+317+250,YELLOW);
- else grx_box(56,Y0min+312+250,75,Y0min+317+250,COL_SFONDO);
- if ( -15>=Velocita_x) grx_box(56,Y0min+305+250,75,Y0min+310+250,GREEN);
- else grx_box(56,Y0min+305+250,75,Y0min+310+250,COL_SFONDO);
- if ( -13.75>=Velocita_x)grx_box(56,Y0min+298+250,75,Y0min+303+250,GREEN);
- else grx_box(56,Y0min+298+250,75,Y0min+303+250,COL_SFONDO);
- if ( -12.50>=Velocita_x)grx_box(56,Y0min+291+250,75,Y0min+296+250,GREEN);
- else grx_box(56,Y0min+291+250,75,Y0min+296+250,COL_SFONDO);
- if ( -11.25>=Velocita_x)grx_box(56,Y0min+284+250,75,Y0min+289+250,GREEN);
- else grx_box(56,Y0min+284+250,75,Y0min+289+250,COL_SFONDO);
- if ( -10>=Velocita_x) grx_box(56,Y0min+277+250,75,Y0min+282+250,GREEN);
- else grx_box(56,Y0min+277+250,75,Y0min+282+250,COL_SFONDO);
- if ( -8.75>=Velocita_x)grx_box(56,Y0min+270+250,75,Y0min+275+250,GREEN);
- else grx_box(56,Y0min+270+250,75,Y0min+275+250,COL_SFONDO);
- if ( -7.50>=Velocita_x)grx_box(56,Y0min+263+250,75,Y0min+268+250,GREEN);
- else grx_box(56,Y0min+263+250,75,Y0min+268+250,COL_SFONDO);
- if ( -6.25>=Velocita_x)grx_box(56,Y0min+256+250,75,Y0min+261+250,GREEN);
- else grx_box(56,Y0min+256+250,75,Y0min+261+250,COL_SFONDO);
- if ( -5>=Velocita_x) grx_box(56,Y0min+249+250,75,Y0min+254+250,GREEN);
- else grx_box(56,Y0min+249+250,75,Y0min+254+250,COL_SFONDO);
- if ( -3.75>=Velocita_x)grx_box(56,Y0min+242+250,75,Y0min+247+250,GREEN);
- else grx_box(56,Y0min+242+250,75,Y0min+247+250,COL_SFONDO);
- if ( -2.50>=Velocita_x)grx_box(56,Y0min+235+250,75,Y0min+240+250,GREEN);
- else grx_box(56,Y0min+235+250,75,Y0min+240+250,COL_SFONDO);
- if ( -1.25>=Velocita_x)grx_box(56,Y0min+228+250,75,Y0min+233+250,GREEN);
- else grx_box(56,Y0min+228+250,75,Y0min+233+250,COL_SFONDO);
- //############# ------
- if ( 1.25<=Velocita_x) grx_box(56,Y0min+221+250,75,Y0min+226+250,GREEN);
- else grx_box(56,Y0min+221+250,75,Y0min+226+250,COL_SFONDO);
- if ( 2.50<=Velocita_x) grx_box(56,Y0min+214+250,75,Y0min+219+250,GREEN);
- else grx_box(56,Y0min+214+250,75,Y0min+219+250,COL_SFONDO);
- if ( 3.75<=Velocita_x) grx_box(56,Y0min+207+250,75,Y0min+212+250,GREEN);
- else grx_box(56,Y0min+207+250,75,Y0min+212+250,COL_SFONDO);
- if (5<=Velocita_x) grx_box(56,Y0min+200+250,75,Y0min+205+250,GREEN);
- else grx_box(56,Y0min+200+250,75,Y0min+205+250,COL_SFONDO);
- if ( 6.25<=Velocita_x) grx_box(56,Y0min+193+250,75,Y0min+198+250,GREEN);
- else grx_box(56,Y0min+193+250,75,Y0min+198+250,COL_SFONDO);
- if (7.50<=Velocita_x) grx_box(56,Y0min+186+250,75,Y0min+191+250,GREEN);
- else grx_box(56,Y0min+186+250,75,Y0min+191+250,COL_SFONDO);
- if (8.75<=Velocita_x) grx_box(56,Y0min+179+250,75,Y0min+184+250,GREEN);
- else grx_box(56,Y0min+179+250,75,Y0min+184+250,COL_SFONDO);
- if (10<=Velocita_x) grx_box(56,Y0min+172+250,75,Y0min+177+250,GREEN);
- else grx_box(56,Y0min+172+250,75,Y0min+177+250,COL_SFONDO);
- if (11.25<=Velocita_x) grx_box(56,Y0min+165+250,75,Y0min+170+250,GREEN);
- else grx_box(56,Y0min+165+250,75,Y0min+170+250,COL_SFONDO);
- if (12.50<=Velocita_x) grx_box(56,Y0min+158+250,75,Y0min+163+250,GREEN);
- else grx_box(56,Y0min+158+250,75,Y0min+163+250,COL_SFONDO);
- if (13.75<=Velocita_x) grx_box(56,Y0min+151+250,75,Y0min+156+250,GREEN);
- else grx_box(56,Y0min+151+250,75,Y0min+156+250,COL_SFONDO);
- if (15<=Velocita_x) grx_box(56,Y0min+144+250,75,Y0min+149+250,GREEN);
- else grx_box(56,Y0min+144+250,75,Y0min+149+250,COL_SFONDO);
- if (16.25<=Velocita_x) grx_box(56,Y0min+137+250,75,Y0min+142+250,YELLOW);
- else grx_box(56,Y0min+137+250,75,Y0min+142+250,COL_SFONDO);
- if (17.50<=Velocita_x) grx_box(56,Y0min+130+250,75,Y0min+135+250,YELLOW);
- else grx_box(56,Y0min+130+250,75,Y0min+135+250,COL_SFONDO);
- if (18.75<=Velocita_x) grx_box(56,Y0min+123+250,75,Y0min+128+250,RED);
- else grx_box(56,Y0min+123+250,75,Y0min+128+250,COL_SFONDO);
- if (20<=Velocita_x) grx_box(56,Y0min+116+250,75,Y0min+121+250,RED);
- else grx_box(56,Y0min+116+250,75,Y0min+121+250,COL_SFONDO);
- if (21.25<=Velocita_x) grx_box(56,Y0min+109+250,75,Y0min+114+250,RED);
- else grx_box(56,Y0min+109+250,75,Y0min+114+250,COL_SFONDO);
-
- //####################### VELOCITA Y #############################
- // if ( 160<=Velocita_y)grx_box(81,Y0min+340+250,100,Y0min+345+250,RED);
- // else grx_box(81,Y0min+340+250,100,Y0min+345+250,COL_SFONDO);
- if ( 40<=Velocita_y) grx_box(81,Y0min+333+250,100,Y0min+338+250,RED);
- else grx_box(81,Y0min+333+250,100,Y0min+338+250,COL_SFONDO);
- if ( 37.5<=Velocita_y)grx_box(81,Y0min+326+250,100,Y0min+331+250,RED);
- else grx_box(81,Y0min+326+250,100,Y0min+331+250,COL_SFONDO);
- if ( 35<=Velocita_y)grx_box(81,Y0min+319+250,100,Y0min+324+250,YELLOW);
- else grx_box(81,Y0min+319+250,100,Y0min+324+250,COL_SFONDO);
- if ( 32.5<=Velocita_y)grx_box(81,Y0min+312+250,100,Y0min+317+250,YELLOW);
- else grx_box(81,Y0min+312+250,100,Y0min+317+250,COL_SFONDO);
- if ( 30<=Velocita_y) grx_box(81,Y0min+305+250,100,Y0min+310+250,GREEN);
- else grx_box(81,Y0min+305+250,100,Y0min+310+250,COL_SFONDO);
- if ( 27.5<=Velocita_y)grx_box(81,Y0min+298+250,100,Y0min+303+250,GREEN);
- else grx_box(81,Y0min+298+250,100,Y0min+303+250,COL_SFONDO);
- if ( 25<=Velocita_y)grx_box(81,Y0min+291+250,100,Y0min+296+250,GREEN);
- else grx_box(81,Y0min+291+250,100,Y0min+296+250,COL_SFONDO);
- if ( 22.5<=Velocita_y)grx_box(81,Y0min+284+250,100,Y0min+289+250,GREEN);
- else grx_box(81,Y0min+284+250,100,Y0min+289+250,COL_SFONDO);
- if ( 20<=Velocita_y) grx_box(81,Y0min+277+250,100,Y0min+282+250,GREEN);
- else grx_box(81,Y0min+277+250,100,Y0min+282+250,COL_SFONDO);
- if ( 17.5<=Velocita_y) grx_box(81,Y0min+270+250,100,Y0min+275+250,GREEN);
- else grx_box(81,Y0min+270+250,100,Y0min+275+250,COL_SFONDO);
- if ( 15<=Velocita_y) grx_box(81,Y0min+263+250,100,Y0min+268+250,GREEN);
- else grx_box(81,Y0min+263+250,100,Y0min+268+250,COL_SFONDO);
- if ( 12.5<=Velocita_y) grx_box(81,Y0min+256+250,100,Y0min+261+250,GREEN);
- else grx_box(81,Y0min+256+250,100,Y0min+261+250,COL_SFONDO);
- if ( 10<=Velocita_y) grx_box(81,Y0min+249+250,100,Y0min+254+250,GREEN);
- else grx_box(81,Y0min+249+250,100,Y0min+254+250,COL_SFONDO);
- if ( 7.5<=Velocita_y) grx_box(81,Y0min+242+250,100,Y0min+247+250,GREEN);
- else grx_box(81,Y0min+242+250,100,Y0min+247+250,COL_SFONDO);
- if ( 5<=Velocita_y) grx_box(81,Y0min+235+250,100,Y0min+240+250,GREEN);
- else grx_box(81,Y0min+235+250,100,Y0min+240+250,COL_SFONDO);
- if ( 2.5<=Velocita_y) grx_box(81,Y0min+228+250,100,Y0min+233+250,GREEN);
- else grx_box(81,Y0min+228+250,100,Y0min+233+250,COL_SFONDO);
- //############# ------
- if (-2.5>=Velocita_y) grx_box(81,Y0min+221+250,100,Y0min+226+250,GREEN);
- else grx_box(81,Y0min+221+250,100,Y0min+226+250,COL_SFONDO);
- if (-5>=Velocita_y) grx_box(81,Y0min+214+250,100,Y0min+219+250,GREEN);
- else grx_box(81,Y0min+214+250,100,Y0min+219+250,COL_SFONDO);
- if (-7.5>=Velocita_y) grx_box(81,Y0min+207+250,100,Y0min+212+250,GREEN);
- else grx_box(81,Y0min+207+250,100,Y0min+212+250,COL_SFONDO);
- if (-10>=Velocita_y) grx_box(81,Y0min+200+250,100,Y0min+205+250,GREEN);
- else grx_box(81,Y0min+200+250,100,Y0min+205+250,COL_SFONDO);
- if (-12.5>=Velocita_y) grx_box(81,Y0min+193+250,100,Y0min+198+250,GREEN);
- else grx_box(81,Y0min+193+250,100,Y0min+198+250,COL_SFONDO);
- if (-15>=Velocita_y) grx_box(81,Y0min+186+250,100,Y0min+191+250,GREEN);
- else grx_box(81,Y0min+186+250,100,Y0min+191+250,COL_SFONDO);
- if (-17.5>=Velocita_y) grx_box(81,Y0min+179+250,100,Y0min+184+250,GREEN);
- else grx_box(81,Y0min+179+250,100,Y0min+184+250,COL_SFONDO);
- if (-20>=Velocita_y) grx_box(81,Y0min+172+250,100,Y0min+177+250,GREEN);
- else grx_box(81,Y0min+172+250,100,Y0min+177+250,COL_SFONDO);
- if (-22.5>=Velocita_y) grx_box(81,Y0min+165+250,100,Y0min+170+250,GREEN);
- else grx_box(81,Y0min+165+250,100,Y0min+170+250,COL_SFONDO);
- if (-25>=Velocita_y) grx_box(81,Y0min+158+250,100,Y0min+163+250,GREEN);
- else grx_box(81,Y0min+158+250,100,Y0min+163+250,COL_SFONDO);
- if (-27.5>=Velocita_y) grx_box(81,Y0min+151+250,100,Y0min+156+250,GREEN);
- else grx_box(81,Y0min+151+250,100,Y0min+156+250,COL_SFONDO);
- if (-30>=Velocita_y) grx_box(81,Y0min+144+250,100,Y0min+149+250,GREEN);
- else grx_box(81,Y0min+144+250,100,Y0min+149+250,COL_SFONDO);
- if (-32.5>=Velocita_y) grx_box(81,Y0min+137+250,100,Y0min+142+250,YELLOW);
- else grx_box(81,Y0min+137+250,100,Y0min+142+250,COL_SFONDO);
- if (-35>=Velocita_y) grx_box(81,Y0min+130+250,100,Y0min+135+250,YELLOW);
- else grx_box(81,Y0min+130+250,100,Y0min+135+250,COL_SFONDO);
- if (-37.5>=Velocita_y) grx_box(81,Y0min+123+250,100,Y0min+128+250,RED);
- else grx_box(81,Y0min+123+250,100,Y0min+128+250,COL_SFONDO);
- if (-40>=Velocita_y) grx_box(81,Y0min+116+250,100,Y0min+121+250,RED);
- else grx_box(81,Y0min+116+250,100,Y0min+121+250,COL_SFONDO);
- if (-42.5>=Velocita_y) grx_box(81,Y0min+109+250,100,Y0min+114+250,RED);
- else grx_box(81,Y0min+109+250,100,Y0min+114+250,COL_SFONDO);
-
-
- sem_post(&mutex);
-
-
- task_endcycle();
- }
-}
-
-
Index: rel_1_2/eli/eli.h
===================================================================
--- rel_1_2/eli/eli.h (revision 1198)
+++ rel_1_2/eli/eli.h (nonexistent)
@@ -1,173 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: eli.h,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:45 $
- ------------
-
- This file is similar to the configuration of Hartik 3.3.1
-
-**/
-
-/*
- * Copyright (C) 2000 ALLEN-DESTRO and Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-/***************************************/
-/* Corso di Informatica Industriale */
-/* Libreria con le funzioni di disegno */
-/* Creata da ALLEN-DESTRO */
-/***************************************/
-
-//########################################
-// Librerie standard del linguaggio C
-//#######################################
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-
-//########################################
-// Librerie Hartik
-//########################################
-#include <kernel/kern.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <ll/i386/cons.h>
-#include <semaphore.h>
-
-//########################################
-// Definizione delle costanti del programma
-//########################################
-
-#define PER_DISEGNA 100000
-#define PER_MOLLA 100000
-#define PER_KILL 200000
-#define G 10
-#define DIM_EL 12
-#define DIM_PESO 10
-#define COL_EL YELLOW
-
-
-#define X0min 4 // Ascissa minima della finestra grafica
-#define Y0min 4 // Ordinata minima della finestra grafica
-#define X0max 796 // Ascissa massima della finestra grafica
-#define Y0max 596 // Ordinata massima della finestra grafica
-#define TERRA 400 // Ordinata della pista di atteraggio
-#define COL_SFONDO 0 // Colore di sfondo della finestra grafica
-#define COL_TESTO 7 // Colore del testo della finestra grafica
-#define COL_CORNICE RED // Colore cornici della finestra grafica
-#define DELTA_COL 32
-
-
-// Valore di pigreco
-#define PIGRECO 3.14159
-
-#define ELICOTTERO_S(x,y,dim,col,sfo) grx_disc(x,y,dim,col); \
- grx_box(x-dim,y,x+dim,y+dim,sfo); \
- grx_line(x-dim*2,y-dim,x+dim*2,y-dim,col); \
- grx_box(x-dim,y,x+(dim*2),y+(dim/3),col); \
- grx_line(x-dim,y+dim/2,x+2*dim,y+dim/2,col); \
- grx_circle(x+dim*2,y,dim/2,col); \
- grx_box(x-dim/10,y,x+dim/10,y+dim/2,col)
-
-#define ELICOTTERO_D(x,y,dim,col,sfo) grx_disc(x,y,dim,col); \
- grx_box(x-dim,y,x+dim,y+dim,sfo); \
- grx_line(x-dim*2,y-dim,x+dim*2,y-dim,col); \
- grx_box(x-(dim*2),y,x+dim,y+(dim/3),col); \
- grx_line(x-2*dim,y+dim/2,x+dim,y+dim/2,col); \
- grx_circle(x-dim*2,y,dim/2,col); \
- grx_box(x-dim/10,y,x+dim/10,y+dim/2,col)
-
-#define PESO(x,y,dim,col) grx_box(x-dim,y,x+dim,y+2*dim,col)
-
-#define MOLLA(x,y1,y2,col) { \
- int w; \
- for (w=y1;w<y2;w=w+2) grx_line(x-3,w,x+3,w,col); \
- }
-
-#define RUSPA_S(x,y,col,colvet) grx_box(x,y-20,x+2,y,col); \
- grx_line(x,y-10,x+5,y-10,col); \
- grx_box(x+5,y-30,x+20,y-5,col); \
- grx_box(x+5,y-10,x+40,y-5,col); \
- grx_disc(x+10,y-5,5,col); \
- grx_disc(x+30,y-5,5,col); \
- grx_box(x+5,y-25,x+12,y-15,colvet)
-
-#define RUSPA_D(x,y,col,colvet) grx_box(x-2,y-20,x,y,col); \
- grx_line(x-5,y-10,x,y-10,col); \
- grx_box(x-20,y-30,x-5,y-5,col); \
- grx_box(x-40,y-10,x-5,y-5,col); \
- grx_disc(x-10,y-5,5,col); \
- grx_disc(x-30,y-5,5,col); \
- grx_box(x-12,y-25,x-5,y-15,colvet)
-
-#define ESPLOSIONE(x,y) grx_box(x-2,y-2,x+1,y+1,RED+1); \
- grx_box(x-5,y-5,x-4,y-3,RED+1); \
- grx_box(x-6,y-2,x-4,y,RED+1); \
- grx_box(x+3,y+4,x+4,y+7,RED+1); \
- grx_box(x+5,y-6,x+8,y-4,RED+1); \
- grx_box(x-10,y+10,x-8,y+8,RED+1); \
- grx_box(x-1,y-10,x+1,y-8,RED+1); \
- grx_box(x-13,y-1,x-10,y+1,RED+1); \
- grx_box(x+8,y-7,x+10,y-5,RED+1); \
- grx_box(x,y+6,x-1,y+8,RED+1); \
- grx_box(x-DIM_PESO-1,y-1,x-DIM_PESO+1,y+1,RED+1); \
- grx_box(x-DIM_PESO-1,y+2*DIM_PESO-1,x-DIM_PESO+1,y+2*DIM_PESO+1,RED+1); \
- grx_box(x+DIM_PESO-1,y-1,x+DIM_PESO+1,y+1,RED+1); \
- grx_box(x+DIM_PESO-1,y+2*DIM_PESO-1,x+DIM_PESO+1,y+2*DIM_PESO+1,RED+1); \
- grx_box(x-1,y+DIM_PESO-1,x+1,y+DIM_PESO+1,RED+1); \
- grx_box(x+4,y+DIM_PESO-1,x+6,y+DIM_PESO+1,RED+1); \
-
-//#define PULISCI(x,y) grx_box(x-14,y-11,x+DIM_PESO+2,y+2*DIM_PESO+2,COL_SFONDO)
-#define PULISCI(x,y,d) grx_disc(x,y,d,COL_SFONDO)
-
-/*********************************************************************/
-/* */
-/* Funzione per disegnare gli elementi statici */
-/* */
-/*********************************************************************/
-extern char tastiera;
-extern long double Forza_x,Forza_y,Velocita_x,Velocita_y,Acc_x,Acc_y,Massa;
-// Definizione del semaforo per l'utilizzo della modalità grafica
-extern sem_t mutex;
-
-TASK disegna_stato(int i);
-
-
-
Index: rel_1_2/mpeg2/jetctrl.c
===================================================================
--- rel_1_2/mpeg2/jetctrl.c (revision 1198)
+++ rel_1_2/mpeg2/jetctrl.c (nonexistent)
@@ -1,163 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: jetctrl.c,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:44 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * this file is directly derived from the demos/jumpball/jetctrl.c .
- * I just added this controls to check when the system will become overloaded
- */
-
-#define WCET_JETDUMMY 200
-#define PERIOD_JETDUMMY 100000
-#define DUMMY_PID 1
-
-#define JET_DUMMY_WIDTH (CMD_WIDTH-370)
-#define JET_DUMMY_HEIGHT (CMD_HEIGHT-40)
-
-/* the point (x, y) is the top left corner */
-#define JET_DUMMY_X (TRACK_X1+360)
-#define JET_DUMMY_Y (TRACK_Y2+32)
-
-// from jetdummy in the auto demo
-#define SCREEN_WIDTH 800
-#define SCREEN_HEIGHT 600
-/* Track dimensions */
-#define TRACK_WIDTH 500
-#define TRACK_HEIGHT 500
-/* Track position */
-#define TRACK_X1 0
-#define TRACK_Y1 0
-#define TRACK_X2 TRACK_X1+TRACK_WIDTH-1
-#define TRACK_Y2 TRACK_Y1+TRACK_HEIGHT-1
-#define CMD_WIDTH TRACK_WIDTH
-#define CMD_HEIGHT (SCREEN_HEIGHT-TRACK_HEIGHT-3)
-
-// JetControl
-
-#include "kernel/func.h"
-#include "drivers/glib.h"
-
-/* useful colors... */
-int white;
-int black;
-int red;
-int lightgray;
-
-TASK jetdummy_task(void *arg)
-{
- TIME now_dummy, last_dummy, diff_dummy, slice;
- struct timespec now, last, diff;
- int x = 0;
- int height;
-
- NULL_TIMESPEC(&last);
- last_dummy = 0;
- for (;;) {
- task_nopreempt();
- jet_getstat(DUMMY_PID, NULL, NULL, NULL, &now_dummy);
- sys_gettime(&now);
- task_preempt();
-
- SUBTIMESPEC(&now, &last, &diff);
- slice = diff.tv_sec * 1000000 + diff.tv_nsec/1000;
- diff_dummy = now_dummy - last_dummy;
-
- height = (int)(JET_DUMMY_HEIGHT*((float)diff_dummy)/((float)slice));
-
- TIMESPEC_ASSIGN(&last, &now);
- last_dummy = now_dummy;
-
- grx_line(JET_DUMMY_X+x,JET_DUMMY_Y,
- JET_DUMMY_X+x,JET_DUMMY_Y+height ,black);
- grx_line(JET_DUMMY_X+x,JET_DUMMY_Y+height,
- JET_DUMMY_X+x,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
- grx_line(JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y,
- JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y+JET_DUMMY_HEIGHT,255);
-
- x = (x+1)%JET_DUMMY_WIDTH;
-
- task_endcycle();
- }
-}
-
-void init_jetcontrol(void)
-{
- SOFT_TASK_MODEL m4;
-
- PID p4;
-
- /* useful colors ... */
- white = rgb16(255,255,255);
- black = rgb16(0,0,0);
- red = rgb16(255,0,0);
- lightgray = rgb16(128,128,128);
-
- /* scenario */
- grx_text("System load",
- JET_DUMMY_X+8, JET_DUMMY_Y-10, lightgray, black);
- grx_rect(JET_DUMMY_X-1, JET_DUMMY_Y-1,
- JET_DUMMY_X+JET_DUMMY_WIDTH, JET_DUMMY_Y+JET_DUMMY_HEIGHT+1, lightgray);
-
- grx_text("100%", JET_DUMMY_X-40, JET_DUMMY_Y, lightgray, black);
- grx_text(" 0%", JET_DUMMY_X-40, JET_DUMMY_Y+JET_DUMMY_HEIGHT-8, lightgray, black);
-
- grx_line(JET_DUMMY_X-1, JET_DUMMY_Y, JET_DUMMY_X-5, JET_DUMMY_Y, lightgray);
- grx_line(JET_DUMMY_X-1, JET_DUMMY_Y+JET_DUMMY_HEIGHT, JET_DUMMY_X-5, JET_DUMMY_Y+JET_DUMMY_HEIGHT, lightgray);
-
- /* jetdummy task */
- soft_task_default_model(m4);
- soft_task_def_period(m4, PERIOD_JETDUMMY);
- soft_task_def_met(m4, WCET_JETDUMMY);
- soft_task_def_usemath(m4);
- p4 = task_create("jdmy", jetdummy_task, &m4, NULL);
- if (p4 == -1) {
- grx_close();
- perror("Could not create task <jetdummy>");
- sys_end();
- }
- task_activate(p4);
-}
-
Index: rel_1_2/mpeg2/config.h
===================================================================
--- rel_1_2/mpeg2/config.h (revision 1198)
+++ rel_1_2/mpeg2/config.h (nonexistent)
@@ -1,45 +0,0 @@
-/* config.h, configuration defines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-/* define NON_ANSI_COMPILER for compilers without function prototyping */
-/* #define NON_ANSI_COMPILER */
-
-#ifdef NON_ANSI_COMPILER
-#define _ANSI_ARGS_(x) ()
-#else
-#define _ANSI_ARGS_(x) x
-#endif
-
-#define RB "rb"
-#define WB "wb"
-
-#ifndef O_BINARY
-#define O_BINARY 0
-
-#endif
Index: rel_1_2/mpeg2/getpic.c
===================================================================
--- rel_1_2/mpeg2/getpic.c (revision 1198)
+++ rel_1_2/mpeg2/getpic.c (nonexistent)
@@ -1,1225 +0,0 @@
-/* getpic.c, picture decoding */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-
-#include "config.h"
-#include "global.h"
-
-/* private prototypes*/
-static void picture_data _ANSI_ARGS_((int framenum));
-static void macroblock_modes _ANSI_ARGS_((int *pmacroblock_type, int *pstwtype,
- int *pstwclass, int *pmotion_type, int *pmotion_vector_count, int *pmv_format, int *pdmv,
- int *pmvscale, int *pdct_type));
-static void Clear_Block _ANSI_ARGS_((int comp));
-static void Sum_Block _ANSI_ARGS_((int comp));
-static void Saturate _ANSI_ARGS_((short *bp));
-static void Add_Block _ANSI_ARGS_((int comp, int bx, int by,
- int dct_type, int addflag));
-static void Update_Picture_Buffers _ANSI_ARGS_((void));
-static void frame_reorder _ANSI_ARGS_((int bitstream_framenum,
- int sequence_framenum));
-static void Decode_SNR_Macroblock _ANSI_ARGS_((int *SNRMBA, int *SNRMBAinc,
- int MBA, int MBAmax, int *dct_type));
-
-static void motion_compensation _ANSI_ARGS_((int MBA, int macroblock_type,
- int motion_type, int PMV[2][2][2], int motion_vertical_field_select[2][2],
- int dmvector[2], int stwtype, int dct_type));
-
-static void skipped_macroblock _ANSI_ARGS_((int dc_dct_pred[3],
- int PMV[2][2][2], int *motion_type, int motion_vertical_field_select[2][2],
- int *stwtype, int *macroblock_type));
-
-static int slice _ANSI_ARGS_((int framenum, int MBAmax));
-
-static int start_of_slice _ANSI_ARGS_ ((int MBAmax, int *MBA,
- int *MBAinc, int dc_dct_pred[3], int PMV[2][2][2]));
-
-static int decode_macroblock _ANSI_ARGS_((int *macroblock_type,
- int *stwtype, int *stwclass, int *motion_type, int *dct_type,
- int PMV[2][2][2], int dc_dct_pred[3],
- int motion_vertical_field_select[2][2], int dmvector[2]));
-
-
-/* decode one frame or field picture */
-void Decode_Picture(bitstream_framenum, sequence_framenum)
-int bitstream_framenum, sequence_framenum;
-{
-
- if (picture_structure==FRAME_PICTURE && Second_Field)
- {
- /* recover from illegal number of field pictures */
- printf("odd number of field pictures\n");
- Second_Field = 0;
- }
-
- /* IMPLEMENTATION: update picture buffer pointers */
- Update_Picture_Buffers();
-
-#ifdef VERIFY
- Check_Headers(bitstream_framenum, sequence_framenum);
-#endif /* VERIFY */
-
- /* ISO/IEC 13818-4 section 2.4.5.4 "frame buffer intercept method" */
- /* (section number based on November 1995 (Dallas) draft of the
- conformance document) */
- if(Ersatz_Flag)
- Substitute_Frame_Buffer(bitstream_framenum, sequence_framenum);
-
- /* form spatial scalable picture */
-
- /* form spatial scalable picture */
- /* ISO/IEC 13818-2 section 7.7: Spatial scalability */
- if (base.pict_scal && !Second_Field)
- {
- Spatial_Prediction();
- }
-
- /* decode picture data ISO/IEC 13818-2 section 6.2.3.7 */
- picture_data(bitstream_framenum);
-
- /* write or display current or previously decoded reference frame */
- /* ISO/IEC 13818-2 section 6.1.1.11: Frame reordering */
- frame_reorder(bitstream_framenum, sequence_framenum);
-
- if (picture_structure!=FRAME_PICTURE)
- Second_Field = !Second_Field;
-}
-
-
-/* decode all macroblocks of the current picture */
-/* stages described in ISO/IEC 13818-2 section 7 */
-static void picture_data(framenum)
-int framenum;
-{
- int MBAmax;
- int ret;
-
- /* number of macroblocks per picture */
- MBAmax = mb_width*mb_height;
-
- if (picture_structure!=FRAME_PICTURE)
- MBAmax>>=1; /* field picture has half as mnay macroblocks as frame */
-
- for(;;)
- {
- if((ret=slice(framenum, MBAmax))<0)
- return;
- }
-
-}
-
-
-
-/* decode all macroblocks of the current picture */
-/* ISO/IEC 13818-2 section 6.3.16 */
-static int slice(framenum, MBAmax)
-int framenum, MBAmax;
-{
- int MBA;
- int MBAinc, macroblock_type, motion_type, dct_type;
- int dc_dct_pred[3];
- int PMV[2][2][2], motion_vertical_field_select[2][2];
- int dmvector[2];
- int stwtype, stwclass;
- int SNRMBA, SNRMBAinc;
- int ret;
-
- MBA = 0; /* macroblock address */
- MBAinc = 0;
-
- if((ret=start_of_slice(MBAmax, &MBA, &MBAinc, dc_dct_pred, PMV))!=1)
- return(ret);
-
- if (Two_Streams && enhan.scalable_mode==SC_SNR)
- {
- SNRMBA=0;
- SNRMBAinc=0;
- }
-
- Fault_Flag=0;
-
- for (;;)
- {
-
- /* this is how we properly exit out of picture */
- if (MBA>=MBAmax)
- return(-1); /* all macroblocks decoded */
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("frame %d, MB %d\n",framenum,MBA);
-#endif /* TRACE */
-
-#ifdef DISPLAY
- if (!progressive_frame && picture_structure==FRAME_PICTURE
- && MBA==(MBAmax>>1) && framenum!=0 && Output_Type==T_X11
- && !Display_Progressive_Flag)
- {
- Display_Second_Field();
- }
-#endif
-
- ld = &base;
-
- if (MBAinc==0)
- {
- if (base.scalable_mode==SC_DP && base.priority_breakpoint==1)
- ld = &enhan;
-
- if (!Show_Bits(23) || Fault_Flag) /* next_start_code or fault */
- {
-resync: /* if Fault_Flag: resynchronize to next next_start_code */
- Fault_Flag = 0;
- return(0); /* trigger: go to next slice */
- }
- else /* neither next_start_code nor Fault_Flag */
- {
- if (base.scalable_mode==SC_DP && base.priority_breakpoint==1)
- ld = &enhan;
-
- /* decode macroblock address increment */
- MBAinc = Get_macroblock_address_increment();
-
- if (Fault_Flag) goto resync;
- }
- }
-
- if (MBA>=MBAmax)
- {
- /* MBAinc points beyond picture dimensions */
- if (!Quiet_Flag)
- printf("Too many macroblocks in picture\n");
- return(-1);
- }
-
- if (MBAinc==1) /* not skipped */
- {
- ret = decode_macroblock(&macroblock_type, &stwtype, &stwclass,
- &motion_type, &dct_type, PMV, dc_dct_pred,
- motion_vertical_field_select, dmvector);
-
- if(ret==-1)
- return(-1);
-
- if(ret==0)
- goto resync;
-
- }
- else /* MBAinc!=1: skipped macroblock */
- {
- /* ISO/IEC 13818-2 section 7.6.6 */
- skipped_macroblock(dc_dct_pred, PMV, &motion_type,
- motion_vertical_field_select, &stwtype, &macroblock_type);
- }
-
- /* SCALABILITY: SNR */
- /* ISO/IEC 13818-2 section 7.8 */
- /* NOTE: we currently ignore faults encountered in this routine */
- if (Two_Streams && enhan.scalable_mode==SC_SNR)
- Decode_SNR_Macroblock(&SNRMBA, &SNRMBAinc, MBA, MBAmax, &dct_type);
-
- /* ISO/IEC 13818-2 section 7.6 */
- motion_compensation(MBA, macroblock_type, motion_type, PMV,
- motion_vertical_field_select, dmvector, stwtype, dct_type);
-
-
- /* advance to next macroblock */
- MBA++;
- MBAinc--;
-
- /* SCALABILITY: SNR */
- if (Two_Streams && enhan.scalable_mode==SC_SNR)
- {
- SNRMBA++;
- SNRMBAinc--;
- }
-
- if (MBA>=MBAmax)
- return(-1); /* all macroblocks decoded */
- }
-}
-
-
-/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
-static void macroblock_modes(pmacroblock_type,pstwtype,pstwclass,
- pmotion_type,pmotion_vector_count,pmv_format,pdmv,pmvscale,pdct_type)
- int *pmacroblock_type, *pstwtype, *pstwclass;
- int *pmotion_type, *pmotion_vector_count, *pmv_format, *pdmv, *pmvscale;
- int *pdct_type;
-{
- int macroblock_type;
- int stwtype, stwcode, stwclass;
- int motion_type = 0;
- int motion_vector_count, mv_format, dmv, mvscale;
- int dct_type;
- static unsigned char stwc_table[3][4]
- = { {6,3,7,4}, {2,1,5,4}, {2,5,7,4} };
- static unsigned char stwclass_table[9]
- = {0, 1, 2, 1, 1, 2, 3, 3, 4};
-
- /* get macroblock_type */
- macroblock_type = Get_macroblock_type();
-
- if (Fault_Flag) return;
-
- /* get spatial_temporal_weight_code */
- if (macroblock_type & MB_WEIGHT)
- {
- if (spatial_temporal_weight_code_table_index==0)
- stwtype = 4;
- else
- {
- stwcode = Get_Bits(2);
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("spatial_temporal_weight_code (");
- Print_Bits(stwcode,2,2);
- printf("): %d\n",stwcode);
- }
-#endif /* TRACE */
- stwtype = stwc_table[spatial_temporal_weight_code_table_index-1][stwcode];
- }
- }
- else
- stwtype = (macroblock_type & MB_CLASS4) ? 8 : 0;
-
- /* SCALABILITY: derive spatial_temporal_weight_class (Table 7-18) */
- stwclass = stwclass_table[stwtype];
-
- /* get frame/field motion type */
- if (macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD))
- {
- if (picture_structure==FRAME_PICTURE) /* frame_motion_type */
- {
- motion_type = frame_pred_frame_dct ? MC_FRAME : Get_Bits(2);
-#ifdef TRACE
- if (!frame_pred_frame_dct && Trace_Flag)
- {
- printf("frame_motion_type (");
- Print_Bits(motion_type,2,2);
- printf("): %s\n",motion_type==MC_FIELD?"Field":
- motion_type==MC_FRAME?"Frame":
- motion_type==MC_DMV?"Dual_Prime":"Invalid");
- }
-#endif /* TRACE */
- }
- else /* field_motion_type */
- {
- motion_type = Get_Bits(2);
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("field_motion_type (");
- Print_Bits(motion_type,2,2);
- printf("): %s\n",motion_type==MC_FIELD?"Field":
- motion_type==MC_16X8?"16x8 MC":
- motion_type==MC_DMV?"Dual_Prime":"Invalid");
- }
-#endif /* TRACE */
- }
- }
- else if ((macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
- {
- /* concealment motion vectors */
- motion_type = (picture_structure==FRAME_PICTURE) ? MC_FRAME : MC_FIELD;
- }
-#if 0
- else
- {
- printf("maroblock_modes(): unknown macroblock type\n");
- motion_type = -1;
- }
-#endif
-
- /* derive motion_vector_count, mv_format and dmv, (table 6-17, 6-18) */
- if (picture_structure==FRAME_PICTURE)
- {
- motion_vector_count = (motion_type==MC_FIELD && stwclass<2) ? 2 : 1;
- mv_format = (motion_type==MC_FRAME) ? MV_FRAME : MV_FIELD;
- }
- else
- {
- motion_vector_count = (motion_type==MC_16X8) ? 2 : 1;
- mv_format = MV_FIELD;
- }
-
- dmv = (motion_type==MC_DMV); /* dual prime */
-
- /* field mv predictions in frame pictures have to be scaled
- * ISO/IEC 13818-2 section 7.6.3.1 Decoding the motion vectors
- * IMPLEMENTATION: mvscale is derived for later use in motion_vectors()
- * it displaces the stage:
- *
- * if((mv_format=="field")&&(t==1)&&(picture_structure=="Frame picture"))
- * prediction = PMV[r][s][t] DIV 2;
- */
-
- mvscale = ((mv_format==MV_FIELD) && (picture_structure==FRAME_PICTURE));
-
- /* get dct_type (frame DCT / field DCT) */
- dct_type = (picture_structure==FRAME_PICTURE)
- && (!frame_pred_frame_dct)
- && (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA))
- ? Get_Bits(1)
- : 0;
-
-#ifdef TRACE
- if (Trace_Flag && (picture_structure==FRAME_PICTURE)
- && (!frame_pred_frame_dct)
- && (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA)))
- printf("dct_type (%d): %s\n",dct_type,dct_type?"Field":"Frame");
-#endif /* TRACE */
-
- /* return values */
- *pmacroblock_type = macroblock_type;
- *pstwtype = stwtype;
- *pstwclass = stwclass;
- *pmotion_type = motion_type;
- *pmotion_vector_count = motion_vector_count;
- *pmv_format = mv_format;
- *pdmv = dmv;
- *pmvscale = mvscale;
- *pdct_type = dct_type;
-}
-
-
-/* move/add 8x8-Block from block[comp] to backward_reference_frame */
-/* copy reconstructed 8x8 block from block[comp] to current_frame[]
- * ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data
- * This stage also embodies some of the operations implied by:
- * - ISO/IEC 13818-2 section 7.6.7: Combining predictions
- * - ISO/IEC 13818-2 section 6.1.3: Macroblock
-*/
-static void Add_Block(comp,bx,by,dct_type,addflag)
-int comp,bx,by,dct_type,addflag;
-{
- int cc,i, j, iincr;
- unsigned char *rfp;
- short *bp;
-
-
- /* derive color component index */
- /* equivalent to ISO/IEC 13818-2 Table 7-1 */
- cc = (comp<4) ? 0 : (comp&1)+1; /* color component index */
-
- if (cc==0)
- {
- /* luminance */
-
- if (picture_structure==FRAME_PICTURE)
- if (dct_type)
- {
- /* field DCT coding */
- rfp = current_frame[0]
- + Coded_Picture_Width*(by+((comp&2)>>1)) + bx + ((comp&1)<<3);
- iincr = (Coded_Picture_Width<<1) - 8;
- }
- else
- {
- /* frame DCT coding */
- rfp = current_frame[0]
- + Coded_Picture_Width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
- iincr = Coded_Picture_Width - 8;
- }
- else
- {
- /* field picture */
- rfp = current_frame[0]
- + (Coded_Picture_Width<<1)*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
- iincr = (Coded_Picture_Width<<1) - 8;
- }
- }
- else
- {
- /* chrominance */
-
- /* scale coordinates */
- if (chroma_format!=CHROMA444)
- bx >>= 1;
- if (chroma_format==CHROMA420)
- by >>= 1;
- if (picture_structure==FRAME_PICTURE)
- {
- if (dct_type && (chroma_format!=CHROMA420))
- {
- /* field DCT coding */
- rfp = current_frame[cc]
- + Chroma_Width*(by+((comp&2)>>1)) + bx + (comp&8);
- iincr = (Chroma_Width<<1) - 8;
- }
- else
- {
- /* frame DCT coding */
- rfp = current_frame[cc]
- + Chroma_Width*(by+((comp&2)<<2)) + bx + (comp&8);
- iincr = Chroma_Width - 8;
- }
- }
- else
- {
- /* field picture */
- rfp = current_frame[cc]
- + (Chroma_Width<<1)*(by+((comp&2)<<2)) + bx + (comp&8);
- iincr = (Chroma_Width<<1) - 8;
- }
- }
-
- bp = ld->block[comp];
-
- if (addflag)
- {
- for (i=0; i<8; i++)
- {
- for (j=0; j<8; j++)
- {
- *rfp = Clip[*bp++ + *rfp];
- rfp++;
- }
-
- rfp+= iincr;
- }
- }
- else
- {
- for (i=0; i<8; i++)
- {
- for (j=0; j<8; j++)
- *rfp++ = Clip[*bp++ + 128];
-
- rfp+= iincr;
- }
- }
-}
-
-
-/* ISO/IEC 13818-2 section 7.8 */
-static void Decode_SNR_Macroblock(SNRMBA, SNRMBAinc, MBA, MBAmax, dct_type)
- int *SNRMBA, *SNRMBAinc;
- int MBA, MBAmax;
- int *dct_type;
-{
- int SNRmacroblock_type, SNRcoded_block_pattern, SNRdct_type, dummy;
- int slice_vert_pos_ext, quantizer_scale_code, comp, code;
-
- ld = &enhan;
-
- if (*SNRMBAinc==0)
- {
- if (!Show_Bits(23)) /* next_start_code */
- {
- next_start_code();
- code = Show_Bits(32);
-
- if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
- {
- /* only slice headers are allowed in picture_data */
- if (!Quiet_Flag)
- printf("SNR: Premature end of picture\n");
- return;
- }
-
- Flush_Buffer32();
-
- /* decode slice header (may change quantizer_scale) */
- slice_vert_pos_ext = slice_header();
-
- /* decode macroblock address increment */
- *SNRMBAinc = Get_macroblock_address_increment();
-
- /* set current location */
- *SNRMBA =
- ((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *SNRMBAinc - 1;
-
- *SNRMBAinc = 1; /* first macroblock in slice: not skipped */
- }
- else /* not next_start_code */
- {
- if (*SNRMBA>=MBAmax)
- {
- if (!Quiet_Flag)
- printf("Too many macroblocks in picture\n");
- return;
- }
-
- /* decode macroblock address increment */
- *SNRMBAinc = Get_macroblock_address_increment();
- }
- }
-
- if (*SNRMBA!=MBA)
- {
- /* streams out of sync */
- if (!Quiet_Flag)
- printf("Cant't synchronize streams\n");
- return;
- }
-
- if (*SNRMBAinc==1) /* not skipped */
- {
- macroblock_modes(&SNRmacroblock_type, &dummy, &dummy,
- &dummy, &dummy, &dummy, &dummy, &dummy,
- &SNRdct_type);
-
- if (SNRmacroblock_type & MACROBLOCK_PATTERN)
- *dct_type = SNRdct_type;
-
- if (SNRmacroblock_type & MACROBLOCK_QUANT)
- {
- quantizer_scale_code = Get_Bits(5);
- ld->quantizer_scale =
- ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1;
- }
-
- /* macroblock_pattern */
- if (SNRmacroblock_type & MACROBLOCK_PATTERN)
- {
- SNRcoded_block_pattern = Get_coded_block_pattern();
-
- if (chroma_format==CHROMA422)
- SNRcoded_block_pattern = (SNRcoded_block_pattern<<2) | Get_Bits(2); /* coded_block_pattern_1 */
- else if (chroma_format==CHROMA444)
- SNRcoded_block_pattern = (SNRcoded_block_pattern<<6) | Get_Bits(6); /* coded_block_pattern_2 */
- }
- else
- SNRcoded_block_pattern = 0;
-
- /* decode blocks */
- for (comp=0; comp<block_count; comp++)
- {
- Clear_Block(comp);
-
- if (SNRcoded_block_pattern & (1<<(block_count-1-comp)))
- Decode_MPEG2_Non_Intra_Block(comp);
- }
- }
- else /* SNRMBAinc!=1: skipped macroblock */
- {
- for (comp=0; comp<block_count; comp++)
- Clear_Block(comp);
- }
-
- ld = &base;
-}
-
-
-
-/* IMPLEMENTATION: set scratch pad macroblock to zero */
-static void Clear_Block(comp)
-int comp;
-{
- short *Block_Ptr;
- int i;
-
- Block_Ptr = ld->block[comp];
-
- for (i=0; i<64; i++)
- *Block_Ptr++ = 0;
-}
-
-
-/* SCALABILITY: add SNR enhancement layer block data to base layer */
-/* ISO/IEC 13818-2 section 7.8.3.4: Addition of coefficients from the two layes */
-static void Sum_Block(comp)
-int comp;
-{
- short *Block_Ptr1, *Block_Ptr2;
- int i;
-
- Block_Ptr1 = base.block[comp];
- Block_Ptr2 = enhan.block[comp];
-
- for (i=0; i<64; i++)
- *Block_Ptr1++ += *Block_Ptr2++;
-}
-
-
-/* limit coefficients to -2048..2047 */
-/* ISO/IEC 13818-2 section 7.4.3 and 7.4.4: Saturation and Mismatch control */
-static void Saturate(Block_Ptr)
-short *Block_Ptr;
-{
- int i, sum, val;
-
- sum = 0;
-
- /* ISO/IEC 13818-2 section 7.4.3: Saturation */
- for (i=0; i<64; i++)
- {
- val = Block_Ptr[i];
-
- if (val>2047)
- val = 2047;
- else if (val<-2048)
- val = -2048;
-
- Block_Ptr[i] = val;
- sum+= val;
- }
-
- /* ISO/IEC 13818-2 section 7.4.4: Mismatch control */
- if ((sum&1)==0)
- Block_Ptr[63]^= 1;
-
-}
-
-
-/* reuse old picture buffers as soon as they are no longer needed
- based on life-time axioms of MPEG */
-static void Update_Picture_Buffers()
-{
- int cc; /* color component index */
- unsigned char *tmp; /* temporary swap pointer */
-
- for (cc=0; cc<3; cc++)
- {
- /* B pictures do not need to be save for future reference */
- if (picture_coding_type==B_TYPE)
- {
- current_frame[cc] = auxframe[cc];
- }
- else
- {
- /* only update at the beginning of the coded frame */
- if (!Second_Field)
- {
- tmp = forward_reference_frame[cc];
-
- /* the previously decoded reference frame is stored
- coincident with the location where the backward
- reference frame is stored (backwards prediction is not
- needed in P pictures) */
- forward_reference_frame[cc] = backward_reference_frame[cc];
-
- /* update pointer for potential future B pictures */
- backward_reference_frame[cc] = tmp;
- }
-
- /* can erase over old backward reference frame since it is not used
- in a P picture, and since any subsequent B pictures will use the
- previously decoded I or P frame as the backward_reference_frame */
- current_frame[cc] = backward_reference_frame[cc];
- }
-
- /* IMPLEMENTATION:
- one-time folding of a line offset into the pointer which stores the
- memory address of the current frame saves offsets and conditional
- branches throughout the remainder of the picture processing loop */
- if (picture_structure==BOTTOM_FIELD)
- current_frame[cc]+= (cc==0) ? Coded_Picture_Width : Chroma_Width;
- }
-}
-
-
-/* store last frame */
-
-void Output_Last_Frame_of_Sequence(Framenum)
-int Framenum;
-{
- if (Second_Field)
- printf("last frame incomplete, not stored\n");
- else
- Write_Frame(backward_reference_frame,Framenum-1);
-}
-
-
-
-static void frame_reorder(Bitstream_Framenum, Sequence_Framenum)
-int Bitstream_Framenum, Sequence_Framenum;
-{
- /* tracking variables to insure proper output in spatial scalability */
- static int Oldref_progressive_frame, Newref_progressive_frame;
-
- if (Sequence_Framenum!=0)
- {
- if (picture_structure==FRAME_PICTURE || Second_Field)
- {
- if (picture_coding_type==B_TYPE)
- Write_Frame(auxframe,Bitstream_Framenum-1);
- else
- {
- Newref_progressive_frame = progressive_frame;
- progressive_frame = Oldref_progressive_frame;
-
- Write_Frame(forward_reference_frame,Bitstream_Framenum-1);
-
- Oldref_progressive_frame = progressive_frame = Newref_progressive_frame;
- }
- }
-#ifdef DISPLAY
- else if (Output_Type==T_X11)
- {
- if(!Display_Progressive_Flag)
- Display_Second_Field();
- }
-#endif
- }
- else
- Oldref_progressive_frame = progressive_frame;
-
-}
-
-
-/* ISO/IEC 13818-2 section 7.6 */
-static void motion_compensation(MBA, macroblock_type, motion_type, PMV,
- motion_vertical_field_select, dmvector, stwtype, dct_type)
-int MBA;
-int macroblock_type;
-int motion_type;
-int PMV[2][2][2];
-int motion_vertical_field_select[2][2];
-int dmvector[2];
-int stwtype;
-int dct_type;
-{
- int bx, by;
- int comp;
-
- /* derive current macroblock position within picture */
- /* ISO/IEC 13818-2 section 6.3.1.6 and 6.3.1.7 */
- bx = 16*(MBA%mb_width);
- by = 16*(MBA/mb_width);
-
- /* motion compensation */
- if (!(macroblock_type & MACROBLOCK_INTRA))
- form_predictions(bx,by,macroblock_type,motion_type,PMV,
- motion_vertical_field_select,dmvector,stwtype);
-
- /* SCALABILITY: Data Partitioning */
- if (base.scalable_mode==SC_DP)
- ld = &base;
-
- /* copy or add block data into picture */
- for (comp=0; comp<block_count; comp++)
- {
- /* SCALABILITY: SNR */
- /* ISO/IEC 13818-2 section 7.8.3.4: Addition of coefficients from
- the two a layers */
- if (Two_Streams && enhan.scalable_mode==SC_SNR)
- Sum_Block(comp); /* add SNR enhancement layer data to base layer */
-
- /* MPEG-2 saturation and mismatch control */
- /* base layer could be MPEG-1 stream, enhancement MPEG-2 SNR */
- /* ISO/IEC 13818-2 section 7.4.3 and 7.4.4: Saturation and Mismatch control */
- if ((Two_Streams && enhan.scalable_mode==SC_SNR) || ld->MPEG2_Flag)
- Saturate(ld->block[comp]);
-
- /* ISO/IEC 13818-2 section Annex A: inverse DCT */
- if (Reference_IDCT_Flag)
- Reference_IDCT(ld->block[comp]);
- else
- Fast_IDCT(ld->block[comp]);
-
- /* ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data */
- Add_Block(comp,bx,by,dct_type,(macroblock_type & MACROBLOCK_INTRA)==0);
- }
-
-}
-
-
-
-/* ISO/IEC 13818-2 section 7.6.6 */
-static void skipped_macroblock(dc_dct_pred, PMV, motion_type,
- motion_vertical_field_select, stwtype, macroblock_type)
-int dc_dct_pred[3];
-int PMV[2][2][2];
-int *motion_type;
-int motion_vertical_field_select[2][2];
-int *stwtype;
-int *macroblock_type;
-{
- int comp;
-
- /* SCALABILITY: Data Paritioning */
- if (base.scalable_mode==SC_DP)
- ld = &base;
-
- for (comp=0; comp<block_count; comp++)
- Clear_Block(comp);
-
- /* reset intra_dc predictors */
- /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
- dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
-
- /* reset motion vector predictors */
- /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
- if (picture_coding_type==P_TYPE)
- PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
-
- /* derive motion_type */
- if (picture_structure==FRAME_PICTURE)
- *motion_type = MC_FRAME;
- else
- {
- *motion_type = MC_FIELD;
-
- /* predict from field of same parity */
- /* ISO/IEC 13818-2 section 7.6.6.1 and 7.6.6.3: P field picture and B field
- picture */
- motion_vertical_field_select[0][0]=motion_vertical_field_select[0][1] =
- (picture_structure==BOTTOM_FIELD);
- }
-
- /* skipped I are spatial-only predicted, */
- /* skipped P and B are temporal-only predicted */
- /* ISO/IEC 13818-2 section 7.7.6: Skipped macroblocks */
- *stwtype = (picture_coding_type==I_TYPE) ? 8 : 0;
-
- /* IMPLEMENTATION: clear MACROBLOCK_INTRA */
- *macroblock_type&= ~MACROBLOCK_INTRA;
-
-}
-
-
-/* return==-1 means go to next picture */
-/* the expression "start of slice" is used throughout the normative
- body of the MPEG specification */
-static int start_of_slice(MBAmax, MBA, MBAinc,
- dc_dct_pred, PMV)
-int MBAmax;
-int *MBA;
-int *MBAinc;
-int dc_dct_pred[3];
-int PMV[2][2][2];
-{
- unsigned int code;
- int slice_vert_pos_ext;
-
- ld = &base;
-
- Fault_Flag = 0;
-
- next_start_code();
- code = Show_Bits(32);
-
- if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
- {
- /* only slice headers are allowed in picture_data */
- if (!Quiet_Flag)
- printf("start_of_slice(): Premature end of picture\n");
-
- return(-1); /* trigger: go to next picture */
- }
-
- Flush_Buffer32();
-
- /* decode slice header (may change quantizer_scale) */
- slice_vert_pos_ext = slice_header();
-
-
- /* SCALABILITY: Data Partitioning */
- if (base.scalable_mode==SC_DP)
- {
- ld = &enhan;
- next_start_code();
- code = Show_Bits(32);
-
- if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
- {
- /* only slice headers are allowed in picture_data */
- if (!Quiet_Flag)
- printf("DP: Premature end of picture\n");
- return(-1); /* trigger: go to next picture */
- }
-
- Flush_Buffer32();
-
- /* decode slice header (may change quantizer_scale) */
- slice_vert_pos_ext = slice_header();
-
- if (base.priority_breakpoint!=1)
- ld = &base;
- }
-
- /* decode macroblock address increment */
- *MBAinc = Get_macroblock_address_increment();
-
- if (Fault_Flag)
- {
- printf("start_of_slice(): MBAinc unsuccessful\n");
- return(0); /* trigger: go to next slice */
- }
-
- /* set current location */
- /* NOTE: the arithmetic used to derive macroblock_address below is
- * equivalent to ISO/IEC 13818-2 section 6.3.17: Macroblock
- */
- *MBA = ((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *MBAinc - 1;
- *MBAinc = 1; /* first macroblock in slice: not skipped */
-
- /* reset all DC coefficient and motion vector predictors */
- /* reset all DC coefficient and motion vector predictors */
- /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
- dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
-
- /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
- PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
- PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
-
- /* successfull: trigger decode macroblocks in slice */
- return(1);
-}
-
-
-/* ISO/IEC 13818-2 sections 7.2 through 7.5 */
-static int decode_macroblock(macroblock_type, stwtype, stwclass,
- motion_type, dct_type, PMV, dc_dct_pred,
- motion_vertical_field_select, dmvector)
-int *macroblock_type;
-int *stwtype;
-int *stwclass;
-int *motion_type;
-int *dct_type;
-int PMV[2][2][2];
-int dc_dct_pred[3];
-int motion_vertical_field_select[2][2];
-int dmvector[2];
-{
- /* locals */
- int quantizer_scale_code;
- int comp;
-
- int motion_vector_count;
- int mv_format;
- int dmv;
- int mvscale;
- int coded_block_pattern;
-
- /* SCALABILITY: Data Patitioning */
- if (base.scalable_mode==SC_DP)
- {
- if (base.priority_breakpoint<=2)
- ld = &enhan;
- else
- ld = &base;
- }
-
- /* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
- macroblock_modes(macroblock_type, stwtype, stwclass,
- motion_type, &motion_vector_count, &mv_format, &dmv, &mvscale,
- dct_type);
-
- if (Fault_Flag) return(0); /* trigger: go to next slice */
-
- if (*macroblock_type & MACROBLOCK_QUANT)
- {
- quantizer_scale_code = Get_Bits(5);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("quantiser_scale_code (");
- Print_Bits(quantizer_scale_code,5,5);
- printf("): %d\n",quantizer_scale_code);
- }
-#endif /* TRACE */
-
- /* ISO/IEC 13818-2 section 7.4.2.2: Quantizer scale factor */
- if (ld->MPEG2_Flag)
- ld->quantizer_scale =
- ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code]
- : (quantizer_scale_code << 1);
- else
- ld->quantizer_scale = quantizer_scale_code;
-
- /* SCALABILITY: Data Partitioning */
- if (base.scalable_mode==SC_DP)
- /* make sure base.quantizer_scale is valid */
- base.quantizer_scale = ld->quantizer_scale;
- }
-
- /* motion vectors */
-
-
- /* ISO/IEC 13818-2 section 6.3.17.2: Motion vectors */
-
- /* decode forward motion vectors */
- if ((*macroblock_type & MACROBLOCK_MOTION_FORWARD)
- || ((*macroblock_type & MACROBLOCK_INTRA)
- && concealment_motion_vectors))
- {
- if (ld->MPEG2_Flag)
- motion_vectors(PMV,dmvector,motion_vertical_field_select,
- 0,motion_vector_count,mv_format,f_code[0][0]-1,f_code[0][1]-1,
- dmv,mvscale);
- else
- motion_vector(PMV[0][0],dmvector,
- forward_f_code-1,forward_f_code-1,0,0,full_pel_forward_vector);
- }
-
- if (Fault_Flag) return(0); /* trigger: go to next slice */
-
- /* decode backward motion vectors */
- if (*macroblock_type & MACROBLOCK_MOTION_BACKWARD)
- {
- if (ld->MPEG2_Flag)
- motion_vectors(PMV,dmvector,motion_vertical_field_select,
- 1,motion_vector_count,mv_format,f_code[1][0]-1,f_code[1][1]-1,0,
- mvscale);
- else
- motion_vector(PMV[0][1],dmvector,
- backward_f_code-1,backward_f_code-1,0,0,full_pel_backward_vector);
- }
-
- if (Fault_Flag) return(0); /* trigger: go to next slice */
-
- if ((*macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
- Flush_Buffer(1); /* remove marker_bit */
-
- if (base.scalable_mode==SC_DP && base.priority_breakpoint==3)
- ld = &enhan;
-
- /* macroblock_pattern */
- /* ISO/IEC 13818-2 section 6.3.17.4: Coded block pattern */
- if (*macroblock_type & MACROBLOCK_PATTERN)
- {
- coded_block_pattern = Get_coded_block_pattern();
-
- if (chroma_format==CHROMA422)
- {
- /* coded_block_pattern_1 */
- coded_block_pattern = (coded_block_pattern<<2) | Get_Bits(2);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("coded_block_pattern_1: ");
- Print_Bits(coded_block_pattern,2,2);
- printf(" (%d)\n",coded_block_pattern&3);
- }
-#endif /* TRACE */
- }
- else if (chroma_format==CHROMA444)
- {
- /* coded_block_pattern_2 */
- coded_block_pattern = (coded_block_pattern<<6) | Get_Bits(6);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("coded_block_pattern_2: ");
- Print_Bits(coded_block_pattern,6,6);
- printf(" (%d)\n",coded_block_pattern&63);
- }
-#endif /* TRACE */
- }
- }
- else
- coded_block_pattern = (*macroblock_type & MACROBLOCK_INTRA) ?
- (1<<block_count)-1 : 0;
-
- if (Fault_Flag) return(0); /* trigger: go to next slice */
-
- /* decode blocks */
- for (comp=0; comp<block_count; comp++)
- {
- /* SCALABILITY: Data Partitioning */
- if (base.scalable_mode==SC_DP)
- ld = &base;
-
- Clear_Block(comp);
-
- if (coded_block_pattern & (1<<(block_count-1-comp)))
- {
- if (*macroblock_type & MACROBLOCK_INTRA)
- {
- if (ld->MPEG2_Flag)
- Decode_MPEG2_Intra_Block(comp,dc_dct_pred);
- else
- Decode_MPEG1_Intra_Block(comp,dc_dct_pred);
- }
- else
- {
- if (ld->MPEG2_Flag)
- Decode_MPEG2_Non_Intra_Block(comp);
- else
- Decode_MPEG1_Non_Intra_Block(comp);
- }
-
- if (Fault_Flag) return(0); /* trigger: go to next slice */
- }
- }
-
- if(picture_coding_type==D_TYPE)
- {
- /* remove end_of_macroblock (always 1, prevents startcode emulation) */
- /* ISO/IEC 11172-2 section 2.4.2.7 and 2.4.3.6 */
- marker_bit("D picture end_of_macroblock bit");
- }
-
- /* reset intra_dc predictors */
- /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
- if (!(*macroblock_type & MACROBLOCK_INTRA))
- dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
-
- /* reset motion vector predictors */
- if ((*macroblock_type & MACROBLOCK_INTRA) && !concealment_motion_vectors)
- {
- /* intra mb without concealment motion vectors */
- /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
- PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
- PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
- }
-
- /* special "No_MC" macroblock_type case */
- /* ISO/IEC 13818-2 section 7.6.3.5: Prediction in P pictures */
- if ((picture_coding_type==P_TYPE)
- && !(*macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_INTRA)))
- {
- /* non-intra mb without forward mv in a P picture */
- /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
- PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
-
- /* derive motion_type */
- /* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes, frame_motion_type */
- if (picture_structure==FRAME_PICTURE)
- *motion_type = MC_FRAME;
- else
- {
- *motion_type = MC_FIELD;
- /* predict from field of same parity */
- motion_vertical_field_select[0][0] = (picture_structure==BOTTOM_FIELD);
- }
- }
-
- if (*stwclass==4)
- {
- /* purely spatially predicted macroblock */
- /* ISO/IEC 13818-2 section 7.7.5.1: Resetting motion vector predictions */
- PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
- PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
- }
-
- /* successfully decoded macroblock */
- return(1);
-
-} /* decode_macroblock */
-
-
Index: rel_1_2/mpeg2/idctref.c
===================================================================
--- rel_1_2/mpeg2/idctref.c (revision 1198)
+++ rel_1_2/mpeg2/idctref.c (nonexistent)
@@ -1,108 +0,0 @@
-/* Reference_IDCT.c, Inverse Discrete Fourier Transform, double precision */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-/* Perform IEEE 1180 reference (64-bit floating point, separable 8x1
- * direct matrix multiply) Inverse Discrete Cosine Transform
-*/
-
-
-/* Here we use math.h to generate constants. Compiler results may
- vary a little */
-
-#include <math.h>
-
-#include "config.h"
-
-#ifndef PI
-# ifdef M_PI
-# define PI M_PI
-# else
-# define PI 3.14159265358979323846
-# endif
-#endif
-
-/* global declarations */
-void Initialize_Fast_IDCTref _ANSI_ARGS_((void));
-void Reference_IDCT _ANSI_ARGS_((short *block));
-
-/* private data */
-
-/* cosine transform matrix for 8x1 IDCT */
-static double c[8][8];
-
-/* initialize DCT coefficient matrix */
-
-void Initialize_Reference_IDCT()
-{
- int freq, time;
- double scale;
-
- for (freq=0; freq < 8; freq++)
- {
- scale = (freq == 0) ? sqrt(0.125) : 0.5;
- for (time=0; time<8; time++)
- c[freq][time] = scale*cos((PI/8.0)*freq*(time + 0.5));
- }
-}
-
-/* perform IDCT matrix multiply for 8x8 coefficient block */
-
-void Reference_IDCT(block)
-short *block;
-{
- int i, j, k, v;
- double partial_product;
- double tmp[64];
-
- for (i=0; i<8; i++)
- for (j=0; j<8; j++)
- {
- partial_product = 0.0;
-
- for (k=0; k<8; k++)
- partial_product+= c[k][j]*block[8*i+k];
-
- tmp[8*i+j] = partial_product;
- }
-
- /* Transpose operation is integrated into address mapping by switching
- loop order of i and j */
-
- for (j=0; j<8; j++)
- for (i=0; i<8; i++)
- {
- partial_product = 0.0;
-
- for (k=0; k<8; k++)
- partial_product+= c[k][i]*tmp[8*k+j];
-
- v = (int) floor(partial_product+0.5);
- block[8*i+j] = (v<-256) ? -256 : ((v>255) ? 255 : v);
- }
-}
Index: rel_1_2/mpeg2/spatial.doc
===================================================================
--- rel_1_2/mpeg2/spatial.doc (revision 1198)
+++ rel_1_2/mpeg2/spatial.doc (nonexistent)
@@ -1,154 +0,0 @@
-The following changes have been made to debug spatial scalability:
-
-gethdr.c
---------
-
-Temporal_reference is used to compute the frame number of each frame,
-named true_framenum. The periodic reset at each GOP header as well as
-the wrap of temporal_reference at 1024 cause a base value
-temp_ref_base to be incremented accordingly.
-
-spatscal.c
-----------
-
-getspatref()
-
-A potential problem: Variable char fname[32] was dimensioned
-statically and too small.
-
-true_framenum is used instead of lower_layer_temporal_reference to
-determine the lower layer frame to be read for spatial prediction.
-
-The verification of lower_layer_temporal_reference is not possible
-since the temporal reference values that have been encoded into the
-base layer bitstream are not available to the enhancement layer
-decoder.
-
-Since there is no decoder timing information available, the rules on
-which frames can legally be used as spatial prediction frames cannot
-be checked.
-
-Lower layer frames are read field-wise or frame-wise, depending on the
-lower_layer_progressive_frame flag. Consistency between layers is
-checked since the file format for frame and field pictures differs.
-
-Note that the base layer decoder must not use the -f option to enforce
-frame-wise storage.
-
-Note further that only yuv image format (option -o0) is supported as
-input format.
-
-spatpred()
-
-The code for the various combinations of llprog_frame, llfieldsel and
-prog_frame has been completed and verified with the tceh_conf23
-bitstream that uses all permissive combinations.
-
-
-getpic.c
---------
-
-A small bug when storing an I- or P-frame: The prog_frame flag that
-the decoder knows when storing the oldrefframe belongs to the current
-refframe. Therefore the old value of the flag needs to be memorized.
-
-
-store.c
--------
-
-A potential problem: the filename variables char outname[32],
-tmpname[32] are statically dimensioned and quite small.
-
-
-The concept of time in this video decoder software
---------------------------------------------------
-
-When decoding a non-scalable bitstream, the frame number (i.e.
-temporal position) of the current I- or P-frame can be derived
-implicitly from the number of preceding B-frames after they have been
-decoded. Therefore the temporal_reference entry in the picture header
-is somewhat redundant and does not necessarily have to be evaluated in
-the decoding process.
-
-Decoding of the enhancement layer of a spatial scalable hierarchy,
-however, requires to know the temporal position of each frame at the
-instant when it is decoded, since data from a lower layer reference
-frame has to be incorporated.
-
-In the architecture of this video-only decoder decoding of a spatial
-scalable hierarchy of bitstreams is done by calling mpeg2decode once
-for the base layer bitstream and a second time for the enhancement
-layer bitstream, indicating where the decoded base layer frames can be
-found (option -s<filename>).
-
-Here the concept of time is only present in the form of frame numbers.
-Therefore spatial scalable bitstream hierarchies can only be handled
-under the assumption that base and enhancement layer bitstreams are
-decoded to image sequences where corresponding images of both layers
-have identical frame numbers.
-
-More specifically this means that base and enhancement layer
-bitstreams must contain video with the same frame rate. Furthermore
-only the temporally coincident frame of the base layer can be accessed
-for spatial prediction by the enhancement layer decoder, since it is
-not possible to resolve unambiguously the lower_layer_temporal_reference
-which is meant to further specify the lower layer reference frame.
-
-======================== SPATIAL.DOC ========================0
-
-Decoding a spatial scalable hierarchy of bitstreams
----------------------------------------------------
-
-With this video-only decoder decoding of a spatial scalable hierarchy
-of bitstreams is done by calling mpeg2decode once for the base layer
-bitstream and a second time for the enhancement layer bitstream,
-indicating where the decoded base layer frames can be found
-(using option -s and supplying <spatial base filename>).
-
-mpeg2decode -r -o0 base.mpg base%d%c
-mpeg2decode -r -o0 -f -s base%d%c enh.mpg enh%d
-
-Note that the base layer decoder must not use the -f option to enforce
-frame-wise storage.
-
-Note further that only yuv image format (option -o0) is supported as
-input format.
-
-
-Timing / layer synchronisation in this video decoder software
--------------------------------------------------------------
-
-When decoding a non-scalable bitstream, the frame number (i.e.
-temporal position) of the current I- or P-frame can be derived
-implicitly from the number of preceding B-frames after they have been
-decoded. Therefore the temporal_reference entry in the picture header
-is somewhat redundant and does not necessarily have to be evaluated in
-the decoding process.
-
-Decoding of the enhancement layer of a spatial scalable hierarchy,
-however, requires to know the temporal position of each frame at the
-instant when it is decoded, since data from a lower layer reference
-frame has to be incorporated.
-
-The concept of time is only present in the form of frame numbers.
-Therefore spatial scalable bitstream hierarchies can only be handled
-under the assumption that base and enhancement layer bitstreams are
-decoded to image sequences where corresponding images of both layers
-have identical frame numbers.
-
-More specifically this means that base and enhancement layer
-bitstreams must contain video with the same frame rate. Furthermore
-only the temporally coincident frame of the base layer can be accessed
-for spatial prediction by the enhancement layer decoder, since it is
-not possible to resolve unambiguously the lower_layer_temporal_reference
-which is meant to further specify the lower layer reference frame.
-
-Lower layer frames are read field-wise or frame-wise, depending on the
-lower_layer_progressive_frame flag. Consistency between layers in this
-respect is checked since the file format for frame and field pictures
-differs.
-
-
-
-
-
Index: rel_1_2/mpeg2/getbits.c
===================================================================
--- rel_1_2/mpeg2/getbits.c (revision 1198)
+++ rel_1_2/mpeg2/getbits.c (nonexistent)
@@ -1,202 +0,0 @@
-/* getbits.c, bit level routines */
-
-/*
- * All modifications (mpeg2decode -> mpeg2play) are
- * Copyright (C) 1996, Stefan Eckart. All Rights Reserved.
- */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "config.h"
-#include "global.h"
-
-/* initialize buffer, call once before first getbits or showbits */
-
-void Initialize_Buffer()
-{
- ld->Incnt = 0;
- ld->Rdptr = ld->Rdbfr + 2048;
- ld->Rdmax = ld->Rdptr;
-
-#ifdef VERIFY
- /* only the verifier uses this particular bit counter
- * Bitcnt keeps track of the current parser position with respect
- * to the video elementary stream being decoded, regardless
- * of whether or not it is wrapped within a systems layer stream
- */
- ld->Bitcnt = 0;
-#endif
-
- ld->Bfr = 0;
- Flush_Buffer(0); /* fills valid data into bfr */
-}
-
-void Fill_Buffer()
-{
- int Buffer_Level;
-
- Buffer_Level = read(ld->Infile,ld->Rdbfr,2048);
- ld->Rdptr = ld->Rdbfr;
-
- if (System_Stream_Flag)
- ld->Rdmax -= 2048;
-
-
- /* end of the bitstream file */
- if (Buffer_Level < 2048)
- {
- /* just to be safe */
- if (Buffer_Level < 0)
- Buffer_Level = 0;
-
- /* pad until the next to the next 32-bit word boundary */
- while (Buffer_Level & 3)
- ld->Rdbfr[Buffer_Level++] = 0;
-
- /* pad the buffer with sequence end codes */
- while (Buffer_Level < 2048)
- {
- ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>24;
- ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>16;
- ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>8;
- ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE&0xff;
- }
- }
-}
-
-
-/* MPEG-1 system layer demultiplexer */
-
-int Get_Byte()
-{
- while(ld->Rdptr >= ld->Rdbfr+2048)
- {
- read(ld->Infile,ld->Rdbfr,2048);
- ld->Rdptr -= 2048;
- ld->Rdmax -= 2048;
- }
- return *ld->Rdptr++;
-}
-
-/* extract a 16-bit word from the bitstream buffer */
-int Get_Word()
-{
- int Val;
-
- Val = Get_Byte();
- return (Val<<8) | Get_Byte();
-}
-
-
-/* return next n bits (right adjusted) without advancing */
-
-unsigned int Show_Bits(N)
-int N;
-{
- return ld->Bfr >> (32-N);
-}
-
-
-/* return next bit (could be made faster than Get_Bits(1)) */
-
-unsigned int Get_Bits1()
-{
- return Get_Bits(1);
-}
-
-
-/* advance by n bits */
-
-void Flush_Buffer(N)
-int N;
-{
- int Incnt;
-
- ld->Bfr <<= N;
-
- Incnt = ld->Incnt -= N;
-
- if (Incnt <= 24)
- {
- if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4))
- {
- do
- {
- if (ld->Rdptr >= ld->Rdmax)
- Next_Packet();
- ld->Bfr |= Get_Byte() << (24 - Incnt);
- Incnt += 8;
- }
- while (Incnt <= 24);
- }
- else if (ld->Rdptr < ld->Rdbfr+2044)
- {
- do
- {
- ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
- Incnt += 8;
- }
- while (Incnt <= 24);
- }
- else
- {
- do
- {
- if (ld->Rdptr >= ld->Rdbfr+2048)
- Fill_Buffer();
- ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
- Incnt += 8;
- }
- while (Incnt <= 24);
- }
- ld->Incnt = Incnt;
- }
-
-#ifdef VERIFY
- ld->Bitcnt += N;
-#endif /* VERIFY */
-
-}
-
-
-/* return next n bits (right adjusted) */
-
-unsigned int Get_Bits(N)
-int N;
-{
- unsigned int Val;
-
- Val = Show_Bits(N);
- Flush_Buffer(N);
-
- return Val;
-}
-
Index: rel_1_2/mpeg2/test.m2v
===================================================================
--- rel_1_2/mpeg2/test.m2v (revision 1198)
+++ rel_1_2/mpeg2/test.m2v (nonexistent)
@@ -1,73 +0,0 @@
-³€#ú 0µ‚µ#²MPEG-2 Verification Sequence
-¸_¿l@
-XXµÿ÷ÌSÐTñç!H <$¶óJÒˆ4*”¿FóJ“ a$°ó›Ñ*“Ò@ҔøPUño“=¾œæñ©^„Û!g"¥ý*¶óÔ¾¥qc֗ZµZ•#XN,r0§X°`Pã¥m+fÝÒIgz´â‚ ò$¶¤/°$¨…ZXʶJ_£s&î•öÕR䨫¡#›H¨l!-…BÌA„–l›Ãipb³Õ’gƒqòGY/‚¢–F -Öߧâȧ@¥EJ_‹s6WKXT%• æÐöý$Lµ}iÑG•Â×Çi”@Bí-»’e´aà?{reLRÃùí–D7!GidÞ+fJ–€E +4ãQ#l&ØP8{iªì˳Õ*@«NÅZ؞UȲ©d‹iQ±­Ñ V÷<?'‰Ð¿Š\lU%’À-) ªUk­KèLC a°ä&¶‹t < AMm-¬ÃM!,P“ɨ­n¡0*ùC‚À‰YVìR‚Š<ó&ÁVÄ.SÂÀûfɀS՚’!£éç!Gs²–ÖR£ÍÚCXáÔæó©UÒÏA瞣ì)»‹¶ê 
-8£Ûä[ê©MëÙ@ªù-ƒaV*µ§¬ …H¡v*žÕÈ°øð9BcfÙdž©R’ŽC›VͶŸŒuV?2K<Û
-À†¾~ò&ª]¡á§ -;Á¹4¸ˆ3?ÂCècu uæÈ`äˆ3Ðaþ-q¥»?Pº:ÛJ.Áð9¹q0ØC§àсU!Tmҗ©OæÅ K¡ØxôR¶ -môxAÈóõ
-ƒÛ›»6C6„(h cÙ Ë ¯ü£hb—|—×Ԑ5‡´7Ñ*y­AÕ–ƒÐåD2µ»M±< ‹áæ2cjÍÞ"ÚJ$”ï؇P¹@ó”åhÛ­ãËf–\Bèß ¦ì\*—e¨PXW†·SgžU4Þ6Ä:D€5­íy… ™ÂÚ6’èÈTnº[Djo˜ùÁnæÎ+½Ý©J&¨ÂgídXPæôÿzñ'ÚoÒ¾EI
-––dßJُ}ÙÜR]­ëVhé$ƒ[©[ˆs2¦ÍÉf.ÑäʉT–Är­m2š²Ñò­µhm +
-³VCÀy$0±¤Ú¥y¡AL»%ô°aGB‚t¶ù1£›ê›¼š”àD!BÔ`ÚXbÙ `B©ò7J¿Ö⏔>éÔl7e£(û
--B)ZÉ¡¾|¦"C)VŒ’–×Í´ŸI°àúQvTwƒU-S€!–Å8ó‹ÔXÊè·JÈ6T£%C‚!t±ìÕ©»2REñP¢´¶× -æ鷺¨²TP&FÁ2¸`JÑ£|Cɍ×v)r(Ö
-µ«Á†ãï–q
-Ÿý’(¦B’*µO~pN6¥Sà~PIg52dJŠ NÊzԚ -“l1Ş•e°„ƒ&TñfZ6U½«ä]–)~0 Â–0{u¹~ ÌY¹®´¥ˆR­£´ì°õãiсá­ôÞQú2c¤nŠ[kµ+ö‚ö•3:ÉTÒ¬Ø9[Fiɱ¼x«x²“g{?rŽÊ¤ÊÛÆƇÈßmÀ„iód(Ÿl×K¶îðxÄØ=C-¾n)sf»žÔ­¶ÙžYfð0õ¥6ñKöAÑÕ¬öÛJPÀÖ*¢¹†× …,@ëY—œž€IˆxJ Ød¡ ±_%ð“ 4¹˄óNX;å‹|ƒ}p1ÿûzÕNô,¡ƒ)ê}j -ƒŠROŽ6šZJZ]¡'ÐÚ
-kc’¡jpÑÅ&²l›Ï¹jÀê¥hiÖ u©KÃmµó -¡§›(QEí…6Ç;.]ðYv¨Y€<‹›0Ȓ¥†¡ŠÚÚҍä܂®¦†UªwˆÉ„ж’$’ƒvm«ÏCñ­4B–û,(­ÃÏyæìHSz óMééP²0¡ûYÖØ{Rù²-sÀ,˜OÁ= Âð^ÑVK£åª>·Ð>lîẘD›"”°=K0ožÊÞË·A6§‚:Z]£ ¾ -ÑTC®+wZ¶Žny‚PKô©˜!Ù#u­<"„’›/Km¡ÕÜÊÜ!KÕ°Lƒ¡L¬ñj®N(­£cñ¾+Òñ]û Áä¦×ґ{¡!¾Îu.ëß,,)³¥Æ÷7òßØú´J -¯º¡Á/‰cz(L{yÿ}®PíûY·#•.Ëi:¥€DÝt¦jˆ60SÌçT‘3qç¦L ¥RÆÖæfU§\ñŽ´6î¶',»k|֐›õñ>>MMï:tåîË%à¥ØùlB†8ûÛ÷ÖóÆÏÆñlHf™-§@Œ
-oÏù–¶ÐÖôÞÈúM×ò.[N)fÉõŠØ}a9MZNF©úvÀü¸”6DK(`E=³]6–X–.ȶŒy¨°¤9¸½~p¢ÉãV’¡MÝÄï](7^m5Nñ¬©u¼q(íÆ­ìòÍëiÃY¢` ۇ^™G@–õNô§QOÈßt¿L°üø6„ÝjµOºøPÂ;Y졛Ÿ-ù?¥(û¼µÝ×òÙìñîn 
-£¦ý”sÞ·œö^¥ýÏxIo„pXúþZü´j×®«m±BcsªP6ŽQ µý½Noaï`øèî~9y¦T.£Z‘(GvInQÊ°j\o×âÐO<É38ÖH­êRkyÎ o¯©Ûô¬ŽŽBYMó…:ãt¨çíý7±€…›1E·Ä¾ÚX|{µ}iM‰ÍÅCä`J“ãP,¶H¥†²±Oñ[úQ¶ƒI -!€xÊCe¨ŌÛÝÂó±×ä . [wJ÷Ì°Ø-2SlJÞgB倵ôÿÝ~x02Œiڐ£¢·ôµ÷Î9·ÌO¿oXøÞ`M»íÅâvñ?A>v•O\ÛV¿{Ï8<­ÕøŠù/•à‹ÒXɈÌýªQQ¾\‹@ -š›˜d++Só>¶ãì¦ç?hù|e–7ä:ÀFVúßÀ!?D\L¢¾æD»²–O?JoŒŠ¦@GÿšÇ8uµ¿9¸rK[í<=N3¥gÐüvÏÖñr,ˆ«‡·šQFÑ(õn3s¥»œû æé–~¯:ú¶ùãËm©u=¿Ð"äþëàvpF²­æ}-¾‰…]67˜›m³$
-Hsy1
-âςe$7<)¹©Ííá}´fç9T¢›ó¥ûgnÑ=åá“Ö{ù@Jw k|O þ\*-6wtôÖMéu€;ù. ^3m o=ÀQ‚Z¾&{·#ÈMû§µJ2ãÛôkTe˜¬±C+£y–ßt‹…“öOc[ÈMÂF¨Ë~ÝҀòñ±°q C«»Fñà€ZúÏF/K·àœÐ`ÿö½¾¼‚40zò÷8X:Îۃ¸}½Ø‹•4Ÿ&’µÍ®CåúÌhcxb8{öµ#=;Â>À @\‡æH¹œU7Æ·”ÆÒo–­ú [§:%'Yð Eƒ‡áu¾VGÉö™«&:õq\g….©[žSr Š9¹¬'D-|[ñ@ãªïŸœ°>A–ßµ“ßîéœ8@¡‹j©·»T†ß–ˆûžýŠ–oÿ¯s`°q„Ùëc~˜Êz/š‹`©‡šT™ nh@ xÔFÄ[ <3Õ¿tF7âRfðE”`K|„RýŠÈýBYÅDSߢÐc|ÔBÿ®žð×¾*Üô<)®þu7âEÛ2­ç~y”àÉ»¨_8;0Cõ|M9¼¤q­æÒ[z¡@…þ"r!7¨1
-nÒf¼!‚k°z G”À"£óßo•Ù؊…”}ômbêÉCç|ßiæäJŽr/è$qÀB¶—ìËՉ…VpòÃË°)¼Ž’]o£oäbˑJÒ!(*Ž¤¶é ‘ᐈ .9aMõûÎQ’H6aë
-:”ÇVÍ©¦‹ZRÛ> JҚ+:÷ÈùúÎÁ° ñ­P¼6þ³Cᔿ–›éÒù©áežyè2¥°Â]" -¡zÜøTkh{!ùB1¸T‘K ‡þ©U¸¯A{vÌo¹âj‘m…1<[Íw&!2;ŠYð)T±íxYcÛ¯èà¦ø̔šO¶QƝ™dZXŠûK•܋ɹ<ä1Ðí—Yéu
-kue… ñ}RÙaU£
--ø7ùŸ®2fGDÜ¥$ª´$ªÝ!GiÛ;A­Þ×Ìw;–ŸÁgÀ=Å7Çù¦Zx®Ì°µ9„ufMŒ*–1¾ó—$æ[xRþ…° ”b·¨¶ CãÜý_F¼NߌU¾}nT‡ ¹[¶RàæDÊԟ¿” ­×êÔ “.¦oñÃåSª[%,ã©ÍT‹CktR£dMV’ »€µ‚/÷˜rø0ÿù=àÁ瑍…‰sÈÄl-llàð¿;WÁ—ÿÀáð ™ÐñÑêpÐßÀ 4숇‘à`*ÿ0節pp‘ -€á T$ŒF½Cwh¸-P„DÀ°ÌO€ÐÂׇ’= -¼ŒpbQʉüƒÎäøÀş׀ӏ9GWÀàYFlÂÜøðbÿý„àwˆ¢G‘9„g€Ð–<Ï_"wƒðq´7
-dG7xÀD(åšÉ°aÁ`"€j¸6ÿ€h¼È Ȑ4ø{ž}|Àv ÷€Øã8Ÿ @Z ÐÞð6Ø `85‘þ8èÀ9¨nà¾çp*$®õÌ qª€À, ¡¿‘ÀjÒúà@-à6 _ÿ™Cwx €óŸHv`l~x“˜ˆú;‹)ÅՄ¤µÛ
- -n¤Z2BÂ@¢ýF#sâĔf6P¤!ø·E-¡hTR a(èz·Ê7Ô6à˜-„îÍ?Žÿn–æð&¥Ó÷I!JÃÉÊP(5ƪ<ðþúÀš~ùŤœ1Âhn…+l<ŸÄe§cYVÞrø6ü `wÿ…@î47pø Î3@°ø -ƒX€^ð¯C 0 £ @ñÿê€9õ -ÎØðât ÿþ(pát7õƒP€G,s€ÈžO¨ÔÂ)Š´qÔµCÇвQš8¦4â¶Á¯¨_€òÙñ
-J¡¥Œ¨3Ðs.—*]ƒZB8ú1¾Cž°kGʊ‹K’–‡†Œ8bځ­Ú„ì.ò2aUO* -z†7-C풖Q*Ià6ߜ|BÐe= -5օhœ Œ‚HÂö +F¬Ìʆ`Ó΂CþJ²lpíñ ´Ã· $«/¯ýð ²@rÖC)9cN'Ž-•r ‚ø=ÿü à€Ü ÀOã 4áFµ -ÌPø‚³à8ô° -õðfÿòp˜v8\ ßþ°5°°³mæèWáÊ$8…—Ð |G4ÀÓÿàGG™¿³Ãˆø:è÷KLÙFƒP³ì© :<0%c&Z›
-ª 7«=”ÈXÀʾ2’²·È7Ô4MðL‚`’
-nžwfû퐷a˜Þh^N:d¡Ô7ž³³‰e‡«›¤–œß¤×s˜à=À#<£²¤¨Ô»8@ÑãØçÏ}gQ5ÃZê ž³R”¿ÓÿâŸö2X©Š+- -’¾à|/­Rpӂ~Úè&~Ž1^£À²[v4ý /o{9y~ŒvZ4pf© -½&9KTð{y -ôjÀb'4>tXC2›î€®ÙaèçF£ö$ç û‡ãÂÜZr2`@Fß V㐰L…³¨œ:9.}=\-e@¡(xãƒ[¡ùXL§œ’”Pks¢–´ªIê¡a -Ó¦ÔK©V•H@?o•,1¾œ¦‰Ç7Q8G '™‘=őXq¯œÄ§Ç‘€9ÀjeœOàÇQò¸ê\ø¥l©R¡a@QÍ ½ˆ£èññV¡ÛªuJU-Ú*ÙOéFúo’o«hœ`˜% ‘ˆ%¡[1áafð<Öàg
-DÃÉãäoÙ<ÁÿìG<`ì´÷Ir“‰=!X¡/Íæ˜9]³Ñ5ËæDÒná‘Œ;h †_,„QX01$­€$<ôðüÊ’QJcÀ_øš¢ÚÕpف¦PÀòQ0°G1F‡°_€,ä²Ñ‡ð 'z©%œ!åp´…ͯª‚ª \öÚ¿ùf ¡ §¤mÄâwÿ›á"pێŸ ÒNËë[ºbðõ¼eo¿šÀzâsñ$– ÖÅ?T¤ô(¶ôÉ$-!ô -xB‡69—T«Iføâ›í͐ -´>yÈÛ EŽoS®²“y@r’›-ã”/*u8!»vËCBÿÙYM”惊P†Ä¾¾}U{tt1E@ æÁ*œYCáA¥§ŠUÚ·Gî<O…š ðæî;›ó·ÁǐÂÇ>Ç'C†—àxQá­è£Þ.Rt‘<hSu*Öè:+A;ìÕ_V QhŒbá-¿8€þ‚oý5à?ïúdcve4J@*¢b6+b+€ -Käx
-$¦$ï”A;þý¼â kÁ„º%‚<AÂa &-¿FÅcA+ÿ@ð&™âhnGÑY†+€˜ƒ`*P)`gè4 ¥ FB?$fðŸÍ€BP @®$ŒN±>]@’ -höd ž¨›°êã7ôšÖcÀÛVn {j¹š~e
-Œ2VÜPD ô -Zv}YEîQ „‚Ñóp6®O‰‰‹†a(Ð ¥MBJ -BCà ÉxGîmé £àpú
-_UžÖêh‰íùüG±:©*Ê ù±¹¶ à jØ<Ѐ ¼UoÓcÍ4J–c#Àа•¦lGð €
-pwà"aPД9áî €ñà>€P ÿA¿áTM•®•ï>Y=ï¨1B«h ÚV,Qжó@|ß^f@6څÂPpI>À_‘’ŒWl9húAa®X .Ð`-=C
-V$'áÅ£‰€¡h4j¢Q¶Ó¹±cF«8É ÐGç#4©àŠ -ŸXÎlj˜7ŽßÒíGœÂ~l0­(Ñöy©ÒЦ£':vh[5~A±®å8°‚Ù«sGZš Õ?Æ· ¬$Ï_9[Äç¤@›ÿ­çÐÙí¹­óîöÛ@âKAKô5#+Ü:O!÷_áóêks_L€y*VË5@Ù!±ºß ÁÍdp”<$` €*nhe‚oýÈ@À -øÔሠ,frg^@¯9 7&¥ÁoÿqÐà d0Ô(mŽêû+…†8¾dKPúÛÑ(ÆÆð’ÅiƁ9bƒÿiƒÿè”믣 ?þBU¦Š -;€ Y𣸵”‹/¿—ßËïÄäûúe÷é~—é|“/¿Kô¿Kô¿ÛïÐ=ÿý Å÷·¿ÿà`5¨NOµœ‰9Eüg›À“/¿—ߥü¾þ_~ÛçoÿÀâ4&à#Ù%€ z³‹î;¿ÚB7+ -~,þl” -eŒƒð̶Ê$óŒ¹aþF·=²ùˆvٲЎÎb5Q7Ìpq€Ü¼>²4MIìpfÿ”¥Í Í{/¿—ߥú_„äû| -ÀIGi¬hM @BØñÈπ–Ç1¸›ÍTSñ›x ºÊ?™•ƒ—À²µ-Âà37¬ªØ…êfˆe¡ ÿ…!$óã hN »j(Å_þâÂP. ÓŠ“òÏÿŽ¡9¿è?þ¥ûkíW<Œæ:BOÉ0~„YN…Нˆ ¥ Üé(í ÏBobl - \0'.<Bv¹ ’u ÔaÀÐÔ; dšàUáSͪ&Úԁˆ ɱ™Z~ÙM¢`fû!‰ã6ÏÇa9Í·ƒ?ò|D´ð‘BnƒÌ&Rk˜Œ*³/ö'‘ƒ VRÎÌzGšÿPfí€y¨Nl(ëçæÁ~ðфˆ'Õ à ÆåŒO>(%'ê˜"*ˆi á±7…’ä“©$ý ¡98Ði -p¿d…¼Ô'@LNDú˝”p\`xÓD¼“W‚¤t€’ -¿høKyô­Ï¢U -)ÖÀ|Á†¢ävËרMã¬h%dÏ·b7´v„½ Ò ‚
-éã~# ø¿ÄÎ.U¤ŸèNcŋ%"-SÖÙ©?Ñ
-¢u…Ž0]ôÎ<Œ¨ªy æ€éÄÁ :É¢^¬Z"¹Ù0œAËóàaIc*°gkР½½ˆ0º}úÀb€GBu„ÀjbyQi*INm¡¢ÊAÏóÑ ¡‰úá–Éʵ¬wÖã…Ñ;AÇ@à5æûK›Ÿ‹R'ùtN0ŒÁ€†€äd–R_n΋NC{›øb¾à¼áƒ\hxޅFQ9ÃçÐox{HPÓÿiD€ý?@áõ·
\ No newline at end of file
Index: rel_1_2/mpeg2/store.ori
===================================================================
--- rel_1_2/mpeg2/store.ori (revision 1198)
+++ rel_1_2/mpeg2/store.ori (nonexistent)
@@ -1,576 +0,0 @@
-/* store.c, picture output routines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-
-#include "config.h"
-#include "global.h"
-
-/* private prototypes */
-static void store_one _ANSI_ARGS_((char *outname, unsigned char *src[],
- int offset, int incr, int height));
-static void store_yuv _ANSI_ARGS_((char *outname, unsigned char *src[],
- int offset, int incr, int height));
-static void store_sif _ANSI_ARGS_((char *outname, unsigned char *src[],
- int offset, int incr, int height));
-static void store_ppm_tga _ANSI_ARGS_((char *outname, unsigned char *src[],
- int offset, int incr, int height, int tgaflag));
-static void store_yuv1 _ANSI_ARGS_((char *name, unsigned char *src,
- int offset, int incr, int width, int height));
-static void putbyte _ANSI_ARGS_((int c));
-static void putword _ANSI_ARGS_((int w));
-static void conv422to444 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
-static void conv420to422 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
-
-#define OBFRSIZE 4096
-static unsigned char obfr[OBFRSIZE];
-static unsigned char *optr;
-static int outfile;
-
-/*
- * store a picture as either one frame or two fields
- */
-void Write_Frame(src,frame)
-unsigned char *src[];
-int frame;
-{
- char outname[FILENAME_LENGTH];
-
- if (progressive_sequence || progressive_frame || Frame_Store_Flag)
- {
- /* progressive */
- sprintf(outname,Output_Picture_Filename,frame,'f');
- store_one(outname,src,0,Coded_Picture_Width,vertical_size);
- }
- else
- {
- /* interlaced */
- sprintf(outname,Output_Picture_Filename,frame,'a');
- store_one(outname,src,0,Coded_Picture_Width<<1,vertical_size>>1);
-
- sprintf(outname,Output_Picture_Filename,frame,'b');
- store_one(outname,src,
- Coded_Picture_Width,Coded_Picture_Width<<1,vertical_size>>1);
- }
-}
-
-/*
- * store one frame or one field
- */
-static void store_one(outname,src,offset,incr,height)
-char *outname;
-unsigned char *src[];
-int offset, incr, height;
-{
- switch (Output_Type)
- {
- case T_YUV:
- store_yuv(outname,src,offset,incr,height);
- break;
- case T_SIF:
- store_sif(outname,src,offset,incr,height);
- break;
- case T_TGA:
- store_ppm_tga(outname,src,offset,incr,height,1);
- break;
- case T_PPM:
- store_ppm_tga(outname,src,offset,incr,height,0);
- break;
-#ifdef DISPLAY
- case T_X11:
- dither(src);
- break;
-#endif
- default:
- break;
- }
-}
-
-/* separate headerless files for y, u and v */
-static void store_yuv(outname,src,offset,incr,height)
-char *outname;
-unsigned char *src[];
-int offset,incr,height;
-{
- int hsize;
- char tmpname[FILENAME_LENGTH];
-
- hsize = horizontal_size;
-
- sprintf(tmpname,"%s.Y",outname);
- store_yuv1(tmpname,src[0],offset,incr,hsize,height);
-
- if (chroma_format!=CHROMA444)
- {
- offset>>=1; incr>>=1; hsize>>=1;
- }
-
- if (chroma_format==CHROMA420)
- {
- height>>=1;
- }
-
- sprintf(tmpname,"%s.U",outname);
- store_yuv1(tmpname,src[1],offset,incr,hsize,height);
-
- sprintf(tmpname,"%s.V",outname);
- store_yuv1(tmpname,src[2],offset,incr,hsize,height);
-}
-
-/* auxiliary routine */
-static void store_yuv1(name,src,offset,incr,width,height)
-char *name;
-unsigned char *src;
-int offset,incr,width,height;
-{
- int i, j;
- unsigned char *p;
-
- if (!Quiet_Flag)
- fprintf(stderr,"saving %s\n",name);
-
- if ((outfile = open(name,O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666))==-1)
- {
- sprintf(Error_Text,"Couldn't create %s\n",name);
- Error(Error_Text);
- }
-
- optr=obfr;
-
- for (i=0; i<height; i++)
- {
- p = src + offset + incr*i;
- for (j=0; j<width; j++)
- putbyte(*p++);
- }
-
- if (optr!=obfr)
- write(outfile,obfr,optr-obfr);
-
- close(outfile);
-}
-
-/*
- * store as headerless file in U,Y,V,Y format
- */
-static void store_sif (outname,src,offset,incr,height)
-char *outname;
-unsigned char *src[];
-int offset, incr, height;
-{
- int i,j;
- unsigned char *py, *pu, *pv;
- static unsigned char *u422, *v422;
-
- if (chroma_format==CHROMA444)
- Error("4:4:4 not supported for SIF format");
-
- if (chroma_format==CHROMA422)
- {
- u422 = src[1];
- v422 = src[2];
- }
- else
- {
- if (!u422)
- {
- if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
- *Coded_Picture_Height)))
- Error("malloc failed");
- if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
- *Coded_Picture_Height)))
- Error("malloc failed");
- }
-
- conv420to422(src[1],u422);
- conv420to422(src[2],v422);
- }
-
- strcat(outname,".SIF");
-
- if (!Quiet_Flag)
- fprintf(stderr,"saving %s\n",outname);
-
- if ((outfile = open(outname,O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666))==-1)
- {
- sprintf(Error_Text,"Couldn't create %s\n",outname);
- Error(Error_Text);
- }
-
- optr = obfr;
-
- for (i=0; i<height; i++)
- {
- py = src[0] + offset + incr*i;
- pu = u422 + (offset>>1) + (incr>>1)*i;
- pv = v422 + (offset>>1) + (incr>>1)*i;
-
- for (j=0; j<horizontal_size; j+=2)
- {
- putbyte(*pu++);
- putbyte(*py++);
- putbyte(*pv++);
- putbyte(*py++);
- }
- }
-
- if (optr!=obfr)
- write(outfile,obfr,optr-obfr);
-
- close(outfile);
-}
-
-/*
- * store as PPM (PBMPLUS) or uncompressed Truevision TGA ('Targa') file
- */
-static void store_ppm_tga(outname,src,offset,incr,height,tgaflag)
-char *outname;
-unsigned char *src[];
-int offset, incr, height;
-int tgaflag;
-{
- int i, j;
- int y, u, v, r, g, b;
- int crv, cbu, cgu, cgv;
- unsigned char *py, *pu, *pv;
- static unsigned char tga24[14] = {0,0,2,0,0,0,0, 0,0,0,0,0,24,32};
- char header[FILENAME_LENGTH];
- static unsigned char *u422, *v422, *u444, *v444;
-
- if (chroma_format==CHROMA444)
- {
- u444 = src[1];
- v444 = src[2];
- }
- else
- {
- if (!u444)
- {
- if (chroma_format==CHROMA420)
- {
- if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
- *Coded_Picture_Height)))
- Error("malloc failed");
- if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
- *Coded_Picture_Height)))
- Error("malloc failed");
- }
-
- if (!(u444 = (unsigned char *)malloc(Coded_Picture_Width
- *Coded_Picture_Height)))
- Error("malloc failed");
-
- if (!(v444 = (unsigned char *)malloc(Coded_Picture_Width
- *Coded_Picture_Height)))
- Error("malloc failed");
- }
-
- if (chroma_format==CHROMA420)
- {
- conv420to422(src[1],u422);
- conv420to422(src[2],v422);
- conv422to444(u422,u444);
- conv422to444(v422,v444);
- }
- else
- {
- conv422to444(src[1],u444);
- conv422to444(src[2],v444);
- }
- }
-
- strcat(outname,tgaflag ? ".tga" : ".ppm");
-
- if (!Quiet_Flag)
- fprintf(stderr,"saving %s\n",outname);
-
- if ((outfile = open(outname,O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666))==-1)
- {
- sprintf(Error_Text,"Couldn't create %s\n",outname);
- Error(Error_Text);
- }
-
- optr = obfr;
-
- if (tgaflag)
- {
- /* TGA header */
- for (i=0; i<12; i++)
- putbyte(tga24[i]);
-
- putword(horizontal_size); putword(height);
- putbyte(tga24[12]); putbyte(tga24[13]);
- }
- else
- {
- /* PPM header */
- sprintf(header,"P6\n%d %d\n255\n",horizontal_size,height);
-
- for (i=0; header[i]!=0; i++)
- putbyte(header[i]);
- }
-
- /* matrix coefficients */
- crv = Inverse_Table_6_9[matrix_coefficients][0];
- cbu = Inverse_Table_6_9[matrix_coefficients][1];
- cgu = Inverse_Table_6_9[matrix_coefficients][2];
- cgv = Inverse_Table_6_9[matrix_coefficients][3];
-
- for (i=0; i<height; i++)
- {
- py = src[0] + offset + incr*i;
- pu = u444 + offset + incr*i;
- pv = v444 + offset + incr*i;
-
- for (j=0; j<horizontal_size; j++)
- {
- u = *pu++ - 128;
- v = *pv++ - 128;
- y = 76309 * (*py++ - 16); /* (255/219)*65536 */
- r = Clip[(y + crv*v + 32768)>>16];
- g = Clip[(y - cgu*u - cgv*v + 32768)>>16];
- b = Clip[(y + cbu*u + 32786)>>16];
-
- if (tgaflag)
- {
- putbyte(b); putbyte(g); putbyte(r);
- }
- else
- {
- putbyte(r); putbyte(g); putbyte(b);
- }
- }
- }
-
- if (optr!=obfr)
- write(outfile,obfr,optr-obfr);
-
- close(outfile);
-}
-
-static void putbyte(c)
-int c;
-{
- *optr++ = c;
-
- if (optr == obfr+OBFRSIZE)
- {
- write(outfile,obfr,OBFRSIZE);
- optr = obfr;
- }
-}
-
-static void putword(w)
-int w;
-{
- putbyte(w); putbyte(w>>8);
-}
-
-/* horizontal 1:2 interpolation filter */
-static void conv422to444(src,dst)
-unsigned char *src,*dst;
-{
- int i, i2, w, j, im3, im2, im1, ip1, ip2, ip3;
-
- w = Coded_Picture_Width>>1;
-
- if (base.MPEG2_Flag)
- {
- for (j=0; j<Coded_Picture_Height; j++)
- {
- for (i=0; i<w; i++)
- {
- i2 = i<<1;
- im2 = (i<2) ? 0 : i-2;
- im1 = (i<1) ? 0 : i-1;
- ip1 = (i<w-1) ? i+1 : w-1;
- ip2 = (i<w-2) ? i+2 : w-1;
- ip3 = (i<w-3) ? i+3 : w-1;
-
- /* FIR filter coefficients (*256): 21 0 -52 0 159 256 159 0 -52 0 21 */
- /* even samples (0 0 256 0 0) */
- dst[i2] = src[i];
-
- /* odd samples (21 -52 159 159 -52 21) */
- dst[i2+1] = Clip[(int)(21*(src[im2]+src[ip3])
- -52*(src[im1]+src[ip2])
- +159*(src[i]+src[ip1])+128)>>8];
- }
- src+= w;
- dst+= Coded_Picture_Width;
- }
- }
- else
- {
- for (j=0; j<Coded_Picture_Height; j++)
- {
- for (i=0; i<w; i++)
- {
-
- i2 = i<<1;
- im3 = (i<3) ? 0 : i-3;
- im2 = (i<2) ? 0 : i-2;
- im1 = (i<1) ? 0 : i-1;
- ip1 = (i<w-1) ? i+1 : w-1;
- ip2 = (i<w-2) ? i+2 : w-1;
- ip3 = (i<w-3) ? i+3 : w-1;
-
- /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
- dst[i2] = Clip[(int)( 5*src[im3]
- -21*src[im2]
- +70*src[im1]
- +228*src[i]
- -37*src[ip1]
- +11*src[ip2]+128)>>8];
-
- dst[i2+1] = Clip[(int)( 5*src[ip3]
- -21*src[ip2]
- +70*src[ip1]
- +228*src[i]
- -37*src[im1]
- +11*src[im2]+128)>>8];
- }
- src+= w;
- dst+= Coded_Picture_Width;
- }
- }
-}
-
-/* vertical 1:2 interpolation filter */
-static void conv420to422(src,dst)
-unsigned char *src,*dst;
-{
- int w, h, i, j, j2;
- int jm6, jm5, jm4, jm3, jm2, jm1, jp1, jp2, jp3, jp4, jp5, jp6, jp7;
-
- w = Coded_Picture_Width>>1;
- h = Coded_Picture_Height>>1;
-
- if (progressive_frame)
- {
- /* intra frame */
- for (i=0; i<w; i++)
- {
- for (j=0; j<h; j++)
- {
- j2 = j<<1;
- jm3 = (j<3) ? 0 : j-3;
- jm2 = (j<2) ? 0 : j-2;
- jm1 = (j<1) ? 0 : j-1;
- jp1 = (j<h-1) ? j+1 : h-1;
- jp2 = (j<h-2) ? j+2 : h-1;
- jp3 = (j<h-3) ? j+3 : h-1;
-
- /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
- /* New FIR filter coefficients (*256): 3 -16 67 227 -32 7 */
- dst[w*j2] = Clip[(int)( 3*src[w*jm3]
- -16*src[w*jm2]
- +67*src[w*jm1]
- +227*src[w*j]
- -32*src[w*jp1]
- +7*src[w*jp2]+128)>>8];
-
- dst[w*(j2+1)] = Clip[(int)( 3*src[w*jp3]
- -16*src[w*jp2]
- +67*src[w*jp1]
- +227*src[w*j]
- -32*src[w*jm1]
- +7*src[w*jm2]+128)>>8];
- }
- src++;
- dst++;
- }
- }
- else
- {
- /* intra field */
- for (i=0; i<w; i++)
- {
- for (j=0; j<h; j+=2)
- {
- j2 = j<<1;
-
- /* top field */
- jm6 = (j<6) ? 0 : j-6;
- jm4 = (j<4) ? 0 : j-4;
- jm2 = (j<2) ? 0 : j-2;
- jp2 = (j<h-2) ? j+2 : h-2;
- jp4 = (j<h-4) ? j+4 : h-2;
- jp6 = (j<h-6) ? j+6 : h-2;
-
- /* Polyphase FIR filter coefficients (*256): 2 -10 35 242 -18 5 */
- /* New polyphase FIR filter coefficients (*256): 1 -7 30 248 -21 5 */
- dst[w*j2] = Clip[(int)( 1*src[w*jm6]
- -7*src[w*jm4]
- +30*src[w*jm2]
- +248*src[w*j]
- -21*src[w*jp2]
- +5*src[w*jp4]+128)>>8];
-
- /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
- /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
- dst[w*(j2+2)] = Clip[(int)( 7*src[w*jm4]
- -35*src[w*jm2]
- +194*src[w*j]
- +110*src[w*jp2]
- -24*src[w*jp4]
- +4*src[w*jp6]+128)>>8];
-
- /* bottom field */
- jm5 = (j<5) ? 1 : j-5;
- jm3 = (j<3) ? 1 : j-3;
- jm1 = (j<1) ? 1 : j-1;
- jp1 = (j<h-1) ? j+1 : h-1;
- jp3 = (j<h-3) ? j+3 : h-1;
- jp5 = (j<h-5) ? j+5 : h-1;
- jp7 = (j<h-7) ? j+7 : h-1;
-
- /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
- /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
- dst[w*(j2+1)] = Clip[(int)( 7*src[w*jp5]
- -35*src[w*jp3]
- +194*src[w*jp1]
- +110*src[w*jm1]
- -24*src[w*jm3]
- +4*src[w*jm5]+128)>>8];
-
- dst[w*(j2+3)] = Clip[(int)( 1*src[w*jp7]
- -7*src[w*jp5]
- +30*src[w*jp3]
- +248*src[w*jp1]
- -21*src[w*jm1]
- +5*src[w*jm3]+128)>>8];
- }
- src++;
- dst++;
- }
- }
-}
Index: rel_1_2/mpeg2/initfile.c
===================================================================
--- rel_1_2/mpeg2/initfile.c (revision 1198)
+++ rel_1_2/mpeg2/initfile.c (nonexistent)
@@ -1,256 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1.1.1 $
- * Last update: $Date: 2002-09-02 09:37:45 $
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/cbs.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-#include "modules/nopm.h"
-
-#include "drivers/keyb.h"
-
-#include <trace/trace.h>
-#include <trace/queues.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- extern int __register_sub_init_prologue(void);
- extern int __register_sub_init(void);
-
- __register_sub_init_prologue();
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- PC_register_module();
- NPP_register_module();
- SRP_register_module();
- NOP_register_module();
- NOPM_register_module();
-
- __register_sub_init();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- KEYB_PARMS keyb = BASE_KEYB;
- extern int __bdev_sub_init(void);
- extern int __fs_sub_init(void);
- extern void ctrlc_exit(KEY_EVT *k);
-
- HARTPORT_init();
-
- keyb_def_ctrlC(keyb, ctrlc_exit);
- KEYB_init(&keyb);
-
- __bdev_sub_init();
- __fs_sub_init();
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-#define PSCANSCHED 1
-#define NOTRACE
-
-int __register_sub_init_prologue(void)
-{
-#ifndef NOTRACE
- int id;
-
- TRC_init_phase1(NULL);
- trc_register_fixed_queue();
- id=trc_create_queue(TRC_FIXED_QUEUE,NULL);
- trc_trace_class(TRC_CLASS_USER);
- trc_assign_class_to_queue(TRC_CLASS_USER,id);
-#endif
- return 0;
-}
-
-int __register_sub_init(void)
-{
-#if defined(EDFSCHED)
- extern void BD_EDF_register_module(void);
- BD_EDF_register_module();
-#elif defined(PSCANSCHED)
- extern void BD_PSCAN_register_module(void);
- BD_PSCAN_register_module();
-#endif
- return 0;
-}
-
-dev_t root_device=-1;
-dev_t temp_device=-1;
-
-int choose_root_callback(dev_t dev,u_int8_t fs)
-{
- if (fs==FS_MSDOS) return dev;
- return -1;
-}
-
-int choose_temp_callback(__dev_t dev,__uint8_t fs)
-{
- static int flag=0;
- if (fs==FS_MSDOS) {
- if (flag) return dev;
- flag=1;
- }
- return -1;
-}
-
-int __bdev_sub_init(void)
-{
- BDEV_PARMS bdev=BASE_BDEV;
-
- bdev_def_showinfo(bdev,FALSE);
- bdev_init(&bdev);
-
- root_device=bdev_scan_devices(choose_root_callback);
- if (root_device<0) {
- cprintf("can't find root device to mount on /!!!\n");
- sys_end();
- return -1;
- }
-
- /*
- temp_device=bdev_scan_devices(choose_temp_callback);
- if (temp_device<0) {
- cprintf("can't find a filesystem to mount on /TEMP!!!\n");
- }
- */
-
- return 0;
-}
-
-
-int __fs_sub_init(void)
-{
- extern int libc_initialize(void);
- FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
- struct mount_opts opts;
- // int res;
-
- filesystem_def_rootdevice(fs,root_device);
- filesystem_def_fs(fs,FS_MSDOS);
- filesystem_def_showinfo(fs,FALSE);
- filesystem_def_options(fs,opts);
-
- memset(&opts,0,sizeof(struct mount_opts));
- opts.flags=MOUNT_FLAG_RW;
-
-
- filesystem_init(&fs);
-
- /*
- if (temp_device>=0) {
- memset(&opts,0,sizeof(struct mount_opts));
- opts.flags=MOUNT_FLAG_RW;
- res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
- if (res!=0) {
- cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
- } else
- cprintf("mounted /TEMP rw\n");
- }
- */
-
- libc_initialize();
-
-#ifndef NOTRACE
- TRC_init_phase2();
-#endif
-
- return 0;
-}
-
-void ctrlc_exit(KEY_EVT *k)
-{
- extern void dump_sem_table(void);
- extern void dump_nop_table(void);
-#ifndef NOGRX
- grx_close();
-#endif
- cprintf("CTRL-C pressed!\n");
- sys_end();
-}
-
-
-
-
-
-
-
Index: rel_1_2/mpeg2/verify.c
===================================================================
--- rel_1_2/mpeg2/verify.c (revision 1198)
+++ rel_1_2/mpeg2/verify.c (nonexistent)
@@ -1,303 +0,0 @@
-/* verify.c
- *
- * Bitstream verification routines
- *
- *
- */
-#ifdef VERIFY
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <fcntl.h>
-#include <math.h> /* needed for ceil() */
-
-#include "config.h"
-#include "global.h"
-
-/* #define DEBUG */
-#ifdef DEBUG
-#define PC
-#endif
-
-#ifdef PC
-#include <conio.h> /* needed for getch() */
-#endif /* PC */
-
-/*
- Check picture headers: due to the VBV definition of picture data,
- this routine must be called immediately before any picture data
- is parsed. (before the first slice start code, including any slice
- start code stuffing).
-*/
-
-
-static void Check_VBV_Delay _ANSI_ARGS_((int Bitstream_Framenum, int Sequence_Framenum));
-
-
-void Check_Headers(Bitstream_Framenum, Sequence_Framenum)
-int Bitstream_Framenum;
-int Sequence_Framenum;
-{
-
-
- if((!low_delay)&&(vbv_delay!=0)&&(vbv_delay!=0xFFFF))
- Check_VBV_Delay(Bitstream_Framenum, Sequence_Framenum);
-
- /* clear out the header tracking variables so we have an accurate
- count next time */
- Clear_Verify_Headers();
-}
-
-
-
-/*
- * Verify vbv_delay value in picture header
- * (low_delay==1 checks not implemented. this does not exhaustively test all
- * possibilities suggested in ISO/IEC 13818-2 Annex C. It only checks
- * for constant rate streams)
- *
- * Q:how do we tell a variable rate stream from a constant rate stream anyway?
- * it's not as simple as vbv_delay==0xFFFF, since we need meaningful
- * vbv_delay values to calculate the piecewise rate in the first place!
- *
- * Also: no special provisions at the beginning or end of a sequence
- */
-
-static void Check_VBV_Delay(Bitstream_Framenum, Sequence_Framenum)
-int Bitstream_Framenum;
-int Sequence_Framenum;
-{
- double B; /* buffer size */
- double Bn; /* buffer fullness for picture n */
- double R; /* bitrate */
- double I; /* time interval (t[n+1] - t[n]) */
- double T; /* inverse of the frame rate (frame period) */
-
- int d;
- int internal_vbv_delay;
-
- static int previous_IorP_picture_structure;
- static int previous_IorP_repeat_first_field;
- static int previous_IorP_top_field_first;
- static int previous_vbv_delay;
- static int previous_bitstream_position;
-
- static double previous_Bn;
- static double E; /* maximum quantization error or mismatch */
-
-
-
- if((Sequence_Framenum==0)&&(!Second_Field))
- { /* first coded picture of sequence */
-
- R = bit_rate;
-
- /* the initial buffer occupancy is taken on faith
- that is, we believe what is transmitted in the first coded picture header
- to be the true/actual buffer occupancy */
-
- Bn = (R * (double) vbv_delay) / 90000.0;
- B = 16 * 1024 * vbv_buffer_size;
-
-
- /* maximum quantization error in bitrate (bit_rate_value is quantized/
- rounded-up to units of 400 bits/sec as per ISO/IEC 13818-2
- section 6.3.3 */
-
- E = (400.0/frame_rate) + 400;
-
-#ifdef DEBUG
- printf("vbv_buffer_size (B) = %.0f, Bn=%f, E=%f, \nbitrate=%f, vbv_delay=%d frame_rate=%f\n",
- B, Bn, E, bit_rate, vbv_delay, frame_rate);
-#endif
-
- }
- else /* not the first coded picture of sequence */
- {
-
- /* derive the interval (I). The interval tells us how many constant rate bits
- * will have been downloaded to the buffer during the current picture period
- *
- * interval assumes that:
- * 1. whilst we are decoding the current I or P picture, we are displaying
- * the previous I or P picture which was stored in the reorder
- * buffer (pointed to by forward_reference_frame in this implementation)
- *
- * 2. B pictures are output ("displayed") at the time when they are decoded
- *
- */
-
- if(progressive_sequence) /* Annex C.9 (progressive_sequence==1, low_delay==0) */
- {
-
- T = 1/frame_rate; /* inverse of the frame rate (frame period) */
-
- if(picture_coding_type==B_TYPE)
- {
- if(repeat_first_field==1)
- {
- if(top_field_first==1)
- I = T*3; /* three frame periods */
- else
- I = T*2; /* two frame periods */
- }
- else
- I = T; /* one frame period */
- }
- else /* P or I frame */
- {
- if(previous_IorP_repeat_first_field==1)
- {
- if(previous_IorP_top_field_first==1)
- I = 3*T;
- else
- I = 2*T;
- }
- else
- I = T;
- }
- }
- else /* Annex C.11 (progressive_sequence==0, low_delay==0) */
- {
-
- T = 1/(2*frame_rate); /* inverse of two times the frame rate (field period) */
-
- if(picture_coding_type==B_TYPE)
- {
- if(picture_structure==FRAME_PICTURE)
- {
- if(repeat_first_field==0)
- I = 2*T; /* two field periods */
- else
- I = 3*T; /* three field periods */
- }
- else /* B field */
- {
- I = T; /* one field period */
- }
- }
- else /* I or P picture */
- {
- if(picture_structure==FRAME_PICTURE)
- {
- if(previous_IorP_repeat_first_field==0)
- I = 2*T;
- else
- I = 3*T;
- }
- else
- {
- if(Second_Field==0) /* first field of current frame */
- I = T;
- else /* second field of current frame */
- {
- /* formula: previous I or P display period (2*T or 3*T) minus the
- very recent decode period (T) of the first field of the current
- frame */
-
- if(previous_IorP_picture_structure!=FRAME_PICTURE
- || previous_IorP_repeat_first_field==0)
- I = 2*T - T; /* a net of one field period */
- else if(previous_IorP_picture_structure==FRAME_PICTURE
- && previous_IorP_repeat_first_field==1)
- I = 3*T - T; /* a net of two field periods */
- }
- }
- }
- }
-
- /* derive coded size of previous picture */
- d = ld->Bitcnt - previous_bitstream_position;
-
- /* Rate = Distance/Time */
-
- /* piecewise constant rate (variable rate stream) calculation
- * R = ((double) d /((previous_vbv_delay - vbv_delay)/90000 + I));
- */
-
- R = bit_rate;
-
- /* compute buffer fullness just before removing picture n
- *
- * Bn = previous_Bn + (I*R) - d; (recursive formula)
- *
- * where:
- *
- * n is the current picture
- *
- * Bn is the buffer fullness for the current picture
- *
- * previous_Bn is the buffer fullness of the previous picture
- *
- * (I*R ) is the bits accumulated during the current picture
- * period
- *
- * d is the number of bits removed during the decoding of the
- * previous picture
- */
-
- Bn = previous_Bn + (I*R) - d;
-
- /* compute internally derived vbv_delay (rouding up with ceil()) */
- internal_vbv_delay = (int) ceil((90000 * Bn / bit_rate));
-
-#ifdef DEBUG
- printf("\nvbv_delay: internal=%d, bitstream=%d\n", internal_vbv_delay, vbv_delay);
-
- printf("Bn=%f, prevBn=%f, I=%f, R=%f, d=%d\n", Bn, previous_Bn, I, R, d);
- printf("frame(%d), pictstruct(%d), picttype(%d)\n", Sequence_Framenum,
- picture_structure, picture_coding_type);
-
- /* report error */
- if(internal_vbv_delay != vbv_delay)
- {
- printf("WARNING: internal_vbv_delay(%d) != vbv_delay(%d)\n",
- internal_vbv_delay, vbv_delay);
- }
-#endif
-
- } /* not the first coded picture of sequence */
-
-
-#ifdef PC
- getch();
-#endif /* PC */
-
- /* update generic tracking variables */
- previous_bitstream_position = ld->Bitcnt ;
- previous_vbv_delay = vbv_delay;
- previous_Bn = Bn;
-
- /* reference picture: reordered/delayed output picture */
- if(picture_coding_type!=B_TYPE)
- {
- previous_IorP_repeat_first_field = repeat_first_field;
- previous_IorP_top_field_first = top_field_first;
- previous_IorP_picture_structure = picture_structure;
- }
-
-}
-
-
-
-/* variables to keep track of the occurance of redundant headers between pictures */
-void Clear_Verify_Headers()
-{
- verify_sequence_header = 0;
- verify_group_of_pictures_header = 0;
- verify_picture_header = 0;
- verify_slice_header = 0;
- verify_sequence_extension = 0;
- verify_sequence_display_extension = 0;
- verify_quant_matrix_extension = 0;
- verify_sequence_scalable_extension = 0;
- verify_picture_display_extension = 0;
- verify_picture_coding_extension = 0;
- verify_picture_spatial_scalable_extension = 0;
- verify_picture_temporal_scalable_extension = 0;
- verify_copyright_extension = 0;
-}
-
-#endif /* VERIFY */
-
Index: rel_1_2/mpeg2/motion.c
===================================================================
--- rel_1_2/mpeg2/motion.c (revision 1198)
+++ rel_1_2/mpeg2/motion.c (nonexistent)
@@ -1,236 +0,0 @@
-/* motion.c, motion vector decoding */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-
-#include "config.h"
-#include "global.h"
-
-/* private prototypes */
-static void decode_motion_vector _ANSI_ARGS_((int *pred, int r_size, int motion_code,
- int motion_residualesidual, int full_pel_vector));
-
-/* ISO/IEC 13818-2 sections 6.2.5.2, 6.3.17.2, and 7.6.3: Motion vectors */
-void motion_vectors(PMV,dmvector,
- motion_vertical_field_select,s,motion_vector_count,mv_format,h_r_size,v_r_size,dmv,mvscale)
-int PMV[2][2][2];
-int dmvector[2];
-int motion_vertical_field_select[2][2];
-int s, motion_vector_count, mv_format, h_r_size, v_r_size, dmv, mvscale;
-{
- if (motion_vector_count==1)
- {
- if (mv_format==MV_FIELD && !dmv)
- {
- motion_vertical_field_select[1][s] = motion_vertical_field_select[0][s] = Get_Bits(1);
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("motion_vertical_field_select[][%d] (%d): %d\n",s,
- motion_vertical_field_select[0][s],motion_vertical_field_select[0][s]);
- }
-#endif /* TRACE */
- }
-
- motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
-
- /* update other motion vector predictors */
- PMV[1][s][0] = PMV[0][s][0];
- PMV[1][s][1] = PMV[0][s][1];
- }
- else
- {
- motion_vertical_field_select[0][s] = Get_Bits(1);
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("motion_vertical_field_select[0][%d] (%d): %d\n",s,
- motion_vertical_field_select[0][s],motion_vertical_field_select[0][s]);
- }
-#endif /* TRACE */
- motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
-
- motion_vertical_field_select[1][s] = Get_Bits(1);
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("motion_vertical_field_select[1][%d] (%d): %d\n",s,
- motion_vertical_field_select[1][s],motion_vertical_field_select[1][s]);
- }
-#endif /* TRACE */
- motion_vector(PMV[1][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
- }
-}
-
-/* get and decode motion vector and differential motion vector
- for one prediction */
-void motion_vector(PMV,dmvector,
- h_r_size,v_r_size,dmv,mvscale,full_pel_vector)
-int *PMV;
-int *dmvector;
-int h_r_size;
-int v_r_size;
-int dmv; /* MPEG-2 only: get differential motion vectors */
-int mvscale; /* MPEG-2 only: field vector in frame pic */
-int full_pel_vector; /* MPEG-1 only */
-{
- int motion_code, motion_residual;
-
- /* horizontal component */
- /* ISO/IEC 13818-2 Table B-10 */
- motion_code = Get_motion_code();
-
- motion_residual = (h_r_size!=0 && motion_code!=0) ? Get_Bits(h_r_size) : 0;
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- if (h_r_size!=0 && motion_code!=0)
- {
- printf("motion_residual (");
- Print_Bits(motion_residual,h_r_size,h_r_size);
- printf("): %d\n",motion_residual);
- }
- }
-#endif /* TRACE */
-
-
- decode_motion_vector(&PMV[0],h_r_size,motion_code,motion_residual,full_pel_vector);
-
- if (dmv)
- dmvector[0] = Get_dmvector();
-
-
- /* vertical component */
- motion_code = Get_motion_code();
- motion_residual = (v_r_size!=0 && motion_code!=0) ? Get_Bits(v_r_size) : 0;
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- if (v_r_size!=0 && motion_code!=0)
- {
- printf("motion_residual (");
- Print_Bits(motion_residual,v_r_size,v_r_size);
- printf("): %d\n",motion_residual);
- }
- }
-#endif /* TRACE */
-
- if (mvscale)
- PMV[1] >>= 1; /* DIV 2 */
-
- decode_motion_vector(&PMV[1],v_r_size,motion_code,motion_residual,full_pel_vector);
-
- if (mvscale)
- PMV[1] <<= 1;
-
- if (dmv)
- dmvector[1] = Get_dmvector();
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("PMV = %d,%d\n",PMV[0],PMV[1]);
-#endif /* TRACE */
-}
-
-/* calculate motion vector component */
-/* ISO/IEC 13818-2 section 7.6.3.1: Decoding the motion vectors */
-/* Note: the arithmetic here is more elegant than that which is shown
- in 7.6.3.1. The end results (PMV[][][]) should, however, be the same. */
-
-static void decode_motion_vector(pred,r_size,motion_code,motion_residual,full_pel_vector)
-int *pred;
-int r_size, motion_code, motion_residual;
-int full_pel_vector; /* MPEG-1 (ISO/IEC 11172-1) support */
-{
- int lim, vec;
-
- lim = 16<<r_size;
- vec = full_pel_vector ? (*pred >> 1) : (*pred);
-
- if (motion_code>0)
- {
- vec+= ((motion_code-1)<<r_size) + motion_residual + 1;
- if (vec>=lim)
- vec-= lim + lim;
- }
- else if (motion_code<0)
- {
- vec-= ((-motion_code-1)<<r_size) + motion_residual + 1;
- if (vec<-lim)
- vec+= lim + lim;
- }
- *pred = full_pel_vector ? (vec<<1) : vec;
-}
-
-
-/* ISO/IEC 13818-2 section 7.6.3.6: Dual prime additional arithmetic */
-void Dual_Prime_Arithmetic(DMV,dmvector,mvx,mvy)
-int DMV[][2];
-int *dmvector; /* differential motion vector */
-int mvx, mvy; /* decoded mv components (always in field format) */
-{
- if (picture_structure==FRAME_PICTURE)
- {
- if (top_field_first)
- {
- /* vector for prediction of top field from bottom field */
- DMV[0][0] = ((mvx +(mvx>0))>>1) + dmvector[0];
- DMV[0][1] = ((mvy +(mvy>0))>>1) + dmvector[1] - 1;
-
- /* vector for prediction of bottom field from top field */
- DMV[1][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
- DMV[1][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] + 1;
- }
- else
- {
- /* vector for prediction of top field from bottom field */
- DMV[0][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
- DMV[0][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] - 1;
-
- /* vector for prediction of bottom field from top field */
- DMV[1][0] = ((mvx +(mvx>0))>>1) + dmvector[0];
- DMV[1][1] = ((mvy +(mvy>0))>>1) + dmvector[1] + 1;
- }
- }
- else
- {
- /* vector for prediction from field of opposite 'parity' */
- DMV[0][0] = ((mvx+(mvx>0))>>1) + dmvector[0];
- DMV[0][1] = ((mvy+(mvy>0))>>1) + dmvector[1];
-
- /* correct for vertical field shift */
- if (picture_structure==TOP_FIELD)
- DMV[0][1]--;
- else
- DMV[0][1]++;
- }
-}
-
Index: rel_1_2/mpeg2/global.h
===================================================================
--- rel_1_2/mpeg2/global.h (revision 1198)
+++ rel_1_2/mpeg2/global.h (nonexistent)
@@ -1,515 +0,0 @@
-/* global.h, global variables */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include "mpeg2dec.h"
-
-/* choose between declaration (GLOBAL undefined)
- * and definition (GLOBAL defined)
- * GLOBAL is defined in exactly one file mpeg2dec.c)
- */
-
-#ifndef GLOBAL
-#define EXTERN extern
-#else
-#define EXTERN
-#endif
-
-/* prototypes of global functions */
-/* readpic.c */
-void Substitute_Frame_Buffer _ANSI_ARGS_ ((int bitstream_framenum,
- int sequence_framenum));
-
-/* Get_Bits.c */
-void Initialize_Buffer _ANSI_ARGS_((void));
-void Fill_Buffer _ANSI_ARGS_((void));
-unsigned int Show_Bits _ANSI_ARGS_((int n));
-unsigned int Get_Bits1 _ANSI_ARGS_((void));
-void Flush_Buffer _ANSI_ARGS_((int n));
-unsigned int Get_Bits _ANSI_ARGS_((int n));
-int Get_Byte _ANSI_ARGS_((void));
-int Get_Word _ANSI_ARGS_((void));
-
-/* systems.c */
-void Next_Packet _ANSI_ARGS_((void));
-int Get_Long _ANSI_ARGS_((void));
-void Flush_Buffer32 _ANSI_ARGS_((void));
-unsigned int Get_Bits32 _ANSI_ARGS_((void));
-
-
-/* getblk.c */
-void Decode_MPEG1_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[]));
-void Decode_MPEG1_Non_Intra_Block _ANSI_ARGS_((int comp));
-void Decode_MPEG2_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[]));
-void Decode_MPEG2_Non_Intra_Block _ANSI_ARGS_((int comp));
-
-/* gethdr.c */
-int Get_Hdr _ANSI_ARGS_((void));
-void next_start_code _ANSI_ARGS_((void));
-int slice_header _ANSI_ARGS_((void));
-void marker_bit _ANSI_ARGS_((char *text));
-
-/* getpic.c */
-void Decode_Picture _ANSI_ARGS_((int bitstream_framenum,
- int sequence_framenum));
-void Output_Last_Frame_of_Sequence _ANSI_ARGS_((int framenum));
-
-/* getvlc.c */
-int Get_macroblock_type _ANSI_ARGS_((void));
-int Get_motion_code _ANSI_ARGS_((void));
-int Get_dmvector _ANSI_ARGS_((void));
-int Get_coded_block_pattern _ANSI_ARGS_((void));
-int Get_macroblock_address_increment _ANSI_ARGS_((void));
-int Get_Luma_DC_dct_diff _ANSI_ARGS_((void));
-int Get_Chroma_DC_dct_diff _ANSI_ARGS_((void));
-
-/* idct.c */
-void Fast_IDCT _ANSI_ARGS_((short *block));
-void Initialize_Fast_IDCT _ANSI_ARGS_((void));
-
-/* Reference_IDCT.c */
-void Initialize_Reference_IDCT _ANSI_ARGS_((void));
-void Reference_IDCT _ANSI_ARGS_((short *block));
-
-/* motion.c */
-void motion_vectors _ANSI_ARGS_((int PMV[2][2][2], int dmvector[2],
- int motion_vertical_field_select[2][2], int s, int motion_vector_count,
- int mv_format, int h_r_size, int v_r_size, int dmv, int mvscale));
-void motion_vector _ANSI_ARGS_((int *PMV, int *dmvector,
- int h_r_size, int v_r_size, int dmv, int mvscale, int full_pel_vector));
-void Dual_Prime_Arithmetic _ANSI_ARGS_((int DMV[][2], int *dmvector, int mvx, int mvy));
-
-/* mpeg2dec.c */
-void Error _ANSI_ARGS_((char *text));
-void Warning _ANSI_ARGS_((char *text));
-void Print_Bits _ANSI_ARGS_((int code, int bits, int len));
-
-/* recon.c */
-void form_predictions _ANSI_ARGS_((int bx, int by, int macroblock_type,
- int motion_type, int PMV[2][2][2], int motion_vertical_field_select[2][2],
- int dmvector[2], int stwtype));
-
-/* spatscal.c */
-void Spatial_Prediction _ANSI_ARGS_((void));
-
-/* store.c */
-void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame));
-
-#ifdef DISPLAY
-/* display.c */
-void Initialize_Display_Process _ANSI_ARGS_((char *name));
-void Terminate_Display_Process _ANSI_ARGS_((void));
-void Display_Second_Field _ANSI_ARGS_((void));
-void dither _ANSI_ARGS_((unsigned char *src[]));
-void Initialize_Dither_Matrix _ANSI_ARGS_((void));
-#endif
-
-/* global variables */
-
-EXTERN char Version[]
-#ifdef GLOBAL
- ="mpeg2decode V1.2a, 96/07/19"
-#endif
-;
-
-EXTERN char Author[]
-#ifdef GLOBAL
- ="(C) 1996, MPEG Software Simulation Group"
-#endif
-;
-
-
-/* zig-zag and alternate scan patterns */
-EXTERN unsigned char scan[2][64]
-#ifdef GLOBAL
-=
-{
- { /* Zig-Zag scan pattern */
- 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
- 12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
- 35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
- 58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
- },
- { /* Alternate scan pattern */
- 0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
- 41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
- 51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
- 53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
- }
-}
-#endif
-;
-
-/* default intra quantization matrix */
-EXTERN unsigned char default_intra_quantizer_matrix[64]
-#ifdef GLOBAL
-=
-{
- 8, 16, 19, 22, 26, 27, 29, 34,
- 16, 16, 22, 24, 27, 29, 34, 37,
- 19, 22, 26, 27, 29, 34, 34, 38,
- 22, 22, 26, 27, 29, 34, 37, 40,
- 22, 26, 27, 29, 32, 35, 40, 48,
- 26, 27, 29, 32, 35, 40, 48, 58,
- 26, 27, 29, 34, 38, 46, 56, 69,
- 27, 29, 35, 38, 46, 56, 69, 83
-}
-#endif
-;
-
-/* non-linear quantization coefficient table */
-EXTERN unsigned char Non_Linear_quantizer_scale[32]
-#ifdef GLOBAL
-=
-{
- 0, 1, 2, 3, 4, 5, 6, 7,
- 8,10,12,14,16,18,20,22,
- 24,28,32,36,40,44,48,52,
- 56,64,72,80,88,96,104,112
-}
-#endif
-;
-
-/* color space conversion coefficients
- * for YCbCr -> RGB mapping
- *
- * entries are {crv,cbu,cgu,cgv}
- *
- * crv=(255/224)*65536*(1-cr)/0.5
- * cbu=(255/224)*65536*(1-cb)/0.5
- * cgu=(255/224)*65536*(cb/cg)*(1-cb)/0.5
- * cgv=(255/224)*65536*(cr/cg)*(1-cr)/0.5
- *
- * where Y=cr*R+cg*G+cb*B (cr+cg+cb=1)
- */
-
-/* ISO/IEC 13818-2 section 6.3.6 sequence_display_extension() */
-
-EXTERN int Inverse_Table_6_9[8][4]
-#ifdef GLOBAL
-=
-{
- {117504, 138453, 13954, 34903}, /* no sequence_display_extension */
- {117504, 138453, 13954, 34903}, /* ITU-R Rec. 709 (1990) */
- {104597, 132201, 25675, 53279}, /* unspecified */
- {104597, 132201, 25675, 53279}, /* reserved */
- {104448, 132798, 24759, 53109}, /* FCC */
- {104597, 132201, 25675, 53279}, /* ITU-R Rec. 624-4 System B, G */
- {104597, 132201, 25675, 53279}, /* SMPTE 170M */
- {117579, 136230, 16907, 35559} /* SMPTE 240M (1987) */
-}
-#endif
-;
-
-
-
-
-
-/* output types (Output_Type) */
-#define T_YUV 0
-#define T_SIF 1
-#define T_TGA 2
-#define T_PPM 3
-#define T_X11 4
-#define T_X11HIQ 5
-
-/* decoder operation control variables */
-EXTERN int Output_Type;
-EXTERN int hiQdither;
-
-/* decoder operation control flags */
-EXTERN int Quiet_Flag;
-EXTERN int Trace_Flag;
-EXTERN int Fault_Flag;
-EXTERN int Verbose_Flag;
-EXTERN int Two_Streams;
-EXTERN int Spatial_Flag;
-EXTERN int Reference_IDCT_Flag;
-EXTERN int Frame_Store_Flag;
-EXTERN int System_Stream_Flag;
-EXTERN int Display_Progressive_Flag;
-EXTERN int Ersatz_Flag;
-EXTERN int Big_Picture_Flag;
-EXTERN int Verify_Flag;
-EXTERN int Stats_Flag;
-EXTERN int User_Data_Flag;
-EXTERN int Main_Bitstream_Flag;
-
-
-/* filenames */
-EXTERN char *Output_Picture_Filename;
-EXTERN char *Substitute_Picture_Filename;
-EXTERN char *Main_Bitstream_Filename;
-EXTERN char *Enhancement_Layer_Bitstream_Filename;
-
-
-/* buffers for multiuse purposes */
-EXTERN char Error_Text[256];
-EXTERN unsigned char *Clip;
-
-/* pointers to generic picture buffers */
-EXTERN unsigned char *backward_reference_frame[3];
-EXTERN unsigned char *forward_reference_frame[3];
-
-EXTERN unsigned char *auxframe[3];
-EXTERN unsigned char *current_frame[3];
-EXTERN unsigned char *substitute_frame[3];
-
-
-/* pointers to scalability picture buffers */
-EXTERN unsigned char *llframe0[3];
-EXTERN unsigned char *llframe1[3];
-
-EXTERN short *lltmp;
-EXTERN char *Lower_Layer_Picture_Filename;
-
-
-
-
-/* non-normative variables derived from normative elements */
-EXTERN int Coded_Picture_Width;
-EXTERN int Coded_Picture_Height;
-EXTERN int Chroma_Width;
-EXTERN int Chroma_Height;
-EXTERN int block_count;
-EXTERN int Second_Field;
-EXTERN int profile, level;
-
-/* normative derived variables (as per ISO/IEC 13818-2) */
-EXTERN int horizontal_size;
-EXTERN int vertical_size;
-EXTERN int mb_width;
-EXTERN int mb_height;
-EXTERN double bit_rate;
-EXTERN double frame_rate;
-
-
-
-/* headers */
-
-/* ISO/IEC 13818-2 section 6.2.2.1: sequence_header() */
-EXTERN int aspect_ratio_information;
-EXTERN int frame_rate_code;
-EXTERN int bit_rate_value;
-EXTERN int vbv_buffer_size;
-EXTERN int constrained_parameters_flag;
-
-/* ISO/IEC 13818-2 section 6.2.2.3: sequence_extension() */
-EXTERN int profile_and_level_indication;
-EXTERN int progressive_sequence;
-EXTERN int chroma_format;
-EXTERN int low_delay;
-EXTERN int frame_rate_extension_n;
-EXTERN int frame_rate_extension_d;
-
-/* ISO/IEC 13818-2 section 6.2.2.4: sequence_display_extension() */
-EXTERN int video_format;
-EXTERN int color_description;
-EXTERN int color_primaries;
-EXTERN int transfer_characteristics;
-EXTERN int matrix_coefficients;
-EXTERN int display_horizontal_size;
-EXTERN int display_vertical_size;
-
-/* ISO/IEC 13818-2 section 6.2.3: picture_header() */
-EXTERN int temporal_reference;
-EXTERN int picture_coding_type;
-EXTERN int vbv_delay;
-EXTERN int full_pel_forward_vector;
-EXTERN int forward_f_code;
-EXTERN int full_pel_backward_vector;
-EXTERN int backward_f_code;
-
-
-/* ISO/IEC 13818-2 section 6.2.3.1: picture_coding_extension() header */
-EXTERN int f_code[2][2];
-EXTERN int intra_dc_precision;
-EXTERN int picture_structure;
-EXTERN int top_field_first;
-EXTERN int frame_pred_frame_dct;
-EXTERN int concealment_motion_vectors;
-
-EXTERN int intra_vlc_format;
-
-EXTERN int repeat_first_field;
-
-EXTERN int chroma_420_type;
-EXTERN int progressive_frame;
-EXTERN int composite_display_flag;
-EXTERN int v_axis;
-EXTERN int field_sequence;
-EXTERN int sub_carrier;
-EXTERN int burst_amplitude;
-EXTERN int sub_carrier_phase;
-
-
-
-/* ISO/IEC 13818-2 section 6.2.3.3: picture_display_extension() header */
-EXTERN int frame_center_horizontal_offset[3];
-EXTERN int frame_center_vertical_offset[3];
-
-
-
-/* ISO/IEC 13818-2 section 6.2.2.5: sequence_scalable_extension() header */
-EXTERN int layer_id;
-EXTERN int lower_layer_prediction_horizontal_size;
-EXTERN int lower_layer_prediction_vertical_size;
-EXTERN int horizontal_subsampling_factor_m;
-EXTERN int horizontal_subsampling_factor_n;
-EXTERN int vertical_subsampling_factor_m;
-EXTERN int vertical_subsampling_factor_n;
-
-
-/* ISO/IEC 13818-2 section 6.2.3.5: picture_spatial_scalable_extension() header */
-EXTERN int lower_layer_temporal_reference;
-EXTERN int lower_layer_horizontal_offset;
-EXTERN int lower_layer_vertical_offset;
-EXTERN int spatial_temporal_weight_code_table_index;
-EXTERN int lower_layer_progressive_frame;
-EXTERN int lower_layer_deinterlaced_field_select;
-
-
-
-
-
-
-/* ISO/IEC 13818-2 section 6.2.3.6: copyright_extension() header */
-EXTERN int copyright_flag;
-EXTERN int copyright_identifier;
-EXTERN int original_or_copy;
-EXTERN int copyright_number_1;
-EXTERN int copyright_number_2;
-EXTERN int copyright_number_3;
-
-/* ISO/IEC 13818-2 section 6.2.2.6: group_of_pictures_header() */
-EXTERN int drop_flag;
-EXTERN int hour;
-EXTERN int minute;
-EXTERN int sec;
-EXTERN int frame;
-EXTERN int closed_gop;
-EXTERN int broken_link;
-
-
-
-/* layer specific variables (needed for SNR and DP scalability) */
-EXTERN struct layer_data {
- /* bit input */
- int Infile;
- unsigned char Rdbfr[2048];
- unsigned char *Rdptr;
- unsigned char Inbfr[16];
- /* from mpeg2play */
- unsigned int Bfr;
- unsigned char *Rdmax;
- int Incnt;
- int Bitcnt;
- /* sequence header and quant_matrix_extension() */
- int intra_quantizer_matrix[64];
- int non_intra_quantizer_matrix[64];
- int chroma_intra_quantizer_matrix[64];
- int chroma_non_intra_quantizer_matrix[64];
-
- int load_intra_quantizer_matrix;
- int load_non_intra_quantizer_matrix;
- int load_chroma_intra_quantizer_matrix;
- int load_chroma_non_intra_quantizer_matrix;
-
- int MPEG2_Flag;
- /* sequence scalable extension */
- int scalable_mode;
- /* picture coding extension */
- int q_scale_type;
- int alternate_scan;
- /* picture spatial scalable extension */
- int pict_scal;
- /* slice/macroblock */
- int priority_breakpoint;
- int quantizer_scale;
- int intra_slice;
- short block[12][64];
-} base, enhan, *ld;
-
-
-
-#ifdef VERIFY
-EXTERN int verify_sequence_header;
-EXTERN int verify_group_of_pictures_header;
-EXTERN int verify_picture_header;
-EXTERN int verify_slice_header;
-EXTERN int verify_sequence_extension;
-EXTERN int verify_sequence_display_extension;
-EXTERN int verify_quant_matrix_extension;
-EXTERN int verify_sequence_scalable_extension;
-EXTERN int verify_picture_display_extension;
-EXTERN int verify_picture_coding_extension;
-EXTERN int verify_picture_spatial_scalable_extension;
-EXTERN int verify_picture_temporal_scalable_extension;
-EXTERN int verify_copyright_extension;
-#endif /* VERIFY */
-
-
-EXTERN int Decode_Layer;
-
-/* verify.c */
-#ifdef VERIFY
-void Check_Headers _ANSI_ARGS_((int Bitstream_Framenum, int Sequence_Framenum));
-void Clear_Verify_Headers _ANSI_ARGS_((void));
-#endif /* VERIFY */
-
-
-EXTERN int global_MBA;
-EXTERN int global_pic;
-EXTERN int True_Framenum;
-
-// PJ
-
-void gvideo_init(void);
-
-// Insertion/removal from display buffer
-
-// number of preallocated frames
-#define MAX_FRAMEBUF 20
-
-struct framebuf_struct {
- int n;
- WORD *f;
- struct framebuf_struct *next;
- struct framebuf_struct *prev;
-};
-
-void Initialize_framebuf(int sz);
-struct framebuf_struct *get_free_framebuf();
-void insert_frame(struct framebuf_struct *f);
-struct framebuf_struct *remove_frame();
-void give_back_framebuf(struct framebuf_struct *f);
-void init_jetcontrol(void);
-
-
-
-
Index: rel_1_2/mpeg2/recon.c
===================================================================
--- rel_1_2/mpeg2/recon.c (revision 1198)
+++ rel_1_2/mpeg2/recon.c (nonexistent)
@@ -1,467 +0,0 @@
-/* Predict.c, motion compensation routines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-
-#include "config.h"
-#include "global.h"
-
-/* private prototypes */
-static void form_prediction _ANSI_ARGS_((unsigned char *src[], int sfield,
- unsigned char *dst[], int dfield,
- int lx, int lx2, int w, int h, int x, int y, int dx, int dy,
- int average_flag));
-
-static void form_component_prediction _ANSI_ARGS_((unsigned char *src, unsigned char *dst,
- int lx, int lx2, int w, int h, int x, int y, int dx, int dy, int average_flag));
-
-void form_predictions(bx,by,macroblock_type,motion_type,PMV,motion_vertical_field_select,dmvector,stwtype)
-int bx, by;
-int macroblock_type;
-int motion_type;
-int PMV[2][2][2], motion_vertical_field_select[2][2], dmvector[2];
-int stwtype;
-{
- int currentfield;
- unsigned char **predframe;
- int DMV[2][2];
- int stwtop, stwbot;
-
- stwtop = stwtype%3; /* 0:temporal, 1:(spat+temp)/2, 2:spatial */
- stwbot = stwtype/3;
-
- if ((macroblock_type & MACROBLOCK_MOTION_FORWARD)
- || (picture_coding_type==P_TYPE))
- {
- if (picture_structure==FRAME_PICTURE)
- {
- if ((motion_type==MC_FRAME)
- || !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
- {
- /* frame-based prediction (broken into top and bottom halves
- for spatial scalability prediction purposes) */
- if (stwtop<2)
- form_prediction(forward_reference_frame,0,current_frame,0,
- Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
- PMV[0][0][0],PMV[0][0][1],stwtop);
-
- if (stwbot<2)
- form_prediction(forward_reference_frame,1,current_frame,1,
- Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
- PMV[0][0][0],PMV[0][0][1],stwbot);
- }
- else if (motion_type==MC_FIELD) /* field-based prediction */
- {
- /* top field prediction */
- if (stwtop<2)
- form_prediction(forward_reference_frame,motion_vertical_field_select[0][0],
- current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by>>1,PMV[0][0][0],PMV[0][0][1]>>1,stwtop);
-
- /* bottom field prediction */
- if (stwbot<2)
- form_prediction(forward_reference_frame,motion_vertical_field_select[1][0],
- current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by>>1,PMV[1][0][0],PMV[1][0][1]>>1,stwbot);
- }
- else if (motion_type==MC_DMV) /* dual prime prediction */
- {
- /* calculate derived motion vectors */
- Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]>>1);
-
- if (stwtop<2)
- {
- /* predict top field from top field */
- form_prediction(forward_reference_frame,0,current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
- PMV[0][0][0],PMV[0][0][1]>>1,0);
-
- /* predict and add to top field from bottom field */
- form_prediction(forward_reference_frame,1,current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
- DMV[0][0],DMV[0][1],1);
- }
-
- if (stwbot<2)
- {
- /* predict bottom field from bottom field */
- form_prediction(forward_reference_frame,1,current_frame,1,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
- PMV[0][0][0],PMV[0][0][1]>>1,0);
-
- /* predict and add to bottom field from top field */
- form_prediction(forward_reference_frame,0,current_frame,1,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
- DMV[1][0],DMV[1][1],1);
- }
- }
- else
- /* invalid motion_type */
- printf("invalid motion_type\n");
- }
- else /* TOP_FIELD or BOTTOM_FIELD */
- {
- /* field picture */
- currentfield = (picture_structure==BOTTOM_FIELD);
-
- /* determine which frame to use for prediction */
- if ((picture_coding_type==P_TYPE) && Second_Field
- && (currentfield!=motion_vertical_field_select[0][0]))
- predframe = backward_reference_frame; /* same frame */
- else
- predframe = forward_reference_frame; /* previous frame */
-
- if ((motion_type==MC_FIELD)
- || !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
- {
- /* field-based prediction */
- if (stwtop<2)
- form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
- PMV[0][0][0],PMV[0][0][1],stwtop);
- }
- else if (motion_type==MC_16X8)
- {
- if (stwtop<2)
- {
- form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by,
- PMV[0][0][0],PMV[0][0][1],stwtop);
-
- /* determine which frame to use for lower half prediction */
- if ((picture_coding_type==P_TYPE) && Second_Field
- && (currentfield!=motion_vertical_field_select[1][0]))
- predframe = backward_reference_frame; /* same frame */
- else
- predframe = forward_reference_frame; /* previous frame */
-
- form_prediction(predframe,motion_vertical_field_select[1][0],current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by+8,
- PMV[1][0][0],PMV[1][0][1],stwtop);
- }
- }
- else if (motion_type==MC_DMV) /* dual prime prediction */
- {
- if (Second_Field)
- predframe = backward_reference_frame; /* same frame */
- else
- predframe = forward_reference_frame; /* previous frame */
-
- /* calculate derived motion vectors */
- Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]);
-
- /* predict from field of same parity */
- form_prediction(forward_reference_frame,currentfield,current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
- PMV[0][0][0],PMV[0][0][1],0);
-
- /* predict from field of opposite parity */
- form_prediction(predframe,!currentfield,current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
- DMV[0][0],DMV[0][1],1);
- }
- else
- /* invalid motion_type */
- printf("invalid motion_type\n");
- }
- stwtop = stwbot = 1;
- }
-
- if (macroblock_type & MACROBLOCK_MOTION_BACKWARD)
- {
- if (picture_structure==FRAME_PICTURE)
- {
- if (motion_type==MC_FRAME)
- {
- /* frame-based prediction */
- if (stwtop<2)
- form_prediction(backward_reference_frame,0,current_frame,0,
- Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
- PMV[0][1][0],PMV[0][1][1],stwtop);
-
- if (stwbot<2)
- form_prediction(backward_reference_frame,1,current_frame,1,
- Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
- PMV[0][1][0],PMV[0][1][1],stwbot);
- }
- else /* field-based prediction */
- {
- /* top field prediction */
- if (stwtop<2)
- form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
- current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by>>1,PMV[0][1][0],PMV[0][1][1]>>1,stwtop);
-
- /* bottom field prediction */
- if (stwbot<2)
- form_prediction(backward_reference_frame,motion_vertical_field_select[1][1],
- current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by>>1,PMV[1][1][0],PMV[1][1][1]>>1,stwbot);
- }
- }
- else /* TOP_FIELD or BOTTOM_FIELD */
- {
- /* field picture */
- if (motion_type==MC_FIELD)
- {
- /* field-based prediction */
- form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
- current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,
- bx,by,PMV[0][1][0],PMV[0][1][1],stwtop);
- }
- else if (motion_type==MC_16X8)
- {
- form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
- current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by,PMV[0][1][0],PMV[0][1][1],stwtop);
-
- form_prediction(backward_reference_frame,motion_vertical_field_select[1][1],
- current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by+8,PMV[1][1][0],PMV[1][1][1],stwtop);
- }
- else
- /* invalid motion_type */
- printf("invalid motion_type\n");
- }
- }
-}
-
-static void form_prediction(src,sfield,dst,dfield,lx,lx2,w,h,x,y,dx,dy,average_flag)
-unsigned char *src[]; /* prediction source buffer */
-int sfield; /* prediction source field number (0 or 1) */
-unsigned char *dst[]; /* prediction destination buffer */
-int dfield; /* prediction destination field number (0 or 1)*/
-int lx,lx2; /* line strides */
-int w,h; /* prediction block/sub-block width, height */
-int x,y; /* pixel co-ordinates of top-left sample in current MB */
-int dx,dy; /* horizontal, vertical prediction address */
-int average_flag; /* add prediction error to prediction ? */
-{
- /* Y */
- form_component_prediction(src[0]+(sfield?lx2>>1:0),dst[0]+(dfield?lx2>>1:0),
- lx,lx2,w,h,x,y,dx,dy,average_flag);
-
- if (chroma_format!=CHROMA444)
- {
- lx>>=1; lx2>>=1; w>>=1; x>>=1; dx/=2;
- }
-
- if (chroma_format==CHROMA420)
- {
- h>>=1; y>>=1; dy/=2;
- }
-
- /* Cb */
- form_component_prediction(src[1]+(sfield?lx2>>1:0),dst[1]+(dfield?lx2>>1:0),
- lx,lx2,w,h,x,y,dx,dy,average_flag);
-
- /* Cr */
- form_component_prediction(src[2]+(sfield?lx2>>1:0),dst[2]+(dfield?lx2>>1:0),
- lx,lx2,w,h,x,y,dx,dy,average_flag);
-}
-
-/* ISO/IEC 13818-2 section 7.6.4: Forming predictions */
-/* NOTE: the arithmetic below produces numerically equivalent results
- * to 7.6.4, yet is more elegant. It differs in the following ways:
- *
- * 1. the vectors (dx, dy) are based on cartesian frame
- * coordiantes along a half-pel grid (always positive numbers)
- * In contrast, vector[r][s][t] are differential (with positive and
- * negative values). As a result, deriving the integer vectors
- * (int_vec[t]) from dx, dy is accomplished by a simple right shift.
- *
- * 2. Half pel flags (xh, yh) are equivalent to the LSB (Least
- * Significant Bit) of the half-pel coordinates (dx,dy).
- *
- *
- * NOTE: the work of combining predictions (ISO/IEC 13818-2 section 7.6.7)
- * is distributed among several other stages. This is accomplished by
- * folding line offsets into the source and destination (src,dst)
- * addresses (note the call arguments to form_prediction() in Predict()),
- * line stride variables lx and lx2, the block dimension variables (w,h),
- * average_flag, and by the very order in which Predict() is called.
- * This implementation design (implicitly different than the spec)
- * was chosen for its elegance.
-*/
-
-static void form_component_prediction(src,dst,lx,lx2,w,h,x,y,dx,dy,average_flag)
-unsigned char *src;
-unsigned char *dst;
-int lx; /* raster line increment */
-int lx2;
-int w,h;
-int x,y;
-int dx,dy;
-int average_flag; /* flag that signals bi-directional or Dual-Prime
- averaging (7.6.7.1 and 7.6.7.4). if average_flag==1,
- a previously formed prediction has been stored in
- pel_pred[] */
-{
- int xint; /* horizontal integer sample vector: analogous to int_vec[0] */
- int yint; /* vertical integer sample vectors: analogous to int_vec[1] */
- int xh; /* horizontal half sample flag: analogous to half_flag[0] */
- int yh; /* vertical half sample flag: analogous to half_flag[1] */
- int i, j, v;
- unsigned char *s; /* source pointer: analogous to pel_ref[][] */
- unsigned char *d; /* destination pointer: analogous to pel_pred[][] */
-
- /* half pel scaling for integer vectors */
- xint = dx>>1;
- yint = dy>>1;
-
- /* derive half pel flags */
- xh = dx & 1;
- yh = dy & 1;
-
- /* compute the linear address of pel_ref[][] and pel_pred[][]
- based on cartesian/raster cordinates provided */
- s = src + lx*(y+yint) + x + xint;
- d = dst + lx*y + x;
-
- if (!xh && !yh) /* no horizontal nor vertical half-pel */
- {
- if (average_flag)
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- v = d[i]+s[i];
- d[i] = (v+(v>=0?1:0))>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- else
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- d[i] = s[i];
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- }
- else if (!xh && yh) /* no horizontal but vertical half-pel */
- {
- if (average_flag)
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- v = d[i] + ((unsigned int)(s[i]+s[i+lx]+1)>>1);
- d[i]=(v+(v>=0?1:0))>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- else
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- d[i] = (unsigned int)(s[i]+s[i+lx]+1)>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- }
- else if (xh && !yh) /* horizontal but no vertical half-pel */
- {
- if (average_flag)
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- v = d[i] + ((unsigned int)(s[i]+s[i+1]+1)>>1);
- d[i] = (v+(v>=0?1:0))>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- else
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- d[i] = (unsigned int)(s[i]+s[i+1]+1)>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- }
- else /* if (xh && yh) horizontal and vertical half-pel */
- {
- if (average_flag)
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- v = d[i] + ((unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2);
- d[i] = (v+(v>=0?1:0))>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- else
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- d[i] = (unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- }
-}
Index: rel_1_2/mpeg2/systems.c
===================================================================
--- rel_1_2/mpeg2/systems.c (revision 1198)
+++ rel_1_2/mpeg2/systems.c (nonexistent)
@@ -1,200 +0,0 @@
-/* systems.c, systems-specific routines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "config.h"
-#include "global.h"
-
-/* initialize buffer, call once before first getbits or showbits */
-
-/* parse system layer, ignore everything we don't need */
-void Next_Packet()
-{
- unsigned int code;
- int l;
-
- for(;;)
- {
- code = Get_Long();
-
- /* remove system layer byte stuffing */
- while ((code & 0xffffff00) != 0x100)
- code = (code<<8) | Get_Byte();
-
- switch(code)
- {
- case PACK_START_CODE: /* pack header */
- /* skip pack header (system_clock_reference and mux_rate) */
- ld->Rdptr += 8;
- break;
- case VIDEO_ELEMENTARY_STREAM:
- code = Get_Word(); /* packet_length */
- ld->Rdmax = ld->Rdptr + code;
-
- code = Get_Byte();
-
- if((code>>6)==0x02)
- {
- ld->Rdptr++;
- code=Get_Byte(); /* parse PES_header_data_length */
- ld->Rdptr+=code; /* advance pointer by PES_header_data_length */
- printf("MPEG-2 PES packet\n");
- return;
- }
- else if(code==0xff)
- {
- /* parse MPEG-1 packet header */
- while((code=Get_Byte())== 0xFF);
- }
-
- /* stuffing bytes */
- if(code>=0x40)
- {
- if(code>=0x80)
- {
- fprintf(stderr,"Error in packet header\n");
- exit(1);
- }
- /* skip STD_buffer_scale */
- ld->Rdptr++;
- code = Get_Byte();
- }
-
- if(code>=0x30)
- {
- if(code>=0x40)
- {
- fprintf(stderr,"Error in packet header\n");
- exit(1);
- }
- /* skip presentation and decoding time stamps */
- ld->Rdptr += 9;
- }
- else if(code>=0x20)
- {
- /* skip presentation time stamps */
- ld->Rdptr += 4;
- }
- else if(code!=0x0f)
- {
- fprintf(stderr,"Error in packet header\n");
- exit(1);
- }
- return;
- case ISO_END_CODE: /* end */
- /* simulate a buffer full of sequence end codes */
- l = 0;
- while (l<2048)
- {
- ld->Rdbfr[l++] = SEQUENCE_END_CODE>>24;
- ld->Rdbfr[l++] = SEQUENCE_END_CODE>>16;
- ld->Rdbfr[l++] = SEQUENCE_END_CODE>>8;
- ld->Rdbfr[l++] = SEQUENCE_END_CODE&0xff;
- }
- ld->Rdptr = ld->Rdbfr;
- ld->Rdmax = ld->Rdbfr + 2048;
- return;
- default:
- if(code>=SYSTEM_START_CODE)
- {
- /* skip system headers and non-video packets*/
- code = Get_Word();
- ld->Rdptr += code;
- }
- else
- {
- fprintf(stderr,"Unexpected startcode %08x in system layer\n",code);
- exit(1);
- }
- break;
- }
- }
-}
-
-
-
-void Flush_Buffer32()
-{
- int Incnt;
-
- ld->Bfr = 0;
-
- Incnt = ld->Incnt;
- Incnt -= 32;
-
- if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4))
- {
- while (Incnt <= 24)
- {
- if (ld->Rdptr >= ld->Rdmax)
- Next_Packet();
- ld->Bfr |= Get_Byte() << (24 - Incnt);
- Incnt += 8;
- }
- }
- else
- {
- while (Incnt <= 24)
- {
- if (ld->Rdptr >= ld->Rdbfr+2048)
- Fill_Buffer();
- ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
- Incnt += 8;
- }
- }
- ld->Incnt = Incnt;
-
-#ifdef VERIFY
- ld->Bitcnt += 32;
-#endif /* VERIFY */
-}
-
-
-unsigned int Get_Bits32()
-{
- unsigned int l;
-
- l = Show_Bits(32);
- Flush_Buffer32();
-
- return l;
-}
-
-
-int Get_Long()
-{
- int i;
-
- i = Get_Word();
- return (i<<16) | Get_Word();
-}
-
-
Index: rel_1_2/mpeg2/getblk.c
===================================================================
--- rel_1_2/mpeg2/getblk.c (revision 1198)
+++ rel_1_2/mpeg2/getblk.c (nonexistent)
@@ -1,570 +0,0 @@
-/* getblk.c, DCT block decoding */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-
-#include "config.h"
-#include "global.h"
-
-
-/* defined in getvlc.h */
-typedef struct {
- char run, level, len;
-} DCTtab;
-
-extern DCTtab DCTtabfirst[],DCTtabnext[],DCTtab0[],DCTtab1[];
-extern DCTtab DCTtab2[],DCTtab3[],DCTtab4[],DCTtab5[],DCTtab6[];
-extern DCTtab DCTtab0a[],DCTtab1a[];
-
-
-/* decode one intra coded MPEG-1 block */
-
-void Decode_MPEG1_Intra_Block(comp,dc_dct_pred)
-int comp;
-int dc_dct_pred[];
-{
- int val, i, j, sign;
- unsigned int code;
- DCTtab *tab;
- short *bp;
-
- bp = ld->block[comp];
-
- /* ISO/IEC 11172-2 section 2.4.3.7: Block layer. */
- /* decode DC coefficients */
- if (comp<4)
- bp[0] = (dc_dct_pred[0]+=Get_Luma_DC_dct_diff()) << 3;
- else if (comp==4)
- bp[0] = (dc_dct_pred[1]+=Get_Chroma_DC_dct_diff()) << 3;
- else
- bp[0] = (dc_dct_pred[2]+=Get_Chroma_DC_dct_diff()) << 3;
-
- if (Fault_Flag) return;
-
- /* D-pictures do not contain AC coefficients */
- if(picture_coding_type == D_TYPE)
- return;
-
- /* decode AC coefficients */
- for (i=1; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384)
- tab = &DCTtabnext[(code>>12)-4];
- else if (code>=1024)
- tab = &DCTtab0[(code>>8)-4];
- else if (code>=512)
- tab = &DCTtab1[(code>>6)-8];
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- printf("invalid Huffman code in Decode_MPEG1_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
-
- Flush_Buffer(tab->len);
-
- if (tab->run==64) /* end_of_block */
- return;
-
- if (tab->run==65) /* escape */
- {
- i+= Get_Bits(6);
-
- val = Get_Bits(8);
- if (val==0)
- val = Get_Bits(8);
- else if (val==128)
- val = Get_Bits(8) - 256;
- else if (val>128)
- val -= 256;
-
- if((sign = (val<0)))
- val = -val;
- }
- else
- {
- i+= tab->run;
- val = tab->level;
- sign = Get_Bits(1);
- }
-
- if (i>=64)
- {
- if (!Quiet_Flag)
- fprintf(stderr,"DCT coeff index (i) out of bounds (intra)\n");
- Fault_Flag = 1;
- return;
- }
-
- j = scan[ZIG_ZAG][i];
- val = (val*ld->quantizer_scale*ld->intra_quantizer_matrix[j]) >> 3;
-
- /* mismatch control ('oddification') */
- if (val!=0) /* should always be true, but it's not guaranteed */
- val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
-
- /* saturation */
- if (!sign)
- bp[j] = (val>2047) ? 2047 : val; /* positive */
- else
- bp[j] = (val>2048) ? -2048 : -val; /* negative */
- }
-}
-
-
-/* decode one non-intra coded MPEG-1 block */
-
-void Decode_MPEG1_Non_Intra_Block(comp)
-int comp;
-{
- int val, i, j, sign;
- unsigned int code;
- DCTtab *tab;
- short *bp;
-
- bp = ld->block[comp];
-
- /* decode AC coefficients */
- for (i=0; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384)
- {
- if (i==0)
- tab = &DCTtabfirst[(code>>12)-4];
- else
- tab = &DCTtabnext[(code>>12)-4];
- }
- else if (code>=1024)
- tab = &DCTtab0[(code>>8)-4];
- else if (code>=512)
- tab = &DCTtab1[(code>>6)-8];
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- printf("invalid Huffman code in Decode_MPEG1_Non_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
-
- Flush_Buffer(tab->len);
-
- if (tab->run==64) /* end_of_block */
- return;
-
- if (tab->run==65) /* escape */
- {
- i+= Get_Bits(6);
-
- val = Get_Bits(8);
- if (val==0)
- val = Get_Bits(8);
- else if (val==128)
- val = Get_Bits(8) - 256;
- else if (val>128)
- val -= 256;
-
- if((sign = (val<0)))
- val = -val;
- }
- else
- {
- i+= tab->run;
- val = tab->level;
- sign = Get_Bits(1);
- }
-
- if (i>=64)
- {
- if (!Quiet_Flag)
- fprintf(stderr,"DCT coeff index (i) out of bounds (inter)\n");
- Fault_Flag = 1;
- return;
- }
-
- j = scan[ZIG_ZAG][i];
- val = (((val<<1)+1)*ld->quantizer_scale*ld->non_intra_quantizer_matrix[j]) >> 4;
-
- /* mismatch control ('oddification') */
- if (val!=0) /* should always be true, but it's not guaranteed */
- val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
-
- /* saturation */
- if (!sign)
- bp[j] = (val>2047) ? 2047 : val; /* positive */
- else
- bp[j] = (val>2048) ? -2048 : -val; /* negative */
- }
-}
-
-
-/* decode one intra coded MPEG-2 block */
-
-void Decode_MPEG2_Intra_Block(comp,dc_dct_pred)
-int comp;
-int dc_dct_pred[];
-{
- int val, i, j, sign, nc, cc, run;
- unsigned int code;
- DCTtab *tab;
- short *bp;
- int *qmat;
- struct layer_data *ld1;
-
- /* with data partitioning, data always goes to base layer */
- ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
- bp = ld1->block[comp];
-
- if (base.scalable_mode==SC_DP)
- if (base.priority_breakpoint<64)
- ld = &enhan;
- else
- ld = &base;
-
- cc = (comp<4) ? 0 : (comp&1)+1;
-
- qmat = (comp<4 || chroma_format==CHROMA420)
- ? ld1->intra_quantizer_matrix
- : ld1->chroma_intra_quantizer_matrix;
-
- /* ISO/IEC 13818-2 section 7.2.1: decode DC coefficients */
- if (cc==0)
- val = (dc_dct_pred[0]+= Get_Luma_DC_dct_diff());
- else if (cc==1)
- val = (dc_dct_pred[1]+= Get_Chroma_DC_dct_diff());
- else
- val = (dc_dct_pred[2]+= Get_Chroma_DC_dct_diff());
-
- if (Fault_Flag) return;
-
- bp[0] = val << (3-intra_dc_precision);
-
- nc=0;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("DCT(%d)i:",comp);
-#endif /* TRACE */
-
- /* decode AC coefficients */
- for (i=1; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384 && !intra_vlc_format)
- tab = &DCTtabnext[(code>>12)-4];
- else if (code>=1024)
- {
- if (intra_vlc_format)
- tab = &DCTtab0a[(code>>8)-4];
- else
- tab = &DCTtab0[(code>>8)-4];
- }
- else if (code>=512)
- {
- if (intra_vlc_format)
- tab = &DCTtab1a[(code>>6)-8];
- else
- tab = &DCTtab1[(code>>6)-8];
- }
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- printf("invalid Huffman code in Decode_MPEG2_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
-
- Flush_Buffer(tab->len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf(" (");
- Print_Bits(code,16,tab->len);
- }
-#endif /* TRACE */
-
- if (tab->run==64) /* end_of_block */
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf("): EOB\n");
-#endif /* TRACE */
- return;
- }
-
- if (tab->run==65) /* escape */
- {
-#ifdef TRACE
- if (Trace_Flag)
- {
- putchar(' ');
- Print_Bits(Show_Bits(6),6,6);
- }
-#endif /* TRACE */
-
- i+= run = Get_Bits(6);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- putchar(' ');
- Print_Bits(Show_Bits(12),12,12);
- }
-#endif /* TRACE */
-
- val = Get_Bits(12);
- if ((val&2047)==0)
- {
- if (!Quiet_Flag)
- printf("invalid escape in Decode_MPEG2_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
- if((sign = (val>=2048)))
- val = 4096 - val;
- }
- else
- {
- i+= run = tab->run;
- val = tab->level;
- sign = Get_Bits(1);
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("%d",sign);
-#endif /* TRACE */
- }
-
- if (i>=64)
- {
- if (!Quiet_Flag)
- fprintf(stderr,"DCT coeff index (i) out of bounds (intra2)\n");
- Fault_Flag = 1;
- return;
- }
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("): %d/%d",run,sign ? -val : val);
-#endif /* TRACE */
-
- j = scan[ld1->alternate_scan][i];
- val = (val * ld1->quantizer_scale * qmat[j]) >> 4;
- bp[j] = sign ? -val : val;
- nc++;
-
- if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
- ld = &enhan;
- }
-}
-
-
-/* decode one non-intra coded MPEG-2 block */
-
-void Decode_MPEG2_Non_Intra_Block(comp)
-int comp;
-{
- int val, i, j, sign, nc, run;
- unsigned int code;
- DCTtab *tab;
- short *bp;
- int *qmat;
- struct layer_data *ld1;
-
- /* with data partitioning, data always goes to base layer */
- ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
- bp = ld1->block[comp];
-
- if (base.scalable_mode==SC_DP)
- if (base.priority_breakpoint<64)
- ld = &enhan;
- else
- ld = &base;
-
- qmat = (comp<4 || chroma_format==CHROMA420)
- ? ld1->non_intra_quantizer_matrix
- : ld1->chroma_non_intra_quantizer_matrix;
-
- nc = 0;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("DCT(%d)n:",comp);
-#endif /* TRACE */
-
- /* decode AC coefficients */
- for (i=0; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384)
- {
- if (i==0)
- tab = &DCTtabfirst[(code>>12)-4];
- else
- tab = &DCTtabnext[(code>>12)-4];
- }
- else if (code>=1024)
- tab = &DCTtab0[(code>>8)-4];
- else if (code>=512)
- tab = &DCTtab1[(code>>6)-8];
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- printf("invalid Huffman code in Decode_MPEG2_Non_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
-
- Flush_Buffer(tab->len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf(" (");
- Print_Bits(code,16,tab->len);
- }
-#endif /* TRACE */
-
- if (tab->run==64) /* end_of_block */
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf("): EOB\n");
-#endif /* TRACE */
- return;
- }
-
- if (tab->run==65) /* escape */
- {
-#ifdef TRACE
- if (Trace_Flag)
- {
- putchar(' ');
- Print_Bits(Show_Bits(6),6,6);
- }
-#endif /* TRACE */
-
- i+= run = Get_Bits(6);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- putchar(' ');
- Print_Bits(Show_Bits(12),12,12);
- }
-#endif /* TRACE */
-
- val = Get_Bits(12);
- if ((val&2047)==0)
- {
- if (!Quiet_Flag)
- printf("invalid escape in Decode_MPEG2_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
- if((sign = (val>=2048)))
- val = 4096 - val;
- }
- else
- {
- i+= run = tab->run;
- val = tab->level;
- sign = Get_Bits(1);
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("%d",sign);
-#endif /* TRACE */
- }
-
- if (i>=64)
- {
- if (!Quiet_Flag)
- fprintf(stderr,"DCT coeff index (i) out of bounds (inter2)\n");
- Fault_Flag = 1;
- return;
- }
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("): %d/%d",run,sign?-val:val);
-#endif /* TRACE */
-
- j = scan[ld1->alternate_scan][i];
- val = (((val<<1)+1) * ld1->quantizer_scale * qmat[j]) >> 5;
- bp[j] = sign ? -val : val;
- nc++;
-
- if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
- ld = &enhan;
- }
-}
Index: rel_1_2/mpeg2/subspic.c
===================================================================
--- rel_1_2/mpeg2/subspic.c (revision 1198)
+++ rel_1_2/mpeg2/subspic.c (nonexistent)
@@ -1,392 +0,0 @@
-/* #define DEBUG */
-/* subspic.c, Frame buffer substitution routines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-
-#include "config.h"
-#include "global.h"
-
-/* private prototypes*/
-static void Read_Frame _ANSI_ARGS_((char *filename,
- unsigned char *frame_buffer[], int framenum));
-static void Copy_Frame _ANSI_ARGS_((unsigned char *src, unsigned char *dst,
- int width, int height, int parity, int incr));
-static int Read_Components _ANSI_ARGS_ ((char *filename,
- unsigned char *frame[3], int framenum));
-static int Read_Component _ANSI_ARGS_ ((char *fname, unsigned char *frame,
- int width, int height));
-static int Extract_Components _ANSI_ARGS_ ((char *filename,
- unsigned char *frame[3], int framenum));
-
-
-/* substitute frame buffer routine */
-void Substitute_Frame_Buffer (bitstream_framenum, sequence_framenum)
-int bitstream_framenum;
-int sequence_framenum;
-{
- /* static tracking variables */
- static int previous_temporal_reference;
- static int previous_bitstream_framenum;
- static int previous_anchor_temporal_reference;
- static int previous_anchor_bitstream_framenum;
- static int previous_picture_coding_type;
- static int bgate;
-
- /* local temporary variables */
- int substitute_display_framenum;
-
-
-#ifdef DEBUG
- printf("SUB: seq fn(%d) bitfn(%d) tempref(%d) picstr(%d) type(%d)\n",
- sequence_framenum, bitstream_framenum, temporal_reference,
- picture_structure, picture_coding_type);
-#endif
-
- /* we don't substitute at the first picture of a sequence */
- if((sequence_framenum!=0)||(Second_Field))
- {
- /* only at the start of the frame */
- if ((picture_structure==FRAME_PICTURE)||(!Second_Field))
- {
- if(picture_coding_type==P_TYPE)
- {
- /* the most recently decoded reference frame needs substituting */
- substitute_display_framenum = bitstream_framenum - 1;
-
- Read_Frame(Substitute_Picture_Filename, forward_reference_frame,
- substitute_display_framenum);
- }
- /* only the first B frame in a consequitve set of B pictures
- loads a substitute backward_reference_frame since all subsequent
- B frames predict from the same reference pictures */
- else if((picture_coding_type==B_TYPE)&&(bgate!=1))
- {
- substitute_display_framenum =
- (previous_temporal_reference - temporal_reference)
- + bitstream_framenum - 1;
-
- Read_Frame(Substitute_Picture_Filename, backward_reference_frame,
- substitute_display_framenum);
- }
- } /* P fields can predict from the two most recently decoded fields, even
- from the first field of the same frame being decoded */
- else if(Second_Field && (picture_coding_type==P_TYPE))
- {
- /* our favourite case: the IP field picture pair */
- if((previous_picture_coding_type==I_TYPE)&&(picture_coding_type==P_TYPE))
- {
- substitute_display_framenum = bitstream_framenum;
- }
- else /* our more generic P field picture pair */
- {
- substitute_display_framenum =
- (temporal_reference - previous_anchor_temporal_reference)
- + bitstream_framenum - 1;
- }
-
- Read_Frame(Substitute_Picture_Filename, current_frame, substitute_display_framenum);
- }
-#ifdef DEBUG
- else if((picture_coding_type!=B_TYPE)||(picture_coding_type!=D_TYPE))
- {
- printf("NO SUBS FOR THIS PICTURE\n");
- }
-#endif
- }
-
-
- /* set b gate so we don't redundantly load next time around */
- if(picture_coding_type==B_TYPE)
- bgate = 1;
- else
- bgate = 0;
-
- /* update general tracking variables */
- if((picture_structure==FRAME_PICTURE)||(!Second_Field))
- {
- previous_temporal_reference = temporal_reference;
- previous_bitstream_framenum = bitstream_framenum;
- }
-
- /* update reference frame tracking variables */
- if((picture_coding_type!=B_TYPE) &&
- ((picture_structure==FRAME_PICTURE)||Second_Field))
- {
- previous_anchor_temporal_reference = temporal_reference;
- previous_anchor_bitstream_framenum = bitstream_framenum;
- }
-
- previous_picture_coding_type = picture_coding_type;
-
-}
-
-
-/* Note: fields are only read to serve as the same-frame reference for
- a second field */
-static void Read_Frame(fname,frame,framenum)
-char *fname;
-unsigned char *frame[];
-int framenum;
-{
- int parity;
- int rerr = 0;
- int field_mode;
-
- if(framenum<0)
- printf("ERROR: framenum (%d) is less than zero\n", framenum);
-
-
- if(Big_Picture_Flag)
- rerr = Extract_Components(fname, substitute_frame, framenum);
- else
- rerr = Read_Components(fname, substitute_frame, framenum);
-
- if(rerr!=0)
- {
- printf("was unable to substitute frame\n");
- }
-
- /* now copy to the appropriate buffer */
- /* first field (which we are attempting to substitute) must be
- of opposite field parity to the current one */
- if((Second_Field)&&(picture_coding_type==P_TYPE))
- {
- parity = (picture_structure==TOP_FIELD ? 1:0);
- field_mode = (picture_structure==FRAME_PICTURE ? 0:1);
- }
- else
- {
- /* Like frame structued pictures, B pictures only substitute an entire frame
- since both fields always predict from the same frame (with respect
- to forward/backwards directions) */
- parity = 0;
- field_mode = 0;
- }
-
-
- Copy_Frame(substitute_frame[0], frame[0], Coded_Picture_Width,
- Coded_Picture_Height, parity, field_mode);
-
- Copy_Frame(substitute_frame[1], frame[1], Chroma_Width, Chroma_Height,
- parity, field_mode);
-
- Copy_Frame(substitute_frame[2], frame[2], Chroma_Width, Chroma_Height,
- parity, field_mode);
-
-#ifdef VERBOSE
- if(Verbose_Flag > NO_LAYER)
- printf("substituted %s %d\n",
- (field_mode ? (parity?"bottom field":"bottom field"):"frame"), framenum);
-#endif
-}
-
-
-
-
-static int Read_Components(filename, frame, framenum)
-char *filename;
-unsigned char *frame[3];
-int framenum;
-{
- int err = 0;
- char outname[FILENAME_LENGTH];
- char name[FILENAME_LENGTH];
-
- sprintf(outname,filename,framenum);
-
-
- sprintf(name,"%s.Y",outname);
- err += Read_Component(name, frame[0], Coded_Picture_Width,
- Coded_Picture_Height);
-
- sprintf(name,"%s.U",outname);
- err += Read_Component(name, frame[1], Chroma_Width, Chroma_Height);
-
- sprintf(name,"%s.V",outname);
- err += Read_Component(name, frame[2], Chroma_Width, Chroma_Height);
-
- return(err);
-}
-
-
-static int Read_Component(Filename, Frame, Width, Height)
-char *Filename;
-unsigned char *Frame;
-int Width;
-int Height;
-{
- int Size;
- int Bytes_Read;
- int Infile;
-
- Size = Width*Height;
-
-#ifdef DEBUG
- printf("SUBS: reading %s\n", filename);
-#endif
-
- if(!(Infile=open(Filename,O_RDONLY|O_BINARY))<0)
- {
- printf("ERROR: unable to open reference filename (%s)\n", Filename);
- return(-1);
- }
-
- Bytes_Read = read(Infile, Frame, Size);
-
- if(Bytes_Read!=Size)
- {
- printf("was able to read only %d bytes of %d of file %s\n",
- Bytes_Read, Size, Filename);
- }
-
- close(Infile);
- return(0);
-}
-
-
-/* optimization: do not open the big file each time. Open once at start
- of decoder, and close at the very last frame */
-
-/* Note: "big" files were used in E-mail exchanges almost exclusively by the
- MPEG Committee's syntax validation and conformance ad-hoc groups from
- the year 1993 until 1995 */
-static int Extract_Components(filename, frame, framenum)
-char *filename;
-unsigned char *frame[3];
-int framenum;
-{
-/* int err = 0; */
- FILE *fd;
- int line;
- int size, offset;
-
-
- if (!(fd = fopen(filename,"rb")))
- {
- sprintf(Error_Text,"Couldn't open %s\n",filename);
- return(-1);
- }
-
- /* compute size of each frame (in bytes) */
- size = (Coded_Picture_Width*Coded_Picture_Height);
-
- if(chroma_format==CHROMA444)
- size = (size * 3);
- else if(chroma_format==CHROMA422)
- size = (size * 2);
- else if(chroma_format==CHROMA420)
- size = ((size*3)>>1);
- else
- printf("ERROR: chroma_format (%d) not recognized\n", chroma_format);
-
-
- /* compute distance into "big" file */
- offset = size*framenum;
-
-#ifdef DEBUG
- printf("EXTRACTING: frame(%d) offset(%d), size (%d) from %s\n",
- framenum, offset, size, filename);
-#endif
-
- /* seek to location in big file where desired frame begins */
- /* note: this offset cannot exceed a few billion bytes due to the */
- /* obvious limitations of 32-bit integers */
- fseek(fd, offset, 0);
-
- /* Y */
- for (line=0; line<Coded_Picture_Height; line++)
- {
- fread(frame[0]+(line*Coded_Picture_Width),1,Coded_Picture_Width,fd);
- }
-
- /* Cb */
- for (line=0; line<Chroma_Height; line++)
- {
- fread(frame[1]+(line*Chroma_Width),1,Chroma_Width,fd);
- }
-
- /* Cr */
- for (line=0; line<Chroma_Height; line++)
- {
- fread(frame[2]+(line*Chroma_Width),1,Chroma_Width,fd);
- }
-
-
- fclose(fd);
- return(0);
-}
-
-
-static void Copy_Frame(src, dst, width, height, parity, field_mode)
-unsigned char *src;
-unsigned char *dst;
-int width;
-int height;
-int parity; /* field parity (top or bottom) to overwrite */
-int field_mode; /* 0 = frame, 1 = field */
-{
- int row, col;
- int s, d;
- int incr;
-
- s = d = 0;
-
-#ifdef DEBUG
- printf("COPYING (w=%d, h=%d, parity=%d, field_mode=%d)\n",
- width,height,parity,field_mode);
-#endif /* DEBUG */
-
- if(field_mode)
- {
- incr = 2;
-
- if(parity==0)
- s += width;
- }
- else
- {
- incr = 1;
- }
-
- for(row=0; row<height; row+=incr)
- {
- for(col=0; col<width; col++)
- {
- dst[d+col] = src[s+col];
- }
-
- d += (width*incr);
- s += (width*incr);
- }
-
-}
-
Index: rel_1_2/mpeg2/spatscal.c
===================================================================
--- rel_1_2/mpeg2/spatscal.c (revision 1198)
+++ rel_1_2/mpeg2/spatscal.c (nonexistent)
@@ -1,331 +0,0 @@
-
-#include <stdio.h>
-#include "config.h"
-#include "global.h"
-
-/* private prototypes */
-static void Read_Lower_Layer_Component_Framewise _ANSI_ARGS_((int comp, int lw, int lh));
-static void Read_Lower_Layer_Component_Fieldwise _ANSI_ARGS_((int comp, int lw, int lh));
-static void Make_Spatial_Prediction_Frame _ANSI_ARGS_((int progressive_frame,
- int llprogressive_frame, unsigned char *fld0, unsigned char *fld1,
- short *tmp, unsigned char *dst, int llx0, int lly0, int llw, int llh,
- int horizontal_size, int vertical_size, int vm, int vn, int hm, int hn,
- int aperture));
-static void Deinterlace _ANSI_ARGS_((unsigned char *fld0, unsigned char *fld1,
- int j0, int lx, int ly, int aperture));
-static void Subsample_Vertical _ANSI_ARGS_((unsigned char *s, short *d,
- int lx, int lys, int lyd, int m, int n, int j0, int dj));
-static void Subsample_Horizontal _ANSI_ARGS_((short *s, unsigned char *d,
- int x0, int lx, int lxs, int lxd, int ly, int m, int n));
-
-
-
-/* get reference frame */
-void Spatial_Prediction()
-{
-
- if(Frame_Store_Flag)
- {
- Read_Lower_Layer_Component_Framewise(0,lower_layer_prediction_horizontal_size,
- lower_layer_prediction_vertical_size); /* Y */
- Read_Lower_Layer_Component_Framewise(1,lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1); /* Cb ("U") */
- Read_Lower_Layer_Component_Framewise(2,lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1); /* Cr ("V") */
- }
- else
- {
- Read_Lower_Layer_Component_Fieldwise(0,lower_layer_prediction_horizontal_size,
- lower_layer_prediction_vertical_size); /* Y */
- Read_Lower_Layer_Component_Fieldwise(1,lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1); /* Cb ("U") */
- Read_Lower_Layer_Component_Fieldwise(2,lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1); /* Cr ("V") */
- }
-
-
- Make_Spatial_Prediction_Frame /* Y */
- (progressive_frame,lower_layer_progressive_frame,llframe0[0],llframe1[0],
- lltmp,current_frame[0],lower_layer_horizontal_offset,
- lower_layer_vertical_offset,
- lower_layer_prediction_horizontal_size,
- lower_layer_prediction_vertical_size,
- horizontal_size,vertical_size,vertical_subsampling_factor_m,
- vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
- horizontal_subsampling_factor_n,
- picture_structure!=FRAME_PICTURE); /* this changed from CD to DIS */
-
- Make_Spatial_Prediction_Frame /* Cb */
- (progressive_frame,lower_layer_progressive_frame,llframe0[1],llframe1[1],
- lltmp,current_frame[1],lower_layer_horizontal_offset/2,
- lower_layer_vertical_offset/2,
- lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1,
- horizontal_size>>1,vertical_size>>1,vertical_subsampling_factor_m,
- vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
- horizontal_subsampling_factor_n,1);
-
- Make_Spatial_Prediction_Frame /* Cr */
- (progressive_frame,lower_layer_progressive_frame,llframe0[2],llframe1[2],
- lltmp,current_frame[2],lower_layer_horizontal_offset/2,
- lower_layer_vertical_offset/2,
- lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1,
- horizontal_size>>1,vertical_size>>1,vertical_subsampling_factor_m,
- vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
- horizontal_subsampling_factor_n,1);
-
-}
-
-static void Read_Lower_Layer_Component_Framewise(comp,lw,lh)
- int comp;
- int lw, lh;
-{
- FILE *fd;
- char fname[256];
- char ext[3][3] = {".Y",".U",".V"};
-/* char *ext = {".Y",".U",".V"}; */
- int i,j;
-
- sprintf(fname,Lower_Layer_Picture_Filename,True_Framenum);
- strcat(fname,ext[comp]);
-#ifdef VERBOSE
- if (Verbose_Flag>1)
- printf("reading %s\n",fname);
-#endif
- fd=fopen(fname,"rb");
- if (fd==NULL) sys_abort(-1); // PJ exit(-1);
- for (j=0; j<lh; j++) {
- for (i=0; i<lw; i++)
- llframe0[comp][lw*j+i]=getc(fd);
- if (! lower_layer_progressive_frame) {
- j++;
- for (i=0; i<lw; i++)
- llframe1[comp][lw*j+i]=getc(fd);
- }
- }
- fclose(fd);
-}
-
-
-static void Read_Lower_Layer_Component_Fieldwise(comp,lw,lh)
- int comp;
- int lw, lh;
-{
- FILE *fd;
- char fname[256];
- char ext[3][3] = {".Y",".U",".V"};
-/* char *ext = {".Y",".U",".V"}; */
- int i,j;
-
- sprintf(fname,Lower_Layer_Picture_Filename,True_Framenum,lower_layer_progressive_frame ? 'f':'a');
- strcat(fname,ext[comp]);
-#ifdef VERBOSE
- if (Verbose_Flag>1)
- printf("reading %s\n",fname);
-#endif
- fd=fopen(fname,"rb");
- if (fd==NULL) sys_abort(-1); // PJ exit(-1);
- for (j=0; j<lh; j+=lower_layer_progressive_frame?1:2)
- for (i=0; i<lw; i++)
- llframe0[comp][lw*j+i]=getc(fd);
- fclose(fd);
-
- if (! lower_layer_progressive_frame) {
- sprintf(fname,Lower_Layer_Picture_Filename,True_Framenum,'b');
- strcat(fname,ext[comp]);
-#ifdef VERBOSE
- if (Verbose_Flag>1)
- printf("reading %s\n",fname);
-#endif
- fd=fopen(fname,"rb");
- if (fd==NULL) sys_abort(-1); // PJ exit(-1);
- for (j=1; j<lh; j+=2)
- for (i=0; i<lw; i++)
- llframe1[comp][lw*j+i]=getc(fd);
- fclose(fd);
- }
-}
-
-
-/* form spatial prediction */
-static void Make_Spatial_Prediction_Frame(progressive_frame,
- llprogressive_frame,fld0,fld1,tmp,dst,llx0,lly0,llw,llh,horizontal_size,
- vertical_size,vm,vn,hm,hn,aperture)
-int progressive_frame,llprogressive_frame;
-unsigned char *fld0,*fld1;
-short *tmp;
-unsigned char *dst;
-int llx0,lly0,llw,llh,horizontal_size,vertical_size,vm,vn,hm,hn,aperture;
-{
- int w, h, x0, llw2, llh2;
-
- llw2 = (llw*hn)/hm;
- llh2 = (llh*vn)/vm;
-
- if (llprogressive_frame)
- {
- /* progressive -> progressive / interlaced */
- Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,1);
- }
- else if (progressive_frame)
- {
- /* interlaced -> progressive */
- if (lower_layer_deinterlaced_field_select)
- {
- Deinterlace(fld1,fld0,0,llw,llh,aperture);
- Subsample_Vertical(fld1,tmp,llw,llh,llh2,vm,vn,0,1);
- }
- else
- {
- Deinterlace(fld0,fld1,1,llw,llh,aperture);
- Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,1);
- }
- }
- else
- {
- /* interlaced -> interlaced */
- Deinterlace(fld0,fld1,1,llw,llh,aperture);
- Deinterlace(fld1,fld0,0,llw,llh,aperture);
- Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,2);
- Subsample_Vertical(fld1,tmp,llw,llh,llh2,vm,vn,1,2);
- }
-
- /* vertical limits */
- if (lly0<0)
- {
- tmp-= llw*lly0;
- llh2+= lly0;
- if (llh2<0)
- llh2 = 0;
- h = (vertical_size<llh2) ? vertical_size : llh2;
- }
- else
- {
- dst+= horizontal_size*lly0;
- h= vertical_size - lly0;
- if (h>llh2)
- h = llh2;
- }
-
- /* horizontal limits */
- if (llx0<0)
- {
- x0 = -llx0;
- llw2+= llx0;
- if (llw2<0)
- llw2 = 0;
- w = (horizontal_size<llw2) ? horizontal_size : llw2;
- }
- else
- {
- dst+= llx0;
- x0 = 0;
- w = horizontal_size - llx0;
- if (w>llw2)
- w = llw2;
- }
-
- Subsample_Horizontal(tmp,dst,x0,w,llw,horizontal_size,h,hm,hn);
-}
-
-/* deinterlace one field (interpolate opposite parity samples)
- *
- * deinterlacing is done in-place: if j0=1, fld0 contains the input field in
- * its even lines and the odd lines are interpolated by this routine
- * if j0=0, the input field is in the odd lines and the even lines are
- * interpolated
- *
- * fld0: field to be deinterlaced
- * fld1: other field (referenced by the two field aperture filter)
- * j0: 0: interpolate even (top) lines, 1: interpolate odd (bottom) lines
- * lx: width of fld0 and fld1
- * ly: height of the deinterlaced field (has to be even)
- * aperture: 1: use one field aperture filter (two field otherwise)
- */
-static void Deinterlace(fld0,fld1,j0,lx,ly,aperture)
-unsigned char *fld0,*fld1;
-int j0,lx,ly; /* ly has to be even */
-int aperture;
-{
- int i,j,v;
- unsigned char *p0, *p0m1, *p0p1, *p1, *p1m2, *p1p2;
-
- /* deinterlace one field */
- for (j=j0; j<ly; j+=2)
- {
- p0 = fld0+lx*j;
- p0m1 = (j==0) ? p0+lx : p0-lx;
- p0p1 = (j==ly-1) ? p0-lx : p0+lx;
-
- if (aperture)
- for (i=0; i<lx; i++)
- p0[i] = (unsigned int)(p0m1[i] + p0p1[i] + 1)>>1;
- else
- {
- p1 = fld1 + lx*j;
- p1m2 = (j<2) ? p1 : p1-2*lx;
- p1p2 = (j>=ly-2) ? p1 : p1+2*lx;
- for (i=0; i<lx; i++)
- {
- v = 8*(p0m1[i]+p0p1[i]) + 2*p1[i] - p1m2[i] - p1p2[i];
- p0[i] = Clip[(v + ((v>=0) ? 8 : 7))>>4];
- }
- }
- }
-}
-
-/* vertical resampling */
-static void Subsample_Vertical(s,d,lx,lys,lyd,m,n,j0,dj)
-unsigned char *s;
-short *d;
-int lx, lys, lyd, m, n, j0, dj;
-{
- int i, j, c1, c2, jd;
- unsigned char *s1, *s2;
- short *d1;
-
- for (j=j0; j<lyd; j+=dj)
- {
- d1 = d + lx*j;
- jd = (j*m)/n;
- s1 = s + lx*jd;
- s2 = (jd<lys-1)? s1+lx : s1;
- c2 = (16*((j*m)%n) + (n>>1))/n;
- c1 = 16 - c2;
- for (i=0; i<lx; i++)
- d1[i] = c1*s1[i] + c2*s2[i];
- }
-}
-
-/* horizontal resampling */
-static void Subsample_Horizontal(s,d,x0,lx,lxs,lxd,ly,m,n)
-short *s;
-unsigned char *d;
-int x0, lx, lxs, lxd, ly, m, n;
-{
- int i, i1, j, id, c1, c2, v;
- short *s1, *s2;
- unsigned char *d1;
-
- for (i1=0; i1<lx; i1++)
- {
- d1 = d + i1;
- i = x0 + i1;
- id = (i*m)/n;
- s1 = s+id;
- s2 = (id<lxs-1) ? s1+1 : s1;
- c2 = (16*((i*m)%n) + (n>>1))/n;
- c1 = 16 - c2;
- for (j=0; j<ly; j++)
- {
- v = c1*(*s1) + c2*(*s2);
- *d1 = (v + ((v>=0) ? 128 : 127))>>8;
- d1+= lxd;
- s1+= lxs;
- s2+= lxs;
- }
- }
-}
-
-
Index: rel_1_2/mpeg2/readme
===================================================================
--- rel_1_2/mpeg2/readme (revision 1198)
+++ rel_1_2/mpeg2/readme (nonexistent)
@@ -1,72 +0,0 @@
-This is the S.Ha.R.K. porting of the MPEG2 decoder from the
-MPEG Software Simulation Group.
-
----------------------------------------------------------------------------
-
-The original source code is available on the web at
-http://www.mpeg.org
-
-The demo uses the FAT16 filesystem and the graphics card.
-I just added these files:
-- gvideo.c Video initialization and output
-- jetctrl.c Idle time visualization
-- makefile S.Ha.R.K. Makefile for the demo
-- store.c interface between the original decoder and S.Ha.R.K.
-
-The original makefile and store.c files has also been renamed to store.ori.
-
----------------------------------------------------------------------------
-
-The demo simply intercets the Write_Frame function and puts the decoded
-frame into a buffer. The task created in gvideo is a periodic CBS task
-that reads a picture from the buffer and simply displays it.
-
-===========================================================================
-
-This is the original readme file:
-
-
-January 9, 1995:
-=====
-Pre-release caveats:
-
- - has only been tested with gcc. (I'm not sure we will even bother
- with acc, or cc in the future).
-
- - I'm fully aware of the warnings received by -Wall
-
- - Verifier still not integrated (due to complexity), although
- experimental vbv_delay code included in verify.c
-
-
-
-December 20, 1995
-===============================================================
-Frame buffer substitution edition of decoder.
-
-Restrictions:
- - temporal_reference in bitstream must be correct.
-
- - substitute pictures must have pixel (luminance samples) width
- and height equal to coded_picture_width (mb_width*16) and
- coded_picture_height (mb_height*16) rather than horizontal_size
- and vertical_size, respectively.
-
- - all input pictures must be interleaved into a frame.
-
- - frame count (index) is based on absolute display frame order with
- no repeated (3:2 pulldown) fields or frames.
-
---------------------------------------------------------
-Notes:
-
- - command line arguements in this edition differ from verifier
- style. This decoder's arguments are the same as the
- public distribution's (July 4, 1994) code .
-
- please note that this code, with frame buffer substitution, when it
- is released will use the verifier style of arguments.
-
- - Carsten's updated spatial scalability decoder routines have been
- incorperated.
-
Index: rel_1_2/mpeg2/gvideo.c
===================================================================
--- rel_1_2/mpeg2/gvideo.c (revision 1198)
+++ rel_1_2/mpeg2/gvideo.c (nonexistent)
@@ -1,157 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: gvideo.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1.1.1 $
- * Last update: $Date: 2002-09-02 09:37:45 $
- */
-
-//#include "config.h"
-
-#include <kernel/func.h>
-#include <kernel/model.h>
-#include <kernel/const.h>
-
-#include <drivers/glib.h>
-
-#include <stdlib.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-
-#include "config.h"
-#include "global.h"
-
-#define COLORFG rgb16(255,255,255)
-#define COLORBG rgb16(0,0,0)
-
-#define SP rgb16(0,128,0)
-#define FG rgb16(255,255,255)
-#define BG rgb16(0,0,0)
-
-/* border size (pixels) */
-#define BO 4
-
-
-//#define NOGRX
-
-/*
- *
- */
-
-
-void draw_frame(int x, int y, int dx, int dy)
-{
-#ifndef NOGRX
- grx_box(x-1-BO,y-1-BO,x+dx+BO,y+dy+BO,SP);
- grx_rect(x-1-BO,y-1-BO,x+dx+BO,y+dy+BO,FG);
- grx_box(x,y,x+dx-1,y+dy-1,BG);
- grx_rect(x-1,y-1,x+dx,y+dy,FG);
-#endif
-}
-
-static TASK play(void *arg)
-{
- int x1,y1,x2,y2;
- int moreframes;
- struct framebuf_struct *fbuf;
-
- x1=1;
- y1=1;
- x2=x1+Coded_Picture_Width-1;
- y2=y1+Coded_Picture_Height-1;
-
- moreframes=1;
- task_nopreempt();
-
- while (moreframes) {
- fbuf = remove_frame();
-#ifndef NOGRX
- // grxlock();
-// grx_rect(10,10,10+5*fbuf->n,10+5*fbuf->n,FG);
- grx_putimage(x1, y1, x2, y2, fbuf->f);
- // grxunlock();
-#else
- cprintf("(%d %d)\n",fbuf->n, fbuf->f);
-#endif
- give_back_framebuf(fbuf);
- task_endcycle();
- }
-
- return NULL;
-}
-
-void gvideo_init(void)
-{
- SOFT_TASK_MODEL model;
- PID pid;
- int period,wcet;
-
-#ifndef NOGRX
- grx_init();
- grx_setmode(grx_getmode(800, 600, 16));
-#endif
-
- // draw_frame(0, 0, CodedImageWidth,CodedImageHeight);
-
- srand(7);
-
- period=1000000/20;
- wcet=20000;
-
- soft_task_default_model(model);
- soft_task_def_met(model,wcet);
- soft_task_def_wcet(model,wcet);
- soft_task_def_period(model,period);
- soft_task_def_periodic(model);
- soft_task_def_ctrl_jet(model);
-
- pid=task_create("Video",play,&model,NULL);
- if (pid!=-1) task_activate(pid);
-}
-
-
-
-
-
-
-
-
Index: rel_1_2/mpeg2/gethdr.c
===================================================================
--- rel_1_2/mpeg2/gethdr.c (revision 1198)
+++ rel_1_2/mpeg2/gethdr.c (nonexistent)
@@ -1,1077 +0,0 @@
-/* gethdr.c, header decoding */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-
-#include "config.h"
-#include "global.h"
-
-
-/* private prototypes */
-static void sequence_header _ANSI_ARGS_((void));
-static void group_of_pictures_header _ANSI_ARGS_((void));
-static void picture_header _ANSI_ARGS_((void));
-static void extension_and_user_data _ANSI_ARGS_((void));
-static void sequence_extension _ANSI_ARGS_((void));
-static void sequence_display_extension _ANSI_ARGS_((void));
-static void quant_matrix_extension _ANSI_ARGS_((void));
-static void sequence_scalable_extension _ANSI_ARGS_((void));
-static void picture_display_extension _ANSI_ARGS_((void));
-static void picture_coding_extension _ANSI_ARGS_((void));
-static void picture_spatial_scalable_extension _ANSI_ARGS_((void));
-static void picture_temporal_scalable_extension _ANSI_ARGS_((void));
-static int extra_bit_information _ANSI_ARGS_((void));
-static void copyright_extension _ANSI_ARGS_((void));
-static void user_data _ANSI_ARGS_((void));
-static void user_data _ANSI_ARGS_((void));
-
-
-
-
-/* introduced in September 1995 to assist spatial scalable decoding */
-static void Update_Temporal_Reference_Tacking_Data _ANSI_ARGS_((void));
-/* private variables */
-static int Temporal_Reference_Base = 0;
-static int True_Framenum_max = -1;
-static int Temporal_Reference_GOP_Reset = 0;
-
-#define RESERVED -1
-static double frame_rate_Table[16] =
-{
- 0.0,
- ((23.0*1000.0)/1001.0),
- 24.0,
- 25.0,
- ((30.0*1000.0)/1001.0),
- 30.0,
- 50.0,
- ((60.0*1000.0)/1001.0),
- 60.0,
-
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED
-};
-
-/*
- * decode headers from one input stream
- * until an End of Sequence or picture start code
- * is found
- */
-int Get_Hdr()
-{
- unsigned int code;
-
- for (;;)
- {
- /* look for next_start_code */
- next_start_code();
- code = Get_Bits32();
-
- switch (code)
- {
- case SEQUENCE_HEADER_CODE:
- sequence_header();
- break;
- case GROUP_START_CODE:
- group_of_pictures_header();
- break;
- case PICTURE_START_CODE:
- picture_header();
- return 1;
- break;
- case SEQUENCE_END_CODE:
- return 0;
- break;
- default:
- if (!Quiet_Flag)
- fprintf(stderr,"Unexpected next_start_code %08x (ignored)\n",code);
- break;
- }
- }
-}
-
-
-/* align to start of next next_start_code */
-
-void next_start_code()
-{
- /* byte align */
- Flush_Buffer(ld->Incnt&7);
- while (Show_Bits(24)!=0x01L)
- Flush_Buffer(8);
-}
-
-
-/* decode sequence header */
-
-static void sequence_header()
-{
- int i;
- int pos;
-
- pos = ld->Bitcnt;
- horizontal_size = Get_Bits(12);
- vertical_size = Get_Bits(12);
- aspect_ratio_information = Get_Bits(4);
- frame_rate_code = Get_Bits(4);
- bit_rate_value = Get_Bits(18);
- marker_bit("sequence_header()");
- vbv_buffer_size = Get_Bits(10);
- constrained_parameters_flag = Get_Bits(1);
-
- if((ld->load_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
- else
- {
- for (i=0; i<64; i++)
- ld->intra_quantizer_matrix[i] = default_intra_quantizer_matrix[i];
- }
-
- if((ld->load_non_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
- else
- {
- for (i=0; i<64; i++)
- ld->non_intra_quantizer_matrix[i] = 16;
- }
-
- /* copy luminance to chrominance matrices */
- for (i=0; i<64; i++)
- {
- ld->chroma_intra_quantizer_matrix[i] =
- ld->intra_quantizer_matrix[i];
-
- ld->chroma_non_intra_quantizer_matrix[i] =
- ld->non_intra_quantizer_matrix[i];
- }
-
-#ifdef VERBOSE
- if (Verbose_Flag > NO_LAYER)
- {
- printf("sequence header (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag > SEQUENCE_LAYER)
- {
- printf(" horizontal_size=%d\n",horizontal_size);
- printf(" vertical_size=%d\n",vertical_size);
- printf(" aspect_ratio_information=%d\n",aspect_ratio_information);
- printf(" frame_rate_code=%d",frame_rate_code);
- printf(" bit_rate_value=%d\n",bit_rate_value);
- printf(" vbv_buffer_size=%d\n",vbv_buffer_size);
- printf(" constrained_parameters_flag=%d\n",constrained_parameters_flag);
- printf(" load_intra_quantizer_matrix=%d\n",ld->load_intra_quantizer_matrix);
- printf(" load_non_intra_quantizer_matrix=%d\n",ld->load_non_intra_quantizer_matrix);
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_sequence_header++;
-#endif /* VERIFY */
-
- extension_and_user_data();
-}
-
-
-
-/* decode group of pictures header */
-/* ISO/IEC 13818-2 section 6.2.2.6 */
-static void group_of_pictures_header()
-{
- int pos;
-
- if (ld == &base)
- {
- Temporal_Reference_Base = True_Framenum_max + 1; /* *CH* */
- Temporal_Reference_GOP_Reset = 1;
- }
- pos = ld->Bitcnt;
- drop_flag = Get_Bits(1);
- hour = Get_Bits(5);
- minute = Get_Bits(6);
- marker_bit("group_of_pictures_header()");
- sec = Get_Bits(6);
- frame = Get_Bits(6);
- closed_gop = Get_Bits(1);
- broken_link = Get_Bits(1);
-
-#ifdef VERBOSE
- if (Verbose_Flag > NO_LAYER)
- {
- printf("group of pictures (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag > SEQUENCE_LAYER)
- {
- printf(" drop_flag=%d\n",drop_flag);
- printf(" timecode %d:%02d:%02d:%02d\n",hour,minute,sec,frame);
- printf(" closed_gop=%d\n",closed_gop);
- printf(" broken_link=%d\n",broken_link);
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_group_of_pictures_header++;
-#endif /* VERIFY */
-
- extension_and_user_data();
-
-}
-
-
-/* decode picture header */
-
-/* ISO/IEC 13818-2 section 6.2.3 */
-static void picture_header()
-{
- int pos;
- int Extra_Information_Byte_Count;
-
- /* unless later overwritten by picture_spatial_scalable_extension() */
- ld->pict_scal = 0;
-
- pos = ld->Bitcnt;
- temporal_reference = Get_Bits(10);
- picture_coding_type = Get_Bits(3);
- vbv_delay = Get_Bits(16);
-
- if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
- {
- full_pel_forward_vector = Get_Bits(1);
- forward_f_code = Get_Bits(3);
- }
- if (picture_coding_type==B_TYPE)
- {
- full_pel_backward_vector = Get_Bits(1);
- backward_f_code = Get_Bits(3);
- }
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("picture header (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" temporal_reference=%d\n",temporal_reference);
- printf(" picture_coding_type=%d\n",picture_coding_type);
- printf(" vbv_delay=%d\n",vbv_delay);
- if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
- {
- printf(" full_pel_forward_vector=%d\n",full_pel_forward_vector);
- printf(" forward_f_code =%d\n",forward_f_code);
- }
- if (picture_coding_type==B_TYPE)
- {
- printf(" full_pel_backward_vector=%d\n",full_pel_backward_vector);
- printf(" backward_f_code =%d\n",backward_f_code);
- }
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_picture_header++;
-#endif /* VERIFY */
-
- Extra_Information_Byte_Count =
- extra_bit_information();
-
- extension_and_user_data();
-
- /* update tracking information used to assist spatial scalability */
- Update_Temporal_Reference_Tacking_Data();
-}
-
-/* decode slice header */
-
-/* ISO/IEC 13818-2 section 6.2.4 */
-int slice_header()
-{
- int slice_vertical_position_extension;
- int quantizer_scale_code;
- int pos;
- int slice_picture_id_enable = 0;
- int slice_picture_id = 0;
- int extra_information_slice = 0;
-
- pos = ld->Bitcnt;
-
- slice_vertical_position_extension =
- (ld->MPEG2_Flag && vertical_size>2800) ? Get_Bits(3) : 0;
-
- if (ld->scalable_mode==SC_DP)
- ld->priority_breakpoint = Get_Bits(7);
-
- quantizer_scale_code = Get_Bits(5);
- ld->quantizer_scale =
- ld->MPEG2_Flag ? (ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1) : quantizer_scale_code;
-
- /* slice_id introduced in March 1995 as part of the video corridendum
- (after the IS was drafted in November 1994) */
- if (Get_Bits(1))
- {
- ld->intra_slice = Get_Bits(1);
-
- slice_picture_id_enable = Get_Bits(1);
- slice_picture_id = Get_Bits(6);
-
- extra_information_slice = extra_bit_information();
- }
- else
- ld->intra_slice = 0;
-
-#ifdef VERBOSE
- if (Verbose_Flag>PICTURE_LAYER)
- {
- printf("slice header (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SLICE_LAYER)
- {
- if (ld->MPEG2_Flag && vertical_size>2800)
- printf(" slice_vertical_position_extension=%d\n",slice_vertical_position_extension);
-
- if (ld->scalable_mode==SC_DP)
- printf(" priority_breakpoint=%d\n",ld->priority_breakpoint);
-
- printf(" quantizer_scale_code=%d\n",quantizer_scale_code);
-
- printf(" slice_picture_id_enable = %d\n", slice_picture_id_enable);
-
- if(slice_picture_id_enable)
- printf(" slice_picture_id = %d\n", slice_picture_id);
-
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_slice_header++;
-#endif /* VERIFY */
-
-
- return slice_vertical_position_extension;
-}
-
-
-/* decode extension and user data */
-/* ISO/IEC 13818-2 section 6.2.2.2 */
-static void extension_and_user_data()
-{
- int code,ext_ID;
-
- next_start_code();
-
- while ((code = Show_Bits(32))==EXTENSION_START_CODE || code==USER_DATA_START_CODE)
- {
- if (code==EXTENSION_START_CODE)
- {
- Flush_Buffer32();
- ext_ID = Get_Bits(4);
- switch (ext_ID)
- {
- case SEQUENCE_EXTENSION_ID:
- sequence_extension();
- break;
- case SEQUENCE_DISPLAY_EXTENSION_ID:
- sequence_display_extension();
- break;
- case QUANT_MATRIX_EXTENSION_ID:
- quant_matrix_extension();
- break;
- case SEQUENCE_SCALABLE_EXTENSION_ID:
- sequence_scalable_extension();
- break;
- case PICTURE_DISPLAY_EXTENSION_ID:
- picture_display_extension();
- break;
- case PICTURE_CODING_EXTENSION_ID:
- picture_coding_extension();
- break;
- case PICTURE_SPATIAL_SCALABLE_EXTENSION_ID:
- picture_spatial_scalable_extension();
- break;
- case PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID:
- picture_temporal_scalable_extension();
- break;
- case COPYRIGHT_EXTENSION_ID:
- copyright_extension();
- break;
- default:
- fprintf(stderr,"reserved extension start code ID %d\n",ext_ID);
- break;
- }
- next_start_code();
- }
- else
- {
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- printf("user data\n");
-#endif /* VERBOSE */
- Flush_Buffer32();
- user_data();
- }
- }
-}
-
-
-/* decode sequence extension */
-
-/* ISO/IEC 13818-2 section 6.2.2.3 */
-static void sequence_extension()
-{
- int horizontal_size_extension;
- int vertical_size_extension;
- int bit_rate_extension;
- int vbv_buffer_size_extension;
- int pos;
-
- /* derive bit position for trace */
-#ifdef VERBOSE
- pos = ld->Bitcnt;
-#endif
-
- ld->MPEG2_Flag = 1;
-
- ld->scalable_mode = SC_NONE; /* unless overwritten by sequence_scalable_extension() */
- layer_id = 0; /* unless overwritten by sequence_scalable_extension() */
-
- profile_and_level_indication = Get_Bits(8);
- progressive_sequence = Get_Bits(1);
- chroma_format = Get_Bits(2);
- horizontal_size_extension = Get_Bits(2);
- vertical_size_extension = Get_Bits(2);
- bit_rate_extension = Get_Bits(12);
- marker_bit("sequence_extension");
- vbv_buffer_size_extension = Get_Bits(8);
- low_delay = Get_Bits(1);
- frame_rate_extension_n = Get_Bits(2);
- frame_rate_extension_d = Get_Bits(5);
-
- frame_rate = frame_rate_Table[frame_rate_code] *
- ((frame_rate_extension_n+1)/(frame_rate_extension_d+1));
-
- /* special case for 422 profile & level must be made */
- if((profile_and_level_indication>>7) & 1)
- { /* escape bit of profile_and_level_indication set */
-
- /* 4:2:2 Profile @ Main Level */
- if((profile_and_level_indication&15)==5)
- {
- profile = PROFILE_422;
- level = MAIN_LEVEL;
- }
- }
- else
- {
- profile = profile_and_level_indication >> 4; /* Profile is upper nibble */
- level = profile_and_level_indication & 0xF; /* Level is lower nibble */
- }
-
-
- horizontal_size = (horizontal_size_extension<<12) | (horizontal_size&0x0fff);
- vertical_size = (vertical_size_extension<<12) | (vertical_size&0x0fff);
-
-
- /* ISO/IEC 13818-2 does not define bit_rate_value to be composed of
- * both the original bit_rate_value parsed in sequence_header() and
- * the optional bit_rate_extension in sequence_extension_header().
- * However, we use it for bitstream verification purposes.
- */
-
- bit_rate_value += (bit_rate_extension << 18);
- bit_rate = ((double) bit_rate_value) * 400.0;
- vbv_buffer_size += (vbv_buffer_size_extension << 10);
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("sequence extension (byte %d)\n",(pos>>3)-4);
-
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" profile_and_level_indication=%d\n",profile_and_level_indication);
-
- if (profile_and_level_indication<128)
- {
- printf(" profile=%d, level=%d\n",profile,level);
- }
-
- printf(" progressive_sequence=%d\n",progressive_sequence);
- printf(" chroma_format=%d\n",chroma_format);
- printf(" horizontal_size_extension=%d\n",horizontal_size_extension);
- printf(" vertical_size_extension=%d\n",vertical_size_extension);
- printf(" bit_rate_extension=%d\n",bit_rate_extension);
- printf(" vbv_buffer_size_extension=%d\n",vbv_buffer_size_extension);
- printf(" low_delay=%d\n",low_delay);
- printf(" frame_rate_extension_n=%d\n",frame_rate_extension_n);
- printf(" frame_rate_extension_d=%d\n",frame_rate_extension_d);
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_sequence_extension++;
-#endif /* VERIFY */
-
-
-}
-
-
-/* decode sequence display extension */
-
-static void sequence_display_extension()
-{
- int pos;
-
- pos = ld->Bitcnt;
- video_format = Get_Bits(3);
- color_description = Get_Bits(1);
-
- if (color_description)
- {
- color_primaries = Get_Bits(8);
- transfer_characteristics = Get_Bits(8);
- matrix_coefficients = Get_Bits(8);
- }
-
- display_horizontal_size = Get_Bits(14);
- marker_bit("sequence_display_extension");
- display_vertical_size = Get_Bits(14);
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("sequence display extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
-
- printf(" video_format=%d\n",video_format);
- printf(" color_description=%d\n",color_description);
-
- if (color_description)
- {
- printf(" color_primaries=%d\n",color_primaries);
- printf(" transfer_characteristics=%d\n",transfer_characteristics);
- printf(" matrix_coefficients=%d\n",matrix_coefficients);
- }
- printf(" display_horizontal_size=%d\n",display_horizontal_size);
- printf(" display_vertical_size=%d\n",display_vertical_size);
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_sequence_display_extension++;
-#endif /* VERIFY */
-
-}
-
-
-/* decode quant matrix entension */
-/* ISO/IEC 13818-2 section 6.2.3.2 */
-static void quant_matrix_extension()
-{
- int i;
- int pos;
-
- pos = ld->Bitcnt;
-
- if((ld->load_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- {
- ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = Get_Bits(8);
- }
- }
-
- if((ld->load_non_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- {
- ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = Get_Bits(8);
- }
- }
-
- if((ld->load_chroma_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
-
- if((ld->load_chroma_non_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("quant matrix extension (byte %d)\n",(pos>>3)-4);
- printf(" load_intra_quantizer_matrix=%d\n",
- ld->load_intra_quantizer_matrix);
- printf(" load_non_intra_quantizer_matrix=%d\n",
- ld->load_non_intra_quantizer_matrix);
- printf(" load_chroma_intra_quantizer_matrix=%d\n",
- ld->load_chroma_intra_quantizer_matrix);
- printf(" load_chroma_non_intra_quantizer_matrix=%d\n",
- ld->load_chroma_non_intra_quantizer_matrix);
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_quant_matrix_extension++;
-#endif /* VERIFY */
-
-}
-
-
-/* decode sequence scalable extension */
-/* ISO/IEC 13818-2 section 6.2.2.5 */
-static void sequence_scalable_extension()
-{
- int pos;
-
- pos = ld->Bitcnt;
-
- /* values (without the +1 offset) of scalable_mode are defined in
- Table 6-10 of ISO/IEC 13818-2 */
- ld->scalable_mode = Get_Bits(2) + 1; /* add 1 to make SC_DP != SC_NONE */
-
- layer_id = Get_Bits(4);
-
- if (ld->scalable_mode==SC_SPAT)
- {
- lower_layer_prediction_horizontal_size = Get_Bits(14);
- marker_bit("sequence_scalable_extension()");
- lower_layer_prediction_vertical_size = Get_Bits(14);
- horizontal_subsampling_factor_m = Get_Bits(5);
- horizontal_subsampling_factor_n = Get_Bits(5);
- vertical_subsampling_factor_m = Get_Bits(5);
- vertical_subsampling_factor_n = Get_Bits(5);
- }
-
- if (ld->scalable_mode==SC_TEMP)
- Error("temporal scalability not implemented\n");
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("sequence scalable extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" scalable_mode=%d\n",ld->scalable_mode-1);
- printf(" layer_id=%d\n",layer_id);
- if (ld->scalable_mode==SC_SPAT)
- {
- printf(" lower_layer_prediction_horiontal_size=%d\n",
- lower_layer_prediction_horizontal_size);
- printf(" lower_layer_prediction_vertical_size=%d\n",
- lower_layer_prediction_vertical_size);
- printf(" horizontal_subsampling_factor_m=%d\n",
- horizontal_subsampling_factor_m);
- printf(" horizontal_subsampling_factor_n=%d\n",
- horizontal_subsampling_factor_n);
- printf(" vertical_subsampling_factor_m=%d\n",
- vertical_subsampling_factor_m);
- printf(" vertical_subsampling_factor_n=%d\n",
- vertical_subsampling_factor_n);
- }
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_sequence_scalable_extension++;
-#endif /* VERIFY */
-
-}
-
-
-/* decode picture display extension */
-/* ISO/IEC 13818-2 section 6.2.3.3. */
-static void picture_display_extension()
-{
- int i;
- int number_of_frame_center_offsets;
- int pos;
-
- pos = ld->Bitcnt;
- /* based on ISO/IEC 13818-2 section 6.3.12
- (November 1994) Picture display extensions */
-
- /* derive number_of_frame_center_offsets */
- if(progressive_sequence)
- {
- if(repeat_first_field)
- {
- if(top_field_first)
- number_of_frame_center_offsets = 3;
- else
- number_of_frame_center_offsets = 2;
- }
- else
- {
- number_of_frame_center_offsets = 1;
- }
- }
- else
- {
- if(picture_structure!=FRAME_PICTURE)
- {
- number_of_frame_center_offsets = 1;
- }
- else
- {
- if(repeat_first_field)
- number_of_frame_center_offsets = 3;
- else
- number_of_frame_center_offsets = 2;
- }
- }
-
-
- /* now parse */
- for (i=0; i<number_of_frame_center_offsets; i++)
- {
- frame_center_horizontal_offset[i] = Get_Bits(16);
- marker_bit("picture_display_extension, first marker bit");
-
- frame_center_vertical_offset[i] = Get_Bits(16);
- marker_bit("picture_display_extension, second marker bit");
- }
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("picture display extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
-
- for (i=0; i<number_of_frame_center_offsets; i++)
- {
- printf(" frame_center_horizontal_offset[%d]=%d\n",i,
- frame_center_horizontal_offset[i]);
- printf(" frame_center_vertical_offset[%d]=%d\n",i,
- frame_center_vertical_offset[i]);
- }
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_picture_display_extension++;
-#endif /* VERIFY */
-
-}
-
-
-/* decode picture coding extension */
-static void picture_coding_extension()
-{
- int pos;
-
- pos = ld->Bitcnt;
-
- f_code[0][0] = Get_Bits(4);
- f_code[0][1] = Get_Bits(4);
- f_code[1][0] = Get_Bits(4);
- f_code[1][1] = Get_Bits(4);
-
- intra_dc_precision = Get_Bits(2);
- picture_structure = Get_Bits(2);
- top_field_first = Get_Bits(1);
- frame_pred_frame_dct = Get_Bits(1);
- concealment_motion_vectors = Get_Bits(1);
- ld->q_scale_type = Get_Bits(1);
- intra_vlc_format = Get_Bits(1);
- ld->alternate_scan = Get_Bits(1);
- repeat_first_field = Get_Bits(1);
- chroma_420_type = Get_Bits(1);
- progressive_frame = Get_Bits(1);
- composite_display_flag = Get_Bits(1);
-
- if (composite_display_flag)
- {
- v_axis = Get_Bits(1);
- field_sequence = Get_Bits(3);
- sub_carrier = Get_Bits(1);
- burst_amplitude = Get_Bits(7);
- sub_carrier_phase = Get_Bits(8);
- }
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("picture coding extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" forward horizontal f_code=%d\n", f_code[0][0]);
- printf(" forward vertical f_code=%d\n", f_code[0][1]);
- printf(" backward horizontal f_code=%d\n", f_code[1][0]);
- printf(" backward_vertical f_code=%d\n", f_code[1][1]);
- printf(" intra_dc_precision=%d\n",intra_dc_precision);
- printf(" picture_structure=%d\n",picture_structure);
- printf(" top_field_first=%d\n",top_field_first);
- printf(" frame_pred_frame_dct=%d\n",frame_pred_frame_dct);
- printf(" concealment_motion_vectors=%d\n",concealment_motion_vectors);
- printf(" q_scale_type=%d\n",ld->q_scale_type);
- printf(" intra_vlc_format=%d\n",intra_vlc_format);
- printf(" alternate_scan=%d\n",ld->alternate_scan);
- printf(" repeat_first_field=%d\n",repeat_first_field);
- printf(" chroma_420_type=%d\n",chroma_420_type);
- printf(" progressive_frame=%d\n",progressive_frame);
- printf(" composite_display_flag=%d\n",composite_display_flag);
-
- if (composite_display_flag)
- {
- printf(" v_axis=%d\n",v_axis);
- printf(" field_sequence=%d\n",field_sequence);
- printf(" sub_carrier=%d\n",sub_carrier);
- printf(" burst_amplitude=%d\n",burst_amplitude);
- printf(" sub_carrier_phase=%d\n",sub_carrier_phase);
- }
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_picture_coding_extension++;
-#endif /* VERIFY */
-}
-
-
-/* decode picture spatial scalable extension */
-/* ISO/IEC 13818-2 section 6.2.3.5. */
-static void picture_spatial_scalable_extension()
-{
- int pos;
-
- pos = ld->Bitcnt;
-
- ld->pict_scal = 1; /* use spatial scalability in this picture */
-
- lower_layer_temporal_reference = Get_Bits(10);
- marker_bit("picture_spatial_scalable_extension(), first marker bit");
- lower_layer_horizontal_offset = Get_Bits(15);
- if (lower_layer_horizontal_offset>=16384)
- lower_layer_horizontal_offset-= 32768;
- marker_bit("picture_spatial_scalable_extension(), second marker bit");
- lower_layer_vertical_offset = Get_Bits(15);
- if (lower_layer_vertical_offset>=16384)
- lower_layer_vertical_offset-= 32768;
- spatial_temporal_weight_code_table_index = Get_Bits(2);
- lower_layer_progressive_frame = Get_Bits(1);
- lower_layer_deinterlaced_field_select = Get_Bits(1);
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("picture spatial scalable extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" lower_layer_temporal_reference=%d\n",lower_layer_temporal_reference);
- printf(" lower_layer_horizontal_offset=%d\n",lower_layer_horizontal_offset);
- printf(" lower_layer_vertical_offset=%d\n",lower_layer_vertical_offset);
- printf(" spatial_temporal_weight_code_table_index=%d\n",
- spatial_temporal_weight_code_table_index);
- printf(" lower_layer_progressive_frame=%d\n",lower_layer_progressive_frame);
- printf(" lower_layer_deinterlaced_field_select=%d\n",lower_layer_deinterlaced_field_select);
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_picture_spatial_scalable_extension++;
-#endif /* VERIFY */
-
-}
-
-
-/* decode picture temporal scalable extension
- *
- * not implemented
- */
-/* ISO/IEC 13818-2 section 6.2.3.4. */
-static void picture_temporal_scalable_extension()
-{
- Error("temporal scalability not supported\n");
-
-#ifdef VERIFY
- verify_picture_temporal_scalable_extension++;
-#endif /* VERIFY */
-}
-
-
-/* decode extra bit information */
-/* ISO/IEC 13818-2 section 6.2.3.4. */
-static int extra_bit_information()
-{
- int Byte_Count = 0;
-
- while (Get_Bits1())
- {
- Flush_Buffer(8);
- Byte_Count++;
- }
-
- return(Byte_Count);
-}
-
-
-
-/* ISO/IEC 13818-2 section 5.3 */
-/* Purpose: this function is mainly designed to aid in bitstream conformance
- testing. A simple Flush_Buffer(1) would do */
-void marker_bit(text)
-char *text;
-{
- int marker;
-
- marker = Get_Bits(1);
-
-#ifdef VERIFY
- if(!marker)
- printf("ERROR: %s--marker_bit set to 0",text);
-#endif
-}
-
-
-/* ISO/IEC 13818-2 sections 6.3.4.1 and 6.2.2.2.2 */
-static void user_data()
-{
- /* skip ahead to the next start code */
- next_start_code();
-}
-
-
-
-/* Copyright extension */
-/* ISO/IEC 13818-2 section 6.2.3.6. */
-/* (header added in November, 1994 to the IS document) */
-
-
-static void copyright_extension()
-{
- int pos;
- int reserved_data;
-
- pos = ld->Bitcnt;
-
-
- copyright_flag = Get_Bits(1);
- copyright_identifier = Get_Bits(8);
- original_or_copy = Get_Bits(1);
-
- /* reserved */
- reserved_data = Get_Bits(7);
-
- marker_bit("copyright_extension(), first marker bit");
- copyright_number_1 = Get_Bits(20);
- marker_bit("copyright_extension(), second marker bit");
- copyright_number_2 = Get_Bits(22);
- marker_bit("copyright_extension(), third marker bit");
- copyright_number_3 = Get_Bits(22);
-
- if(Verbose_Flag>NO_LAYER)
- {
- printf("copyright_extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" copyright_flag =%d\n",copyright_flag);
-
- printf(" copyright_identifier=%d\n",copyright_identifier);
-
- printf(" original_or_copy = %d (original=1, copy=0)\n",
- original_or_copy);
-
- printf(" copyright_number_1=%d\n",copyright_number_1);
- printf(" copyright_number_2=%d\n",copyright_number_2);
- printf(" copyright_number_3=%d\n",copyright_number_3);
- }
- }
-
-#ifdef VERIFY
- verify_copyright_extension++;
-#endif /* VERIFY */
-}
-
-
-
-/* introduced in September 1995 to assist Spatial Scalability */
-static void Update_Temporal_Reference_Tacking_Data()
-{
- static int temporal_reference_wrap = 0;
- static int temporal_reference_old = 0;
-
- if (ld == &base) /* *CH* */
- {
- if (picture_coding_type!=B_TYPE && temporal_reference!=temporal_reference_old)
- /* check first field of */
- {
- /* non-B-frame */
- if (temporal_reference_wrap)
- {/* wrap occured at previous I- or P-frame */
- /* now all intervening B-frames which could
- still have high temporal_reference values are done */
- Temporal_Reference_Base += 1024;
- temporal_reference_wrap = 0;
- }
-
- /* distinguish from a reset */
- if (temporal_reference<temporal_reference_old && !Temporal_Reference_GOP_Reset)
- temporal_reference_wrap = 1; /* we must have just passed a GOP-Header! */
-
- temporal_reference_old = temporal_reference;
- Temporal_Reference_GOP_Reset = 0;
- }
-
- True_Framenum = Temporal_Reference_Base + temporal_reference;
-
- /* temporary wrap of TR at 1024 for M frames */
- if (temporal_reference_wrap && temporal_reference <= temporal_reference_old)
- True_Framenum += 1024;
-
- True_Framenum_max = (True_Framenum > True_Framenum_max) ?
- True_Framenum : True_Framenum_max;
- }
-}
Index: rel_1_2/mpeg2/m.bat
===================================================================
--- rel_1_2/mpeg2/m.bat (revision 1198)
+++ rel_1_2/mpeg2/m.bat (nonexistent)
@@ -1 +0,0 @@
-x mpeg2dec -b /shark/mpeg2/m.m2v
Index: rel_1_2/mpeg2/idct.c
===================================================================
--- rel_1_2/mpeg2/idct.c (revision 1198)
+++ rel_1_2/mpeg2/idct.c (nonexistent)
@@ -1,211 +0,0 @@
-/* idct.c, inverse fast discrete cosine transform */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-/**********************************************************/
-/* inverse two dimensional DCT, Chen-Wang algorithm */
-/* (cf. IEEE ASSP-32, pp. 803-816, Aug. 1984) */
-/* 32-bit integer arithmetic (8 bit coefficients) */
-/* 11 mults, 29 adds per DCT */
-/* sE, 18.8.91 */
-/**********************************************************/
-/* coefficients extended to 12 bit for IEEE1180-1990 */
-/* compliance sE, 2.1.94 */
-/**********************************************************/
-
-/* this code assumes >> to be a two's-complement arithmetic */
-/* right shift: (-2)>>1 == -1 , (-3)>>1 == -2 */
-
-#include "config.h"
-
-#define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */
-#define W2 2676 /* 2048*sqrt(2)*cos(2*pi/16) */
-#define W3 2408 /* 2048*sqrt(2)*cos(3*pi/16) */
-#define W5 1609 /* 2048*sqrt(2)*cos(5*pi/16) */
-#define W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */
-#define W7 565 /* 2048*sqrt(2)*cos(7*pi/16) */
-
-/* global declarations */
-void Initialize_Fast_IDCT _ANSI_ARGS_((void));
-void Fast_IDCT _ANSI_ARGS_((short *block));
-
-/* private data */
-static short iclip[1024]; /* clipping table */
-static short *iclp;
-
-/* private prototypes */
-static void idctrow _ANSI_ARGS_((short *blk));
-static void idctcol _ANSI_ARGS_((short *blk));
-
-/* row (horizontal) IDCT
- *
- * 7 pi 1
- * dst[k] = sum c[l] * src[l] * cos( -- * ( k + - ) * l )
- * l=0 8 2
- *
- * where: c[0] = 128
- * c[1..7] = 128*sqrt(2)
- */
-
-static void idctrow(blk)
-short *blk;
-{
- int x0, x1, x2, x3, x4, x5, x6, x7, x8;
-
- /* shortcut */
- if (!((x1 = blk[4]<<11) | (x2 = blk[6]) | (x3 = blk[2]) |
- (x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))
- {
- blk[0]=blk[1]=blk[2]=blk[3]=blk[4]=blk[5]=blk[6]=blk[7]=blk[0]<<3;
- return;
- }
-
- x0 = (blk[0]<<11) + 128; /* for proper rounding in the fourth stage */
-
- /* first stage */
- x8 = W7*(x4+x5);
- x4 = x8 + (W1-W7)*x4;
- x5 = x8 - (W1+W7)*x5;
- x8 = W3*(x6+x7);
- x6 = x8 - (W3-W5)*x6;
- x7 = x8 - (W3+W5)*x7;
-
- /* second stage */
- x8 = x0 + x1;
- x0 -= x1;
- x1 = W6*(x3+x2);
- x2 = x1 - (W2+W6)*x2;
- x3 = x1 + (W2-W6)*x3;
- x1 = x4 + x6;
- x4 -= x6;
- x6 = x5 + x7;
- x5 -= x7;
-
- /* third stage */
- x7 = x8 + x3;
- x8 -= x3;
- x3 = x0 + x2;
- x0 -= x2;
- x2 = (181*(x4+x5)+128)>>8;
- x4 = (181*(x4-x5)+128)>>8;
-
- /* fourth stage */
- blk[0] = (x7+x1)>>8;
- blk[1] = (x3+x2)>>8;
- blk[2] = (x0+x4)>>8;
- blk[3] = (x8+x6)>>8;
- blk[4] = (x8-x6)>>8;
- blk[5] = (x0-x4)>>8;
- blk[6] = (x3-x2)>>8;
- blk[7] = (x7-x1)>>8;
-}
-
-/* column (vertical) IDCT
- *
- * 7 pi 1
- * dst[8*k] = sum c[l] * src[8*l] * cos( -- * ( k + - ) * l )
- * l=0 8 2
- *
- * where: c[0] = 1/1024
- * c[1..7] = (1/1024)*sqrt(2)
- */
-static void idctcol(blk)
-short *blk;
-{
- int x0, x1, x2, x3, x4, x5, x6, x7, x8;
-
- /* shortcut */
- if (!((x1 = (blk[8*4]<<8)) | (x2 = blk[8*6]) | (x3 = blk[8*2]) |
- (x4 = blk[8*1]) | (x5 = blk[8*7]) | (x6 = blk[8*5]) | (x7 = blk[8*3])))
- {
- blk[8*0]=blk[8*1]=blk[8*2]=blk[8*3]=blk[8*4]=blk[8*5]=blk[8*6]=blk[8*7]=
- iclp[(blk[8*0]+32)>>6];
- return;
- }
-
- x0 = (blk[8*0]<<8) + 8192;
-
- /* first stage */
- x8 = W7*(x4+x5) + 4;
- x4 = (x8+(W1-W7)*x4)>>3;
- x5 = (x8-(W1+W7)*x5)>>3;
- x8 = W3*(x6+x7) + 4;
- x6 = (x8-(W3-W5)*x6)>>3;
- x7 = (x8-(W3+W5)*x7)>>3;
-
- /* second stage */
- x8 = x0 + x1;
- x0 -= x1;
- x1 = W6*(x3+x2) + 4;
- x2 = (x1-(W2+W6)*x2)>>3;
- x3 = (x1+(W2-W6)*x3)>>3;
- x1 = x4 + x6;
- x4 -= x6;
- x6 = x5 + x7;
- x5 -= x7;
-
- /* third stage */
- x7 = x8 + x3;
- x8 -= x3;
- x3 = x0 + x2;
- x0 -= x2;
- x2 = (181*(x4+x5)+128)>>8;
- x4 = (181*(x4-x5)+128)>>8;
-
- /* fourth stage */
- blk[8*0] = iclp[(x7+x1)>>14];
- blk[8*1] = iclp[(x3+x2)>>14];
- blk[8*2] = iclp[(x0+x4)>>14];
- blk[8*3] = iclp[(x8+x6)>>14];
- blk[8*4] = iclp[(x8-x6)>>14];
- blk[8*5] = iclp[(x0-x4)>>14];
- blk[8*6] = iclp[(x3-x2)>>14];
- blk[8*7] = iclp[(x7-x1)>>14];
-}
-
-/* two dimensional inverse discrete cosine transform */
-void Fast_IDCT(block)
-short *block;
-{
- int i;
-
- for (i=0; i<8; i++)
- idctrow(block+8*i);
-
- for (i=0; i<8; i++)
- idctcol(block+i);
-}
-
-void Initialize_Fast_IDCT()
-{
- int i;
-
- iclp = iclip+512;
- for (i= -512; i<512; i++)
- iclp[i] = (i<-256) ? -256 : ((i>255) ? 255 : i);
-}
Index: rel_1_2/mpeg2/todo
===================================================================
--- rel_1_2/mpeg2/todo (revision 1198)
+++ rel_1_2/mpeg2/todo (nonexistent)
@@ -1,73 +0,0 @@
- 1. Test bitstream
- Small example bitstream (128x128 pixel dimensions) which employs all
- picture_structure (top field, bottom field, frame), picture_coding_type
- (I, P, and B), macroblock_type (forwards/backwards/interpolated,
- intra/non-intra, coded/not-coded, quant/no quant, etc.), and
- motion_type (field, frame, 16X8, dual prime) modes.
-
- 2. add trace printing for mpeg1 getblk routines.
-
- 3. modify getsys.c to parse program layer bitstreams (Systems)
- with variable-length packets.
-
- 4. 24 bit X11 display
- (borrow from Berkeley or find way for our code to use their interface)
-
- 5. MPEG-2 Transport layer systems streams parsing
-
- 6. Document IPR issue
-
- provide CableLabs URL
- how IPR relates to our disclaimer.
-
- 7. TIFF library support (YCbCr 4:4:4, 4:2:2, and 4:2:0 pictures)
-[deferred]
-
-10. IDCT rounding
- As per IDCT corridgendum (Savatier, MPEG 95/XXX)
- [done, but verified ?]
-
-
-12. green dots in can
- [ appears to be a display issue, probably related to convmat[]
- error ]
-
-19. move Dual_Prime calculation into picture_data()
-
-20. motion vector calculation to include tappable stages to test
- whether elements fall within [low:high] range.
-
-21. Integrate verifier routines
-
-22. Inter-layer verification routines
- - check base and enhancement layers (e.g. SNR)
-
-23. Spatial verification
- - considering that no base layer is available.
-
-24. SNR verification
- [ done ]
-
-25. DP verification
- [ not done. No longer any bitstreams with Data Partitioning distributed
- since DP is not part of any official Profile ]
-
-26. merge all global bitsteam element variables into
- common data structure (similar to layer_data). This is needed
- for the verifier (whether or not headers in SNR and DP streams
- are identical where needed to that of the base layer).
-
-27. investigate why MS-DOS wants an extra % sign for filename patterns
- when more than one filename pattern is used in the command line argument
-
-28. convert -t (trace) flag into levels, merge with Verbose.
-
-29. seek to a specified frame number (support for MCI-like functions)
-
-30. document the "flash" VLC table decoding method in detail.
- (namely how to map tables in Annex B to those in getvlc.h)
-
-31. MPEG-2 program stream compatibility
- (a few minor bits of difference in the system header ).
-
---------
Index: rel_1_2/mpeg2/makefile.ori
===================================================================
--- rel_1_2/mpeg2/makefile.ori (revision 1198)
+++ rel_1_2/mpeg2/makefile.ori (nonexistent)
@@ -1,98 +0,0 @@
-# Makefile for mpeg2decode
-
-# Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved.
-
-#
-# Disclaimer of Warranty
-#
-# These software programs are available to the user without any license fee or
-# royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
-# any and all warranties, whether express, implied, or statuary, including any
-# implied warranties or merchantability or of fitness for a particular
-# purpose. In no event shall the copyright-holder be liable for any
-# incidental, punitive, or consequential damages of any kind whatsoever
-# arising from the use of these programs.
-#
-# This disclaimer of warranty extends to the user of these programs and user's
-# customers, employees, agents, transferees, successors, and assigns.
-#
-# The MPEG Software Simulation Group does not represent or warrant that the
-# programs furnished hereunder are free of infringement of any third-party
-# patents.
-#
-# Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
-# are subject to royalty fees to patent holders. Many of these patents are
-# general enough such that they are unavoidable regardless of implementation
-# design.
-#
-#
-
-#WARNINGS = -Wall
-#VERIFY = -DVERIFY
-
-#disable this flag if you do not want bitstream element tracing
-#this will speed up the decoder some since it does not have to test
-#the trace flag at several critical inner loop locations.
-TRACE = -DTRACE
-
-#disable this flag if you do not need verbose trace, such as
-#header information
-VERBOSE = -DVERBOSE
-
-# uncomment the following two lines if you want to include X11 support
-
-#USE_DISP = -DDISPLAY
-#LIBS = -lX11
-
-# uncomment the following two lines if you want to use shared memory
-# (faster display if server and client run on the same machine)
-
-#USE_SHMEM = -DSH_MEM
-#LIBS = -lXext -lX11
-
-# if your X11 include files / libraries are in a non standard location:
-# set INCLUDEDIR to -I followed by the appropriate include file path and
-# set LIBRARYDIR to -L followed by the appropriate library path and
-
-#INCLUDEDIR = -I/usr/openwin/include
-#LIBRARYDIR = -L/usr/openwin/lib
-
-#
-# GNU gcc
-#
-CC = gcc
-CFLAGS = -O2 $(USE_DISP) $(USE_SHMEM) $(INCLUDEDIR) $(TRACE) $(VERBOSE) $(VERIFY) $(WARNINGS)
-
-OBJ = mpeg2dec.o getpic.o motion.o getvlc.o gethdr.o getblk.o getbits.o store.o recon.o spatscal.o idct.o idctref.o display.o systems.o subspic.o verify.o
-
-all: mpeg2decode
-
-pc: mpeg2dec.exe
-
-clean:
- rm -f *.o *% core mpeg2decode
-
-mpeg2dec.exe: mpeg2decode
- coff2exe mpeg2dec
-
-mpeg2decode: $(OBJ)
- $(CC) $(CFLAGS) $(LIBRARYDIR) -o mpeg2decode $(OBJ) -lm $(LIBS)
-
-display.o : display.c config.h global.h mpeg2dec.h
-getbits.o : getbits.c config.h global.h mpeg2dec.h
-getblk.o : getblk.c config.h global.h mpeg2dec.h
-gethdr.o : gethdr.c config.h global.h mpeg2dec.h
-getpic.o : getpic.c config.h global.h mpeg2dec.h
-getvlc.o : getvlc.c config.h global.h mpeg2dec.h getvlc.h
-idct.o : idct.c config.h
-idctref.o : idctref.c config.h
-motion.o : motion.c config.h global.h mpeg2dec.h
-mpeg2dec.o : mpeg2dec.c config.h global.h mpeg2dec.h
-recon.o : recon.c config.h global.h mpeg2dec.h
-spatscal.o : spatscal.c config.h global.h mpeg2dec.h
-store.o : store.c config.h global.h mpeg2dec.h
-
-# additions since July 4, 1994 edition
-systems.o : systems.c config.h global.h mpeg2dec.h
-subspic.o : subspic.c config.h global.h mpeg2dec.h
-verify.o: verify.c config.h global.h mpeg2dec.h
Index: rel_1_2/mpeg2/getvlc.c
===================================================================
--- rel_1_2/mpeg2/getvlc.c (revision 1198)
+++ rel_1_2/mpeg2/getvlc.c (nonexistent)
@@ -1,799 +0,0 @@
-/* getvlc.c, variable length decoding */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-
-#include "config.h"
-#include "global.h"
-#include "getvlc.h"
-
-/* private prototypes */
-/* generic picture macroblock type processing functions */
-static int Get_I_macroblock_type _ANSI_ARGS_((void));
-static int Get_P_macroblock_type _ANSI_ARGS_((void));
-static int Get_B_macroblock_type _ANSI_ARGS_((void));
-static int Get_D_macroblock_type _ANSI_ARGS_((void));
-
-/* spatial picture macroblock type processing functions */
-static int Get_I_Spatial_macroblock_type _ANSI_ARGS_((void));
-static int Get_P_Spatial_macroblock_type _ANSI_ARGS_((void));
-static int Get_B_Spatial_macroblock_type _ANSI_ARGS_((void));
-static int Get_SNR_macroblock_type _ANSI_ARGS_((void));
-
-int Get_macroblock_type()
-{
- int macroblock_type = 0;
-
- if (ld->scalable_mode==SC_SNR)
- macroblock_type = Get_SNR_macroblock_type();
- else
- {
- switch (picture_coding_type)
- {
- case I_TYPE:
- macroblock_type = ld->pict_scal ? Get_I_Spatial_macroblock_type() : Get_I_macroblock_type();
- break;
- case P_TYPE:
- macroblock_type = ld->pict_scal ? Get_P_Spatial_macroblock_type() : Get_P_macroblock_type();
- break;
- case B_TYPE:
- macroblock_type = ld->pict_scal ? Get_B_Spatial_macroblock_type() : Get_B_macroblock_type();
- break;
- case D_TYPE:
- macroblock_type = Get_D_macroblock_type();
- break;
- default:
- printf("Get_macroblock_type(): unrecognized picture coding type\n");
- break;
- }
- }
-
- return macroblock_type;
-}
-
-static int Get_I_macroblock_type()
-{
-#ifdef TRACE
- if (Trace_Flag)
- printf("macroblock_type(I) ");
-#endif /* TRACE */
-
- if (Get_Bits1())
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf("(1): Intra (1)\n");
-#endif /* TRACE */
- return 1;
- }
-
- if (!Get_Bits1())
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- }
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("(01): Intra, Quant (17)\n");
-#endif /* TRACE */
-
- return 17;
-}
-
-static char *MBdescr[]={
- "", "Intra", "No MC, Coded", "",
- "Bwd, Not Coded", "", "Bwd, Coded", "",
- "Fwd, Not Coded", "", "Fwd, Coded", "",
- "Interp, Not Coded", "", "Interp, Coded", "",
- "", "Intra, Quant", "No MC, Coded, Quant", "",
- "", "", "Bwd, Coded, Quant", "",
- "", "", "Fwd, Coded, Quant", "",
- "", "", "Interp, Coded, Quant", ""
-};
-
-static int Get_P_macroblock_type()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("macroblock_type(P) (");
-#endif /* TRACE */
-
- if ((code = Show_Bits(6))>=8)
- {
- code >>= 3;
- Flush_Buffer(PMBtab0[code].len);
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,3,PMBtab0[code].len);
- printf("): %s (%d)\n",MBdescr[(int)PMBtab0[code].val],PMBtab0[code].val);
- }
-#endif /* TRACE */
- return PMBtab0[code].val;
- }
-
- if (code==0)
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- Flush_Buffer(PMBtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,6,PMBtab1[code].len);
- printf("): %s (%d)\n",MBdescr[(int)PMBtab1[code].val],PMBtab1[code].val);
- }
-#endif /* TRACE */
-
- return PMBtab1[code].val;
-}
-
-static int Get_B_macroblock_type()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("macroblock_type(B) (");
-#endif /* TRACE */
-
- if ((code = Show_Bits(6))>=8)
- {
- code >>= 2;
- Flush_Buffer(BMBtab0[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,4,BMBtab0[code].len);
- printf("): %s (%d)\n",MBdescr[(int)BMBtab0[code].val],BMBtab0[code].val);
- }
-#endif /* TRACE */
-
- return BMBtab0[code].val;
- }
-
- if (code==0)
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- Flush_Buffer(BMBtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,6,BMBtab1[code].len);
- printf("): %s (%d)\n",MBdescr[(int)BMBtab1[code].val],BMBtab1[code].val);
- }
-#endif /* TRACE */
-
- return BMBtab1[code].val;
-}
-
-static int Get_D_macroblock_type()
-{
- if (!Get_Bits1())
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag=1;
- }
-
- return 1;
-}
-
-/* macroblock_type for pictures with spatial scalability */
-static int Get_I_Spatial_macroblock_type()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("macroblock_type(I,spat) (");
-#endif /* TRACE */
-
- code = Show_Bits(4);
-
- if (code==0)
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,4,spIMBtab[code].len);
- printf("): %02x\n",spIMBtab[code].val);
- }
-#endif /* TRACE */
-
- Flush_Buffer(spIMBtab[code].len);
- return spIMBtab[code].val;
-}
-
-static int Get_P_Spatial_macroblock_type()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("macroblock_type(P,spat) (");
-#endif /* TRACE */
-
- code = Show_Bits(7);
-
- if (code<2)
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- if (code>=16)
- {
- code >>= 3;
- Flush_Buffer(spPMBtab0[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,4,spPMBtab0[code].len);
- printf("): %02x\n",spPMBtab0[code].val);
- }
-#endif /* TRACE */
-
- return spPMBtab0[code].val;
- }
-
- Flush_Buffer(spPMBtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,7,spPMBtab1[code].len);
- printf("): %02x\n",spPMBtab1[code].val);
- }
-#endif /* TRACE */
-
- return spPMBtab1[code].val;
-}
-
-static int Get_B_Spatial_macroblock_type()
-{
- int code;
- VLCtab *p;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("macroblock_type(B,spat) (");
-#endif /* TRACE */
-
- code = Show_Bits(9);
-
- if (code>=64)
- p = &spBMBtab0[(code>>5)-2];
- else if (code>=16)
- p = &spBMBtab1[(code>>2)-4];
- else if (code>=8)
- p = &spBMBtab2[code-8];
- else
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- Flush_Buffer(p->len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,9,p->len);
- printf("): %02x\n",p->val);
- }
-#endif /* TRACE */
-
- return p->val;
-}
-
-static int Get_SNR_macroblock_type()
-{
- int code;
-
-#ifdef TRACE /* *CH* */
- if (Trace_Flag)
- printf("macroblock_type(SNR) (");
-#endif
-
- code = Show_Bits(3);
-
- if (code==0)
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- Flush_Buffer(SNRMBtab[code].len);
-
-#ifdef TRACE /* *CH* */
- if (Trace_Flag)
- {
- Print_Bits(code,3,SNRMBtab[code].len);
- printf("): %s (%d)\n",MBdescr[(int)SNRMBtab[code].val],SNRMBtab[code].val);
- }
-#endif
-
-
- return SNRMBtab[code].val;
-}
-
-int Get_motion_code()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("motion_code (");
-#endif /* TRACE */
-
- if (Get_Bits1())
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf("0): 0\n");
-#endif /* TRACE */
- return 0;
- }
-
- if ((code = Show_Bits(9))>=64)
- {
- code >>= 6;
- Flush_Buffer(MVtab0[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,3,MVtab0[code].len);
- printf("%d): %d\n",
- Show_Bits(1),Show_Bits(1)?-MVtab0[code].val:MVtab0[code].val);
- }
-#endif /* TRACE */
-
- return Get_Bits1()?-MVtab0[code].val:MVtab0[code].val;
- }
-
- if (code>=24)
- {
- code >>= 3;
- Flush_Buffer(MVtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,6,MVtab1[code].len);
- printf("%d): %d\n",
- Show_Bits(1),Show_Bits(1)?-MVtab1[code].val:MVtab1[code].val);
- }
-#endif /* TRACE */
-
- return Get_Bits1()?-MVtab1[code].val:MVtab1[code].val;
- }
-
- if ((code-=12)<0)
- {
- if (!Quiet_Flag)
-/* HACK */
- printf("Invalid motion_vector code (MBA %d, pic %d)\n", global_MBA, global_pic);
- Fault_Flag=1;
- return 0;
- }
-
- Flush_Buffer(MVtab2[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code+12,9,MVtab2[code].len);
- printf("%d): %d\n",
- Show_Bits(1),Show_Bits(1)?-MVtab2[code].val:MVtab2[code].val);
- }
-#endif /* TRACE */
-
- return Get_Bits1() ? -MVtab2[code].val : MVtab2[code].val;
-}
-
-/* get differential motion vector (for dual prime prediction) */
-int Get_dmvector()
-{
-#ifdef TRACE
- if (Trace_Flag)
- printf("dmvector (");
-#endif /* TRACE */
-
- if (Get_Bits(1))
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf(Show_Bits(1) ? "11): -1\n" : "10): 1\n");
-#endif /* TRACE */
- return Get_Bits(1) ? -1 : 1;
- }
- else
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf("0): 0\n");
-#endif /* TRACE */
- return 0;
- }
-}
-
-int Get_coded_block_pattern()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("coded_block_pattern_420 (");
-#endif /* TRACE */
-
- if ((code = Show_Bits(9))>=128)
- {
- code >>= 4;
- Flush_Buffer(CBPtab0[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,5,CBPtab0[code].len);
- printf("): ");
- Print_Bits(CBPtab0[code].val,6,6);
- printf(" (%d)\n",CBPtab0[code].val);
- }
-#endif /* TRACE */
-
- return CBPtab0[code].val;
- }
-
- if (code>=8)
- {
- code >>= 1;
- Flush_Buffer(CBPtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,8,CBPtab1[code].len);
- printf("): ");
- Print_Bits(CBPtab1[code].val,6,6);
- printf(" (%d)\n",CBPtab1[code].val);
- }
-#endif /* TRACE */
-
- return CBPtab1[code].val;
- }
-
- if (code<1)
- {
- if (!Quiet_Flag)
- printf("Invalid coded_block_pattern code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- Flush_Buffer(CBPtab2[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,9,CBPtab2[code].len);
- printf("): ");
- Print_Bits(CBPtab2[code].val,6,6);
- printf(" (%d)\n",CBPtab2[code].val);
- }
-#endif /* TRACE */
-
- return CBPtab2[code].val;
-}
-
-int Get_macroblock_address_increment()
-{
- int code, val;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("macroblock_address_increment (");
-#endif /* TRACE */
-
- val = 0;
-
- while ((code = Show_Bits(11))<24)
- {
- if (code!=15) /* if not macroblock_stuffing */
- {
- if (code==8) /* if macroblock_escape */
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf("00000001000 ");
-#endif /* TRACE */
-
- val+= 33;
- }
- else
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_address_increment code\n");
-
- Fault_Flag = 1;
- return 1;
- }
- }
- else /* macroblock suffing */
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf("00000001111 ");
-#endif /* TRACE */
- }
-
- Flush_Buffer(11);
- }
-
- /* macroblock_address_increment == 1 */
- /* ('1' is in the MSB position of the lookahead) */
- if (code>=1024)
- {
- Flush_Buffer(1);
-#ifdef TRACE
- if (Trace_Flag)
- printf("1): %d\n",val+1);
-#endif /* TRACE */
- return val + 1;
- }
-
- /* codes 00010 ... 011xx */
- if (code>=128)
- {
- /* remove leading zeros */
- code >>= 6;
- Flush_Buffer(MBAtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,5,MBAtab1[code].len);
- printf("): %d\n",val+MBAtab1[code].val);
- }
-#endif /* TRACE */
-
-
- return val + MBAtab1[code].val;
- }
-
- /* codes 00000011000 ... 0000111xxxx */
- code-= 24; /* remove common base */
- Flush_Buffer(MBAtab2[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code+24,11,MBAtab2[code].len);
- printf("): %d\n",val+MBAtab2[code].val);
- }
-#endif /* TRACE */
-
- return val + MBAtab2[code].val;
-}
-
-/* combined MPEG-1 and MPEG-2 stage. parse VLC and
- perform dct_diff arithmetic.
-
- MPEG-1: ISO/IEC 11172-2 section
- MPEG-2: ISO/IEC 13818-2 section 7.2.1
-
- Note: the arithmetic here is presented more elegantly than
- the spec, yet the results, dct_diff, are the same.
-*/
-
-int Get_Luma_DC_dct_diff()
-{
- int code, size, dct_diff;
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf("dct_dc_size_luminance: (");
-*/
-#endif /* TRACE */
-
- /* decode length */
- code = Show_Bits(5);
-
- if (code<31)
- {
- size = DClumtab0[code].val;
- Flush_Buffer(DClumtab0[code].len);
-#ifdef TRACE
-/*
- if (Trace_Flag)
- {
- Print_Bits(code,5,DClumtab0[code].len);
- printf("): %d",size);
- }
-*/
-#endif /* TRACE */
- }
- else
- {
- code = Show_Bits(9) - 0x1f0;
- size = DClumtab1[code].val;
- Flush_Buffer(DClumtab1[code].len);
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- {
- Print_Bits(code+0x1f0,9,DClumtab1[code].len);
- printf("): %d",size);
- }
-*/
-#endif /* TRACE */
- }
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf(", dct_dc_differential (");
-*/
-#endif /* TRACE */
-
- if (size==0)
- dct_diff = 0;
- else
- {
- dct_diff = Get_Bits(size);
-#ifdef TRACE
-/*
- if (Trace_Flag)
- Print_Bits(dct_diff,size,size);
-*/
-#endif /* TRACE */
- if ((dct_diff & (1<<(size-1)))==0)
- dct_diff-= (1<<size) - 1;
- }
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf("): %d\n",dct_diff);
-*/
-#endif /* TRACE */
-
- return dct_diff;
-}
-
-
-int Get_Chroma_DC_dct_diff()
-{
- int code, size, dct_diff;
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf("dct_dc_size_chrominance: (");
-*/
-#endif /* TRACE */
-
- /* decode length */
- code = Show_Bits(5);
-
- if (code<31)
- {
- size = DCchromtab0[code].val;
- Flush_Buffer(DCchromtab0[code].len);
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- {
- Print_Bits(code,5,DCchromtab0[code].len);
- printf("): %d",size);
- }
-*/
-#endif /* TRACE */
- }
- else
- {
- code = Show_Bits(10) - 0x3e0;
- size = DCchromtab1[code].val;
- Flush_Buffer(DCchromtab1[code].len);
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- {
- Print_Bits(code+0x3e0,10,DCchromtab1[code].len);
- printf("): %d",size);
- }
-*/
-#endif /* TRACE */
- }
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf(", dct_dc_differential (");
-*/
-#endif /* TRACE */
-
- if (size==0)
- dct_diff = 0;
- else
- {
- dct_diff = Get_Bits(size);
-#ifdef TRACE
-/*
- if (Trace_Flag)
- Print_Bits(dct_diff,size,size);
-*/
-#endif /* TRACE */
- if ((dct_diff & (1<<(size-1)))==0)
- dct_diff-= (1<<size) - 1;
- }
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf("): %d\n",dct_diff);
-*/
-#endif /* TRACE */
-
- return dct_diff;
-}
Index: rel_1_2/mpeg2/mpeg2dec.c
===================================================================
--- rel_1_2/mpeg2/mpeg2dec.c (revision 1198)
+++ rel_1_2/mpeg2/mpeg2dec.c (nonexistent)
@@ -1,770 +0,0 @@
-
-/* mpeg2dec.c, main(), initialization, option processing */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <fcntl.h>
-
-#define GLOBAL
-#include "config.h"
-#include "global.h"
-
-/* private prototypes */
-static int video_sequence _ANSI_ARGS_((int *framenum));
-static int Decode_Bitstream _ANSI_ARGS_((void));
-static int Headers _ANSI_ARGS_((void));
-static void Initialize_Sequence _ANSI_ARGS_((void));
-static void Initialize_Decoder _ANSI_ARGS_((void));
-static void Deinitialize_Sequence _ANSI_ARGS_((void));
-static void Process_Options _ANSI_ARGS_((int argc, char *argv[]));
-
-
-#if OLD
-static int Get_Val _ANSI_ARGS_((char *argv[]));
-#endif
-
-/* #define DEBUG */
-
-static void Clear_Options();
-#ifdef DEBUG
-static void Print_Options();
-#endif
-
-int main(argc,argv)
-int argc;
-char *argv[];
-{
- int ret, code;
-
- Clear_Options();
-
- /* decode command line arguments */
- Process_Options(argc,argv);
-
-#ifdef DEBUG
- Print_Options();
-#endif
-
- ld = &base; /* select base layer context */
-
- /* open MPEG base layer bitstream file(s) */
- /* NOTE: this is either a base layer stream or a spatial enhancement stream */
- if ((base.Infile=open(Main_Bitstream_Filename,O_RDONLY|O_BINARY))<0)
- {
- fprintf(stderr,"Base layer input file %s not found\n", Main_Bitstream_Filename);
- exit(1);
- }
-
-
- if(base.Infile != 0)
- {
- Initialize_Buffer();
-
- if(Show_Bits(8)==0x47)
- {
- sprintf(Error_Text,"Decoder currently does not parse transport streams\n");
- Error(Error_Text);
- }
-
- next_start_code();
- code = Show_Bits(32);
-
- switch(code)
- {
- case SEQUENCE_HEADER_CODE:
- break;
- case PACK_START_CODE:
- System_Stream_Flag = 1;
- case VIDEO_ELEMENTARY_STREAM:
- System_Stream_Flag = 1;
- break;
- default:
- sprintf(Error_Text,"Unable to recognize stream type\n");
- Error(Error_Text);
- break;
- }
-
- lseek(base.Infile, 0l, 0);
- Initialize_Buffer();
- }
-
- if(base.Infile!=0)
- {
- lseek(base.Infile, 0l, 0);
- }
-
- Initialize_Buffer();
-
- if(Two_Streams)
- {
- ld = &enhan; /* select enhancement layer context */
-
- if ((enhan.Infile = open(Enhancement_Layer_Bitstream_Filename,O_RDONLY|O_BINARY))<0)
- {
- sprintf(Error_Text,"enhancment layer bitstream file %s not found\n",
- Enhancement_Layer_Bitstream_Filename);
-
- Error(Error_Text);
- }
-
- Initialize_Buffer();
- ld = &base;
- }
-
- Initialize_Decoder();
-
- ret = Decode_Bitstream();
-
- close(base.Infile);
-
- if (Two_Streams)
- close(enhan.Infile);
-
- return 0;
-}
-
-/* IMPLEMENTAION specific rouintes */
-static void Initialize_Decoder()
-{
- int i;
-
- /* Clip table */
- if (!(Clip=(unsigned char *)malloc(1024)))
- Error("Clip[] malloc failed\n");
-
- Clip += 384;
-
- for (i=-384; i<640; i++)
- Clip[i] = (i<0) ? 0 : ((i>255) ? 255 : i);
-
- /* IDCT */
- if (Reference_IDCT_Flag)
- Initialize_Reference_IDCT();
- else
- Initialize_Fast_IDCT();
-
-}
-
-/* mostly IMPLEMENTAION specific rouintes */
-static void Initialize_Sequence()
-{
- int cc, size;
- static int Table_6_20[3] = {6,8,12};
-
- /* check scalability mode of enhancement layer */
- if (Two_Streams && (enhan.scalable_mode!=SC_SNR) && (base.scalable_mode!=SC_DP))
- Error("unsupported scalability mode\n");
-
- /* force MPEG-1 parameters for proper decoder behavior */
- /* see ISO/IEC 13818-2 section D.9.14 */
- if (!base.MPEG2_Flag)
- {
- progressive_sequence = 1;
- progressive_frame = 1;
- picture_structure = FRAME_PICTURE;
- frame_pred_frame_dct = 1;
- chroma_format = CHROMA420;
- matrix_coefficients = 5;
- }
-
- /* round to nearest multiple of coded macroblocks */
- /* ISO/IEC 13818-2 section 6.3.3 sequence_header() */
- mb_width = (horizontal_size+15)/16;
- mb_height = (base.MPEG2_Flag && !progressive_sequence) ? 2*((vertical_size+31)/32)
- : (vertical_size+15)/16;
-
- Coded_Picture_Width = 16*mb_width;
- Coded_Picture_Height = 16*mb_height;
-
- /* ISO/IEC 13818-2 sections 6.1.1.8, 6.1.1.9, and 6.1.1.10 */
- Chroma_Width = (chroma_format==CHROMA444) ? Coded_Picture_Width
- : Coded_Picture_Width>>1;
- Chroma_Height = (chroma_format!=CHROMA420) ? Coded_Picture_Height
- : Coded_Picture_Height>>1;
-
- /* derived based on Table 6-20 in ISO/IEC 13818-2 section 6.3.17 */
- block_count = Table_6_20[chroma_format-1];
-
- for (cc=0; cc<3; cc++)
- {
- if (cc==0)
- size = Coded_Picture_Width*Coded_Picture_Height;
- else
- size = Chroma_Width*Chroma_Height;
-
- if (!(backward_reference_frame[cc] = (unsigned char *)malloc(size)))
- Error("backward_reference_frame[] malloc failed\n");
-
- if (!(forward_reference_frame[cc] = (unsigned char *)malloc(size)))
- Error("forward_reference_frame[] malloc failed\n");
-
- if (!(auxframe[cc] = (unsigned char *)malloc(size)))
- Error("auxframe[] malloc failed\n");
-
- if(Ersatz_Flag)
- if (!(substitute_frame[cc] = (unsigned char *)malloc(size)))
- Error("substitute_frame[] malloc failed\n");
-
-
- if (base.scalable_mode==SC_SPAT)
- {
- /* this assumes lower layer is 4:2:0 */
- if (!(llframe0[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1))))
- Error("llframe0 malloc failed\n");
- if (!(llframe1[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1))))
- Error("llframe1 malloc failed\n");
- }
- }
-
- /* SCALABILITY: Spatial */
- if (base.scalable_mode==SC_SPAT)
- {
- if (!(lltmp = (short *)malloc(lower_layer_prediction_horizontal_size*((lower_layer_prediction_vertical_size*vertical_subsampling_factor_n)/vertical_subsampling_factor_m)*sizeof(short))))
- Error("lltmp malloc failed\n");
- }
-
- // PJ
- Initialize_framebuf( Coded_Picture_Width*Coded_Picture_Height*sizeof(WORD) );
- gvideo_init();
- init_jetcontrol();
-
-#ifdef DISPLAY
- if (Output_Type==T_X11)
- {
- Initialize_Display_Process("");
- Initialize_Dither_Matrix();
- }
-#endif /* DISPLAY */
-
-}
-
-void Error(text)
-char *text;
-{
- fprintf(stderr,text);
- exit(1);
-}
-
-/* Trace_Flag output */
-void Print_Bits(code,bits,len)
-int code,bits,len;
-{
- int i;
- for (i=0; i<len; i++)
- printf("%d",(code>>(bits-1-i))&1);
-}
-
-
-
-/* option processing */
-static void Process_Options(argc,argv)
-int argc; /* argument count */
-char *argv[]; /* argument vector */
-{
- int i, LastArg, NextArg;
-
- /* at least one argument should be present */
- if (argc<2)
- {
- printf("\n%s, %s\n",Version,Author);
- printf("Usage: mpeg2decode {options}\n\
-Options: -b file main bitstream (base or spatial enhancement layer)\n\
- -cn file conformance report (n: level)\n\
- -e file enhancement layer bitstream (SNR or Data Partitioning)\n\
- -f store/display interlaced video in frame format\n\
- -g concatenated file format for substitution method (-x)\n\
- -in file information & statistics report (n: level)\n\
- -l file file name pattern for lower layer sequence\n\
- (for spatial scalability)\n\
- -on file output format (0:YUV 1:SIF 2:TGA 3:PPM 4:X11 5:X11HiQ)\n\
- -q disable warnings to stderr\n\
- -r use double precision reference IDCT\n\
- -t enable low level tracing to stdout\n\
- -u file print user_data to stdio or file\n\
- -vn verbose output (n: level)\n\
- -x file filename pattern of picture substitution sequence\n\n\
-File patterns: for sequential filenames, \"printf\" style, e.g. rec%%d\n\
- or rec%%d%%c for fieldwise storage\n\
-Levels: 0:none 1:sequence 2:picture 3:slice 4:macroblock 5:block\n\n\
-Example: mpeg2decode -b bitstream.mpg -f -r -o0 rec%%d\n\
- \n");
- exit(0);
- }
-
-
- Output_Type = -1;
- i = 1;
-
- /* command-line options are proceeded by '-' */
-
- while(i < argc)
- {
- /* check if this is the last argument */
- LastArg = ((argc-i)==1);
-
- /* parse ahead to see if another flag immediately follows current
- argument (this is used to tell if a filename is missing) */
- if(!LastArg)
- NextArg = (argv[i+1][0]=='-');
- else
- NextArg = 0;
-
- /* second character, [1], after '-' is the switch */
- if(argv[i][0]=='-')
- {
- switch(toupper(argv[i][1]))
- {
- /* third character. [2], is the value */
- case 'B':
- Main_Bitstream_Flag = 1;
-
- if(NextArg || LastArg)
- {
- printf("ERROR: -b must be followed the main bitstream filename\n");
- }
- else
- Main_Bitstream_Filename = argv[++i];
-
- break;
-
-
- case 'C':
-
-#ifdef VERIFY
- Verify_Flag = atoi(&argv[i][2]);
-
- if((Verify_Flag < NO_LAYER) || (Verify_Flag > ALL_LAYERS))
- {
- printf("ERROR: -c level (%d) out of range [%d,%d]\n",
- Verify_Flag, NO_LAYER, ALL_LAYERS);
- exit(ERROR);
- }
-#else /* VERIFY */
- printf("This program not compiled for Verify_Flag option\n");
-#endif /* VERIFY */
- break;
-
- case 'E':
- Two_Streams = 1; /* either Data Partitioning (DP) or SNR Scalability enhancment */
-
- if(NextArg || LastArg)
- {
- printf("ERROR: -e must be followed by filename\n");
- exit(ERROR);
- }
- else
- Enhancement_Layer_Bitstream_Filename = argv[++i];
-
- break;
-
-
- case 'F':
- Frame_Store_Flag = 1;
- break;
-
- case 'G':
- Big_Picture_Flag = 1;
- break;
-
-
- case 'I':
-#ifdef VERIFY
- Stats_Flag = atoi(&argv[i][2]);
-#else /* VERIFY */
- printf("WARNING: This program not compiled for -i option\n");
-#endif /* VERIFY */
- break;
-
- case 'L': /* spatial scalability flag */
- Spatial_Flag = 1;
-
- if(NextArg || LastArg)
- {
- printf("ERROR: -l must be followed by filename\n");
- exit(ERROR);
- }
- else
- Lower_Layer_Picture_Filename = argv[++i];
-
- break;
-
- case 'O':
-
- Output_Type = atoi(&argv[i][2]);
-
- if((Output_Type==4) || (Output_Type==5))
- Output_Picture_Filename = ""; /* no need of filename */
- else if(NextArg || LastArg)
- {
- printf("ERROR: -o must be followed by filename\n");
- exit(ERROR);
- }
- else
- /* filename is separated by space, so it becomes the next argument */
- Output_Picture_Filename = argv[++i];
-
-#ifdef DISPLAY
- if (Output_Type==T_X11HIQ)
- {
- hiQdither = 1;
- Output_Type=T_X11;
- }
-#endif /* DISPLAY */
- break;
-
- case 'Q':
- Quiet_Flag = 1;
- break;
-
- case 'R':
- Reference_IDCT_Flag = 1;
- break;
-
- case 'T':
-#ifdef TRACE
- Trace_Flag = 1;
-#else /* TRACE */
- printf("WARNING: This program not compiled for -t option\n");
-#endif /* TRACE */
- break;
-
- case 'U':
- User_Data_Flag = 1;
-
- case 'V':
-#ifdef VERBOSE
- Verbose_Flag = atoi(&argv[i][2]);
-#else /* VERBOSE */
- printf("This program not compiled for -v option\n");
-#endif /* VERBOSE */
- break;
-
-
- case 'X':
- Ersatz_Flag = 1;
-
- if(NextArg || LastArg)
- {
- printf("ERROR: -x must be followed by filename\n");
- exit(ERROR);
- }
- else
- Substitute_Picture_Filename = argv[++i];
-
- break;
-
-
-
- default:
- fprintf(stderr,"undefined option -%c ignored. Exiting program\n",
- argv[i][1]);
-
- exit(ERROR);
-
- } /* switch() */
- } /* if argv[i][0] == '-' */
-
- i++;
-
- /* check for bitstream filename argument (there must always be one, at the very end
- of the command line arguments */
-
- } /* while() */
-
-
- /* options sense checking */
-
- if(Main_Bitstream_Flag!=1)
- {
- printf("There must be a main bitstream specified (-b filename)\n");
- }
-
- /* force display process to show frame pictures */
- if((Output_Type==4 || Output_Type==5) && Frame_Store_Flag)
- Display_Progressive_Flag = 1;
- else
- Display_Progressive_Flag = 0;
-
-#ifdef VERIFY
- /* parse the bitstream, do not actually decode it completely */
-
-
-#if 0
- if(Output_Type==-1)
- {
- Decode_Layer = Verify_Flag;
- printf("FYI: Decoding bitstream elements up to: %s\n",
- Layer_Table[Decode_Layer]);
- }
- else
-#endif
- Decode_Layer = ALL_LAYERS;
-
-#endif /* VERIFY */
-
- /* no output type specified */
- if(Output_Type==-1)
- {
- Output_Type = 9;
- Output_Picture_Filename = "";
- }
-
-
-#ifdef DISPLAY
- if (Output_Type==T_X11)
- {
- if(Frame_Store_Flag)
- Display_Progressive_Flag = 1;
- else
- Display_Progressive_Flag = 0;
-
- Frame_Store_Flag = 1; /* to avoid calling dither() twice */
- }
-#endif
-
-
-}
-
-
-#ifdef OLD
-/*
- this is an old routine used to convert command line arguments
- into integers
-*/
-static int Get_Val(argv)
-char *argv[];
-{
- int val;
-
- if (sscanf(argv[1]+2,"%d",&val)!=1)
- return 0;
-
- while (isdigit(argv[1][2]))
- argv[1]++;
-
- return val;
-}
-#endif
-
-
-
-static int Headers()
-{
- int ret;
-
- ld = &base;
-
-
- /* return when end of sequence (0) or picture
- header has been parsed (1) */
-
- ret = Get_Hdr();
-
-
- if (Two_Streams)
- {
- ld = &enhan;
- if (Get_Hdr()!=ret && !Quiet_Flag)
- fprintf(stderr,"streams out of sync\n");
- ld = &base;
- }
-
- return ret;
-}
-
-
-
-static int Decode_Bitstream()
-{
- int ret;
- int Bitstream_Framenum;
-
- Bitstream_Framenum = 0;
-
- for(;;)
- {
-
-#ifdef VERIFY
- Clear_Verify_Headers();
-#endif /* VERIFY */
-
- ret = Headers();
-
- if(ret==1)
- {
- ret = video_sequence(&Bitstream_Framenum);
- }
- else
- return(ret);
- }
-
-}
-
-
-static void Deinitialize_Sequence()
-{
- int i;
-
- /* clear flags */
- base.MPEG2_Flag=0;
-
- for(i=0;i<3;i++)
- {
- free(backward_reference_frame[i]);
- free(forward_reference_frame[i]);
- free(auxframe[i]);
-
- if (base.scalable_mode==SC_SPAT)
- {
- free(llframe0[i]);
- free(llframe1[i]);
- }
- }
-
- if (base.scalable_mode==SC_SPAT)
- free(lltmp);
-
-#ifdef DISPLAY
- if (Output_Type==T_X11)
- Terminate_Display_Process();
-#endif
-}
-
-
-static int video_sequence(Bitstream_Framenumber)
-int *Bitstream_Framenumber;
-{
- int Bitstream_Framenum;
- int Sequence_Framenum;
- int Return_Value;
-
- Bitstream_Framenum = *Bitstream_Framenumber;
- Sequence_Framenum=0;
-
- Initialize_Sequence();
-
- /* decode picture whose header has already been parsed in
- Decode_Bitstream() */
-
-
- Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
-
- /* update picture numbers */
- if (!Second_Field)
- {
- Bitstream_Framenum++;
- Sequence_Framenum++;
- }
-
- /* loop through the rest of the pictures in the sequence */
- while ((Return_Value=Headers()))
- {
- Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
-
- if (!Second_Field)
- {
- Bitstream_Framenum++;
- Sequence_Framenum++;
- }
- }
-
- /* put last frame */
- if (Sequence_Framenum!=0)
- {
- Output_Last_Frame_of_Sequence(Bitstream_Framenum);
- }
-
- Deinitialize_Sequence();
-
-#ifdef VERIFY
- Clear_Verify_Headers();
-#endif /* VERIFY */
-
- *Bitstream_Framenumber = Bitstream_Framenum;
- return(Return_Value);
-}
-
-
-
-static void Clear_Options()
-{
- Verbose_Flag = 0;
- Output_Type = 0;
- Output_Picture_Filename = " ";
- hiQdither = 0;
- Output_Type = 0;
- Frame_Store_Flag = 0;
- Spatial_Flag = 0;
- Lower_Layer_Picture_Filename = " ";
- Reference_IDCT_Flag = 0;
- Trace_Flag = 0;
- Quiet_Flag = 0;
- Ersatz_Flag = 0;
- Substitute_Picture_Filename = " ";
- Two_Streams = 0;
- Enhancement_Layer_Bitstream_Filename = " ";
- Big_Picture_Flag = 0;
- Main_Bitstream_Flag = 0;
- Main_Bitstream_Filename = " ";
- Verify_Flag = 0;
- Stats_Flag = 0;
- User_Data_Flag = 0;
-}
-
-
-#ifdef DEBUG
-static void Print_Options()
-{
-
- printf("Verbose_Flag = %d\n", Verbose_Flag);
- printf("Output_Type = %d\n", Output_Type);
- printf("Output_Picture_Filename = %s\n", Output_Picture_Filename);
- printf("hiQdither = %d\n", hiQdither);
- printf("Output_Type = %d\n", Output_Type);
- printf("Frame_Store_Flag = %d\n", Frame_Store_Flag);
- printf("Spatial_Flag = %d\n", Spatial_Flag);
- printf("Lower_Layer_Picture_Filename = %s\n", Lower_Layer_Picture_Filename);
- printf("Reference_IDCT_Flag = %d\n", Reference_IDCT_Flag);
- printf("Trace_Flag = %d\n", Trace_Flag);
- printf("Quiet_Flag = %d\n", Quiet_Flag);
- printf("Ersatz_Flag = %d\n", Ersatz_Flag);
- printf("Substitute_Picture_Filename = %s\n", Substitute_Picture_Filename);
- printf("Two_Streams = %d\n", Two_Streams);
- printf("Enhancement_Layer_Bitstream_Filename = %s\n", Enhancement_Layer_Bitstream_Filename);
- printf("Big_Picture_Flag = %d\n", Big_Picture_Flag);
- printf("Main_Bitstream_Flag = %d\n", Main_Bitstream_Flag);
- printf("Main_Bitstream_Filename = %s\n", Main_Bitstream_Filename);
- printf("Verify_Flag = %d\n", Verify_Flag);
- printf("Stats_Flag = %d\n", Stats_Flag);
- printf("User_Data_Flag = %d\n", User_Data_Flag);
-
-}
-#endif
Index: rel_1_2/mpeg2/changes
===================================================================
--- rel_1_2/mpeg2/changes (revision 1198)
+++ rel_1_2/mpeg2/changes (nonexistent)
@@ -1,95 +0,0 @@
-CHANGES
-----------
-
-January 9, 1996 to July 17, 1996
-- cleaned up some code which gave warnings.
-- altered some code to be compatible with Sun CC compiler.
- However, support in the makefile for non-ansi C compilers
- has been dropped (this is a stupid thing to support).
-
-December 20, 1995 to January 9, 1996:
-
-verified on HHI #22, TCEH #23 bitstreams.
-
- 1. new arguments format. Got to be so many argument fields that
- a new more consistent format was devised.
-
- 2. Frame_Store_Flag (-f) option now controls lower layer prediciton
- picture format (field or framewise)
-
- 3. getpic() structural changes
-
-
-Since December 18, 1995:
-
-1. added special case for current B pictures subsframe.c which
- loads entire reference frame for buffer substitution.
-
-2. fixed -l omission (-lXext) in Makefile that drives Tristan nuts everytime.
-
-
-Since December 14, 1995:
-
- 1. organized frame buffer substitution routines into subspic.c
- 2. added "big file" -b mode for Tristan ;-)
-
-
-Since July 4, 1994:
-
-1. Concatenated elementary sequences within same bitstream
-
- Decode can now handle concatenated elementary video sequences of
- arbitrary parameters.
-
-2. TRACE and VERBOSE #ifdef flags
-
-3. More disciplined naming convention
-
- normative variables and bitstream elements defined in 13818 are
- verbatim, lower case. Implementation specific routines and variables
- are capitolized.
-
-4. Spatial scalability corrections
- - see Carsten's document (spatscal.doc)
-
-5. D-pictures (picture_coding_type==D_TYPE)
-
- Only two small changes were necessary to accomodate D-pictures:
-
- a. in Decode_MPEG1_Intra_Block() added line which termines
- subroutine after DC coefficient has been processed.
-
- b. in picture_data(), added line which parses marker bit.
-
-
- 6. forced decoder to display frame progressively (regardless of whether
- the picture is frame structured or field structured) when -f flag
- is invoked in the command line arguements.
-
- also: progressive_frame now decides whether a frame is to be displayed
- as a frame picture to two field pictures, rather than the older convention
- of testing progressive_sequence.
-
- 7. Adapted systems parser from Stefan's mpeg2play to mpeg2decode.
- The major changes are:
-
- mpeg2dec.c:
- - fseek() called twice
-
- gethdr.c, getpic.c:
- instances of Flush_Bits(par,32) changed to Flush_Bits32(par)
-
- gethdr.c
- Get_Bits(par,32) changed to Get_32_Bits(par)
-
- global.h
- added rdmax, sysstream, and bfr[] to parameters struct.
-
- 8. Restructuring of getpic.c:
-
- a. moved picture pointer rotation into Update_Picture_Buffers()
- b. moved picture output logic into Output_Current_Frame() to
- in anticipation of 3:2 pulldown
-
-
-
Index: rel_1_2/mpeg2/getvlc.h
===================================================================
--- rel_1_2/mpeg2/getvlc.h (revision 1198)
+++ rel_1_2/mpeg2/getvlc.h (nonexistent)
@@ -1,491 +0,0 @@
-/* getvlc.h, variable length code tables */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-/* NOTE: #define constants such as MACROBLOCK_QUANT are upper case
- as per C programming convention. However, the MPEG document
- (ISO/IEC 13818-2) lists them in all lower case (e.g. Annex B) */
-
-/* NOTE: the VLC tables are in a flash format---a transformation
- of the tables in Annex B to a form more convenient towards
- parallel (more than one-bit-at-a-time) decoding */
-
-typedef struct {
- char val, len;
-} VLCtab;
-
-typedef struct {
- char run, level, len;
-} DCTtab;
-
-/* Table B-3, macroblock_type in P-pictures, codes 001..1xx */
-static VLCtab PMBtab0[8] = {
- {ERROR,0},
- {MACROBLOCK_MOTION_FORWARD,3},
- {MACROBLOCK_PATTERN,2}, {MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1}
-};
-
-/* Table B-3, macroblock_type in P-pictures, codes 000001..00011x */
-static VLCtab PMBtab1[8] = {
- {ERROR,0},
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,6},
- {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5},
- {MACROBLOCK_INTRA,5}, {MACROBLOCK_INTRA,5}
-};
-
-/* Table B-4, macroblock_type in B-pictures, codes 0010..11xx */
-static VLCtab BMBtab0[16] = {
- {ERROR,0},
- {ERROR,0},
- {MACROBLOCK_MOTION_FORWARD,4},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,4},
- {MACROBLOCK_MOTION_BACKWARD,3},
- {MACROBLOCK_MOTION_BACKWARD,3},
- {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
- {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}
-};
-
-/* Table B-4, macroblock_type in B-pictures, codes 000001..00011x */
-static VLCtab BMBtab1[8] = {
- {ERROR,0},
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,6},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5},
- {MACROBLOCK_INTRA,5},
- {MACROBLOCK_INTRA,5}
-};
-
-/* Table B-5, macroblock_type in spat. scal. I-pictures, codes 0001..1xxx */
-static VLCtab spIMBtab[16] = {
- {ERROR,0},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,4},
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,4},
- {MACROBLOCK_INTRA,4},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}
-};
-
-/* Table B-6, macroblock_type in spat. scal. P-pictures, codes 0010..11xx */
-static VLCtab spPMBtab0[16] =
-{
- {ERROR,0},
- {ERROR,0},
- {MACROBLOCK_MOTION_FORWARD,4},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,4},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2}
-};
-
-/* Table B-6, macroblock_type in spat. scal. P-pictures, codes 0000010..000111x */
-static VLCtab spPMBtab1[16] = {
- {ERROR,0},
- {ERROR,0},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,7},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,7},
- {MACROBLOCK_PATTERN,7},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,7},
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,7},
- {MACROBLOCK_INTRA,7},
- {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
- {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_PATTERN,6}
-};
-
-/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 0010..11xx */
-static VLCtab spBMBtab0[14] = {
- {MACROBLOCK_MOTION_FORWARD,4},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,4},
- {MACROBLOCK_MOTION_BACKWARD,3},
- {MACROBLOCK_MOTION_BACKWARD,3},
- {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
- {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}
-};
-
-/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 0000100..000111x */
-static VLCtab spBMBtab1[12] = {
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,7},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,7},
- {MACROBLOCK_INTRA,7},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,7},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6}
-};
-
-/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 00000100x..000001111 */
-static VLCtab spBMBtab2[8] = {
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,8},
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,8},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,8},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,8},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,9},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,9},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,9},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,9}
-};
-
-/* Table B-8, macroblock_type in spat. scal. B-pictures, codes 001..1xx */
-static VLCtab SNRMBtab[8] = {
- {ERROR,0},
- {0,3},
- {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_PATTERN,1},
- {MACROBLOCK_PATTERN,1},
- {MACROBLOCK_PATTERN,1},
- {MACROBLOCK_PATTERN,1}
-};
-
-/* Table B-10, motion_code, codes 0001 ... 01xx */
-static VLCtab MVtab0[8] =
-{ {ERROR,0}, {3,3}, {2,2}, {2,2}, {1,1}, {1,1}, {1,1}, {1,1}
-};
-
-/* Table B-10, motion_code, codes 0000011 ... 000011x */
-static VLCtab MVtab1[8] =
-{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {7,6}, {6,6}, {5,6}, {4,5}, {4,5}
-};
-
-/* Table B-10, motion_code, codes 0000001100 ... 000001011x */
-static VLCtab MVtab2[12] =
-{ {16,9}, {15,9}, {14,9}, {13,9},
- {12,9}, {11,9}, {10,8}, {10,8},
- {9,8}, {9,8}, {8,8}, {8,8}
-};
-
-/* Table B-9, coded_block_pattern, codes 01000 ... 111xx */
-static VLCtab CBPtab0[32] =
-{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
- {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
- {62,5}, {2,5}, {61,5}, {1,5}, {56,5}, {52,5}, {44,5}, {28,5},
- {40,5}, {20,5}, {48,5}, {12,5}, {32,4}, {32,4}, {16,4}, {16,4},
- {8,4}, {8,4}, {4,4}, {4,4}, {60,3}, {60,3}, {60,3}, {60,3}
-};
-
-/* Table B-9, coded_block_pattern, codes 00000100 ... 001111xx */
-static VLCtab CBPtab1[64] =
-{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
- {58,8}, {54,8}, {46,8}, {30,8},
- {57,8}, {53,8}, {45,8}, {29,8}, {38,8}, {26,8}, {37,8}, {25,8},
- {43,8}, {23,8}, {51,8}, {15,8}, {42,8}, {22,8}, {50,8}, {14,8},
- {41,8}, {21,8}, {49,8}, {13,8}, {35,8}, {19,8}, {11,8}, {7,8},
- {34,7}, {34,7}, {18,7}, {18,7}, {10,7}, {10,7}, {6,7}, {6,7},
- {33,7}, {33,7}, {17,7}, {17,7}, {9,7}, {9,7}, {5,7}, {5,7},
- {63,6}, {63,6}, {63,6}, {63,6}, {3,6}, {3,6}, {3,6}, {3,6},
- {36,6}, {36,6}, {36,6}, {36,6}, {24,6}, {24,6}, {24,6}, {24,6}
-};
-
-/* Table B-9, coded_block_pattern, codes 000000001 ... 000000111 */
-static VLCtab CBPtab2[8] =
-{ {ERROR,0}, {0,9}, {39,9}, {27,9}, {59,9}, {55,9}, {47,9}, {31,9}
-};
-
-/* Table B-1, macroblock_address_increment, codes 00010 ... 011xx */
-static VLCtab MBAtab1[16] =
-{ {ERROR,0}, {ERROR,0}, {7,5}, {6,5}, {5,4}, {5,4}, {4,4}, {4,4},
- {3,3}, {3,3}, {3,3}, {3,3}, {2,3}, {2,3}, {2,3}, {2,3}
-};
-
-/* Table B-1, macroblock_address_increment, codes 00000011000 ... 0000111xxxx */
-static VLCtab MBAtab2[104] =
-{
- {33,11}, {32,11}, {31,11}, {30,11}, {29,11}, {28,11}, {27,11}, {26,11},
- {25,11}, {24,11}, {23,11}, {22,11}, {21,10}, {21,10}, {20,10}, {20,10},
- {19,10}, {19,10}, {18,10}, {18,10}, {17,10}, {17,10}, {16,10}, {16,10},
- {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8},
- {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8},
- {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8},
- {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8},
- {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8},
- {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8},
- {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7},
- {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7},
- {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7},
- {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}
-};
-
-/* Table B-12, dct_dc_size_luminance, codes 00xxx ... 11110 */
-static VLCtab DClumtab0[32] =
-{ {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
- {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
- {0, 3}, {0, 3}, {0, 3}, {0, 3}, {3, 3}, {3, 3}, {3, 3}, {3, 3},
- {4, 3}, {4, 3}, {4, 3}, {4, 3}, {5, 4}, {5, 4}, {6, 5}, {ERROR, 0}
-};
-
-/* Table B-12, dct_dc_size_luminance, codes 111110xxx ... 111111111 */
-static VLCtab DClumtab1[16] =
-{ {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6},
- {8, 7}, {8, 7}, {8, 7}, {8, 7}, {9, 8}, {9, 8}, {10,9}, {11,9}
-};
-
-/* Table B-13, dct_dc_size_chrominance, codes 00xxx ... 11110 */
-static VLCtab DCchromtab0[32] =
-{ {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2},
- {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
- {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
- {3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5}, {ERROR, 0}
-};
-
-/* Table B-13, dct_dc_size_chrominance, codes 111110xxxx ... 1111111111 */
-static VLCtab DCchromtab1[32] =
-{ {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
- {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
- {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7},
- {8, 8}, {8, 8}, {8, 8}, {8, 8}, {9, 9}, {9, 9}, {10,10}, {11,10}
-};
-
-/* Table B-14, DCT coefficients table zero,
- * codes 0100 ... 1xxx (used for first (DC) coefficient)
- */
-DCTtab DCTtabfirst[12] =
-{
- {0,2,4}, {2,1,4}, {1,1,3}, {1,1,3},
- {0,1,1}, {0,1,1}, {0,1,1}, {0,1,1},
- {0,1,1}, {0,1,1}, {0,1,1}, {0,1,1}
-};
-
-/* Table B-14, DCT coefficients table zero,
- * codes 0100 ... 1xxx (used for all other coefficients)
- */
-DCTtab DCTtabnext[12] =
-{
- {0,2,4}, {2,1,4}, {1,1,3}, {1,1,3},
- {64,0,2}, {64,0,2}, {64,0,2}, {64,0,2}, /* EOB */
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}
-};
-
-/* Table B-14, DCT coefficients table zero,
- * codes 000001xx ... 00111xxx
- */
-DCTtab DCTtab0[60] =
-{
- {65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */
- {2,2,7}, {2,2,7}, {9,1,7}, {9,1,7},
- {0,4,7}, {0,4,7}, {8,1,7}, {8,1,7},
- {7,1,6}, {7,1,6}, {7,1,6}, {7,1,6},
- {6,1,6}, {6,1,6}, {6,1,6}, {6,1,6},
- {1,2,6}, {1,2,6}, {1,2,6}, {1,2,6},
- {5,1,6}, {5,1,6}, {5,1,6}, {5,1,6},
- {13,1,8}, {0,6,8}, {12,1,8}, {11,1,8},
- {3,2,8}, {1,3,8}, {0,5,8}, {10,1,8},
- {0,3,5}, {0,3,5}, {0,3,5}, {0,3,5},
- {0,3,5}, {0,3,5}, {0,3,5}, {0,3,5},
- {4,1,5}, {4,1,5}, {4,1,5}, {4,1,5},
- {4,1,5}, {4,1,5}, {4,1,5}, {4,1,5},
- {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
- {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5}
-};
-
-/* Table B-15, DCT coefficients table one,
- * codes 000001xx ... 11111111
-*/
-DCTtab DCTtab0a[252] =
-{
- {65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */
- {7,1,7}, {7,1,7}, {8,1,7}, {8,1,7},
- {6,1,7}, {6,1,7}, {2,2,7}, {2,2,7},
- {0,7,6}, {0,7,6}, {0,7,6}, {0,7,6},
- {0,6,6}, {0,6,6}, {0,6,6}, {0,6,6},
- {4,1,6}, {4,1,6}, {4,1,6}, {4,1,6},
- {5,1,6}, {5,1,6}, {5,1,6}, {5,1,6},
- {1,5,8}, {11,1,8}, {0,11,8}, {0,10,8},
- {13,1,8}, {12,1,8}, {3,2,8}, {1,4,8},
- {2,1,5}, {2,1,5}, {2,1,5}, {2,1,5},
- {2,1,5}, {2,1,5}, {2,1,5}, {2,1,5},
- {1,2,5}, {1,2,5}, {1,2,5}, {1,2,5},
- {1,2,5}, {1,2,5}, {1,2,5}, {1,2,5},
- {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
- {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4}, /* EOB */
- {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
- {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
- {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
- {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
- {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
- {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
- {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,4,5}, {0,4,5}, {0,4,5}, {0,4,5},
- {0,4,5}, {0,4,5}, {0,4,5}, {0,4,5},
- {0,5,5}, {0,5,5}, {0,5,5}, {0,5,5},
- {0,5,5}, {0,5,5}, {0,5,5}, {0,5,5},
- {9,1,7}, {9,1,7}, {1,3,7}, {1,3,7},
- {10,1,7}, {10,1,7}, {0,8,7}, {0,8,7},
- {0,9,7}, {0,9,7}, {0,12,8}, {0,13,8},
- {2,3,8}, {4,2,8}, {0,14,8}, {0,15,8}
-};
-
-/* Table B-14, DCT coefficients table zero,
- * codes 0000001000 ... 0000001111
- */
-DCTtab DCTtab1[8] =
-{
- {16,1,10}, {5,2,10}, {0,7,10}, {2,3,10},
- {1,4,10}, {15,1,10}, {14,1,10}, {4,2,10}
-};
-
-/* Table B-15, DCT coefficients table one,
- * codes 000000100x ... 000000111x
- */
-DCTtab DCTtab1a[8] =
-{
- {5,2,9}, {5,2,9}, {14,1,9}, {14,1,9},
- {2,4,10}, {16,1,10}, {15,1,9}, {15,1,9}
-};
-
-/* Table B-14/15, DCT coefficients table zero / one,
- * codes 000000010000 ... 000000011111
- */
-DCTtab DCTtab2[16] =
-{
- {0,11,12}, {8,2,12}, {4,3,12}, {0,10,12},
- {2,4,12}, {7,2,12}, {21,1,12}, {20,1,12},
- {0,9,12}, {19,1,12}, {18,1,12}, {1,5,12},
- {3,3,12}, {0,8,12}, {6,2,12}, {17,1,12}
-};
-
-/* Table B-14/15, DCT coefficients table zero / one,
- * codes 0000000010000 ... 0000000011111
- */
-DCTtab DCTtab3[16] =
-{
- {10,2,13}, {9,2,13}, {5,3,13}, {3,4,13},
- {2,5,13}, {1,7,13}, {1,6,13}, {0,15,13},
- {0,14,13}, {0,13,13}, {0,12,13}, {26,1,13},
- {25,1,13}, {24,1,13}, {23,1,13}, {22,1,13}
-};
-
-/* Table B-14/15, DCT coefficients table zero / one,
- * codes 00000000010000 ... 00000000011111
- */
-DCTtab DCTtab4[16] =
-{
- {0,31,14}, {0,30,14}, {0,29,14}, {0,28,14},
- {0,27,14}, {0,26,14}, {0,25,14}, {0,24,14},
- {0,23,14}, {0,22,14}, {0,21,14}, {0,20,14},
- {0,19,14}, {0,18,14}, {0,17,14}, {0,16,14}
-};
-
-/* Table B-14/15, DCT coefficients table zero / one,
- * codes 000000000010000 ... 000000000011111
- */
-DCTtab DCTtab5[16] =
-{
- {0,40,15}, {0,39,15}, {0,38,15}, {0,37,15},
- {0,36,15}, {0,35,15}, {0,34,15}, {0,33,15},
- {0,32,15}, {1,14,15}, {1,13,15}, {1,12,15},
- {1,11,15}, {1,10,15}, {1,9,15}, {1,8,15}
-};
-
-/* Table B-14/15, DCT coefficients table zero / one,
- * codes 0000000000010000 ... 0000000000011111
- */
-DCTtab DCTtab6[16] =
-{
- {1,18,16}, {1,17,16}, {1,16,16}, {1,15,16},
- {6,3,16}, {16,2,16}, {15,2,16}, {14,2,16},
- {13,2,16}, {12,2,16}, {11,2,16}, {31,1,16},
- {30,1,16}, {29,1,16}, {28,1,16}, {27,1,16}
-};
-
Index: rel_1_2/mpeg2/const.h
===================================================================
--- rel_1_2/mpeg2/const.h (revision 1198)
+++ rel_1_2/mpeg2/const.h (nonexistent)
@@ -1,141 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: const.h,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:45 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------------ */
-/* Useful constants */
-/* ------------------ */
-
-#ifndef __CONST_H_
-
-#define __CONST_H_
-
-/* Screen dimensions */
-#define SCREEN_WIDTH 800
-#define SCREEN_HEIGHT 600
-#define SCREEN_BIT_COLORS 8
-
-/* Visible area */
-#define TEL_WIDTH 50
-#define TEL_HEIGHT 50
-
-/* Car dimensions */
-#define CAR_WIDTH 12
-#define CAR_HEIGHT 12
-#define CAR_W 8
-#define CAR_H 10
-
-/* Track dimensions */
-#define TRACK_WIDTH 500
-#define TRACK_HEIGHT 500
-
-/* Track position */
-#define TRACK_X1 0
-#define TRACK_Y1 0
-#define TRACK_X2 TRACK_X1+TRACK_WIDTH-1
-#define TRACK_Y2 TRACK_Y1+TRACK_HEIGHT-1
-
-/* Max number of car on track */
-#define MAX_CAR_NUMBER 10
-#define DRIVERS_NUMBER 20
-#define MAX_DRIVER_NAME_LENGTH 20
-#define MAX_TRACK_NAME_LENGTH 20
-#define TRACK_NUMBER 4
-
-/* Lap direction */
-#define CLOCK 0
-#define ANTICLOCK 1
-
-/* Information display coords */
-#define CMD_WIDTH TRACK_WIDTH
-#define CMD_HEIGHT (SCREEN_HEIGHT-TRACK_HEIGHT-3)
-
-/* Car position limits */
-#define MIN_CAR_X (TRACK_X1 + CAR_WIDTH/2 + 4)
-#define MIN_CAR_Y (TRACK_Y1 + CAR_HEIGHT/2 + 4)
-#define MAX_CAR_X (TRACK_X2 - CAR_WIDTH/2 - 4)
-#define MAX_CAR_Y (TRACK_Y2 - CAR_HEIGHT/2 - 4)
-
-/* Road constants */
-#define LEFT_ONLY 10
-#define RIGHT_ONLY 11
-#define ROAD_OK 12
-#define NO_ROAD 13
-
-/* Collision constants */
-#define COLLISION_LEFT 20
-#define COLLISION_RIGHT 21
-#define COLLISION_BACK 22
-#define NO_COLL 0
-
-/* CAB constants */
-#define ROAD_MSG_DIM sizeof(road_info)
-#define ROAD_MSG_READER 4
-
-#define CAR_MSG_DIM sizeof(car_status)
-#define CAR_MSG_READER 5
-
-/* Tasks parameters */
-#define SENSOR_WCET 3000
-#define SENSOR_PERIOD 40000
-#define CONTROL_WCET 1000
-#define CONTROL_PERIOD 40000
-
-#endif
-
Index: rel_1_2/mpeg2/mpeg2dec.h
===================================================================
--- rel_1_2/mpeg2/mpeg2dec.h (revision 1198)
+++ rel_1_2/mpeg2/mpeg2dec.h (nonexistent)
@@ -1,129 +0,0 @@
-/* mpeg2dec.h, MPEG specific defines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#define ERROR (-1)
-
-#define PICTURE_START_CODE 0x100
-#define SLICE_START_CODE_MIN 0x101
-#define SLICE_START_CODE_MAX 0x1AF
-#define USER_DATA_START_CODE 0x1B2
-#define SEQUENCE_HEADER_CODE 0x1B3
-#define SEQUENCE_ERROR_CODE 0x1B4
-#define EXTENSION_START_CODE 0x1B5
-#define SEQUENCE_END_CODE 0x1B7
-#define GROUP_START_CODE 0x1B8
-#define SYSTEM_START_CODE_MIN 0x1B9
-#define SYSTEM_START_CODE_MAX 0x1FF
-
-#define ISO_END_CODE 0x1B9
-#define PACK_START_CODE 0x1BA
-#define SYSTEM_START_CODE 0x1BB
-
-#define VIDEO_ELEMENTARY_STREAM 0x1e0
-
-/* scalable_mode */
-#define SC_NONE 0
-#define SC_DP 1
-#define SC_SPAT 2
-#define SC_SNR 3
-#define SC_TEMP 4
-
-/* picture coding type */
-#define I_TYPE 1
-#define P_TYPE 2
-#define B_TYPE 3
-#define D_TYPE 4
-
-/* picture structure */
-#define TOP_FIELD 1
-#define BOTTOM_FIELD 2
-#define FRAME_PICTURE 3
-
-/* macroblock type */
-#define MACROBLOCK_INTRA 1
-#define MACROBLOCK_PATTERN 2
-#define MACROBLOCK_MOTION_BACKWARD 4
-#define MACROBLOCK_MOTION_FORWARD 8
-#define MACROBLOCK_QUANT 16
-#define SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG 32
-#define PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS 64
-
-
-/* motion_type */
-#define MC_FIELD 1
-#define MC_FRAME 2
-#define MC_16X8 2
-#define MC_DMV 3
-
-/* mv_format */
-#define MV_FIELD 0
-#define MV_FRAME 1
-
-/* chroma_format */
-#define CHROMA420 1
-#define CHROMA422 2
-#define CHROMA444 3
-
-/* extension start code IDs */
-
-#define SEQUENCE_EXTENSION_ID 1
-#define SEQUENCE_DISPLAY_EXTENSION_ID 2
-#define QUANT_MATRIX_EXTENSION_ID 3
-#define COPYRIGHT_EXTENSION_ID 4
-#define SEQUENCE_SCALABLE_EXTENSION_ID 5
-#define PICTURE_DISPLAY_EXTENSION_ID 7
-#define PICTURE_CODING_EXTENSION_ID 8
-#define PICTURE_SPATIAL_SCALABLE_EXTENSION_ID 9
-#define PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID 10
-
-#define ZIG_ZAG 0
-
-#define PROFILE_422 (128+5)
-#define MAIN_LEVEL 8
-
-/* Layers: used by Verbose_Flag, Verifier_Flag, Stats_Flag, and Trace_Flag */
-#define NO_LAYER 0
-#define SEQUENCE_LAYER 1
-#define PICTURE_LAYER 2
-#define SLICE_LAYER 3
-#define MACROBLOCK_LAYER 4
-#define BLOCK_LAYER 5
-#define EVENT_LAYER 6
-#define ALL_LAYERS 7
-
-
-
-#define FILENAME_LENGTH 256
-
-
-
-
-#define MB_WEIGHT 32
-#define MB_CLASS4 64
-
Index: rel_1_2/mpeg2/store.c
===================================================================
--- rel_1_2/mpeg2/store.c (revision 1198)
+++ rel_1_2/mpeg2/store.c (nonexistent)
@@ -1,529 +0,0 @@
-/* store.c, picture output routines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-
-#include "config.h"
-#include "global.h"
-#include "semaphore.h"
-#include "kernel/kern.h"
-
-//#debug DEBUG_MAILBOX
-
-static void conv422to444 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
-static void conv420to422 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
-
-__inline__ WORD down32to16(unsigned char r, unsigned char g, unsigned char b)
-{
- return ((b&0xf8)>>3)|((g&0xfc)<<3)|((r&0xf8)<<8);
-}
-
-#if 0
-void xWrite_Frame _ANSI_ARGS_((unsigned char *src[], int frame))
-{
- int i, j;
- int y, u, v, r, g, b;
-// int rm=0,gm=0,bm=0;
- int crv, cbu, cgu, cgv;
- unsigned char *py, *pu, *pv;
- int height, width;
-
- struct framebuf_struct *f;
-
- cprintf("%d ",frame);
-
- width = Coded_Picture_Width ;
- height= Coded_Picture_Height;
-
- f = get_free_framebuf();
-
- dither(src);
- f->f[i*width+j] = down32to16(r,g,b);
-
- f->n = frame;
- insert_frame(f);
-}
-#endif
-
-void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame))
-{
- int i, j;
- int y, u, v, r, g, b;
-// int rm=0,gm=0,bm=0;
- int crv, cbu, cgu, cgv;
- unsigned char *py, *pu, *pv;
- int height, width, incr;
- static unsigned char *u422, *v422, *u444, *v444;
-
- struct framebuf_struct *f;
-
- cprintf("%d ",frame);
-
- incr = width = Coded_Picture_Width ;
- height= Coded_Picture_Height;
-
- if (chroma_format==CHROMA444)
- {
- u444 = src[1];
- v444 = src[2];
- }
- else
- {
- if (!u444)
- {
- if (chroma_format==CHROMA420)
- {
- if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
- *Coded_Picture_Height)))
- Error("malloc failed");
- if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
- *Coded_Picture_Height)))
- Error("malloc failed");
- }
-
- if (!(u444 = (unsigned char *)malloc(Coded_Picture_Width
- *Coded_Picture_Height)))
- Error("malloc failed");
-
- if (!(v444 = (unsigned char *)malloc(Coded_Picture_Width
- *Coded_Picture_Height)))
- Error("malloc failed");
- }
-
- if (chroma_format==CHROMA420)
- {
- conv420to422(src[1],u422);
- conv420to422(src[2],v422);
- conv422to444(u422,u444);
- conv422to444(v422,v444);
- }
- else
- {
- conv422to444(src[1],u444);
- conv422to444(src[2],v444);
- }
- }
-
-
- f = get_free_framebuf();
-
- /* matrix coefficients */
- crv = Inverse_Table_6_9[matrix_coefficients][0];
- cbu = Inverse_Table_6_9[matrix_coefficients][1];
- cgu = Inverse_Table_6_9[matrix_coefficients][2];
- cgv = Inverse_Table_6_9[matrix_coefficients][3];
-
- for (i=0; i<height; i++)
- {
- py = src[0] + incr*i;
- pu = u444 + incr*i;
- pv = v444 + incr*i;
-
- for (j=0; j<width; j++)
- {
- u = *pu++ - 128;
- v = *pv++ - 128;
- y = 76309 * (*py++ - 16); /* (255/219)*65536 */
-
- r = Clip[(y + crv*v + 32768)>>16];
- g = Clip[(y - cgu*u - cgv*v + 32768)>>16];
- b = Clip[(y + cbu*u + 32786)>>16];
-
-// rm = max(rm,r);gm=max(gm,g);bm=max(bm,b);
-// cprintf("(r%dg%db%d)",rm,gm,bm);
- f->f[i*width+j] = down32to16(r,g,b);
-// r=g=b=rand()%255;
-// f->f[i*width+j] = down32to16(r,g,b);
- }
- }
-
- f->n = frame;
- insert_frame(f);
-}
-
-/*
-void Display_Image(Dithered_Image)
-unsigned char *Dithered_Image;
-{
- / * display dithered image */
-//}
-
-
-/* horizontal 1:2 interpolation filter */
-static void conv422to444(src,dst)
-unsigned char *src,*dst;
-{
- int i, i2, w, j, im3, im2, im1, ip1, ip2, ip3;
-
- w = Coded_Picture_Width>>1;
-
- if (base.MPEG2_Flag)
- {
- for (j=0; j<Coded_Picture_Height; j++)
- {
- for (i=0; i<w; i++)
- {
- i2 = i<<1;
- im2 = (i<2) ? 0 : i-2;
- im1 = (i<1) ? 0 : i-1;
- ip1 = (i<w-1) ? i+1 : w-1;
- ip2 = (i<w-2) ? i+2 : w-1;
- ip3 = (i<w-3) ? i+3 : w-1;
-
- /* FIR filter coefficients (*256): 21 0 -52 0 159 256 159 0 -52 0 21 */
- /* even samples (0 0 256 0 0) */
- dst[i2] = src[i];
-
- /* odd samples (21 -52 159 159 -52 21) */
- dst[i2+1] = Clip[(int)(21*(src[im2]+src[ip3])
- -52*(src[im1]+src[ip2])
- +159*(src[i]+src[ip1])+128)>>8];
- }
- src+= w;
- dst+= Coded_Picture_Width;
- }
- }
- else
- {
- for (j=0; j<Coded_Picture_Height; j++)
- {
- for (i=0; i<w; i++)
- {
-
- i2 = i<<1;
- im3 = (i<3) ? 0 : i-3;
- im2 = (i<2) ? 0 : i-2;
- im1 = (i<1) ? 0 : i-1;
- ip1 = (i<w-1) ? i+1 : w-1;
- ip2 = (i<w-2) ? i+2 : w-1;
- ip3 = (i<w-3) ? i+3 : w-1;
-
- /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
- dst[i2] = Clip[(int)( 5*src[im3]
- -21*src[im2]
- +70*src[im1]
- +228*src[i]
- -37*src[ip1]
- +11*src[ip2]+128)>>8];
-
- dst[i2+1] = Clip[(int)( 5*src[ip3]
- -21*src[ip2]
- +70*src[ip1]
- +228*src[i]
- -37*src[im1]
- +11*src[im2]+128)>>8];
- }
- src+= w;
- dst+= Coded_Picture_Width;
- }
- }
-}
-
-/* vertical 1:2 interpolation filter */
-static void conv420to422(src,dst)
-unsigned char *src,*dst;
-{
- int w, h, i, j, j2;
- int jm6, jm5, jm4, jm3, jm2, jm1, jp1, jp2, jp3, jp4, jp5, jp6, jp7;
-
- w = Coded_Picture_Width>>1;
- h = Coded_Picture_Height>>1;
-
- if (progressive_frame)
- {
- /* intra frame */
- for (i=0; i<w; i++)
- {
- for (j=0; j<h; j++)
- {
- j2 = j<<1;
- jm3 = (j<3) ? 0 : j-3;
- jm2 = (j<2) ? 0 : j-2;
- jm1 = (j<1) ? 0 : j-1;
- jp1 = (j<h-1) ? j+1 : h-1;
- jp2 = (j<h-2) ? j+2 : h-1;
- jp3 = (j<h-3) ? j+3 : h-1;
-
- /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
- /* New FIR filter coefficients (*256): 3 -16 67 227 -32 7 */
- dst[w*j2] = Clip[(int)( 3*src[w*jm3]
- -16*src[w*jm2]
- +67*src[w*jm1]
- +227*src[w*j]
- -32*src[w*jp1]
- +7*src[w*jp2]+128)>>8];
-
- dst[w*(j2+1)] = Clip[(int)( 3*src[w*jp3]
- -16*src[w*jp2]
- +67*src[w*jp1]
- +227*src[w*j]
- -32*src[w*jm1]
- +7*src[w*jm2]+128)>>8];
- }
- src++;
- dst++;
- }
- }
- else
- {
- /* intra field */
- for (i=0; i<w; i++)
- {
- for (j=0; j<h; j+=2)
- {
- j2 = j<<1;
-
- /* top field */
- jm6 = (j<6) ? 0 : j-6;
- jm4 = (j<4) ? 0 : j-4;
- jm2 = (j<2) ? 0 : j-2;
- jp2 = (j<h-2) ? j+2 : h-2;
- jp4 = (j<h-4) ? j+4 : h-2;
- jp6 = (j<h-6) ? j+6 : h-2;
-
- /* Polyphase FIR filter coefficients (*256): 2 -10 35 242 -18 5 */
- /* New polyphase FIR filter coefficients (*256): 1 -7 30 248 -21 5 */
- dst[w*j2] = Clip[(int)( 1*src[w*jm6]
- -7*src[w*jm4]
- +30*src[w*jm2]
- +248*src[w*j]
- -21*src[w*jp2]
- +5*src[w*jp4]+128)>>8];
-
- /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
- /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
- dst[w*(j2+2)] = Clip[(int)( 7*src[w*jm4]
- -35*src[w*jm2]
- +194*src[w*j]
- +110*src[w*jp2]
- -24*src[w*jp4]
- +4*src[w*jp6]+128)>>8];
-
- /* bottom field */
- jm5 = (j<5) ? 1 : j-5;
- jm3 = (j<3) ? 1 : j-3;
- jm1 = (j<1) ? 1 : j-1;
- jp1 = (j<h-1) ? j+1 : h-1;
- jp3 = (j<h-3) ? j+3 : h-1;
- jp5 = (j<h-5) ? j+5 : h-1;
- jp7 = (j<h-7) ? j+7 : h-1;
-
- /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
- /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
- dst[w*(j2+1)] = Clip[(int)( 7*src[w*jp5]
- -35*src[w*jp3]
- +194*src[w*jp1]
- +110*src[w*jm1]
- -24*src[w*jm3]
- +4*src[w*jm5]+128)>>8];
-
- dst[w*(j2+3)] = Clip[(int)( 1*src[w*jp7]
- -7*src[w*jp5]
- +30*src[w*jp3]
- +248*src[w*jp1]
- -21*src[w*jm1]
- +5*src[w*jm3]+128)>>8];
- }
- src++;
- dst++;
- }
- }
-}
-
-
-
-
-
-// Frame buffer for displaying pictures
-
-struct framebuf_struct *get_free_framebuf();
-void insert_frame(struct framebuf_struct *f);
-struct framebuf_struct *remove_frame();
-
-int framebuf_sz;
-
-// a queue of framebufs
-struct framebuf_struct *framebuf_first;
-struct framebuf_struct *framebuf_last;
-
-// free framebuf list
-struct framebuf_struct *framebuf_free;
-
-// some semaphores
-sem_t framebuf_sem;
-sem_t framebuf_count;
-sem_t framebuf_freecount;
-
-void allocate_framebuf()
-{
- struct framebuf_struct *f;
-
- f = (struct framebuf_struct *)malloc(sizeof(struct framebuf_struct));
- if (!f) {
- cputs("Not enough memory!!!\n");
- sys_end();
- }
-
- f->f = (WORD *)malloc(framebuf_sz);
- if (!f->f) {
- cputs("Not enough memory for buffer!!!\n");
- sys_end();
- }
-
- f->next = framebuf_free;
- framebuf_free = f;
- cprintf("(Alloc %d %d)\n",f,f->f);
-}
-
-void Initialize_framebuf(int sz)
-{
- int i;
-
- framebuf_first = NULL;
- framebuf_last = NULL;
- framebuf_free = NULL;
- framebuf_sz = sz;
-
- cprintf("Coded W=%d H=%d sz=%d\n",Coded_Picture_Width,Coded_Picture_Height,sz);
-
- for (i=0; i<MAX_FRAMEBUF; i++)
- allocate_framebuf();
-
- sem_init(&framebuf_sem,0,1);
- sem_init(&framebuf_count,0,0);
- sem_init(&framebuf_freecount,0,MAX_FRAMEBUF);
-}
-
-struct framebuf_struct *get_free_framebuf()
-{
- struct framebuf_struct *f;
-
-#ifdef DEBUG_MAILBOX
- cprintf("G");
-#endif
- sem_wait(&framebuf_freecount);
- sem_wait(&framebuf_sem);
-
- //if (!framebuf_free)
- // allocate_framebuf();
-
- f = framebuf_free;
-
- framebuf_free = framebuf_free->next;
-
- sem_post(&framebuf_sem);
-
- return f;
-}
-
-void insert_frame(struct framebuf_struct *f)
-{
- struct framebuf_struct *p, *q;
- int n;
-
-#ifdef DEBUG_MAILBOX
- cprintf("I");
-#endif
- sem_wait(&framebuf_sem);
-
- p = NULL;
- q = framebuf_first;
- n = f->n;
-
- while ((q != NULL) && (n >= q->n)) {
- p = q;
- q = q->next;
- }
-
- if (p)
- p->next = f;
- else
- framebuf_first = f;
-
- if (q)
- q->prev = f;
- else
- framebuf_last = f;
-
- f->next = q;
- f->prev = p;
-
- sem_post(&framebuf_count);
- sem_post(&framebuf_sem);
-}
-
-struct framebuf_struct *remove_frame()
-{
- struct framebuf_struct *f;
-
-#ifdef DEBUG_MAILBOX
- cprintf("R");
-#endif
- sem_wait(&framebuf_count);
- sem_wait(&framebuf_sem);
-
-
- // remove the first frame
- f = framebuf_first;
-
- if (!f)
- sys_abort(69); // should never happen
-
- framebuf_first = framebuf_first->next;
-
- if (framebuf_first)
- framebuf_first->prev = NULL;
- else
- framebuf_last = NULL;
-
- sem_post(&framebuf_sem);
-
- return f;
-}
-
-void give_back_framebuf(struct framebuf_struct *f)
-{
-#ifdef DEBUG_MAILBOX
- cprintf("B");
-#endif
- sem_wait(&framebuf_sem);
-
- f->next = framebuf_free;
- framebuf_free = f;
-
- sem_post(&framebuf_sem);
- sem_post(&framebuf_freecount);
-}
-
-
-
-
-
Index: rel_1_2/mpeg2/makefile
===================================================================
--- rel_1_2/mpeg2/makefile (revision 1198)
+++ rel_1_2/mpeg2/makefile (nonexistent)
@@ -1,19 +0,0 @@
-#
-# The mpeg library
-#
-
-# (see sources for copyrights)
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= mpeg2dec
-
-include $(BASE)/config/example.mk
-
-OBJS= "initfile.o jetctrl.o getpic.o motion.o getvlc.o gethdr.o getblk.o getbits.o store.o recon.o spatscal.o idct.o idctref.o systems.o subspic.o verify.o gvideo.o"
-
-mpeg2dec:
- make -f $(SUBMAKE) APP=mpeg2dec INIT= OTHEROBJS=$(OBJS) OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
Index: rel_1_2/mpeg2/examples
===================================================================
--- rel_1_2/mpeg2/examples (revision 1198)
+++ rel_1_2/mpeg2/examples (nonexistent)
@@ -1,49 +0,0 @@
-EXAMPLES:
-
-1. to decode a bitstream with double precision IDCT, such as
- to create a reference reconstruction set of frames:
-
- mpeg2decode -r -f -o0 rec%d -b bitstream.mpg
-
-2. to decode a bitstream with fast integer IDCT, such as
- to create a test reconstruction set of frames:
-
- mpeg2decode -f -o0 rec%d -b bitstream.mpg
-
-3. To substitute reference pictures with external reference
- pictures (ref%d):
-
- mpeg2decode -f -x ref%d -b bitstream.mpg -o0 rec%d
-
-
-4. Same as 3. only using a single large concatenated file for the
- sequence of reconstruction frames.
-
- mpeg2decode -f -g -x ref%d bitstream.mpg -o0 rec%d
-
-5. Decode an SNR enhancement bitstream at the same time as base layer
- stream:
-
- mpeg2decode -o0 rec%d -e snr_bitstream.mpg -b base_bitstream.mpg
-
-6. Decode a Spatially scalable bitstream
-
- Step 1: create lower layer reconstruction
-
- mpeg2decode -f -o0 llrec%d -b base_layer.mpg
-
- Step 2: decode enhancement bitstream, combined reconstruction.
-
- mpeg2decode -f -l llrec%d -b enhancement_layer.mpg -o0 rec%d
-
-------------
- where:
- -o0 specifies .Y, .U, .V input
- -f specifies field interleaved format
- -b is the bitstream flag
- -g specifies substitute file is a large concatendated one.
- -e substitution flag
- ref.pic filename of substitution sequence
- bitstream.mpg bitstream
- test%d output file pattern
-
Index: rel_1_2/mpeg2/ieee1180
===================================================================
--- rel_1_2/mpeg2/ieee1180 (revision 1198)
+++ rel_1_2/mpeg2/ieee1180 (nonexistent)
@@ -1,245 +0,0 @@
-IEEE 1180 report for mpeg2decode fast integer IDCT:
-
-From stefan@lis.e-technik.tu-muenchen.de Thu May 26 08:18:36 1994
-
-IEEE test conditions: -L = -256, +H = 255, sign = 1, #iters = 10000
-Peak absolute values of errors:
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
-Worst peak error = 1 (meets spec limit 1)
-
-Mean square errors:
- 0.0058 0.0118 0.0097 0.0057 0.0055 0.0117 0.0120 0.0063
- 0.0106 0.0157 0.0142 0.0099 0.0115 0.0168 0.0154 0.0123
- 0.0128 0.0156 0.0152 0.0095 0.0115 0.0147 0.0173 0.0096
- 0.0055 0.0115 0.0103 0.0078 0.0069 0.0092 0.0113 0.0071
- 0.0057 0.0134 0.0123 0.0067 0.0050 0.0109 0.0128 0.0065
- 0.0101 0.0172 0.0159 0.0093 0.0097 0.0148 0.0163 0.0130
- 0.0113 0.0171 0.0148 0.0103 0.0110 0.0153 0.0149 0.0093
- 0.0064 0.0123 0.0104 0.0065 0.0064 0.0111 0.0099 0.0066
-Worst pmse = 0.017300 (meets spec limit 0.06)
-Overall mse = 0.010998 (meets spec limit 0.02)
-
-Mean errors:
- 0.0014 0.0004 0.0003 0.0017 0.0003 0.0011 0.0010 -0.0001
- 0.0000 0.0003 0.0010 0.0003 0.0007 -0.0006 0.0004 0.0033
- 0.0000 -0.0008 -0.0006 0.0009 -0.0015 -0.0013 -0.0017 -0.0008
- -0.0017 0.0019 -0.0005 0.0010 0.0005 0.0000 -0.0017 -0.0001
- 0.0007 0.0034 0.0015 0.0021 0.0016 0.0007 -0.0006 0.0011
- -0.0007 0.0004 -0.0001 0.0003 0.0003 0.0004 0.0031 -0.0010
- 0.0009 -0.0005 -0.0004 0.0003 0.0008 -0.0015 -0.0007 -0.0007
- 0.0024 0.0001 0.0018 -0.0003 -0.0006 -0.0001 0.0009 0.0018
-Worst mean error = 0.003400 (meets spec limit 0.015)
-Overall mean error = 0.000352 (meets spec limit 0.0015)
-
-0 elements of IDCT(0) were not zero
-
-
-25.8u 0.1s 0:27 95% 0+216k 0+2io 0pf+0w
-IEEE test conditions: -L = -5, +H = 5, sign = 1, #iters = 10000
-Peak absolute values of errors:
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
-Worst peak error = 1 (meets spec limit 1)
-
-Mean square errors:
- 0.0008 0.0008 0.0006 0.0006 0.0006 0.0006 0.0007 0.0005
- 0.0005 0.0003 0.0005 0.0001 0.0003 0.0007 0.0007 0.0004
- 0.0004 0.0012 0.0011 0.0007 0.0010 0.0008 0.0010 0.0003
- 0.0004 0.0004 0.0001 0.0002 0.0004 0.0007 0.0009 0.0004
- 0.0005 0.0005 0.0004 0.0002 0.0006 0.0004 0.0012 0.0003
- 0.0008 0.0006 0.0007 0.0007 0.0003 0.0012 0.0011 0.0004
- 0.0006 0.0002 0.0001 0.0002 0.0005 0.0005 0.0007 0.0005
- 0.0008 0.0004 0.0006 0.0003 0.0008 0.0006 0.0002 0.0003
-Worst pmse = 0.001200 (meets spec limit 0.06)
-Overall mse = 0.000561 (meets spec limit 0.02)
-
-Mean errors:
- 0.0008 0.0006 0.0000 0.0006 0.0006 0.0002 0.0005 0.0003
- 0.0005 0.0003 0.0003 0.0001 0.0001 0.0001 0.0005 0.0002
- 0.0004 0.0006 0.0005 0.0007 0.0006 0.0004 0.0002 -0.0001
- 0.0002 0.0002 0.0001 0.0002 0.0004 0.0005 0.0003 0.0002
- 0.0003 0.0003 0.0004 0.0002 0.0006 0.0000 0.0002 0.0003
- -0.0002 0.0004 0.0007 0.0005 0.0001 0.0010 0.0005 -0.0002
- 0.0004 0.0000 0.0001 0.0000 0.0001 0.0003 0.0005 0.0003
- 0.0006 0.0000 0.0002 0.0003 0.0004 0.0002 0.0002 0.0001
-Worst mean error = 0.001000 (meets spec limit 0.015)
-Overall mean error = 0.000311 (meets spec limit 0.0015)
-
-0 elements of IDCT(0) were not zero
-
-
-25.7u 0.1s 0:27 95% 0+216k 0+3io 0pf+0w
-IEEE test conditions: -L = -300, +H = 300, sign = 1, #iters = 10000
-Peak absolute values of errors:
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
-Worst peak error = 1 (meets spec limit 1)
-
-Mean square errors:
- 0.0068 0.0097 0.0119 0.0064 0.0065 0.0105 0.0112 0.0050
- 0.0088 0.0130 0.0128 0.0088 0.0111 0.0152 0.0139 0.0109
- 0.0114 0.0127 0.0157 0.0099 0.0114 0.0137 0.0153 0.0109
- 0.0052 0.0097 0.0120 0.0060 0.0067 0.0114 0.0099 0.0065
- 0.0062 0.0096 0.0091 0.0064 0.0076 0.0092 0.0111 0.0058
- 0.0096 0.0139 0.0166 0.0112 0.0092 0.0141 0.0122 0.0103
- 0.0121 0.0138 0.0131 0.0089 0.0108 0.0172 0.0127 0.0104
- 0.0070 0.0109 0.0092 0.0055 0.0057 0.0128 0.0102 0.0069
-Worst pmse = 0.017200 (meets spec limit 0.06)
-Overall mse = 0.010316 (meets spec limit 0.02)
-
-Mean errors:
- -0.0010 0.0015 0.0001 -0.0004 0.0005 -0.0001 0.0008 0.0000
- 0.0004 0.0016 0.0006 0.0000 -0.0001 0.0004 0.0011 0.0001
- -0.0008 0.0013 0.0015 0.0003 0.0010 0.0005 -0.0005 0.0021
- 0.0006 0.0013 -0.0004 0.0000 0.0007 -0.0002 -0.0009 0.0003
- 0.0004 0.0004 -0.0001 -0.0004 0.0014 0.0018 0.0017 -0.0002
- 0.0024 0.0007 -0.0002 -0.0018 0.0004 0.0001 0.0010 0.0009
- 0.0001 -0.0002 0.0005 0.0003 -0.0016 0.0004 0.0013 -0.0006
- -0.0012 -0.0017 -0.0008 0.0003 0.0001 0.0018 0.0008 -0.0005
-Worst mean error = 0.002400 (meets spec limit 0.015)
-Overall mean error = 0.000309 (meets spec limit 0.0015)
-
-0 elements of IDCT(0) were not zero
-
-
-25.8u 0.0s 0:27 95% 0+216k 0+4io 0pf+0w
-IEEE test conditions: -L = -256, +H = 255, sign = -1, #iters = 10000
-Peak absolute values of errors:
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
-Worst peak error = 1 (meets spec limit 1)
-
-Mean square errors:
- 0.0061 0.0118 0.0097 0.0057 0.0058 0.0113 0.0115 0.0061
- 0.0105 0.0159 0.0138 0.0097 0.0113 0.0166 0.0149 0.0123
- 0.0129 0.0155 0.0152 0.0095 0.0112 0.0145 0.0173 0.0094
- 0.0059 0.0112 0.0105 0.0076 0.0071 0.0091 0.0113 0.0073
- 0.0061 0.0130 0.0128 0.0066 0.0051 0.0108 0.0126 0.0067
- 0.0099 0.0168 0.0161 0.0095 0.0100 0.0149 0.0166 0.0132
- 0.0113 0.0171 0.0150 0.0101 0.0110 0.0157 0.0152 0.0094
- 0.0062 0.0121 0.0102 0.0065 0.0061 0.0112 0.0099 0.0065
-Worst pmse = 0.017300 (meets spec limit 0.06)
-Overall mse = 0.010980 (meets spec limit 0.02)
-
-Mean errors:
- -0.0005 0.0006 0.0001 -0.0007 0.0006 -0.0003 -0.0003 0.0011
- 0.0011 0.0003 -0.0002 0.0005 -0.0001 0.0008 0.0001 -0.0027
- 0.0013 0.0015 0.0010 -0.0001 0.0020 0.0019 0.0025 0.0016
- 0.0023 -0.0008 0.0011 -0.0002 0.0007 0.0003 0.0019 0.0009
- -0.0003 -0.0030 -0.0002 -0.0012 -0.0009 0.0000 0.0010 -0.0005
- 0.0009 0.0002 0.0015 0.0007 0.0002 0.0001 -0.0026 0.0018
- 0.0001 0.0011 0.0010 0.0005 -0.0004 0.0023 0.0014 0.0014
- -0.0014 0.0007 -0.0014 0.0009 0.0013 0.0006 -0.0007 -0.0007
-Worst mean error = 0.003000 (meets spec limit 0.015)
-Overall mean error = 0.000355 (meets spec limit 0.0015)
-
-0 elements of IDCT(0) were not zero
-
-
-25.8u 0.1s 0:27 95% 0+216k 0+3io 0pf+0w
-IEEE test conditions: -L = -5, +H = 5, sign = -1, #iters = 10000
-Peak absolute values of errors:
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
-Worst peak error = 1 (meets spec limit 1)
-
-Mean square errors:
- 0.0010 0.0007 0.0008 0.0004 0.0008 0.0004 0.0005 0.0007
- 0.0005 0.0007 0.0005 0.0004 0.0006 0.0005 0.0005 0.0003
- 0.0003 0.0011 0.0009 0.0007 0.0008 0.0006 0.0011 0.0006
- 0.0003 0.0004 0.0002 0.0002 0.0003 0.0006 0.0008 0.0006
- 0.0004 0.0005 0.0006 0.0006 0.0003 0.0007 0.0007 0.0003
- 0.0013 0.0006 0.0008 0.0005 0.0004 0.0006 0.0008 0.0004
- 0.0003 0.0003 0.0003 0.0002 0.0005 0.0004 0.0006 0.0005
- 0.0005 0.0003 0.0006 0.0005 0.0011 0.0007 0.0005 0.0003
-Worst pmse = 0.001300 (meets spec limit 0.06)
-Overall mse = 0.000561 (meets spec limit 0.02)
-
-Mean errors:
- 0.0002 0.0005 0.0008 0.0000 0.0002 0.0004 0.0003 0.0007
- 0.0001 0.0003 0.0003 0.0002 0.0006 0.0003 0.0001 0.0003
- -0.0001 0.0007 0.0003 0.0001 0.0002 0.0006 0.0005 0.0006
- 0.0001 0.0004 0.0002 0.0002 0.0001 0.0002 0.0004 0.0004
- 0.0002 0.0005 0.0006 0.0004 0.0001 0.0005 0.0005 0.0003
- 0.0009 0.0002 0.0000 0.0001 0.0004 0.0000 0.0006 0.0004
- 0.0003 0.0003 0.0003 0.0002 0.0003 0.0000 0.0004 0.0003
- 0.0003 0.0003 0.0004 0.0003 0.0007 0.0005 0.0005 0.0003
-Worst mean error = 0.000900 (meets spec limit 0.015)
-Overall mean error = 0.000333 (meets spec limit 0.0015)
-
-0 elements of IDCT(0) were not zero
-
-
-25.7u 0.1s 0:27 95% 0+216k 0+0io 0pf+0w
-IEEE test conditions: -L = -300, +H = 300, sign = -1, #iters = 10000
-Peak absolute values of errors:
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
-Worst peak error = 1 (meets spec limit 1)
-
-Mean square errors:
- 0.0067 0.0097 0.0118 0.0060 0.0066 0.0107 0.0113 0.0049
- 0.0082 0.0132 0.0128 0.0088 0.0110 0.0152 0.0140 0.0109
- 0.0122 0.0125 0.0156 0.0098 0.0113 0.0139 0.0152 0.0106
- 0.0054 0.0097 0.0121 0.0064 0.0067 0.0110 0.0096 0.0062
- 0.0064 0.0099 0.0090 0.0067 0.0078 0.0089 0.0112 0.0057
- 0.0098 0.0136 0.0165 0.0111 0.0090 0.0138 0.0120 0.0103
- 0.0121 0.0135 0.0131 0.0087 0.0107 0.0168 0.0128 0.0102
- 0.0069 0.0109 0.0091 0.0057 0.0061 0.0125 0.0103 0.0070
-Worst pmse = 0.016800 (meets spec limit 0.06)
-Overall mse = 0.010283 (meets spec limit 0.02)
-
-Mean errors:
- 0.0015 -0.0009 0.0006 0.0012 0.0002 0.0007 -0.0001 0.0005
- 0.0004 -0.0010 0.0000 0.0004 0.0006 0.0004 -0.0004 0.0007
- 0.0018 -0.0009 -0.0006 0.0000 -0.0003 -0.0001 0.0014 -0.0006
- -0.0002 -0.0011 0.0009 0.0004 -0.0003 0.0010 0.0010 0.0000
- 0.0004 0.0001 0.0010 0.0011 -0.0008 -0.0017 -0.0006 0.0009
- -0.0020 0.0000 0.0007 0.0021 0.0002 0.0002 -0.0004 -0.0003
- 0.0003 0.0005 -0.0003 -0.0001 0.0017 0.0002 -0.0004 0.0010
- 0.0015 0.0023 0.0013 0.0003 0.0005 -0.0011 -0.0003 0.0006
-Worst mean error = 0.002300 (meets spec limit 0.015)
-Overall mean error = 0.000252 (meets spec limit 0.0015)
-
-0 elements of IDCT(0) were not zero
-
-
-25.8u 0.0s 0:27 94% 0+216k 0+3io 0pf+0w
-
Index: rel_1_2/mpeg2/makefile.lib
===================================================================
--- rel_1_2/mpeg2/makefile.lib (revision 1198)
+++ rel_1_2/mpeg2/makefile.lib (nonexistent)
@@ -1,54 +0,0 @@
-#
-# The mpeg library
-#
-
-# (see sources for copyrights)
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-LIBRARY = mpeg2
-
-OBJS_PATH = $(BASE)/ports/mpeg2
-
-DECODER_SRC = util.c \
- video.c \
- parseblock.c \
- motionvector.c \
- decoders.c \
- jrevdct.c \
- wrapper.c \
- gdith.c \
- gdithmni.c \
- readfile.c \
- 16bit.c
-
-DITHER_SRC = fs2.c \
- fs2fast.c \
- fs4.c \
- hybrid.c \
- hybriderr.c \
- 2x2.c \
- gray.c \
- mono.c \
- ordered.c \
- ordered2.c \
- mb_ordered.c
-
-SRCS= $(DECODER_SRC) $(DITHER_SRC)
-
-OBJS= mpeg2dec.o getpic.o motion.o getvlc.o \
- gethdr.o getblk.o getbits.o store.o \
- recon.o spatscal.o idct.o idctref.o \
- display.o systems.o subspic.o verify.o
-
-#C_WARN += -Wno-unused -Wno-uninitialized -Wno-implicit-function-declaration \
-# -Wno-switch -Wno-return-type
-
-#C_DEF += -DNOCONTROLS
-#C_INC += -I.
-
-include $(BASE)/config/lib.mk
-
Index: rel_1_2/tftptest/makefile
===================================================================
--- rel_1_2/tftptest/makefile (revision 1198)
+++ rel_1_2/tftptest/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS = tftptest
-
-include $(BASE)/config/example.mk
-
-tftptest:
- make -f $(SUBMAKE) APP=tftptest INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __TFTP__"
-
Index: rel_1_2/tftptest/tftptest.c
===================================================================
--- rel_1_2/tftptest/tftptest.c (revision 1198)
+++ rel_1_2/tftptest/tftptest.c (nonexistent)
@@ -1,224 +0,0 @@
-#include <string.h>
-#include <kernel/func.h>
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-#include <drivers/udpip.h>
-#include "tftp.h"
-#include "endian.h"
-
-#include "modules/sem.h"
-
-#include <kernel/kern.h>
-#include <drivers/pci.h>
-#include <ll/i386/hw-instr.h>
-
-
-#define LOCAL_HOST_IP "192.168.0.134"
-#define REMOTE_HOST_IP "192.168.0.133"
-
-sem_t m1, m2;
-int handle, handle2;
-
-int prog = 0;
-
-/* This function is called when the user presses CTRL-C (stops the systems) */
-
-void esci(KEY_EVT *k)
-{
- cprintf("Exit from the program...\n");
- cprintf("Ctrl-C pressed!\n");
- sys_abort(500);
-}
-
-void augprog(KEY_EVT *k)
-{
- prog = 1;
-}
-
-void keyb_start(void) {
- KEY_EVT k;
-
- k.flag = CNTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'C';
- keyb_hook(k, esci);
- k.flag = CNTR_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k, esci);
-
- k.flag = CNTL_BIT;
- k.scan = KEY_A;
- k.ascii = 'A';
- keyb_hook(k, augprog);
- k.flag = CNTR_BIT;
- k.scan = KEY_A;
- k.ascii = 'a';
- keyb_hook(k, augprog);
-}
-
-TASK test_upload(void *arg) {
- int i;
- char msg[200];
- int bytes;
-
- i = 0;
- while (1) {
-
-// cprintf("uploader 1\n");
-
- sprintf(msg, "tftptest says: i = %5d\n", i);
- tftp_put(handle, msg, strlen(msg));
-
-// cprintf("uploader 2\n");
-
- bytes = tftp_usedbuffer(handle);
- /*!*/sprintf(msg, "buffer %d ", bytes);
- /*!*/puts_xy(BASE_X, 18, WHITE, msg);
-
-// cprintf("uploader 3\n");
- i++;
-
- task_endcycle();
- }
- return(0);
-}
-
-TASK test_upload2(void *arg) {
- int i;
- char msg[200];
- int bytes;
-
- i = 0;
- while (1) {
-
- sprintf(msg, "tftptest says: i = %5d\n", i);
- tftp_put(handle2, msg, strlen(msg));
-
- bytes = tftp_usedbuffer(handle2);
- /*!*/sprintf(msg, "buffer2 %d ", bytes);
- /*!*/puts_xy(BASE_X, 38, WHITE, msg);
- i++;
-
- task_endcycle();
- }
- return(0);
-}
-
-void wait() {
- char ch;
- do {
- ch = keyb_getch(NON_BLOCK);
- } while(prog == 0);
- prog = 0;
-}
-
-int main(void)
-{
- int err;
- HARD_TASK_MODEL hard_m;
- PID p1, p2;
-
- keyb_start();
- cprintf("main: Keyboard handler started\n");
-
- tftp_init();
- cprintf("main: Tftp library initialized\n");
-
- err = tftp_net_start(LOCAL_HOST_IP, REMOTE_HOST_IP, 1);
- cprintf("netval = %d\n", err);
- if (err == 1) {
- cprintf("Net Init from %s to %s\n", LOCAL_HOST_IP, REMOTE_HOST_IP);
- } else {
- cprintf("Net Init Failed...\n");
- sys_end();
- return(err);
- }
-
- sem_init(&m1, 0, 1);
-
-
- if ((handle = tftp_open("test.txt")) == -1) {
- cprintf("No slots available. Program aborted...\n");
- sys_end();
- return(1);
- }
-
- cprintf("Ctrl-A to proceed *** Ctrl-C to stop\n");
- wait();
- clear();
-
- cprintf("Handle = %d\n", handle);
-
- if ((err = tftp_upload(handle, 4096, &m1)) != 0) {
- cprintf("Error %d calling tftp_upload(). Program aborted...\n", err);
- sys_end();
- return(1);
- }
-
- /* First we set the sender's task properties...*/
- hard_task_default_model(hard_m);
- hard_task_def_wcet(hard_m, 10000);
- hard_task_def_mit(hard_m, 300000);
-
- if ((p1 = task_create("test_upload", test_upload, &hard_m, NULL)) == NIL) {
- cprintf("Error creating test_upload task. Program aborted...\n");
- sys_end();
- return(1);
- }
- if (task_activate(p1) == -1) {
- cprintf("Error activating test_upload task. Program aborted...\n");
- sys_end();
- return(1);
- }
-
-
- sem_init(&m2, 0, 1);
-
- if ((handle2 = tftp_open("test2.txt")) == -1) {
- cprintf("No second slot available. Program aborted...\n");
- sys_end();
- return(1);
- }
-
-
-
- cprintf("Handle2 = %d\n", handle2);
-
- if ((err = tftp_upload(handle2, 4096, &m2)) != 0) {
- cprintf("Error %d calling tftp_upload(). Program aborted...\n", err);
- sys_end();
- return(1);
- }
-
- /* First we set the sender's task properties...*/
- hard_task_default_model(hard_m);
- hard_task_def_wcet(hard_m, 10000);
- hard_task_def_mit(hard_m, 300000);
-
- if ((p2 = task_create("test_upload2", test_upload2, &hard_m, NULL)) == NIL) {
- cprintf("Error creating test_upload2 task. Program aborted...\n");
- sys_end();
- return(1);
- }
- if (task_activate(p2) == -1) {
- cprintf("Error activating test_upload2 task. Program aborted...\n");
- sys_end();
- return(1);
- }
-
-
- wait();
-
- tftp_close(handle, TFTP_STOP_NOW);
-
-
-// wait();
-
- tftp_close(handle2, TFTP_STOP_NOW);
-
- cprintf("\nProgram terminated correctly.\n");
- sys_end();
-
- return(0);
-}
Index: rel_1_2/tftptest/initfile.c
===================================================================
--- rel_1_2/tftptest/initfile.c (revision 1198)
+++ rel_1_2/tftptest/initfile.c (nonexistent)
@@ -1,114 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: initfile.c,v 1.1 2003-10-02 12:45:43 giacomo Exp $
-
- File: $File$
- Revision: $Revision: 1.1 $
- Last update: $Date: 2003-10-02 12:45:43 $
- ------------
-
- System initialization file
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- NRT_TASK_MODEL at level 2
-
- This file is similar to the configuration of kernel/init/hartik3.c
-
- TICK is set to 0 (one-shot timer is used)
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-#include "modules/hartport.h"
-#include "modules/sem.h"
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/oldexamples/fs/common.h
===================================================================
--- rel_1_2/oldexamples/fs/common.h (revision 1198)
+++ rel_1_2/oldexamples/fs/common.h (nonexistent)
@@ -1,15 +0,0 @@
-
-#ifndef _COMMON_H
-#define _COMMON_H
-
-#include <sys/types.h>
-
-extern __dev_t root_device;
-extern __dev_t temp_device;
-
-int choose_temp_callback(__dev_t dev,__uint8_t fs);
-
-void showmessage(char *s);
-void waitend(void);
-
-#endif
Index: rel_1_2/oldexamples/fs/test0.c
===================================================================
--- rel_1_2/oldexamples/fs/test0.c (revision 1198)
+++ rel_1_2/oldexamples/fs/test0.c (nonexistent)
@@ -1,63 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <kernel/func.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <drivers/keyb.h>
-
-#include <sys/mount.h>
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-
-#include "common.h"
-
-#define FILENAME "/TEMP/ALFA1.TXT"
-
-int main(int argc,char *argv[])
-{
- int c;
- int h;
- // int res;
-
- cprintf("OPENING %s\n",FILENAME);
- h=open(FILENAME,O_RDONLY);
- if (h>=0) {
- char buffer[128];
- int len;
- cprintf("OPENED!\n");
-
- cprintf("READING...\n");
- len=read(h,buffer,sizeof(buffer));
- cprintf("READ %i bytes\n",len);
- memset(buffer,'\0',sizeof(buffer));
- cprintf("buffer='%s'\n",buffer);
-
- cprintf("READING...\n");
- len=read(h,buffer,sizeof(buffer));
- cprintf("READ %i bytes\n",len);
- memset(buffer,'\0',sizeof(buffer));
- cprintf("buffer='%s'\n",buffer);
-
- //close(h);
-
- } else
- cprintf("FAILED!\n");
-
- cprintf("Press [x] to exit\n");
-
- while ((c = keyb_getchar()) != 'x') ;
-
- //bdev_dump_status();
-
- return 0;
-}
Index: rel_1_2/oldexamples/fs/tree1.c
===================================================================
--- rel_1_2/oldexamples/fs/tree1.c (revision 1198)
+++ rel_1_2/oldexamples/fs/tree1.c (nonexistent)
@@ -1,154 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <kernel/func.h>
-#include <kernel/model.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mount.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <semaphore.h>
-#include <stdio.h>
-
-#include "common.h"
-
-#define FROMDIR "/TEMP"
-
-char pathname[8192];
-
-int noscroll=1;
-
-static int counter=0;
-
-void viewdir(int prof)
-{
- struct dirent *den;
- struct stat st;
- char *str;
- DIR *d;
- int res;
- int x;
- //int i;
- //static int flag=0;
-
- str=pathname+(x=strlen(pathname));
- d=opendir(pathname);
-
- if (d==NULL) {
- cprintf("ERR: can't open dir %s (errno: %i)\n",pathname,errno);
- return;
- }
-
- while ((den=readdir(d))!=NULL) {
-
- {
- //int c='p';
- //c = keyb_getchar();
- //if (c=='z') inode_stats();
- }
-
- if (x==1&&*pathname=='/')
- strcat(pathname,den->d_name);
- else
- strcat(strcat(pathname,"/"),den->d_name);
-
- /*
- if (!strcmp(den->d_name,"eport.ror")) {
- if (flag==0) debug_info_show(1);
- flag++;
- // inode_stats();
- }
- */
-
- if (counter==22100) noscroll=0;
-
- if (noscroll) {
- place(0,10);
- cprintf(" ");
- place(0,10);
- }
- cprintf("%05i %s\n",++counter,pathname);
- //dcache_stats();
-
- if (!strcmp(den->d_name,".")) goto SKIP;
- if (!strcmp(den->d_name,"..")) goto SKIP;
-
- //goto SKIP;
-
- /*
- if (!strcmp("MSINH.C",den->d_name)) {
- //if (!strcmp("WDIN32.OBJ",den->d_name)) {
- cprintf(">>>START SHOWING DEBUG INFO<<<\n");
- noscroll=0;
- //inode_stats();
- debug_info_show(1);
- }
- */
-
- res=stat(pathname,&st);
- if (res!=0) {
- cprintf("can't stat %s\n",pathname);
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- sys_end();
- l1_exit(0);
- } else {
- if (S_ISDIR(st.st_mode)) {
- viewdir(prof+1);
- }
-
- }
-
- SKIP:
- *str='\0';
- }
-
- closedir(d);
-}
-
-int main(int argc,char *argv[])
-{
- // int res;
-
- //if (noscroll) clear();
-
- //strcpy(pathname,"/");
- //viewdir(0);
-
- showmessage("Try to show all filenames from a directory recursively\n"
- "using one NRT task.\n");
-
- noscroll=0;
- strcpy(pathname,FROMDIR);
- viewdir(0);
-
- //dump_dentry_tree();
-
- /*
- *
- */
-
- /*
- res=umount(temp_device);
- //dump_dentry_tree();
- if (res!=0) {
- cprintf("can't unmount XXX on /TEMP\n");
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- //sys_end();
- return -1;
- }
- */
-
- //bdev_dump_status();
-
- sys_end();
- return 0;
-}
Index: rel_1_2/oldexamples/fs/test1.c
===================================================================
--- rel_1_2/oldexamples/fs/test1.c (revision 1198)
+++ rel_1_2/oldexamples/fs/test1.c (nonexistent)
@@ -1,74 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <kernel/func.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <drivers/keyb.h>
-
-#include <sys/mount.h>
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-
-#include "common.h"
-
-//#define FILENAME "/temp/ALFA1.TXT"
-
-#define FILENAME "/pippo.c"
-
-int leggi(int h)
-{
- char buffer[124];
- int len;
-
- memset(buffer,'\0',sizeof(buffer));
- cprintf("READING...\n");
- len=read(h,buffer,sizeof(buffer)-1);
- cprintf("READ %i bytes\n",len);
- cprintf("buffer='%s'\n",buffer);
-
- return len;
-}
-
-int main(int argc,char *argv[])
-{
- int h;
-
- showmessage("Try lseek() using a file for reading.");
-
- cprintf("OPENING %s\n",FILENAME);
- h=open(FILENAME,O_RDONLY);
-
- if (h>=0) {
- cprintf("OPENED!\n");
-
- leggi(h);
- leggi(h);
- leggi(h);
-
- cprintf("SEEK to 16\n");
- lseek(h,16,SEEK_SET);
-
- leggi(h);
-
- cprintf("SEEK to %i\n",123*3+1);
- lseek(h,123*3+1,SEEK_SET);
-
- leggi(h);
-
- } else
- cprintf("FAILED!\n");
-
- waitend();
-
- return 0;
-}
Index: rel_1_2/oldexamples/fs/test2.c
===================================================================
--- rel_1_2/oldexamples/fs/test2.c (revision 1198)
+++ rel_1_2/oldexamples/fs/test2.c (nonexistent)
@@ -1,57 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <string.h>
-#include "common.c"
-
-int main(int argc,char *argv[])
-{
- int res;
- int c;
- int h;
-
- temp_device=bdev_scan_devices(choose_temp_callback);
- if (temp_device<0) {
- cprintf("can't find a filesystem to mount on /TEMP!!!\n");
- return -1;
- }
-
- /* mounting 2nd msdos partition on /TEMP */
- res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
- if (res!=0) {
- cprintf("can't mount XXX on /TEMP\n");
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- //sys_end();
- return -1;
- }
-
- /*
- *
- */
-
- cprintf("OPENING %s\n",FILENAME);
- h=open(FILENAME,O_RDONLY);
- if (h>=0) {
- char buffer[128];
- int len;
- cprintf("OPENED!\n");
- cprintf("READING...\n");
- len=read(h,buffer,sizeof(buffer));
- cprintf("READ %i bytes\n",len);
- memset(buffer,'\0',sizeof(buffer));
- cprintf("buffer='%s'\n",buffer);
- } else
- cprintf("FAILED!\n");
-
- cprintf("Press [x] to exit\n");
-
- while ((c = keyb_getchar()) != 'x');
-
- bdev_dump_status();
-
- sys_end();
- return 0;
-}
Index: rel_1_2/oldexamples/fs/tree2.c
===================================================================
--- rel_1_2/oldexamples/fs/tree2.c (revision 1198)
+++ rel_1_2/oldexamples/fs/tree2.c (nonexistent)
@@ -1,275 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <kernel/func.h>
-#include <kernel/model.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mount.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <semaphore.h>
-#include <stdio.h>
-
-#include "common.h"
-
-#define NOSHOW
-#undef NOSHOW
-
-#define sem_signal sem_post
-
-int noscroll=0;
-sem_t console;
-
-#define MPROC ((50<(MAX_PROC-10))?50:MAX_PROC-10)
-//#define MWCET 1000l
-//#define MPERIOD (MWCET*(MPROC+10))
-
-TASK viewdir(void *prof);
-sem_t actmutex,actsync;
-char *globpathname;
-PID globpid;
-int counter=0,actcounter=0;
-
-void activate_task(int prof, char *pathname)
-{
- char tname[32];
- NRT_TASK_MODEL m;
- PID pid;
-
-REPEAT:
- sem_wait(&actmutex);
-
- if (actcounter>=MPROC) {
- sem_signal(&actmutex);
- task_delay(10000);
- goto REPEAT;
- }
-
- globpathname=pathname;
- counter++;
- sprintf(tname,"tsk%i",counter);
-
- /*
- printd("Û");
- sem_wait(&console);
- printd("Ü");
- cprintf("%03i has called for ##%s##\n",prof,pathname);
- sem_signal(&console);
- */
-
- nrt_task_default_model(m);
- //soft_task_def_met(m,MWCET);
- //soft_task_def_wcet(m,MWCET);
- //soft_task_def_periodic(m);
- nrt_task_def_arg(m,(void*)counter);
- //soft_task_def_period(m,MPERIOD);
-
- globpid=pid=task_create(tname,viewdir,&m,NULL);
- if (pid==-1) {
- sem_wait(&console);
- cprintf("can't create '%s'\n",tname);
- perror("can't create task");
- sem_signal(&console);
- sys_end();
- return;
- }
- task_activate(pid);
- sem_wait(&actsync);
- actcounter++;
-
- /*
- printd("Û");
- sem_wait(&console);
- printd("Ü");
- if (noscroll) place(0,9);
- cprintf("task running: %5i/%5i --- task started: %5i\n",
- actcounter,MAX_PROC,counter);
- sem_signal(&console);
- */
-
- sem_signal(&actmutex);
-}
-
-/*
- *
- */
-
-int filecounter=0;
-
-TASK viewdir(void *pointer)
-{
- struct dirent *den;
- struct stat st;
- char *str;
- DIR *d;
- int res;
- int x;
- char pathname[1024];
- PID mypid;
- int prof=(int)pointer;
-
- strcpy(pathname,globpathname);
- mypid=globpid;
- sem_signal(&actsync);
-
- //sem_wait(&console);
- //cprintf("%03i on <%s>\n",prof,pathname);
- //sem_signal(&console);
-
- str=pathname+(x=strlen(pathname));
- d=opendir(pathname);
-
- if (d==NULL) {
- sem_wait(&console);
- cprintf("%03i ERR: can't open dir %s\n",prof,pathname);
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- sem_signal(&console);
-
- sys_end();
- l1_exit(0);
-
- goto END;
- }
-
- while ((den=readdir(d))!=NULL) {
-
- if (x==1&&*pathname=='/')
- strcat(pathname,den->d_name);
- else
- strcat(strcat(pathname,"/"),den->d_name);
-
- sem_wait(&console);
-#ifndef NOSHOW
- if (noscroll) {
- place(0,10);
- cprintf(" ");
- place(0,10);
- }
- //cprintf("%03i(0_%03i) %s\n",prof,(int)mypid,pathname);
- cprintf("t%03i %s\n",prof,pathname);
-#endif
- filecounter++;
- sem_signal(&console);
-
- //if (*den->d_name=='.') {
- // sem_wait(console,BLOCK);
- // cprintf("%03i HAS FOUND <%s>\n",prof,den->d_name);
- // sem_signal(console);
- //}
-
- if (!strcmp(den->d_name,".")) {
- //sem_wait(console,BLOCK);
- //cprintf("%03i skip for .\n",prof);
- //sem_signal(console);
- goto SKIP;
- }
- if (!strcmp(den->d_name,"..")) {
- //sem_wait(console,BLOCK);
- //cprintf("%03i skip for ..\n",prof);
- //sem_signal(console);
- goto SKIP;
- }
-
- res=stat(pathname,&st);
- if (res!=0) {
- sem_wait(&console);
- cprintf("t%03i can't stat %s\n",prof,pathname);
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- sem_signal(&console);
-
- sys_end();
- l1_exit(0);
-
- closedir(d);
- goto END;
- } else {
- if (S_ISDIR(st.st_mode)) {
- sem_wait(&console);
- //if (den->d_name[0]=='.')
- // cprintf("%03i called for <%s>\n",prof,den->d_name);
- sem_signal(&console);
- activate_task(prof,pathname);
- }
-
- }
-
- SKIP:
- *str='\0';
- }
-
- closedir(d);
-
-END:
- sem_wait(&actmutex);
- actcounter--;
- sem_signal(&actmutex);
-
- return 0;
-}
-
-int main(int argc,char *argv[])
-{
- extern void dump_sem_table(void);
- TIME stime,etime;
- // int res;
-
- /*
- temp_device=bdev_scan_devices(choose_temp_callback);
- if (temp_device<0) {
- cprintf("can't find a filesystem to mount on /TEMP!!!\n");
- return -1;
- }
- */
-
- /* mounting 2nd msdos partition on /TEMP */
- /*
- res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
- if (res!=0) {
- cprintf("can't mount XXX on /TEMP\n");
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- return -1;
- }
- */
-
- /* clear screen */
- //clear();
-
- showmessage("This test show all filenames of a directory of an hardisk\n"
- "recursively using a soft task for every directory.\n");
-
- stime=sys_gettime(NULL);
-
- sem_init(&console,0,1);
- sem_init(&actmutex,0,1);
- sem_init(&actsync,0,0);
-
- //dump_sem_table();
-
- //keyb_getchar();
-
- activate_task(-1,"/TEMP");
-
- for(;;) {
- sem_wait(&actmutex);
- if (actcounter==0) break;
- sem_signal(&actmutex);
- }
-
- etime=sys_gettime(NULL);
-
- cprintf("\nfiles: %i\n",filecounter);
- cprintf("time : %li\n",etime-stime);
-
- waitend();
-
- return 0;
-}
Index: rel_1_2/oldexamples/fs/hello.c
===================================================================
--- rel_1_2/oldexamples/fs/hello.c (revision 1198)
+++ rel_1_2/oldexamples/fs/hello.c (nonexistent)
@@ -1,13 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <ll/i386/cons.h>
-
-int main(int argc,char *argv[])
-{
- cprintf("\nHello, world!\n\n");
- return 0;
-}
Index: rel_1_2/oldexamples/fs/testu.c
===================================================================
--- rel_1_2/oldexamples/fs/testu.c (revision 1198)
+++ rel_1_2/oldexamples/fs/testu.c (nonexistent)
@@ -1,47 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <ll/i386/cons.h>
-#include <kernel/func.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <drivers/keyb.h>
-
-#include <sys/mount.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-
-#include "common.h"
-
-#define FILENAME "/TEMP/TESTW1.TXT"
-
-//#define FILENAME "/TEMP/CIR2"
-
-extern dev_t temp_device;
-
-int main(int argc,char *argv[])
-{
- int res;
-
- showmessage("Try to unlink (ie. delete) a file.\n");
-
- cprintf("UNLINKING %s\n",FILENAME);
- res=unlink(FILENAME);
- if (res!=0) {
- cprintf("FAILED!\n");
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- } else cprintf("OK!\n");
-
- waitend();
-
- return 0;
-}
Index: rel_1_2/oldexamples/fs/testw0.c
===================================================================
--- rel_1_2/oldexamples/fs/testw0.c (revision 1198)
+++ rel_1_2/oldexamples/fs/testw0.c (nonexistent)
@@ -1,54 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <ll/i386/cons.h>
-#include <kernel/func.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <drivers/keyb.h>
-
-#include <sys/mount.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-
-#include "common.h"
-
-#define FILENAME "/TEMP/TESTW0.TXT"
-
-extern dev_t temp_device;
-
-int main(int argc,char *argv[])
-{
- int res;
- // int c;
- int h;
-
- showmessage("Try to create and truncate a file.\n");
-
- cprintf("OPENING %s\n",FILENAME);
- h=open(FILENAME,O_CREAT|O_WRONLY|O_TRUNC);
- if (h!=-1) {
- cprintf("CLOSING %s\n",FILENAME);
- res=close(h);
- if (res!=0) {
- cprintf("CLOSE FAILED!\n");
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- }
- } else {
- cprintf("FAILED!\n");
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- }
-
- waitend();
-
- return 0;
-}
Index: rel_1_2/oldexamples/fs/testw1.c
===================================================================
--- rel_1_2/oldexamples/fs/testw1.c (revision 1198)
+++ rel_1_2/oldexamples/fs/testw1.c (nonexistent)
@@ -1,71 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <kernel/func.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <drivers/keyb.h>
-
-#include <sys/mount.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-
-#include "common.h"
-
-#define FILENAME "/TEMP/TESTW1.TXT"
-
-int scrivi(int h,char *buffer,int len)
-{
- int res;
- cprintf("WRITING...\n");
- res=write(h,buffer,len);
- cprintf("WRITTEN %i bytes\n",res);
- if (res>0) {
- buffer[res]='\0';
- cprintf("(%s)\n",buffer);
- } else cprintf("errno: %i '%s'\n",errno,strerror(errno));
- return res;
-}
-
-extern dev_t temp_device;
-
-int main(int argc,char *argv[])
-{
- int res;
- int h;
-
- showmessage("Try to create and overwriting a file.\n");
-
- cprintf("OPENING %s\n",FILENAME);
- h=open(FILENAME,O_CREAT|O_WRONLY|O_TRUNC);
-
- if (h>=0) {
- cprintf("OPENED fd=%i!\n",h);
-
- scrivi(h,"ABC ",3);
-
- scrivi(h,"abcdefghilmnopqrstuvz ",21);
-
- res=close(h);
- if (res!=0) {
- cprintf("CLOSE FAILED!\n");
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- }
- } else {
- cprintf("FAILED!\n");
- cprintf("errno: %i '%s'\n",errno,strerror(errno));
- }
-
- waitend();
-
- return 0;
-}
Index: rel_1_2/oldexamples/fs/common.c
===================================================================
--- rel_1_2/oldexamples/fs/common.c (revision 1198)
+++ rel_1_2/oldexamples/fs/common.c (nonexistent)
@@ -1,135 +0,0 @@
-
-#include <kernel/func.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <drivers/keyb.h>
-
-#include <sys/mount.h>
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-
-/* -- */
-
-int __register_sub_init_prologue(void)
-{
- return 0;
-}
-
-int __register_sub_init(void)
-{
- return 0;
-}
-
-/* -- */
-
-__dev_t root_device;
-__dev_t temp_device;
-
-int choose_root_callback(__dev_t dev,__uint8_t fs)
-{
- if (fs==FS_MSDOS) return dev;
- return -1;
-}
-
-int choose_temp_callback(__dev_t dev,__uint8_t fs)
-{
- static int flag=0;
- if (fs==FS_MSDOS) {
- if (flag) return dev;
- flag=1;
- }
- return -1;
-}
-
-/* -- */
-
-//extern int bdev_scan_devices(int(*callback)(__dev_t,__uint8_t));
-
-int __bdev_sub_init(void)
-{
- BDEV_PARMS bdev=BASE_BDEV;
-
- bdev_def_showinfo(bdev,TRUE);
- bdev_init(&bdev);
-
- root_device=bdev_scan_devices(choose_root_callback);
- if (root_device<0) {
- cprintf("can't find root device to mount on /!!!\n");
- sys_end();
- return -1;
- }
-
- temp_device=bdev_scan_devices(choose_temp_callback);
- if (temp_device<0) {
- cprintf("can't find a filesystem to mount on /TEMP!!!\n");
- }
-
- return 0;
-}
-
-/* -- */
-
-extern int libc_initialize(void);
-
-int __fs_sub_init(void)
-{
- FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
- struct mount_opts opts;
- int res;
-
- filesystem_def_rootdevice(fs,root_device);
- filesystem_def_fs(fs,FS_MSDOS);
- filesystem_def_showinfo(fs,TRUE);
- filesystem_init(&fs);
-
- libc_initialize();
-
- if (temp_device>=0) {
- memset(&opts,0,sizeof(struct mount_opts));
- opts.flags=MOUNT_FLAG_RW;
- res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
- if (res!=0) {
- cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
- }
- }
-
- return 0;
-}
-
-/* -- */
-
-
-/* -- */
-
-void ctrlc_exit(KEY_EVT *k)
-{
- extern void dump_sem_table(void);
- extern void dump_nop_table(void);
- //dump_sem_table();
- //dump_nop_table();
- cprintf("CTRL-C pressed!\n");
- sys_end();
-}
-
-/* -- */
-
-void showmessage(char *s)
-{
- cputs(s);
- cprintf("Press [x] to begin...");
- while (keyb_getchar()!='x');
- cprintf("\n");
-}
-
-void waitend(void)
-{
- int c;
- cprintf("Press [x] to exit...");
- while ((c=keyb_getchar())!='x');
- cprintf("\n");
-}
Index: rel_1_2/oldexamples/fs/initfs.c
===================================================================
--- rel_1_2/oldexamples/fs/initfs.c (revision 1198)
+++ rel_1_2/oldexamples/fs/initfs.c (nonexistent)
@@ -1,119 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: initfs.c,v 1.1 2002-11-11 07:42:40 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1 $
- * Last update: $Date: 2002-11-11 07:42:40 $
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/cbs.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-#include "modules/nopm.h"
-
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- extern int __register_sub_init_prologue(void);
- extern int __register_sub_init(void);
-
- __register_sub_init_prologue();
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- PC_register_module();
- NPP_register_module();
- SRP_register_module();
- NOP_register_module();
- NOPM_register_module();
-
- __register_sub_init();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- KEYB_PARMS keyb = BASE_KEYB;
- extern int __bdev_sub_init(void);
- extern int __fs_sub_init(void);
- extern void ctrlc_exit(KEY_EVT *k);
-
- HARTPORT_init();
-
- keyb_def_ctrlC(keyb, ctrlc_exit);
- KEYB_init(&keyb);
-
- __bdev_sub_init();
- __fs_sub_init();
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/oldexamples/fs/makefile
===================================================================
--- rel_1_2/oldexamples/fs/makefile (revision 1198)
+++ rel_1_2/oldexamples/fs/makefile (nonexistent)
@@ -1,45 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS=hello
-PROGS+=test0 test1
-PROGS+=testw0 testw1
-PROGS+=tree1 tree2
-PROGS+=testu
-OBJS=common.o
-
-include $(BASE)/config/example.mk
-
-#
-#
-#
-
-hello:
- make -f $(SUBMAKE) BASE=$(BASE) APP=hello INIT=initfs.o OTHEROBJS=common.o
-
-test0:
- make -f $(SUBMAKE) BASE=$(BASE) APP=test0 INIT=initfs.o OTHEROBJS=common.o
-
-test1:
- make -f $(SUBMAKE) BASE=$(BASE) APP=test1 INIT=initfs.o OTHEROBJS=common.o
-
-testu:
- make -f $(SUBMAKE) BASE=$(BASE) APP=testu INIT=initfs.o OTHEROBJS=common.o
-
-testw0:
- make -f $(SUBMAKE) BASE=$(BASE) APP=testw0 INIT=initfs.o OTHEROBJS=common.o
-
-testw1:
- make -f $(SUBMAKE) BASE=$(BASE) APP=testw1 INIT=initfs.o OTHEROBJS=common.o
-
-tree1:
- make -f $(SUBMAKE) BASE=$(BASE) APP=tree1 INIT=initfs.o OTHEROBJS=common.o
-
-tree2:
- make -f $(SUBMAKE) BASE=$(BASE) APP=tree2 INIT=initfs.o OTHEROBJS=common.o
Index: rel_1_2/oldexamples/mpeg/mplay.c
===================================================================
--- rel_1_2/oldexamples/mpeg/mplay.c (revision 1198)
+++ rel_1_2/oldexamples/mpeg/mplay.c (nonexistent)
@@ -1,512 +0,0 @@
-/*
- * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Gerardo Lamastra <gerardo@sssup.it>
- *
- * Authors : Luca Abeni <luca@hartik.sssup.it>
- * Massimiliano Giorgi <massy@hartik.sssup.it>
- * (see authors.txt for full list of hartik's authors)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://hartik.sssup.it
- */
-
-/*
- * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: mplay.c,v 1.2 2003-01-07 17:10:17 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.2 $
- * Last update: $Date: 2003-01-07 17:10:17 $
- */
-
-#include <ll/sys/types.h>
-
-#include <kernel/func.h>
-#include <kernel/const.h>
-
-//#include <hartik.h>
-#include <drivers/keyb.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-
-//#include <xdos.h>
-#include <drivers/glib.h>
-
-#include "mpeg/video.h"
-/*#include "proto.h"*/
-#include "mpeg/util.h"
-#include "mpeg/dither.h"
-#include "mpeg/mpeg.h"
-
-
-
-
-
-
-#include <drivers/keyb.h>
-
-void ctrlc_exit(KEY_EVT *k)
-{
- extern void dump_sem_table(void);
- extern void dump_nop_table(void);
- grx_close();
- cprintf("CTRL-C pressed!\n");
- grx_modeinfo();
- sys_end();
-}
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <sys/types.h>
-#include <sys/mount.h>
-
-int __register_sub_init_prologue(void)
-{
- return 0;
-}
-
-int __register_sub_init(void)
-{
- return 0;
-}
-
-dev_t root_device;
-
-int choose_root_callback(dev_t dev,u_int8_t fs)
-{
- if (fs==FS_MSDOS) return dev;
- return -1;
-}
-
-int __bdev_sub_init(void)
-{
- BDEV_PARMS bdev=BASE_BDEV;
-
- bdev_def_showinfo(bdev,TRUE);
- bdev_init(&bdev);
-
- root_device=bdev_scan_devices(choose_root_callback);
- if (root_device<0) {
- cprintf("can't find root device to mount on /!!!\n");
- sys_end();
- return -1;
- }
-
- return 0;
-}
-
-extern int libc_initialize(void);
-
-int __fs_sub_init(void)
-{
- FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
- //struct mount_opts opts;
-
- //memset(&opts,0,sizeof(struct mount_opts));
- //opts.flags=MOUNT_FLAG_RW;
-
- filesystem_def_rootdevice(fs,root_device);
- filesystem_def_fs(fs,FS_MSDOS);
- filesystem_def_showinfo(fs,TRUE);
- filesystem_init(&fs);
-
- libc_initialize();
-
- return 0;
-}
-
-
-
-
-
-int x_fseek(FILE *file, long where, int from)
-{
- return fseek(file,where,from);
-}
-
-size_t x_fread(void *buffer, size_t size, size_t n, FILE *file)
-{
- return fread(buffer,size,n,file);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-TIME ttt;
-
-DWORD n;
-
-///* #define GPHBDIM 4097152 */
-//#define GPHBDIM 1000000
-
-//BYTE gphb[GPHBDIM]; /* Std Dim: 2M */
-//BYTE *nextphbyte = gphb;
-
-struct streamdescr {
- FILE *f;
- ImageDesc *i;
- int x1, y1;
-} sd[10];
-
-#define SCREENX 800
-#define SCREENY 600
-
-void txtreset(void *dummy)
-{
- grx_close();
- grx_modeinfo();
- /* cprintf("Total frames: %ld\n", i);
- cprintf("Total time: %lu\n", t);*/
- //cprintf("Frame rate: %lu\n", (n * 1000) / ttt);
- /* cprintf("Max frame time: %lu\n", mft);*/
-}
-
-#define MAINSLEEP 20000
-
-void drawload(TIME l)
-{
- #define LLPWINSIZE 20
- int actl;
-// struct load l;
- #define LOADX 500
- #define LOADY 300
- #define LOADYDIM 50
- #define LOADXDIM 100
- static int th = 0;
- static int x = 0;
- static int hy[LLPWINSIZE];
- static int somma = 0;
- int i;
-
-/* for (i = 0; i < LLPWINSIZE; i++) hy[i] = 0; */
-
-// load_actual(&l);
-// actl = (LOADYDIM * l.actual) / l.rif + 1;
-// {
-// char str[80];
-// sprintf(str,"%d",actl);
-// /*grx_text("Ciao", 200, 200, color16(31, 63, 31), 0);*/
-// grx_text(" ", 100, 400, 100, 0);
-// grx_text(str, 100, 400, 100,0);
-// }
-/* LowPass Filter */
-
-
- actl=((long)l*LOADYDIM)/MAINSLEEP+1;
-
- somma += actl - hy[th];
- hy[th] = actl;
- th = (th + 1) % LLPWINSIZE;
- actl = somma / LLPWINSIZE;
- grx_line(LOADX+x,LOADY,LOADX+x,(LOADY+LOADYDIM),0);
- if (actl > LOADYDIM) actl = LOADYDIM;
- grx_line(LOADX+x,(LOADY + actl),LOADX+x,(LOADY+LOADYDIM),255);
-
- x = (x + 1) % LOADXDIM;
-
-}
-
-
-
-TASK play(void *arg)
-{
- int i=(int)arg;
- int loop = TRUE;
- BYTE *pixels;
- int moreframes = TRUE;
- FILE *mpeg = sd[i].f;
- ImageDesc *img = sd[i].i;
- int x1, y1, x2, y2;
-
- /*printf ("Task %d: Movie is %d x %d pixels\n", i, img->Width, img->Height);
- printf ("Required picture rate = %d, required bit rate = %d\n",
- img->PictureRate, img->BitRate);*/
-
- pixels = (BYTE *) malloc(img->Size * sizeof(BYTE));
- x1 = sd[i].x1;
- y1 = sd[i].y1;
- x2 = x1 + img->Width-1;
- y2 = y1 + img->Height-1;
- while (loop) { /* play the whole movie forever */
- loop = 1;
- n = 0;
- ttt = sys_gettime(NULL);
- while (moreframes) {
- //cprintf("°");
- moreframes = GetMPEGFrame (img, pixels);
- grx_putimage(x1, y1, x2, y2, pixels);
- n++;
- task_endcycle();
- }
- ttt = sys_gettime(NULL) - ttt;
- RewindMPEG (mpeg, img);
- SetMPEGOption (img, MPEG_DITHER, GRAY_DITHER);
- moreframes = TRUE;
- }
-
- return 0;
-}
-
-
-
-int main(int argc, char *argv[])
-{
- // SYS_PARMS sp = BASE_SYS;
- KEY_EVT k;
- // MODEL m = BASE_MODEL;
- PID pid;
-
- // DOS_FILE *Infile;
-// BYTE *mpegbuff[10], *p;
-// WORD res;
-// DWORD cnt[10];
-
-
-TIME sum;
-
- SOFT_TASK_MODEL model;
-
- FILE *mpeg;
- ImageDesc img[10];
- int full_color = FALSE;
-
- int mode;
- int esc;
- int i;
- int actx = 10, acty = 10;
- ColormapEntry *cp;
-
- //cprintf("file '%s'\n",argv[1]);
-
- if (argc < 2) {
- fprintf (stderr, "Usage: %s mpegfile\n", argv[0]);
- sys_abort(301);
- }
-
- /*
- for (i = 0; i < argc - 1; i++) {
- Infile = DOS_fopen(argv[i + 1], "r");
- if (!Infile) {
- cprintf("%s not found!!!\n", argv[i + 1]);
- sys_abort(300);
- }
- cprintf("\n %s Opened!!!\n\n", argv[i + 1]);
-
- mpegbuff[i] = nextphbyte;
- p = mpegbuff[i]; cnt[i] = 0;
- res = 0x1000;
- while (res > 0) {
- res = DOS_fread(p, 0x1000, 1, Infile);
- cnt[i] += res;
- p += res;
- }
- p += res;
- nextphbyte = p;
- }
- */
-
- /* OK, Now we can start the system!!! */
- //sys_init(&sp);
- //keyb_init(SOFT, 100);
- // keyb_init(NULL);
- // k.flag = CNTR_BIT;
- // k.scan = KEY_C;
- // k.ascii = 'c';
- //keyb_excset(k,endfun);
-
- //vfs_init();
- /*
- for (i = 0; i < argc - 1; i++) {
- vfs_assign(argv[i + 1], mpegbuff[i], cnt[i]);
- }
- */
-
-
-
-
-
-
- /* Init the graph... */
- if (grx_init() == -1) {
- cprintf("No init!!!\n");
- sys_abort(255);
- }
-
- mode = grx_getmode(SCREENX, SCREENY, 8);
- cprintf("Mode num: %x\n", mode);
- grx_cardinfo();
- cprintf("[hit enter to continue]\n");
- esc = FALSE;
- while (!esc) {
- keyb_getcode(&k,BLOCK);
- if (k.ascii == 13) esc = TRUE;
- }
-
-
- if (mode == -1) {
- cprintf("Mode not present!!!\n");
- sys_abort(255);
- }
-
- if (grx_setmode(mode) == -1) {
- cprintf("No SetMode!!!\n");
- sys_abort(255);
- }
-
- //sys_atexit(txtreset,NULL,AFTER_EXIT);
-
-
- //cprintf("Û0Û");
-
- for (i = 0; i < argc - 1; i++) {
- mpeg = fopen(argv[i + 1], "r");
-
- if (!mpeg) {
- perror (argv[1]);
- sys_abort(301);
- }
-
-
- setvbuf(mpeg,NULL,_IOFBF,BUFSIZ*100);
-
-
- //cprintf("Û0.5Û");
-
- /* !!! */
- img[i].vid_stream=NULL;
- img[i].Colormap=NULL;
-
- if (!OpenMPEG(mpeg, &(img[i]))) {
- fprintf (stderr, "OpenMPEG on %s failed\n", argv[i + 1]);
- sys_abort(301);
- }
-
-
- //cprintf("Û1Û");
-
-
-
- SetMPEGOption (&(img[i]), MPEG_DITHER, GRAY_DITHER);
- //SetMPEGOption (&(img[i]), MPEG_DITHER, FS4_DITHER);
-
-
- /* SetMPEGOption(MPEG_DITHER, GRAY_DITHER); */
-
- /* printf ("Movie is %d x %d pixels\n", img[i].Width, img[i].Height);
- printf ("Required picture rate = %d, required bit rate = %d\n",
- img[i].PictureRate, img[i].BitRate); */
-
- //cprintf("Û2Û");
-
- if (i == 0) {
- cp = img[i].Colormap;
-
- if (!full_color) {
- int ii;
-
- for (ii = 0; ii < img[i].ColormapSize; ii++) {
-
-
- grx_setcolor (ii, img[i].Colormap[ii].red / 4,
- img[i].Colormap[ii].green / 4,
- img[i].Colormap[ii].blue / 4);
-
-
- }
-
- /*NO!!! Colormap is an array of short, setpalette wants an array of BYTE!!!*/
- /* grx_setpalette(0, 255, img.Colormap);*/
- }
- }
- if (actx + img[i].Width > SCREENX) {
- actx = 10;
- acty += 200;
- }
- sd[i].x1 = actx;
- sd[i].y1 = acty;
- sd[i].f = mpeg;
- sd[i].i = &(img[i]);
-
- //cprintf("Û3Û");
-
- soft_task_default_model(model);
- ////soft_task_def_system(model);
- //soft_task_def_met(model,9000);
- //soft_task_def_wcet(model,9000);
- //soft_task_def_period(model,50000);
-
- soft_task_def_met(model,5000);
- soft_task_def_wcet(model,15000);
- soft_task_def_period(model,40000);
- soft_task_def_periodic(model);
- soft_task_def_arg(model,(void*)i);
- soft_task_def_ctrl_jet(model);
-
- //task_def_arg(m, i);
- //task_def_wcet(m, 9000);
- pid = task_create("video", play, &model, NULL);
- if (pid == -1) {
- cprintf(" task --> Not Guaranteed!!!\n");
- sys_abort(20000);
- }
- task_activate(pid);
-
- //cprintf("Û4Û");
-
- actx += img[i].Width + 10;
- }
-
- /* play(0);*/
- esc = FALSE;
- //jet_delstat(pid);
- while (!esc) {
- if (keyb_getcode(&k,NON_BLOCK) && (k.ascii == 13)) esc = TRUE;
- task_delay(MAINSLEEP);
- //jet_getstat(pid,&sum,NULL,NULL,NULL);
- //jet_delstat(pid);
- //drawload(sum);
- }
-
- sys_abort(59000);
-
- return 0;
-}
Index: rel_1_2/oldexamples/mpeg/mplay2.c
===================================================================
--- rel_1_2/oldexamples/mpeg/mplay2.c (revision 1198)
+++ rel_1_2/oldexamples/mpeg/mplay2.c (nonexistent)
@@ -1,590 +0,0 @@
-/*
- * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Gerardo Lamastra <gerardo@sssup.it>
- *
- * Authors : Luca Abeni <luca@hartik.sssup.it>
- * Massimiliano Giorgi <massy@hartik.sssup.it>
- * (see authors.txt for full list of hartik's authors)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://hartik.sssup.it
- */
-
-/*
- * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: mplay2.c,v 1.2 2003-01-07 17:10:17 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.2 $
- * Last update: $Date: 2003-01-07 17:10:17 $
- */
-
-#include <ll/sys/types.h>
-
-#include <kernel/func.h>
-#include <kernel/const.h>
-
-//#include <hartik.h>
-#include <drivers/keyb.h>
-
-
-
-#include <trace/trace.h>
-#include <trace/queues.h>
-
-
-
-#include <stdlib.h>
-#include <stdio.h>
-
-//#include <xdos.h>
-#include <drivers/glib.h>
-
-#include "mpeg/video.h"
-/*#include "proto.h"*/
-#include "mpeg/util.h"
-#include "mpeg/dither.h"
-#include "mpeg/mpeg.h"
-
-
-
-
-
-
-
-
-//#define NOSHOW 1
-
-
-
-
-#include <drivers/keyb.h>
-
-
-int mustdied=0;
-
-
-void ctrlc_exit(KEY_EVT *k)
-{
- extern void dump_sem_table(void);
- extern void dump_nop_table(void);
- mustdied=1;
-#ifndef NOSHOW
- grx_close();
-#endif
- cprintf("CTRL-C pressed!\n");
-#ifndef NOSHOW
- grx_modeinfo();
-#endif
- sys_end();
-}
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <sys/types.h>
-#include <sys/mount.h>
-
-int __register_sub_init_prologue(void)
-{
- int id;
- TRC_init_phase1(NULL);
- trc_register_fixed_queue();
- id=trc_create_queue(TRC_FIXED_QUEUE,NULL);
- trc_trace_class(TRC_CLASS_USER);
- trc_assign_class_to_queue(TRC_CLASS_USER,id);
- return 0;
-}
-
-int __register_sub_init(void)
-{
- return 0;
-}
-
-dev_t root_device;
-dev_t temp_device;
-
-int choose_root_callback(dev_t dev,u_int8_t fs)
-{
- if (fs==FS_MSDOS) return dev;
- return -1;
-}
-
-int choose_temp_callback(__dev_t dev,__uint8_t fs)
-{
- static int flag=0;
- if (fs==FS_MSDOS) {
- if (flag) return dev;
- flag=1;
- }
- return -1;
-}
-
-int __bdev_sub_init(void)
-{
- BDEV_PARMS bdev=BASE_BDEV;
-
- bdev_def_showinfo(bdev,FALSE);
- bdev_init(&bdev);
-
- root_device=bdev_scan_devices(choose_root_callback);
- if (root_device<0) {
- cprintf("can't find root device to mount on /!!!\n");
- sys_end();
- return -1;
- }
-
- temp_device=bdev_scan_devices(choose_temp_callback);
- if (temp_device<0) {
- cprintf("can't find a filesystem to mount on /TEMP!!!\n");
- }
-
- return 0;
-}
-
-extern int libc_initialize(void);
-
-int __fs_sub_init(void)
-{
- FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
- struct mount_opts opts;
- int res;
-
- filesystem_def_rootdevice(fs,root_device);
- filesystem_def_fs(fs,FS_MSDOS);
- filesystem_def_showinfo(fs,FALSE);
- filesystem_init(&fs);
-
- if (temp_device>=0) {
- memset(&opts,0,sizeof(struct mount_opts));
- opts.flags=MOUNT_FLAG_RW;
- res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
- if (res!=0) {
- cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
- } else
- cprintf("mounted /TEMP rw\n");
-
- }
-
- libc_initialize();
-
- TRC_init_phase2();
-
- return 0;
-}
-
-int x_fseek(FILE *file, long where, int from)
-{
- return fseek(file,where,from);
-}
-
-size_t x_fread(void *buffer, size_t size, size_t n, FILE *file)
-{
- return fread(buffer,size,n,file);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-TIME ttt;
-
-DWORD n[10];
-
-///* #define GPHBDIM 4097152 */
-//#define GPHBDIM 1000000
-
-//BYTE gphb[GPHBDIM]; /* Std Dim: 2M */
-//BYTE *nextphbyte = gphb;
-
-struct streamdescr {
- FILE *f;
- ImageDesc *i;
- int x1, y1;
-} sd[10];
-
-#define SCREENX 800
-#define SCREENY 600
-
-void txtreset(void *dummy)
-{
-#ifndef NOSHOW
- grx_close();
- grx_modeinfo();
- /* cprintf("Total frames: %ld\n", i);
- cprintf("Total time: %lu\n", t);*/
- //cprintf("Frame rate: %lu\n", (n * 1000) / ttt);
- /* cprintf("Max frame time: %lu\n", mft);*/
- /*
- sys_status(READY_RT_STATUS | READY_NRT_STATUS | BLOCKED_STATUS |
- IDLE_STATUS | SLEEP_STATUS | EXEC_STATUS);
- */
-#endif
-}
-
-#define MAINSLEEP 20000
-
-void drawload(TIME l)
-{
- #define LLPWINSIZE 20
- int actl;
-// struct load l;
- #define LOADX 500
- #define LOADY 300
- #define LOADYDIM 50
- #define LOADXDIM 100
- static int th = 0;
- static int x = 0;
- static int hy[LLPWINSIZE];
- static int somma = 0;
- int i;
-
-/* for (i = 0; i < LLPWINSIZE; i++) hy[i] = 0; */
-
-// load_actual(&l);
-// actl = (LOADYDIM * l.actual) / l.rif + 1;
-// {
-// char str[80];
-// sprintf(str,"%d",actl);
-// /*grx_text("Ciao", 200, 200, color16(31, 63, 31), 0);*/
-// grx_text(" ", 100, 400, 100, 0);
-// grx_text(str, 100, 400, 100,0);
-// }
-/* LowPass Filter */
-
-
- actl=((long)l*LOADYDIM)/MAINSLEEP+1;
-
- somma += actl - hy[th];
- hy[th] = actl;
- th = (th + 1) % LLPWINSIZE;
- actl = somma / LLPWINSIZE;
-#ifndef NOSHOW
- grx_line(LOADX+x,LOADY,LOADX+x,(LOADY+LOADYDIM),0);
- if (actl > LOADYDIM) actl = LOADYDIM;
- grx_line(LOADX+x,(LOADY + actl),LOADX+x,(LOADY+LOADYDIM),255);
-#endif
- x = (x + 1) % LOADXDIM;
-
-}
-
-
-
-TASK play(void *arg)
-{
- int i=(int)arg;
- int loop = TRUE;
- BYTE *pixels;
- int moreframes = TRUE;
- FILE *mpeg = sd[i].f;
- ImageDesc *img = sd[i].i;
- int x1, y1, x2, y2;
-
- /*printf ("Task %d: Movie is %d x %d pixels\n", i, img->Width, img->Height);
- printf ("Required picture rate = %d, required bit rate = %d\n",
- img->PictureRate, img->BitRate);*/
-
- pixels = (BYTE *) malloc(img->Size * sizeof(BYTE));
- x1 = sd[i].x1;
- y1 = sd[i].y1;
- x2 = x1 + img->Width-1;
- y2 = y1 + img->Height-1;
- while (loop) { /* play the whole movie forever */
- loop = 0;
- n[i] = 0;
- ttt = sys_gettime(NULL);
- while (moreframes && n[i]<250) {
-
- if (mustdied) break;
-
-#ifdef NOSHOW
- cprintf("%c",'°'+i);
-#endif
-
- moreframes = GetMPEGFrame (img, pixels);
-#ifndef NOSHOW
- grx_putimage(x1, y1, x2, y2, pixels);
-#endif
- n[i]++;
- task_endcycle();
- }
- ttt = sys_gettime(NULL) - ttt;
- if (!loop) break;
- RewindMPEG (mpeg, img);
- SetMPEGOption (img, MPEG_DITHER, GRAY_DITHER);
- moreframes = TRUE;
- }
-
- return 0;
-}
-
-
-
-int main(int argc, char *argv[])
-{
- // SYS_PARMS sp = BASE_SYS;
- KEY_EVT k;
- // MODEL m = BASE_MODEL;
- PID pid;
-
- // DOS_FILE *Infile;
-// BYTE *mpegbuff[10], *p;
-// WORD res;
-// DWORD cnt[10];
-
-
-TIME sum;
-
- SOFT_TASK_MODEL model;
-
- FILE *mpeg;
- ImageDesc img[10];
- int full_color = FALSE;
-
- int mode;
- int esc;
- int i;
- int actx = 10, acty = 10;
- ColormapEntry *cp;
-
- //cprintf("file '%s'\n",argv[1]);
-
- if (argc < 2) {
- fprintf (stderr, "Usage: %s mpegfile\n", argv[0]);
- sys_abort(301);
- }
-
- /*
- for (i = 0; i < argc - 1; i++) {
- Infile = DOS_fopen(argv[i + 1], "r");
- if (!Infile) {
- cprintf("%s not found!!!\n", argv[i + 1]);
- sys_abort(300);
- }
- cprintf("\n %s Opened!!!\n\n", argv[i + 1]);
-
- mpegbuff[i] = nextphbyte;
- p = mpegbuff[i]; cnt[i] = 0;
- res = 0x1000;
- while (res > 0) {
- res = DOS_fread(p, 0x1000, 1, Infile);
- cnt[i] += res;
- p += res;
- }
- p += res;
- nextphbyte = p;
- }
- */
-
- /* OK, Now we can start the system!!! */
- //sys_init(&sp);
- //keyb_init(SOFT, 100);
- // keyb_init(NULL);
- // k.flag = CNTR_BIT;
- // k.scan = KEY_C;
- // k.ascii = 'c';
- //keyb_excset(k,endfun);
-
- //vfs_init();
- /*
- for (i = 0; i < argc - 1; i++) {
- vfs_assign(argv[i + 1], mpegbuff[i], cnt[i]);
- }
- */
-
-
-
-
-
-
- /* Init the graph... */
-#ifndef NOSHOW
-
- if (grx_init() == -1) {
- cprintf("No init!!!\n");
- sys_abort(255);
- }
-
- mode = grx_getmode(SCREENX, SCREENY, 8);
- cprintf("Mode num: %x\n", mode);
- grx_cardinfo();
-#endif
-
- cprintf("[hit enter to continue]\n");
- esc = FALSE;
- while (!esc) {
- keyb_getcode(&k,BLOCK);
- if (k.ascii == 13) esc = TRUE;
- }
-
-
- if (mode == -1) {
- cprintf("Mode not present!!!\n");
- sys_abort(255);
- }
-
-#ifndef NOSHOW
- if (grx_setmode(mode) == -1) {
- cprintf("No SetMode!!!\n");
- sys_abort(255);
- }
-#endif
-
- //sys_atexit(txtreset,NULL,AFTER_EXIT);
-
-
- //cprintf("Û0Û");
-
- for (i = 0; i < argc - 1; i++) {
- mpeg = fopen(argv[i + 1], "r");
-
- if (!mpeg) {
- perror (argv[1]);
- sys_abort(301);
- }
-
- //cprintf("Û0.5Û");
-
- /* !!! */
- img[i].vid_stream=NULL;
- img[i].Colormap=NULL;
-
- if (!OpenMPEG(mpeg, &(img[i]))) {
- fprintf (stderr, "OpenMPEG on %s failed\n", argv[i + 1]);
- sys_abort(301);
- }
-
-
- //cprintf("Û1Û");
-
-
-
- SetMPEGOption (&(img[i]), MPEG_DITHER, GRAY_DITHER);
- //SetMPEGOption (&(img[i]), MPEG_DITHER, FS4_DITHER);
-
-
- /* SetMPEGOption(MPEG_DITHER, GRAY_DITHER); */
-
- /* printf ("Movie is %d x %d pixels\n", img[i].Width, img[i].Height);
- printf ("Required picture rate = %d, required bit rate = %d\n",
- img[i].PictureRate, img[i].BitRate); */
-
- //cprintf("Û2Û");
-
- if (i == 0) {
- cp = img[i].Colormap;
-
- if (!full_color) {
- int ii;
-
- for (ii = 0; ii < img[i].ColormapSize; ii++) {
-
-#ifndef NOSHOW
-
- grx_setcolor (ii, img[i].Colormap[ii].red / 4,
- img[i].Colormap[ii].green / 4,
- img[i].Colormap[ii].blue / 4);
-
-#endif
-
- }
-
- /*NO!!! Colormap is an array of short, setpalette wants an array of BYTE!!!*/
- /* grx_setpalette(0, 255, img.Colormap);*/
- }
- }
- if (actx + img[i].Width > SCREENX) {
- actx = 10;
- acty += 200;
- }
- sd[i].x1 = actx;
- sd[i].y1 = acty;
- sd[i].f = mpeg;
- sd[i].i = &(img[i]);
-
- //cprintf("Û3Û");
-
- soft_task_default_model(model);
- ////soft_task_def_system(model);
- //soft_task_def_met(model,9000);
- //soft_task_def_wcet(model,9000);
- //soft_task_def_period(model,50000);
-
- soft_task_def_met(model,5000);
- soft_task_def_wcet(model,5000);
- soft_task_def_period(model,40000);
- soft_task_def_periodic(model);
- soft_task_def_arg(model,(void*)i);
- soft_task_def_ctrl_jet(model);
-
- //task_def_arg(m, i);
- //task_def_wcet(m, 9000);
- pid = task_create("Shower", play, &model, NULL);
- if (pid == -1) {
- cprintf(" task --> Not Guaranteed!!!\n");
- sys_abort(20000);
- }
- task_activate(pid);
-
- //cprintf("Û4Û");
-
- actx += img[i].Width + 10;
- }
-
- /* play(0);*/
- esc = FALSE;
- //jet_delstat(pid);
- while (!esc) {
- if (keyb_getcode(&k,NON_BLOCK) && (k.ascii == 13)) esc = TRUE;
- task_delay(MAINSLEEP);
- //jet_getstat(pid,&sum,NULL,NULL,NULL);
- //jet_delstat(pid);
- //drawload(sum);
- }
-
- sys_abort(59000);
-
- return 0;
-}
Index: rel_1_2/oldexamples/mpeg/common.c
===================================================================
--- rel_1_2/oldexamples/mpeg/common.c (revision 1198)
+++ rel_1_2/oldexamples/mpeg/common.c (nonexistent)
@@ -1,74 +0,0 @@
-#include <drivers/keyb.h>
-
-void ctrlc_exit(KEY_EVT *k)
-{
- extern void dump_sem_table(void);
- extern void dump_nop_table(void);
- grx_close();
- cprintf("CTRL-C pressed!\n");
- grx_modeinfo();
- sys_end();
-}
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <sys/types.h>
-#include <sys/mount.h>
-
-int __register_sub_init_prologue(void)
-{
- return 0;
-}
-
-int __register_sub_init(void)
-{
- return 0;
-}
-
-dev_t root_device;
-
-int choose_root_callback(dev_t dev,u_int8_t fs)
-{
- if (fs==FS_MSDOS) return dev;
- return -1;
-}
-
-int __bdev_sub_init(void)
-{
- BDEV_PARMS bdev=BASE_BDEV;
-
- bdev_def_showinfo(bdev,TRUE);
- bdev_init(&bdev);
-
- root_device=bdev_scan_devices(choose_root_callback);
- if (root_device<0) {
- cprintf("can't find root device to mount on /!!!\n");
- sys_end();
- return -1;
- }
-
- return 0;
-}
-
-extern int libc_initialize(void);
-
-int __fs_sub_init(void)
-{
- FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
- //struct mount_opts opts;
-
- //memset(&opts,0,sizeof(struct mount_opts));
- //opts.flags=MOUNT_FLAG_RW;
-
- filesystem_def_rootdevice(fs,root_device);
- filesystem_def_fs(fs,FS_MSDOS);
- filesystem_def_showinfo(fs,TRUE);
- filesystem_init(&fs);
-
- libc_initialize();
-
- return 0;
-}
-
Index: rel_1_2/oldexamples/mpeg/mpg123.c
===================================================================
--- rel_1_2/oldexamples/mpeg/mpg123.c (revision 1198)
+++ rel_1_2/oldexamples/mpeg/mpg123.c (nonexistent)
@@ -1,219 +0,0 @@
-
-#include "mpg123/mpg123.h"
-#include <stdlib.h>
-
-/* stub */
-FILE *http_open (char *url)
-{
- return NULL;
-}
-
-
-
-static long rates[3][3] = {
- { 32000,44100,48000 } ,
- { 16000,22050,24000 } ,
- { 8000,11025,12000 }
-};
-
-int supported_rates = 0;
-
-int outmode = DECODE_AUDIO;
-
-char *listname = NULL;
-long outscale = 32768;
-int checkrange = FALSE;
-int tryresync = TRUE;
-int quiet = FALSE;
-int verbose = 0;
-int doublespeed= 0;
-int halfspeed = 0;
-int shuffle = 0;
-int change_always = 1;
-int force_8bit = 0;
-int force_frequency = -1;
-long numframes = -1;
-long startFrame= 0;
-int usebuffer = 0;
-int frontend_type = 0;
-int remote = 0;
-int buffer_fd[2];
-int buffer_pid;
-
-
-static int intflag = FALSE;
-static int remflag = FALSE;
-
-
-static char remote_buffer[1024];
-static struct frame fr;
-static struct audio_info_struct ai;
-txfermem *buffermem;
-#define FRAMEBUFUNIT (18 * 64 * 4)
-
-void init_output(void)
-{
- static int init_done = FALSE;
-
- if (init_done)
- return;
- init_done = TRUE;
-
- if (!(pcm_sample = (unsigned char *) malloc(audiobufsize * 2))) {
- perror ("malloc()");
- l1_exit (1);
-
- }
-
- if(outmode==DECODE_AUDIO) {
- //if(audio_open(&ai) < 0) {
- // perror("audio");
- // exit(1);
- // }
- /* audio_set_rate (&ai); should already be done in audio_open() [OF] */
- }
-}
-
-static void reset_audio_samplerate(void)
-{
-
- //if (outmode == DECODE_AUDIO) {
- /* audio_reset_parameters(&ai); */
- /* close and re-open in order to flush
- * the device's internal buffer before
- * changing the sample rate. [OF]
- */
- //audio_close (&ai);
- //if (audio_open(&ai) < 0) {
- // perror("audio");
- // exit(1);
- // }
- // }
-}
-
-void play_frame(int init,struct frame *fr)
-{
- int clip;
-
- if((fr->header_change && change_always) || init) {
- int reset_audio = 0;
-
- if(remote)
- print_rheader(fr);
-
- if (!quiet && init) {
- if (verbose)
- print_header(fr);
- else
- print_header_compact(fr);
- }
-
- if(force_frequency < 0) {
- if(ai.rate != freqs[fr->sampling_frequency]>>(fr->down_sample)) {
- ai.rate = freqs[fr->sampling_frequency]>>(fr->down_sample);
- reset_audio = 1;
- }
- }
- else if(ai.rate != force_frequency) {
- ai.rate = force_frequency;
- reset_audio = 1;
- }
-
- init_output();
-
- if(reset_audio) {
- reset_audio_samplerate();
- if (intflag)
- return;
- }
- }
-
- if (fr->error_protection) {
- getbits(16); /* crc */
- }
-
- clip = (fr->do_layer)(fr,outmode,&ai);
-
- /*
- if(clip > 0 && checkrange)
- fprintf(stderr,"%d samples clipped\n", clip);
- */
-}
-
-void audio_info_struct_init(struct audio_info_struct *ai)
-{
- ai->rate = -1;
- ai->gain = -1;
- ai->output = -1;
- ai->device = NULL;
- ai->channels = -1;
- ai->format = -1;
-}
-
-int audio_play_samples(struct audio_info_struct *ai, unsigned char *buf, int n)
-{
- return 0;
-}
-
-
-int main(int argc,char *argv[])
-{
- static char *fname="/MOSSE.MP3";
- int result;
- unsigned long frameNum = 0;
- //struct timeval start_time, now;
- unsigned long secdiff;
- int init;
-
-
- quiet=0;
- verbose=1;
-
- // DECODE_STDOUT stampa to 1
- // DECODE_AUDIO chiama la audio_play_samples
- // DECODE_BUFFER scrive su buffer_fd[1]
- outmode = DECODE_AUDIO;
-
- audio_info_struct_init(&ai);
-
- fr.single = -1; /* both channels */
- fr.synth = synth_1to1;
- fr.down_sample = 0;
-
- make_decode_tables(outscale);
- init_layer2();
- init_layer3(fr.down_sample);
-
- open_stream(fname,-1);
-
- //gettimeofday (&start_time, NULL);
- read_frame_init();
-
- init = 1;
- for(frameNum=0;read_frame(&fr) && numframes && !intflag;frameNum++) {
- if(frameNum < startFrame || (doublespeed && (frameNum % doublespeed))) {
- if(fr.lay == 3)
- set_pointer(512);
- continue;
- }
- numframes--;
- play_frame(init,&fr);
- init = 0;
- if (!(frameNum & 0xf))
- fprintf(stderr, "\r{%4lu} ",frameNum);
- }
-
- close_stream();
-
- {
- /* This formula seems to work at least for
- * MPEG 1.0/2.0 layer 3 streams.
- */
- int sfd = freqs[fr.sampling_frequency] * (fr.lsf + 1);
- int secs = (frameNum * (fr.lay==1 ? 384 : 1152) + sfd / 2) / sfd;
- fprintf(stderr,"[%d:%02d] Decoding of %s finished.\n", secs / 60,
- secs % 60, fname);
- }
-
-}
-
Index: rel_1_2/oldexamples/mpeg/initfs.c
===================================================================
--- rel_1_2/oldexamples/mpeg/initfs.c (revision 1198)
+++ rel_1_2/oldexamples/mpeg/initfs.c (nonexistent)
@@ -1,119 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: initfs.c,v 1.1 2002-11-11 07:42:42 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1 $
- * Last update: $Date: 2002-11-11 07:42:42 $
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/cbs.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-#include "modules/nopm.h"
-
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- extern int __register_sub_init_prologue(void);
- extern int __register_sub_init(void);
-
- __register_sub_init_prologue();
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- PC_register_module();
- NPP_register_module();
- SRP_register_module();
- NOP_register_module();
- NOPM_register_module();
-
- __register_sub_init();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- KEYB_PARMS keyb = BASE_KEYB;
- extern int __bdev_sub_init(void);
- extern int __fs_sub_init(void);
- extern void ctrlc_exit(KEY_EVT *k);
-
- HARTPORT_init();
-
- keyb_def_ctrlC(keyb, ctrlc_exit);
- KEYB_init(&keyb);
-
- __bdev_sub_init();
- __fs_sub_init();
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/oldexamples/mpeg/makefile
===================================================================
--- rel_1_2/oldexamples/mpeg/makefile (revision 1198)
+++ rel_1_2/oldexamples/mpeg/makefile (nonexistent)
@@ -1,42 +0,0 @@
-#
-#
-#
-# TO REMAKE BETTER
-#
-#
-
-ifndef BASE
-BASE=../../..
-endif
-include $(BASE)/config/config.mk
-include $(BASE)/config/libdep.mk
-
-.PHONY: test all install depend clean cleanall
-
-C_INC+= -I$(BASE)/ports
-LINK_LIB+= -lmpeg -lmp3
-LINK_DEP+= $(LIB_PATH)/libmpeg.a $(LIB_PATH)/libmp3.a
-
-test:: mplay mplay2 mpg123
-
-clean::
- rm -f *.o
- rm -f mplay
- rm -f mplay2
- rm -f mpg123
-
-mplay:mplay.o $(LIB_PATH)/initfs.o $(LIB_DEP)
- $(LD) $(LINK_OPT) $(LINK_STARTUP) mplay.o $(LIB_PATH)/initfs.o \
- --start-group $(LINK_LIB) --end-group \
- -o mplay
-
-mplay2:mplay2.o $(LIB_PATH)/initfs.o $(LIB_DEP)
- $(LD) $(LINK_OPT) $(LINK_STARTUP) mplay2.o $(LIB_PATH)/initfs.o \
- --start-group $(LINK_LIB) --end-group \
- -o mplay2
-
-mpg123:mpg123.o common.o $(LIB_PATH)/initfs.o $(LIB_DEP)
- $(LD) $(LINK_OPT) $(LINK_STARTUP) \
- mpg123.o common.o $(LIB_PATH)/initfs.o \
- --start-group $(LINK_LIB) --end-group \
- -o mpg123
Index: rel_1_2/oldexamples/makefile
===================================================================
--- rel_1_2/oldexamples/makefile (revision 1198)
+++ rel_1_2/oldexamples/makefile (nonexistent)
@@ -1,5 +0,0 @@
-# fake makefile ;-)
-
-all:
-
-clean:
Index: rel_1_2/oldexamples/stdio/test0.c
===================================================================
--- rel_1_2/oldexamples/stdio/test0.c (revision 1198)
+++ rel_1_2/oldexamples/stdio/test0.c (nonexistent)
@@ -1,72 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <ll/i386/cons.h>
-#include <drivers/keyb.h>
-
-#include <stdio.h>
-#include <string.h>
-
-int main(int argc,char *argv[])
-{
- char buffer[256];
- FILE *fin;
- int res;
- int c;
-
- /*
- temp_device=bdev_scan_devices(choose_temp_callback);
- if (temp_device<0) {
- cprintf("can't find a filesystem to mount on /TEMP!!!\n");
- return -1;
- }
-
- res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
- if (res!=0) {
- cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
- sys_end();
- return -1;
- }
- */
-
- /*
- *
- */
-
- fin=NULL;
-
- cprintf("opening...\n");
- fin=fopen("/TEMP/ALFA1.TXT","r");
- cprintf("opened!\n");
-
- cprintf("res=%p\n",fin);
-
- if (fin!=NULL) {
-
- while (!feof(fin)) {
-
- memset(buffer,'@',sizeof(buffer));
-
- cprintf("reading...\n");
- res=fread(buffer,1,sizeof(buffer)-1,fin);
- cprintf("read!\n");
-
- cprintf("res=%i\n",res);
- buffer[res<sizeof(buffer)-1?res:sizeof(buffer)-1]='\0';
- cprintf("'%s'\n",buffer);
-
- }
-
- cprintf("closing...\n");
- fclose(fin);
- cprintf("closed!\n");
- }
-
- cprintf("[press 'x' to exit]\n");
- while ((c = keyb_getch(BLOCK)) != 'x') ;
-
- return 0;
-}
Index: rel_1_2/oldexamples/stdio/test1.c
===================================================================
--- rel_1_2/oldexamples/stdio/test1.c (revision 1198)
+++ rel_1_2/oldexamples/stdio/test1.c (nonexistent)
@@ -1,67 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <ll/i386/cons.h>
-#include <drivers/keyb.h>
-
-#include <stdio.h>
-#include <string.h>
-
-int main(int argc,char *argv[])
-{
- char buffer[256];
- FILE *fin;
- char *s;
- // int res;
- int c;
-
- /*
- temp_device=bdev_scan_devices(choose_temp_callback);
- if (temp_device<0) {
- cprintf("can't find a filesystem to mount on /TEMP!!!\n");
- return -1;
- }
-
- res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
- if (res!=0) {
- cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
- sys_end();
- return -1;
- }
- */
-
- /*
- *
- */
-
- cprintf("opening...\n");
- fin=fopen("/TEMP/ALFA2.TXT","r");
- cprintf("opened!\n");
-
- if (fin!=NULL) {
-
- while (!feof(fin)) {
- cprintf("getting line...\n");
- s=fgets(buffer,sizeof(buffer),fin);
- cprintf("got!\n");
- if (s==NULL) {
- if (ferror(fin))
- cprintf("error while using fgets()!\n");
- break;
- }
- cprintf("'%s'\n",buffer);
- }
-
- cprintf("closing...\n");
- fclose(fin);
- cprintf("closed!\n");
- }
-
- cprintf("[press 'x' to exit]\n");
- while ((c = keyb_getchar()) != 'x') ;
-
- return 0;
-}
Index: rel_1_2/oldexamples/stdio/test2.c
===================================================================
--- rel_1_2/oldexamples/stdio/test2.c (revision 1198)
+++ rel_1_2/oldexamples/stdio/test2.c (nonexistent)
@@ -1,91 +0,0 @@
-/*
- *
- *
- *
- */
-#include <ll/i386/cons.h>
-#include <drivers/keyb.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-int main(int argc,char *argv[])
-{
- char buffer[256];
- FILE *fin;
- char *s;
- int res;
- int c,n;
- char ch;
-
- /*
- temp_device=bdev_scan_devices(choose_temp_callback);
- if (temp_device<0) {
- cprintf("can't find a filesystem to mount on /TEMP!!!\n");
- return -1;
- }
-
- res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
- if (res!=0) {
- cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
- sys_end();
- return -1;
- }
- */
-
- /*
- *
- */
-
- cprintf("opening...\n");
- fin=fopen("/TEMP/ALFA2.TXT","r");
- cprintf("opened!\n");
-
- if (fin!=NULL) {
-
- n=-1;
- cprintf("fscanf()ing...\n");
- res=fscanf(fin,"number %i",&n);
- cprintf("fscanf()ed...\n");
- if (res!=1) {
- cprintf("error on 1st fscanf() res=%i\n",res);
- return 0;
- }
- cprintf("scanned number %i (exact 103)\n",n);
-
- s=fgets(buffer,sizeof(buffer),fin);
- if (s==NULL) {
- cprintf("error on 1st fgets()\n");
- return 0;
- }
- s=fgets(buffer,sizeof(buffer),fin);
- if (s==NULL) {
- cprintf("error on 2nd fgets()\n");
- return 0;
- }
- s=fgets(buffer,sizeof(buffer),fin);
- if (s==NULL) {
- cprintf("error on 3rd fgets()\n");
- return 0;
- }
-
- cprintf("fscanf()ing...\n");
- res=fscanf(fin,"line %i error letter '%c'",&n,&ch);
- cprintf("fscanf()ed...\n");
- if (res!=2) {
- cprintf("error on 2nd fscanf() res=%i\n",res);
- return 0;
- }
- cprintf("scanned number %i (exact 205) characer '%c' (exact 'c')\n",n,ch);
-
- cprintf("closing...\n");
- fclose(fin);
- cprintf("closed!\n");
- }
-
- cprintf("[press 'x' to exit]\n");
- while ((c = keyb_getchar()) != 'x') ;
-
- return 0;
-}
Index: rel_1_2/oldexamples/stdio/test3.c
===================================================================
--- rel_1_2/oldexamples/stdio/test3.c (revision 1198)
+++ rel_1_2/oldexamples/stdio/test3.c (nonexistent)
@@ -1,55 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <ll/i386/cons.h>
-#include <drivers/keyb.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-int main(int argc,char *argv[])
-{
- char buffer[256];
- char *s;
- // int res;
- int c;
-
- /*
- temp_device=bdev_scan_devices(choose_temp_callback);
- if (temp_device<0) {
- cprintf("can't find a filesystem to mount on /TEMP!!!\n");
- return -1;
- }
-
- res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
- if (res!=0) {
- cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
- sys_end();
- return -1;
- }
- */
-
- /*
- *
- */
-
- printf("try using printf() to write on console!\n");
- printf("second line of the test\n");
- fprintf(stdout,"using fprintf() to write on stdout\n");
- fprintf(stderr,"try using fprintf() to write on stderr!\n");
- fprintf(stderr,"all this %i message are using ?printf() functions\n",4);
-
- printf("now try to write a phrase and press [Enter] to finish\n");
- s=fgets(buffer,sizeof(buffer),stdin);
- if (s!=NULL) printf("you have typed: '%s'\n",s);
-
- cprintf("[press 'x' to exit]\n");
-
- while ((c = keyb_getchar()) != 'x') ;
-
- return 0;
-}
Index: rel_1_2/oldexamples/stdio/test4.c
===================================================================
--- rel_1_2/oldexamples/stdio/test4.c (revision 1198)
+++ rel_1_2/oldexamples/stdio/test4.c (nonexistent)
@@ -1,60 +0,0 @@
-/*
- *
- *
- *
- */
-
-#include <ll/i386/cons.h>
-#include <drivers/keyb.h>
-
-#include <stdio.h>
-#include <string.h>
-
-int main(int argc,char *argv[])
-{
- char buffer[256];
- FILE *fin;
- int res;
- int c;
- int flag=1;
-
- /* prova di rewind() */
-
- cprintf("opening...\n");
- fin=fopen("/TEMP/ALFA1.TXT","r");
- cprintf("opened!\n");
-
- cprintf("res=%p\n",fin);
-
- if (fin!=NULL) {
-
- REDO:
-
- while (!feof(fin)) {
- cprintf("reading...\n");
- res=fread(buffer,1,sizeof(buffer)-2,fin);
- cprintf("read!\n");
-
- cprintf("res=%i\n",res);
- buffer[res<sizeof(buffer)-1?res:sizeof(buffer)-1]='\0';
- cprintf("'%s'\n",buffer);
- }
-
- if (flag) {
- flag=0;
- cprintf("rewinding...\n");
- rewind(fin);
- cprintf("rewinded!\n");
- goto REDO;
- }
-
- cprintf("closing...\n");
- fclose(fin);
- cprintf("closed!\n");
- }
-
- cprintf("[press 'x' to exit]\n");
- while ((c = keyb_getch(BLOCK)) != 'x') ;
-
- return 0;
-}
Index: rel_1_2/oldexamples/stdio/common.c
===================================================================
--- rel_1_2/oldexamples/stdio/common.c (revision 1198)
+++ rel_1_2/oldexamples/stdio/common.c (nonexistent)
@@ -1,117 +0,0 @@
-
-#include <kernel/func.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <drivers/keyb.h>
-
-#include <sys/mount.h>
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-
-/* -- */
-
-int __register_sub_init_prologue(void)
-{
- return 0;
-}
-
-int __register_sub_init(void)
-{
- return 0;
-}
-
-/* -- */
-
-__dev_t root_device;
-__dev_t temp_device;
-
-int choose_root_callback(__dev_t dev,__uint8_t fs)
-{
- if (fs==FS_MSDOS) return dev;
- return -1;
-}
-
-int choose_temp_callback(__dev_t dev,__uint8_t fs)
-{
- static int flag=0;
- if (fs==FS_MSDOS) {
- if (flag) return dev;
- flag=1;
- }
- return -1;
-}
-
-/* -- */
-
-//extern int bdev_scan_devices(int(*callback)(__dev_t,__uint8_t));
-
-int __bdev_sub_init(void)
-{
- BDEV_PARMS bdev=BASE_BDEV;
-
- bdev_def_showinfo(bdev,TRUE);
- bdev_init(&bdev);
-
- root_device=bdev_scan_devices(choose_root_callback);
- if (root_device<0) {
- cprintf("can't find root device to mount on /!!!\n");
- sys_end();
- return -1;
- }
-
- temp_device=bdev_scan_devices(choose_temp_callback);
- if (temp_device<0) {
- cprintf("can't find a filesystem to mount on /TEMP!!!\n");
- }
-
- return 0;
-}
-
-/* -- */
-
-extern int libc_initialize(void);
-
-int __fs_sub_init(void)
-{
- FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
- struct mount_opts opts;
- int res;
-
- filesystem_def_rootdevice(fs,root_device);
- filesystem_def_fs(fs,FS_MSDOS);
- filesystem_def_showinfo(fs,TRUE);
- filesystem_init(&fs);
-
- libc_initialize();
-
- if (temp_device>=0) {
- memset(&opts,0,sizeof(struct mount_opts));
- opts.flags=MOUNT_FLAG_RW;
- res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
- if (res!=0) {
- cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
- }
- }
-
- return 0;
-}
-
-/* -- */
-
-
-/* -- */
-
-void ctrlc_exit(KEY_EVT *k)
-{
- extern void dump_sem_table(void);
- extern void dump_nop_table(void);
- //dump_sem_table();
- //dump_nop_table();
- cprintf("CTRL-C pressed!\n");
- sys_end();
-}
Index: rel_1_2/oldexamples/stdio/initfs.c
===================================================================
--- rel_1_2/oldexamples/stdio/initfs.c (revision 1198)
+++ rel_1_2/oldexamples/stdio/initfs.c (nonexistent)
@@ -1,119 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: initfs.c,v 1.1 2002-11-11 07:42:42 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1 $
- * Last update: $Date: 2002-11-11 07:42:42 $
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/cbs.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-#include "modules/nopm.h"
-
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- extern int __register_sub_init_prologue(void);
- extern int __register_sub_init(void);
-
- __register_sub_init_prologue();
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- PC_register_module();
- NPP_register_module();
- SRP_register_module();
- NOP_register_module();
- NOPM_register_module();
-
- __register_sub_init();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- KEYB_PARMS keyb = BASE_KEYB;
- extern int __bdev_sub_init(void);
- extern int __fs_sub_init(void);
- extern void ctrlc_exit(KEY_EVT *k);
-
- HARTPORT_init();
-
- keyb_def_ctrlC(keyb, ctrlc_exit);
- KEYB_init(&keyb);
-
- __bdev_sub_init();
- __fs_sub_init();
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/oldexamples/stdio/makefile
===================================================================
--- rel_1_2/oldexamples/stdio/makefile (revision 1198)
+++ rel_1_2/oldexamples/stdio/makefile (nonexistent)
@@ -1,28 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS=test0 test1 test2 test3 test4
-OBJS=common.o
-
-include $(BASE)/config/example.mk
-
-test0:
- make -f $(SUBMAKE) BASE=$(BASE) APP=test0 INIT=initfs.o OTHEROBJS=common.o
-
-test1:
- make -f $(SUBMAKE) BASE=$(BASE) APP=test1 INIT=initfs.o OTHEROBJS=common.o
-
-test2:
- make -f $(SUBMAKE) BASE=$(BASE) APP=test2 INIT=initfs.o OTHEROBJS=common.o
-
-test3:
- make -f $(SUBMAKE) BASE=$(BASE) APP=test3 INIT=initfs.o OTHEROBJS=common.o
-
-test4:
- make -f $(SUBMAKE) BASE=$(BASE) APP=test4 INIT=initfs.o OTHEROBJS=common.o
Index: rel_1_2/fsdemo/gload.c
===================================================================
--- rel_1_2/fsdemo/gload.c (revision 1198)
+++ rel_1_2/fsdemo/gload.c (nonexistent)
@@ -1,113 +0,0 @@
-/*
- *
- *
- */
-
-#include "config.h"
-
-#include <kernel/func.h>
-#include <kernel/model.h>
-#include <kernel/const.h>
-
-#include <drivers/glib.h>
-
-#include <stdlib.h>
-#include <assert.h>
-
-#include "mutex.h"
-#include "gload.h"
-
-#define PERIOD 250000
-#define WCET 1000
-
-#ifdef FULLCOLOR
-
-#define BARCOLOR rgb16(255,0,0)
-#define BARBG rgb16(0,0,0)
-
-#define TEXTCOLOR rgb16(255,255,255)
-#define TEXTBG rgb16(0,0,0)
-
-#else
-
-#define BARCOLOR 128
-#define BARBG 0
-
-#define TEXTCOLOR 255
-#define TEXTBG 0
-
-#endif
-
-#define XC (32+64)
-#define YC 450
-#define LEN 100
-#define BOR 8
-
-extern void draw_frame(int x, int y, int dx, int dy);
-
-/* only for NRT task */
-static TASK monitorload(void *arg)
-{
- int oy,y;
- PID pid=(PID)arg;
- TIME sum,old;
- int res;
-
- res=jet_getstat(pid,NULL,NULL,NULL,&old);
- task_endcycle();
-
- oy=YC+LEN-1;
- for (;;) {
- res=jet_getstat(pid,NULL,NULL,NULL,&sum);
- if (res==-1) break;
-#ifndef NOGRX
- y=YC+LEN*(sum-old)/PERIOD-1;
- if (y!=oy) {
- grxlock();
- if (y<oy) grx_box(XC,y,XC+BOR-1,oy,BARCOLOR);
- else grx_box(XC,oy,XC+BOR-1,y,BARBG);
- grxunlock();
- oy=y;
- }
-#else
- n++;
- if (n%4==0)
- cprintf("#%li,%i#",sum); //(1000-sum*1000/PERIOD);
-#endif
- old=sum;
- task_endcycle();
- }
- return 0;
-}
-
-int gload_init(int taskpid)
-{
- SOFT_TASK_MODEL model;
- PID pid;
-
- soft_task_default_model(model);
- soft_task_def_met(model,WCET);
- soft_task_def_wcet(model,WCET);
- soft_task_def_period(model,PERIOD);
- soft_task_def_periodic(model);
- soft_task_def_arg(model,(void*)taskpid);
- /*soft_task_def_group(model,group);*/
-
- pid=task_create("load",monitorload,&model,NULL);
- if (pid==-1) return -6;
-
-#ifndef NOGRX
- draw_frame(XC,YC,BOR,LEN);
- grxlock();
- grx_text("Load",XC-10,YC+LEN+BOR*2,TEXTCOLOR,TEXTBG);
- grx_text("100%",XC+BOR*2+1,YC-4,TEXTCOLOR,TEXTBG);
- grx_text(" 75%",XC+BOR*2+1,YC+LEN/4-4,TEXTCOLOR,TEXTBG);
- grx_text(" 50%",XC+BOR*2+1,YC+LEN/4*2-4,TEXTCOLOR,TEXTBG);
- grx_text(" 25%",XC+BOR*2+1,YC+LEN/4*3-4,TEXTCOLOR,TEXTBG);
- grx_text(" 0%",XC+BOR*2+1,YC+LEN-4,TEXTCOLOR,TEXTBG);
- grxunlock();
-#endif
-
- return pid;
-}
-
Index: rel_1_2/fsdemo/gphoto.ok
===================================================================
--- rel_1_2/fsdemo/gphoto.ok (revision 1198)
+++ rel_1_2/fsdemo/gphoto.ok (nonexistent)
@@ -1,222 +0,0 @@
-/*
- * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Gerardo Lamastra <gerardo@sssup.it>
- *
- * Authors : Luca Abeni <luca@hartik.sssup.it>
- * Massimiliano Giorgi <massy@hartik.sssup.it>
- * (see authors.txt for full list of hartik's authors)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://hartik.sssup.it
- */
-
-/*
- * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: gphoto.ok,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1.1.1 $
- * Last update: $Date: 2002-09-02 09:37:41 $
- */
-
-#include "config.h"
-
-#include <kernel/func.h>
-#include <kernel/model.h>
-#include <kernel/const.h>
-
-#include <drivers/glib.h>
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <fcntl.h>
-
-#include "mutex.h"
-#include "gphoto.h"
-
-#ifdef FULLCOLOR
-
-/* 16bits format 5:6:5 */
-/* 24bits format 8:8:8 */
-static void down24to16(WORD *dst, BYTE *src, int dx, int dy)
-{
- int x,y;
- /* row must be multiple of 4!!! (there are 3 bytes per pixel!)*/
- dst+=dx*(dy+1);
- for (y=0;y<dy;y++) {
- dst-=dx*2;
- for (x=0;x<dx;x++,src+=3,dst++)
- /* blue green red */
- *dst=((src[0]&0xf8)>>3)|((src[1]&0xfc)<<3)|((src[2]&0xf8)<<8);
- }
-}
-
-#define downscaleimage(x,y,z,k) down24to16((WORD*)x,y,z,k)
-
-#else
-
-static void down24to8(BYTE *dst, BYTE *src, int dx, int dy)
-{
- int x,y;
-
- dst+=dx*(dy+1);
- for (y=0;y<dy;y++) {
- dst-=dx*2;
- for (x=0;x<dx;x++,src+=3,dst++)
- *dst=(((int)src[0])*11+((int)src[1])*59+((int)src[2])*30)/100;
- }
-}
-
-#define downscaleimage(x,y,z,k) down24to8(x,y,z,k)
-
-#endif
-
-/*
- *
- */
-
-extern void draw_frame(int x, int y, int dx, int dy);
-
-int gphoto_show(char *pathname, int x, int y)
-{
- struct BITMAPFILEHEADER *bf;
- struct BITMAPINFOHEADER *bi;
- BYTE *src,*dst;
- long l;
- int h,n;
- int dx,dy;
-
- bf=(struct BITMAPFILEHEADER *)malloc(sizeof(struct BITMAPFILEHEADER));
- bi=(struct BITMAPINFOHEADER *)malloc(sizeof(struct BITMAPINFOHEADER));
-
- if (bf==NULL||bi==NULL) return -1;
-
- h=open(pathname,O_RDONLY);
- if (h==-1) {
- free(bf);
- free(bi);
- return -2;
- }
-
- n=read(h,bf,sizeof(struct BITMAPFILEHEADER));
- if (n!=sizeof(struct BITMAPFILEHEADER)) {
- close(h);
- free(bf);
- free(bi);
- return -4;
- }
-
- n=read(h,bi,sizeof(struct BITMAPINFOHEADER));
- if (n!=sizeof(struct BITMAPINFOHEADER)) {
- close(h);
- free(bf);
- free(bi);
- return -4;
- }
-
- //grx_close();
-
- /*
- cprintf("type: %c %c\n",bf->bfType&0xff,bf->bfType>>8);
- cprintf("size: %li\n",bf->bfSize);
- cprintf("tell: %li\n\n",bf->bfOffBits);
-
- cprintf("bitcoutn: %i\n",bi->biBitCount);
- cprintf("compress: %li\n",bi->biCompression);
- cprintf("dx: %li\n",bi->biWidth);
- cprintf("dy: %li\n",bi->biHeight);
- */
-
- //sys_end();
- //return 0;
-
- if (bf->bfType!='B'+256*'M'||
- bi->biBitCount!=24||
- bi->biCompression!=0||
- bi->biWidth%4!=0) {
- close(h);
- free(bf);
- free(bi);
- return -5;
- }
-
- dx=bi->biWidth;
- dy=bi->biHeight;
-
- src=(BYTE*)malloc(dx*dy*3);
- if (src==NULL) {
- close(h);
- free(bf);
- free(bi);
- return -6;
- }
-
- dst=(BYTE*)malloc(dx*dy*2);
- if (dst==NULL) {
- free(src);
- close(h);
- free(bf);
- free(bi);
- return -6;
- }
-
- l=lseek(h,bf->bfOffBits,SEEK_SET);
- if (l!=bf->bfOffBits) {
- free(dst);
- free(src);
- close(h);
- free(bf);
- free(bi);
- return -7;
- }
-
- n=read(h,src,dx*dy*3);
- if (n!=dx*dy*3) {
- free(dst);
- free(src);
- close(h);
- free(bf);
- free(bi);
- return -8;
- }
-
- downscaleimage(dst,src,dx,dy);
-
-#ifndef NOGRX
- draw_frame(x,y,dx,dy);
- grxlock();
- grx_putimage(x, y, x+dx-1, y+dy-1, dst);
- grxunlock();
-#endif
-
- free(dst);
- free(src);
- close(h);
- free(bi);
- free(bf);
-
- return 0;
-}
Index: rel_1_2/fsdemo/oldmakefile
===================================================================
--- rel_1_2/fsdemo/oldmakefile (revision 1198)
+++ rel_1_2/fsdemo/oldmakefile (nonexistent)
@@ -1,41 +0,0 @@
-#
-#
-#
-# TO REMAKE BETTER
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-.PHONY: test all install depend clean cleanall
-
-C_INC+= -I$(BASE)/ports
-LINK_LIB+= -lmpeg
-LINK_DEP+= $(LIB_PATH)/libmpeg.a
-
-#test:: tserv tserv2
-test:: mplay
-
-clean::
- rm -f *.o
- rm -f mplay
-
-OBJS= mplay.o xread.o gclock.o gvideo.o gload.o gbuffer.o gphoto.o
-
-mplay: $(OBJS) $(LIB_PATH)/initfs.o $(LIB_DEP)
- $(LD) $(LINK_OPT) $(LINK_STARTUP) \
- $(OBJS) \
- $(LIB_PATH)/initfs.o \
- --start-group $(LINK_LIB) --end-group \
- -o mplay
-
-depend::
- $(CC) $(C_OPT) -M $(OBJS:.o=.c) > deps
-
-deps:
- $(CC) $(C_OPT) -M $(OBJS:.o=.c) > deps
-
-include deps
Index: rel_1_2/fsdemo/gload.h
===================================================================
--- rel_1_2/fsdemo/gload.h (revision 1198)
+++ rel_1_2/fsdemo/gload.h (nonexistent)
@@ -1,7 +0,0 @@
-
-#ifndef __GLOAD_H
-#define __GLOAD_H
-
-int gload_init(int pid);
-
-#endif
Index: rel_1_2/fsdemo/makefile
===================================================================
--- rel_1_2/fsdemo/makefile (revision 1198)
+++ rel_1_2/fsdemo/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= mplay
-
-include $(BASE)/config/example.mk
-
-mplay:
- make -f $(SUBMAKE) APP=mplay INIT= OTHEROBJS="xread.o gclock.o gvideo.o gload.o gbuffer.o gphoto.o initfile.o" OTHERINCL="-I$(BASE)/ports" SHARKOPT="__OLDCHAR__ __GRX__"
-
Index: rel_1_2/fsdemo/gphoto.c
===================================================================
--- rel_1_2/fsdemo/gphoto.c (revision 1198)
+++ rel_1_2/fsdemo/gphoto.c (nonexistent)
@@ -1,302 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: gphoto.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1.1.1 $
- * Last update: $Date: 2002-09-02 09:37:41 $
- */
-
-#include "config.h"
-
-#include <kernel/func.h>
-#include <kernel/model.h>
-#include <kernel/const.h>
-
-#include <drivers/glib.h>
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <fcntl.h>
-
-#include "mutex.h"
-#include "gphoto.h"
-
-#ifdef FULLCOLOR
-#define COLORFG rgb16(255,255,255)
-#define COLORBG rgb16(0,0,0)
-#else
-#define COLORFG 255
-#define COLORBG 0
-#endif
-
-#ifdef FULLCOLOR
-
-/* 16bits format 5:6:5 */
-/* 24bits format 8:8:8 */
-static void down24to16(int h ,
- WORD *dst, BYTE *src,
- int xs, int ys, int dx, int dy)
-{
- WORD *pdst;
- BYTE *psrc;
- int x,y;
- int n;
-
- /* row must be multiple of 4!!! (there are 3 bytes per pixel!)*/
-
- for (y=0;y<dy;y++) {
- psrc=src;
- pdst=dst;
-
- n=read(h,src,dx*3);
- if (n!=dx*3) return;
-
- for (x=0;x<dx;x++,psrc+=3,pdst++)
- /* blue green red */
- *pdst=((psrc[0]&0xf8)>>3)|((psrc[1]&0xfc)<<3)|((psrc[2]&0xf8)<<8);
-
-#ifndef NOGRX
- grxlock();
- grx_putimage(xs, ys+dy-y-1, xs+dx-1, ys+dy-y-1, dst);
- grxunlock();
-#endif
-
- }
-
-}
-
-#define downscaleimage(h,x,y,a,b,c,d) down24to16(h,(WORD*)x,y,a,b,c,d)
-
-#else
-
-static void down24to8(int h,
- BYTE *dst, BYTE *src,
- int xs, int ys, int dx, int dy)
-{
- BYTE *pdst;
- BYTE *psrc;
- int x,y;
- int n;
-
- /* row must be multiple of 4!!! (there are 3 bytes per pixel!)*/
-
- for (y=0;y<dy;y++) {
- psrc=src;
- pdst=dst;
-
- n=read(h,src,dx*3);
- if (n!=dx*3) return;
-
- for (x=0;x<dx;x++,psrc+=3,pdst++)
- *pdst=(((int)psrc[0])*11+((int)psrc[1])*59+((int)psrc[2])*30)/100;
-
-#ifndef NOGRX
- grxlock();
- grx_putimage(xs, ys+dy-y-1, xs+dx-1, ys+dy-y-1, dst);
- grxunlock();
-#endif
-
- }
-}
-
-#define downscaleimage(h,x,y,a,b,c,d) down24to8(h,x,y,a,b,c,d)
-
-#endif
-
-/*
- *
- */
-
-struct taskinfo {
- int h;
- BYTE *dst,*src;
- int x,y;
- int dx,dy;
-};
-
-static TASK phototask(void *arg)
-{
- struct taskinfo *p=(struct taskinfo *)arg;
-
- downscaleimage(p->h,p->dst,p->src,p->x,p->y,p->dx,p->dy);
-
- free(p->dst);
- free(p->src);
- close(p->h);
-
- free(arg);
-
- return NULL;
-}
-
-
-/*
- *
- */
-
-extern void draw_frame(int x, int y, int dx, int dy);
-
-int gphoto_show(char *title, char *pathname, int x, int y)
-{
- NRT_TASK_MODEL model;
- struct BITMAPFILEHEADER *bf;
- struct BITMAPINFOHEADER *bi;
- struct taskinfo *info;
- BYTE *src,*dst;
- long l;
- int h,n;
- int dx,dy;
- PID pid;
-
- bf=(struct BITMAPFILEHEADER *)malloc(sizeof(struct BITMAPFILEHEADER));
- bi=(struct BITMAPINFOHEADER *)malloc(sizeof(struct BITMAPINFOHEADER));
-
- if (bf==NULL||bi==NULL) return -11;
-
- h=open(pathname,O_RDONLY);
- if (h==-1) {
- free(bf);
- free(bi);
- return -2;
- }
-
- n=read(h,bf,sizeof(struct BITMAPFILEHEADER));
- if (n!=sizeof(struct BITMAPFILEHEADER)) {
- close(h);
- free(bf);
- free(bi);
- return -4;
- }
-
- n=read(h,bi,sizeof(struct BITMAPINFOHEADER));
- if (n!=sizeof(struct BITMAPINFOHEADER)) {
- close(h);
- free(bf);
- free(bi);
- return -4;
- }
-
- //grx_close();
-
- /*
- cprintf("type: %c %c\n",bf->bfType&0xff,bf->bfType>>8);
- cprintf("size: %li\n",bf->bfSize);
- cprintf("tell: %li\n\n",bf->bfOffBits);
-
- cprintf("bitcoutn: %i\n",bi->biBitCount);
- cprintf("compress: %li\n",bi->biCompression);
- cprintf("dx: %li\n",bi->biWidth);
- cprintf("dy: %li\n",bi->biHeight);
- */
-
- //sys_end();
- //return 0;
-
- if (bf->bfType!='B'+256*'M'||
- bi->biBitCount!=24||
- bi->biCompression!=0||
- bi->biWidth%4!=0) {
- close(h);
- free(bf);
- free(bi);
- return -5;
- }
-
- dx=bi->biWidth;
- dy=bi->biHeight;
-
- src=(BYTE*)malloc(dx*3);
- if (src==NULL) {
- close(h);
- free(bf);
- free(bi);
- return -6;
- }
-
- dst=(BYTE*)malloc(dx*2);
- if (dst==NULL) {
- free(src);
- close(h);
- free(bf);
- free(bi);
- return -6;
- }
-
- l=lseek(h,bf->bfOffBits,SEEK_SET);
- if (l!=bf->bfOffBits) {
- free(dst);
- free(src);
- close(h);
- free(bf);
- free(bi);
- return -7;
- }
-
-#ifndef NOGRX
- draw_frame(x,y,dx,dy);
- grxlock();
- grx_text(title,x,y-14,COLORFG,COLORBG);
- grxunlock();
-#endif
-
- free(bi);
- free(bf);
-
- info=(struct taskinfo *)malloc(sizeof(struct taskinfo));
- if (info==NULL) {
- free(dst);
- free(src);
- close(h);
- return -8;
- }
- info->h=h;
- info->src=src;
- info->dst=dst;
- info->x=x;
- info->y=y;
- info->dx=dx;
- info->dy=dy;
-
- nrt_task_default_model(model);
- nrt_task_def_arg(model,info);
- pid=task_create("Photo",phototask,&model,NULL);
-
- return pid;
-}
Index: rel_1_2/fsdemo/gclock.c
===================================================================
--- rel_1_2/fsdemo/gclock.c (revision 1198)
+++ rel_1_2/fsdemo/gclock.c (nonexistent)
@@ -1,81 +0,0 @@
-
-#include "config.h"
-
-#include <kernel/func.h>
-#include <kernel/const.h>
-#include <kernel/model.h>
-#include <kernel/types.h>
-
-#include <drivers/glib.h>
-
-#include <stdlib.h>
-
-#include "mutex.h"
-#include "gclock.h"
-
-#ifdef FULLCOLOR
-#define COLORFG rgb16(255,255,255)
-#define COLORBG rgb16(0,0,0)
-#else
-#define COLORFG 255
-#define COLORBG 0
-#endif
-
-struct info {
- int x;
- int y;
-};
-
-static TASK grxclock(struct info *ptr)
-{
- char buffer[16];
- int min,sec;
-
- min=sec=0;
- for (;;) {
- sprintf(buffer,"%02i:%02i",min,sec);
-#ifndef NOGRX
- grxlock();
- grx_text(buffer,ptr->x,ptr->y,COLORFG,COLORBG);
- grxunlock();
-#endif
- sec++;
- if (sec==60) {
- sec=0;
- min++;
- if (min==60) min=0;
- }
- task_endcycle();
- }
- return NULL;
-}
-
-PID gclock_init(int x, int y)
-{
- SOFT_TASK_MODEL model;
- struct info *ptr;
-
- ptr=(struct info *)malloc(sizeof(struct info));
- if (ptr==NULL) return -1;
- ptr->x=x+1;
- ptr->y=y+1;
-
-#ifndef NOGRX
- grxlock();
- grx_box(x-1,y-1,x+GCLOCKDX-1,y+GCLOCKDY-1,COLORBG);
- grx_rect(x-1,y-1,x+GCLOCKDX-1,y+GCLOCKDY-1,COLORFG);
- grx_text("00:00",ptr->x,ptr->y,COLORFG,COLORBG);
- grx_text("Clock",ptr->x,ptr->y-12,COLORFG,COLORBG);
- grxunlock();
-#endif
-
- soft_task_default_model(model);
- soft_task_def_met(model,5000);
- soft_task_def_wcet(model,5000);
- soft_task_def_period(model,1000000);
- soft_task_def_periodic(model);
- soft_task_def_arg(model,(void*)ptr);
- //soft_task_def_ctrl_jet(model);
-
- return task_create("grxclock", grxclock, &model, NULL);
-}
Index: rel_1_2/fsdemo/initfile.c
===================================================================
--- rel_1_2/fsdemo/initfile.c (revision 1198)
+++ rel_1_2/fsdemo/initfile.c (nonexistent)
@@ -1,119 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1.1.1 $
- * Last update: $Date: 2002-09-02 09:37:41 $
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/cbs.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-#include "modules/nopm.h"
-
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- extern int __register_sub_init_prologue(void);
- extern int __register_sub_init(void);
-
- __register_sub_init_prologue();
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- PC_register_module();
- NPP_register_module();
- SRP_register_module();
- NOP_register_module();
- NOPM_register_module();
-
- __register_sub_init();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- KEYB_PARMS keyb = BASE_KEYB;
- extern int __bdev_sub_init(void);
- extern int __fs_sub_init(void);
- extern void ctrlc_exit(KEY_EVT *k);
-
- HARTPORT_init();
-
- keyb_def_ctrlC(keyb, ctrlc_exit);
- KEYB_init(&keyb);
-
- __bdev_sub_init();
- __fs_sub_init();
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/fsdemo/xread.c
===================================================================
--- rel_1_2/fsdemo/xread.c (revision 1198)
+++ rel_1_2/fsdemo/xread.c (nonexistent)
@@ -1,240 +0,0 @@
-/*
- *
- *
- *
- *
- */
-
-#include "config.h"
-
-#include <ll/i386/cons.h>
-
-#include <kernel/func.h>
-#include <kernel/int_sem.h>
-#define seminit(s,v) internal_sem_init(s,v)
-#define semwait(s) internal_sem_wait(s)
-#define semsignal(s) internal_sem_post(s)
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <time.h>
-
-#include <assert.h>
-
-#include "xread.h"
-
-/**/
-
-/*
- */
-
-#ifndef ACTIVATE
-int x_fseek(FILE *file, long where, int from)
-{
- return fseek(file,where,from);
-}
-
-size_t x_fread(void *buffer, size_t size, size_t n, FILE *file)
-{
- return fread(buffer,size,n,file);
-}
-
-void x_init(void)
-{}
-
-int x_initbuffer(int group, FILE *f, int rate, int band)
-{
- return XUNUSEDPID;
-}
-
-#endif
-
-#ifdef ACTIVATE
-int x_fseek(FILE *file, long where, int from)
-{
- return -1;
-}
-
-#define BLOCKSIZE (512*4)
-#define BLOCKSPERBUFFER (BUFFERMAXSIZE/BLOCKSIZE)
-
-/* in millisecondi */
-#define PRELOAD 500
-
-struct xbuffer *table[OPEN_MAX];
-
-int end_counter=0;
-
-static TASK bufferfiller(void *arg)
-{
- struct xbuffer *ptr=(struct xbuffer *)arg;
- int n;
-
- for (;;) {
- if (freespace(ptr)>BLOCKSIZE+8) {
- //assert(ptr->writeptr>=0);
- //assert(ptr->writeptr+BLOCKSIZE<=BUFFERMAXSIZE);
- n=read(ptr->handle,ptr->buffer+ptr->writeptr,BLOCKSIZE);
-#ifdef NOGRX
- cprintf("²");
-#endif
- kern_cli();
- ptr->writeptr+=n;
- /* ipotesi: non si legge mai piu' di BUFFERMAXSIZE */
- if (ptr->writeptr>=BUFFERMAXSIZE) ptr->writeptr-=BUFFERMAXSIZE;
- kern_sti();
- if (n!=BLOCKSIZE) {
- //cprintf("<XXX>");
- break;
- }
- //assert(ptr->writeptr%512==0);
- }
- task_endcycle();
- }
-
- end_counter++;
-
- return NULL;
-}
-
-void x_init(void)
-{
- int i;
- for (i=0;i<OPEN_MAX;i++) table[i]=NULL;
-}
-
-/* rate in bits/sec */
-/* band in percentuale *100 */
-int x_initbuffer(int group, FILE *f, int rate, int band)
-{
-#ifdef EDFSCHED
- BDEDF_RES_MODEL resource;
-#endif
-#ifdef PSCANSCHED
- BDPSCAN_RES_MODEL resource;
-#endif
- SOFT_TASK_MODEL model;
- struct xbuffer *ptr;
- int handle;
- int period,wcet;
- int n,preload;
- PID pid;
-
- handle=fileno(f);
- if (handle>OPEN_MAX||handle<0) return -11;
-
- if (table[handle]!=NULL) return -2;
-
- ptr=table[handle]=(struct xbuffer *)malloc(sizeof(struct xbuffer));
- if (ptr==NULL) return -3;
-
- ptr->handle=handle;
- ptr->writeptr=ptr->readptr=0;
- n=lseek(ptr->handle,0,SEEK_SET);
- if (n!=0) {
- cprintf("can't seek to 0\n");
- return -12;
- }
-
- /* PRELOAD */
- preload=rate*PRELOAD/8/1000;
- if (preload<100*1024) preload=100*1024;
- preload=(preload/BLOCKSIZE+1)*BLOCKSIZE;
- if (preload>BUFFERMAXSIZE-BLOCKSIZE) return -4;
- n=read(ptr->handle,ptr->buffer,preload);
- if (n!=preload) {
- cprintf("preload: request %li bytes (%li returned)\n",
- (long)preload,(long)n);
- return -5;
- }
- ptr->writeptr+=n;
-
- //cprintf("%li bytes preloaded\n",(long)n);
- if (rate==0) sys_abort(997);
- period=1000000l*BLOCKSIZE/rate*8;
- wcet=period*band/10000;
-
- soft_task_default_model(model);
- soft_task_def_met(model,wcet);
- soft_task_def_wcet(model,wcet);
- soft_task_def_period(model,period);
- soft_task_def_periodic(model);
- soft_task_def_arg(model,(void*)ptr);
- soft_task_def_group(model,group);
-
-#if defined(EDFSCHED)
- BDEDF_res_default_model(resource);
- BDEDF_res_def_dl(resource,period);
- pid=task_createn("xfill", bufferfiller,(TASK_MODEL*)&model, &resource, NULL);
-#elif defined(PSCANSCHED)
- BDPSCAN_res_default_model(resource);
- BDPSCAN_res_def_priority(resource,0);
- pid=task_createn("xfill", bufferfiller,(TASK_MODEL*)&model, &resource, NULL);
-#else
- pid=task_create("xfill", bufferfiller, &model, NULL);
-#endif
- if (pid!=-1) {
- cprintf("task wcet=%10li period=%10li\n",(long)wcet,(long)period);
- }
-
- return pid;
-}
-
-size_t x_fread(void *buffer, size_t objsize, size_t n, FILE *file)
-{
- struct xbuffer *ptr;
- int size,sz;
- int nv;
-
- ptr=table[fileno(file)];
- if (ptr==NULL) {
- cprintf("x_fread with bad fd\n");
- return 0;
- }
-
- size=objsize*n;
- //cprintf("[for %i]",size);
-REDO:
- if (filledspace(ptr)<size) {
- /*
- cprintf("x_fread called for %li bytes (%li available)\n",
- (long)size,
- (long)filledspace(ptr));
- */
- nv=n;
- n=filledspace(ptr)/objsize;
- if (n==0) {
- struct timespec delay;
- delay.tv_sec=0;
- delay.tv_nsec=15000000;
- n=nv;
- nanosleep(&delay, 0);
- goto REDO;
- return 0;
- }
- size=objsize*n;
- /*cprintf("%i will return\n",size);*/
- }
-
- sz=BUFFERMAXSIZE-ptr->readptr;
- if (sz>=size) {
- //cprintf("X");
- memcpy(buffer,ptr->buffer+ptr->readptr,size);
- } else {
- //cprintf("Y");
- memcpy(buffer,ptr->buffer+ptr->readptr,sz);
- assert(size-sz>0);
- memcpy(buffer+sz,ptr->buffer,size-sz);
- }
-
- kern_cli();
- ptr->readptr+=size;
- /* ipotesi: non si legge mai piu' di BUFFERMAXSIZE */
- if (ptr->readptr>=BUFFERMAXSIZE) ptr->readptr-=BUFFERMAXSIZE;
- kern_sti();
-
- return n;
-}
-
-#endif
Index: rel_1_2/fsdemo/gphoto.h
===================================================================
--- rel_1_2/fsdemo/gphoto.h (revision 1198)
+++ rel_1_2/fsdemo/gphoto.h (nonexistent)
@@ -1,42 +0,0 @@
-/*
- *
- *
- */
-
-#ifndef __GPHOTO_H
-#define __GPHOTO_H
-
-#include <ll/sys/types.h>
-
-struct BITMAPFILEHEADER {
- WORD bfType;
- DWORD bfSize;
- WORD bfReserved1;
- WORD bfReserved2;
- DWORD bfOffBits;
-} __attribute__((packed));
-
-struct BITMAPINFOHEADER {
- DWORD biSize;
- DWORD biWidth;
- DWORD biHeight;
- WORD biPlanes;
- WORD biBitCount;
- DWORD biCompression;
- DWORD biSizeImage;
- DWORD biXPelsPerMeter;
- DWORD biYPelsPerMeter;
- DWORD biClrUsed;
- DWORD biClrImportant;
-} __attribute__((packed));
-
-struct RGBQUAD {
- BYTE rgbBlue;
- BYTE rgbGreen;
- BYTE rgbRed;
- BYTE rgbReserverd;
-} __attribute__((packed));
-
-int gphoto_show(char *title, char *pathname, int x, int y);
-
-#endif
Index: rel_1_2/fsdemo/gclock.h
===================================================================
--- rel_1_2/fsdemo/gclock.h (revision 1198)
+++ rel_1_2/fsdemo/gclock.h (nonexistent)
@@ -1,13 +0,0 @@
-
-
-#ifndef __GCLOCK_H
-#define __GCLOCK_H
-
-#include <kernel/types.h>
-
-PID gclock_init(int x, int y);
-
-#define GCLOCKDX (5*8+2)
-#define GCLOCKDY (1*8+2)
-
-#endif
Index: rel_1_2/fsdemo/mutex.h
===================================================================
--- rel_1_2/fsdemo/mutex.h (revision 1198)
+++ rel_1_2/fsdemo/mutex.h (nonexistent)
@@ -1,32 +0,0 @@
-
-#ifndef __GRXMUTEX_H
-#define __GRXMUTEX_H
-
-#include "config.h"
-
-#ifdef GRXMUTEX
-
-#include <kernel/int_sem.h>
-
-#define g_sem_t internal_sem_t
-
-#define g_sem_init(s,value) internal_sem_init(s,value)
-#define g_sem_wait(s) internal_sem_wait(s)
-#define g_sem_signal(s) internal_sem_post(s)
-
-#else
-
-#define g_sem_t int
-
-#define g_sem_init(s,value)
-#define g_sem_wait(s)
-#define g_sem_signal(s)
-
-#endif
-
-extern g_sem_t grxsem;
-
-#define grxlock() g_sem_wait(&grxsem)
-#define grxunlock() g_sem_signal(&grxsem)
-
-#endif
Index: rel_1_2/fsdemo/xread.h
===================================================================
--- rel_1_2/fsdemo/xread.h (revision 1198)
+++ rel_1_2/fsdemo/xread.h (nonexistent)
@@ -1,46 +0,0 @@
-
-#ifndef XREAD_H_
-#define XREAD_H_
-
-#include <stdio.h>
-
-#define BUFFERMAXSIZE (128*1024l)
-
-struct xbuffer {
- int handle;
- char buffer[BUFFERMAXSIZE+8];
- int readptr;
- int writeptr;
-};
-extern struct xbuffer *table[OPEN_MAX];
-
-void x_init(void);
-
-/* rate in bit/sec */
-/* band in percentuale */
-int x_initbuffer(int group, FILE *f, int rate, int band);
-
-#define XUNUSEDPID 5821
-
-/*
- *
- */
-
-static __inline__ int filledspace(struct xbuffer *ptr)
-{
- int size;
-
- if (ptr->writeptr==ptr->readptr) return 0;
-
- size=ptr->writeptr-ptr->readptr;
- if (size<0) size+=BUFFERMAXSIZE;
-
- return size;
-}
-
-static __inline__ int freespace(struct xbuffer *ptr)
-{
- return BUFFERMAXSIZE-filledspace(ptr);
-}
-
-#endif
Index: rel_1_2/fsdemo/config.h
===================================================================
--- rel_1_2/fsdemo/config.h (revision 1198)
+++ rel_1_2/fsdemo/config.h (nonexistent)
@@ -1,44 +0,0 @@
-
-/*
- *
- */
-
-/* if def: does not use graphics */
-#define NOGRX 1
-#undef NOGRX
-
-/* if def: use a mutex for all graphics operations */
-#define GRXMUTEX 1
-#undef GRXMUTEX
-
-/* if def: use full color (16bits.. sigh) else use 8 bits/pixel grayscale */
-#define FULLCOLOR 1
-#undef FULLCOLOR
-
-/*
- *
- */
-
-/* if def: does not trace events (does not work) */
-#define NOTRACE 1
-//#undef NOTRACE
-
-/*
- *
- */
-
-/* if def: activate task buffering */
-#define ACTIVATE 1
-//#undef ACTIVATE
-
-/*
- *
- */
-
-/* if def: use bd_edf resource for I/O tasks */
-#define EDFSCHED 1
-#undef EDFSCHED
-
-/* if def: use bd_pscan resources for I/O tasks */
-#define PSCANSCHED 1
-#undef PSCANSCHED
Index: rel_1_2/fsdemo/readme
===================================================================
--- rel_1_2/fsdemo/readme (revision 1198)
+++ rel_1_2/fsdemo/readme (nonexistent)
@@ -1,21 +0,0 @@
-S.Ha.R.K. FSDEMO
-
-This demo has been made as a thesis demo by Massimiliano Giorgi
-(massy@gandalf.sssup.it). The following is the translations of some itailan
-notes left my Massy. For any problems, please contact us
-shark-help@gandalf.sssup.it...
-
-bye
-
-Paolo
-
-----------------------------------------------------------------------------
-
-mplay is the demo I used during my thesis presentation.
-
-To use the demo you need a few mpeg files (those listed into mplay.c) into the directory /temp/m/ and some BMP photos into the directory /temp/b/
-
-Note that only BMP 24bpp images are supported. They MUST have a DIB header,
-with a line length mujltiple of 4 pixels!!!
-
-Massy
Index: rel_1_2/fsdemo/gvideo.c
===================================================================
--- rel_1_2/fsdemo/gvideo.c (revision 1198)
+++ rel_1_2/fsdemo/gvideo.c (nonexistent)
@@ -1,292 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: gvideo.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1.1.1 $
- * Last update: $Date: 2002-09-02 09:37:41 $
- */
-
-#include "config.h"
-
-#include <kernel/func.h>
-#include <kernel/model.h>
-#include <kernel/const.h>
-
-#include <drivers/glib.h>
-
-#include <stdlib.h>
-
-#include "mpeg/video.h"
-#include "mpeg/util.h"
-#include "mpeg/dither.h"
-#include "mpeg/mpeg.h"
-
-#include "mutex.h"
-#include "gvideo.h"
-#include "gbuffer.h"
-#include "xread.h"
-
-#define STARTGROUP 513
-
-#define VIDEORATE 70
-#define READRATE 30
-
-/*
- * colors
- */
-
-#ifdef FULLCOLOR
-
-#define COLORFG rgb16(255,255,255)
-#define COLORBG rgb16(0,0,0)
-
-#define SP rgb16(0,128,0)
-#define FG rgb16(255,255,255)
-#define BG rgb16(0,0,0)
-
-#else
-
-/* for writing */
-#define COLORFG 255
-#define COLORBG 0
-
-/* for box */
-#define SP 128
-#define FG 255
-#define BG 0
-
-#endif
-
-/* border size (pixels) */
-#define BO 4
-
-/*
- *
- */
-
-#ifdef FULLCOLOR
-/* 16bits format 5:6:5 */
-/* 32bits format 8:8:8:0 */
-void down32to16(WORD *dst, BYTE *src, int size)
-{
- int i;
- return;
- for (i=0;i<size;i+=4,dst++,src+=4)
- /* blue green red */
- *dst=((src[2]&0xf8)>>3)|((src[1]&0xfc)<<3)|((src[0]&0xf8)<<8);
-}
-#endif
-
-/*
- *
- */
-
-void draw_frame(int x, int y, int dx, int dy)
-{
-#ifndef NOGRX
- grxlock();
- grx_box(x-1-BO,y-1-BO,x+dx+BO,y+dy+BO,SP);
- grx_rect(x-1-BO,y-1-BO,x+dx+BO,y+dy+BO,FG);
- grx_box(x,y,x+dx-1,y+dy-1,BG);
- grx_rect(x-1,y-1,x+dx,y+dy,FG);
- grxunlock();
-#endif
-}
-
-struct info {
- int x,y;
- ImageDesc *img;
-};
-
-static TASK play(void *arg)
-{
- struct info *ptr=(struct info*)arg;
- int x1,y1,x2,y2;
- BYTE *pixels; //,*image;
- int moreframes;
-
- pixels=(BYTE*)malloc(ptr->img->Size*sizeof(BYTE));
-#ifdef FULLCOLOR
- image=(BYTE*)malloc(ptr->img->Size/2*sizeof(BYTE));
-#endif
- x1=ptr->x;
- y1=ptr->y;
- x2=x1+ptr->img->Width-1;
- y2=y1+ptr->img->Height-1;
-
- moreframes=1;
- for (;;) {
- while (moreframes) {
- moreframes=GetMPEGFrame(ptr->img,pixels);
-#ifndef NOGRX
-#ifdef FULLCOLOR
- down32to16((WORD*)image,pixels,ptr->img->Size);
- grxlock();
- grx_putimage(x1, y1, x2, y2, pixels);
- grxunlock();
-#else
- grxlock();
- grx_putimage(x1, y1, x2, y2, pixels);
- grxunlock();
-#endif
-#else
- cprintf("%c",'0');
-#endif
- task_endcycle();
- }
- break;
-
- //if (!loop) break;
- //RewindMPEG (mpeg, img);
- //SetMPEGOption (img, MPEG_DITHER, GRAY_DITHER);
- //moreframes = TRUE;
- }
-
- return NULL;
-}
-
-int gvideo_init(char *title, struct gvideoinfo *ptr)
-{
- // static int groupcounter=0;
- struct info *info;
- SOFT_TASK_MODEL model;
- FILE *fin;
- PID pid,pid2;
- ImageDesc *img;
- int res;
- int i;
- int period,wcet;
- int group;
-
- img=(ImageDesc*)malloc(sizeof(ImageDesc));
- if (img==NULL) return -3;
- img->vid_stream=NULL;
- img->Colormap=NULL;
-
- info=(struct info*)malloc(sizeof(struct info));
- if (info==NULL) return -11;
- info->img=img;
- info->x=ptr->x;
- info->y=ptr->y;
-
- fin=fopen(ptr->pathname, "r");
- if (!fin) return -1;
-
- //group=STARTGROUP+groupcounter++;
- group=STARTGROUP;
- pid2=x_initbuffer(group,fin,ptr->bitrate,ptr->band*READRATE);
- if (pid2<0) return -2;
-
-#ifdef ACTIVATE
- gbuffer_init(table[fileno(fin)],group,20+12,450);
-#else
- gbuffer_init(NULL,group,20+12,450);
-#endif
-
- res=OpenMPEG(fin,img);
- if (!res) return -4;
-
-#ifdef FULLCOLOR
- SetMPEGOption(img,MPEG_DITHER,HALF_COLOR_DITHER);
-#else
- SetMPEGOption(img,MPEG_DITHER,GRAY_DITHER);
-#endif
-
- //cprintf("colrmap size=%8i\n",img->ColormapSize);
- //cprintf("picture rate=%8i\n",img->PictureRate);
- //cprintf("bit rate =%8i\n",img->BitRate);
-
-#ifndef FULLCOLOR
- if (group==STARTGROUP) {
- ColormapEntry *cp;
- cp=img->Colormap;
- for (i=0;i<img->ColormapSize;i++) {
-#ifndef NOGRX
- grxlock();
- grx_setcolor (i,img->Colormap[i].red/4,
- img->Colormap[i].green/4,
- img->Colormap[i].blue/4);
- grxunlock();
-#endif
- }
- }
-#endif
-
- draw_frame(info->x,info->y,img->Width,img->Height);
- ptr->w=img->Width;
- ptr->h=img->Height;
-
- {
- char buffer[256];
-
-#ifndef NOGRX
- grxlock();
- grx_text(title,ptr->x,ptr->y-14,COLORFG,COLORBG);
- grxunlock();
- sprintf(buffer,"Average bit rate: %i.%03i Mb/s",
- ptr->bitrate/1024/1024,(ptr->bitrate%(1024*1024))*1000/1024/1000);
- grxlock();
- grx_text(buffer,ptr->x,ptr->y+ptr->h+BO*2+2,COLORFG,COLORBG);
- grxunlock();
- sprintf(buffer,"Frame rate : %02.3f frame/sec",
- (double)ptr->framerate/100.0);
- grxlock();
- grx_text(buffer,ptr->x,ptr->y+ptr->h+BO*2+2+9,COLORFG,COLORBG);
- grxunlock();
-#endif
- }
-
- period=100000000/ptr->framerate;
- wcet=period*ptr->band*VIDEORATE/10000;
-
- soft_task_default_model(model);
- soft_task_def_met(model,wcet);
- soft_task_def_wcet(model,wcet);
- soft_task_def_period(model,period);
- soft_task_def_periodic(model);
- soft_task_def_arg(model,(void*)info);
- soft_task_def_group(model,group);
- soft_task_def_ctrl_jet(model);
-
- pid=task_create("Video",play,&model,NULL);
- if (pid==-1) return -6;
-
- return group;
-}
Index: rel_1_2/fsdemo/gbuffer.c
===================================================================
--- rel_1_2/fsdemo/gbuffer.c (revision 1198)
+++ rel_1_2/fsdemo/gbuffer.c (nonexistent)
@@ -1,129 +0,0 @@
-/*
- *
- *
- */
-
-#include "config.h"
-
-#include <kernel/func.h>
-#include <kernel/model.h>
-#include <kernel/const.h>
-
-#include <drivers/glib.h>
-
-#include <stdlib.h>
-#include <assert.h>
-
-#include "mutex.h"
-#include "xread.h"
-
-#define PERIOD 250000
-#define WCET 1000
-
-#ifdef FULLCOLOR
-
-#define BARCOLOR rgb16(255,0,0)
-#define BARBG rgb16(0,0,0)
-
-#define TEXTCOLOR rgb16(255,255,255)
-#define TEXTBG rgb16(0,0,0)
-
-#else
-
-#define BARCOLOR 128
-#define BARBG 0
-
-#define TEXTCOLOR 255
-#define TEXTBG 0
-
-#endif
-
-//#define XC 700
-//#define YC 400
-#define LEN 100
-#define BORDER 8
-
-extern void draw_frame(int x, int y, int dx, int dy);
-
-struct taskinfo{
- int XC,YC;
- struct xbuffer *ptr;
-};
-
-static TASK monitorbuffer(void *arg)
-{
- struct taskinfo *p=(struct taskinfo *)arg;
- int XC,YC;
- int oy,y;
- struct xbuffer *ptr;
- int sum,old;
-
- ptr=p->ptr;
- XC=p->XC;
- YC=p->YC;
-
- oy=YC+LEN-1;
- for (;;) {
- sum=freespace(ptr);
-#ifndef NOGRX
- y=YC+LEN*sum/BUFFERMAXSIZE-1;
- if (y!=oy) {
- grxlock();
- if (y<oy) grx_box(XC,y,XC+BORDER-1,oy,BARCOLOR);
- else grx_box(XC,oy,XC+BORDER-1,y,BARBG);
- grxunlock();
- oy=y;
- }
-#else
- cprintf("@%i@",sum);
-#endif
- old=sum;
- task_endcycle();
- }
- return 0;
-}
-
-int gbuffer_init(struct xbuffer *ptr, int group, int XC, int YC)
-{
- struct taskinfo *info;
- SOFT_TASK_MODEL model;
- PID pid;
-
-#ifdef ACTIVATE
- info=(struct taskinfo *)malloc(sizeof(struct taskinfo));
- if (info==NULL) sys_abort(912);
- info->XC=XC;
- info->YC=YC;
- info->ptr=ptr;
-
- soft_task_default_model(model);
- soft_task_def_met(model,WCET);
- soft_task_def_wcet(model,WCET);
- soft_task_def_period(model,PERIOD);
- soft_task_def_periodic(model);
- soft_task_def_group(model,group);
- soft_task_def_arg(model,(void*)info);
- /*soft_task_def_group(model,group);*/
-
- pid=task_create("bufferload",monitorbuffer,&model,NULL);
- if (pid==-1) return -6;
-
-#else
- pid=-1;
-#endif
-
-#ifndef NOGRX
- draw_frame(XC,YC,BORDER,LEN);
- grxlock();
- grx_text("Buffer",XC-18,YC+LEN+BORDER*2,TEXTCOLOR,TEXTBG);
- grx_text("100%",XC+BORDER*2+1,YC-4,TEXTCOLOR,TEXTBG);
- grx_text(" 75%",XC+BORDER*2+1,YC+LEN/4-4,TEXTCOLOR,TEXTBG);
- grx_text(" 50%",XC+BORDER*2+1,YC+LEN/4*2-4,TEXTCOLOR,TEXTBG);
- grx_text(" 25%",XC+BORDER*2+1,YC+LEN/4*3-4,TEXTCOLOR,TEXTBG);
- grx_text(" 0%",XC+BORDER*2+1,YC+LEN-4,TEXTCOLOR,TEXTBG);
- grxunlock();
-#endif
-
- return pid;
-}
-
Index: rel_1_2/fsdemo/gvideo.h
===================================================================
--- rel_1_2/fsdemo/gvideo.h (revision 1198)
+++ rel_1_2/fsdemo/gvideo.h (nonexistent)
@@ -1,22 +0,0 @@
-/*
- *
- *
- */
-
-#ifndef __GVIDEO_H
-#define __GVIDEO_H
-
-struct gvideoinfo {
- int x,y;
- int h,w; /* no fill */
-
- char *pathname;
-
- int bitrate; /* bytes/sec */
- int framerate; /* frames/sec */
- int band; /* CPU band in percent */
-};
-
-int gvideo_init(char *title, struct gvideoinfo *info);
-
-#endif
Index: rel_1_2/fsdemo/mplay.c
===================================================================
--- rel_1_2/fsdemo/mplay.c (revision 1198)
+++ rel_1_2/fsdemo/mplay.c (nonexistent)
@@ -1,393 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: mplay.c,v 1.3 2003-05-01 19:44:07 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.3 $
- * Last update: $Date: 2003-05-01 19:44:07 $
- */
-
-#include "config.h"
-
-//#include <ll/sys/types.h>
-
-#include <kernel/func.h>
-#include <kernel/const.h>
-
-#include <trace/trace.h>
-#include <trace/queues.h>
-
-#include <drivers/glib.h>
-#include <drivers/gd.h>
-#include <drivers/keyb.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-#include <sys/types.h>
-#include <sys/mount.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <time.h>
-
-#include "gclock.h"
-#include "gvideo.h"
-#include "gload.h"
-#include "gbuffer.h"
-#include "gphoto.h"
-#include "mutex.h"
-#include "xread.h"
-
-void ctrlc_exit(KEY_EVT *k)
-{
- extern void dump_sem_table(void);
- extern void dump_nop_table(void);
-#ifndef NOGRX
- grx_close();
-#endif
- cprintf("CTRL-C pressed!\n");
- sys_end();
-}
-
-/*
- *
- *
- *
- */
-
-int __register_sub_init_prologue(void)
-{
- // int id;
-#ifndef NOTRACE
- TRC_init_phase1(NULL);
- trc_register_fixed_queue();
- id=trc_create_queue(TRC_FIXED_QUEUE,NULL);
- trc_trace_class(TRC_CLASS_USER);
- trc_assign_class_to_queue(TRC_CLASS_USER,id);
-#endif
- return 0;
-}
-
-int __register_sub_init(void)
-{
-#if defined(EDFSCHED)
- extern void BD_EDF_register_module(void);
- BD_EDF_register_module();
-#elif defined(PSCANSCHED)
- extern void BD_PSCAN_register_module(void);
- BD_PSCAN_register_module();
-#endif
- return 0;
-}
-
-dev_t root_device=-1;
-dev_t temp_device=-1;
-
-int choose_root_callback(dev_t dev,u_int8_t fs)
-{
- if (fs==FS_MSDOS) return dev;
- return -1;
-}
-
-int choose_temp_callback(__dev_t dev,__uint8_t fs)
-{
- static int flag=0;
- if (fs==FS_MSDOS) {
- if (flag) return dev;
- flag=1;
- }
- return -1;
-}
-
-int __bdev_sub_init(void)
-{
- BDEV_PARMS bdev=BASE_BDEV;
-
- bdev_def_showinfo(bdev,FALSE);
- bdev_init(&bdev);
-
- root_device=bdev_scan_devices(choose_root_callback);
- if (root_device<0) {
- sys_shutdown_message("can't find root device to mount on /!!!\n");
- sys_end();
- return -1;
- }
-
- /*
- temp_device=bdev_scan_devices(choose_temp_callback);
- if (temp_device<0) {
- cprintf("can't find a filesystem to mount on /TEMP!!!\n");
- }
- */
-
- return 0;
-}
-
-int __fs_sub_init(void)
-{
- extern int libc_initialize(void);
- FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
- // struct mount_opts opts;
- // int res;
-
- filesystem_def_rootdevice(fs,root_device);
- filesystem_def_fs(fs,FS_MSDOS);
- filesystem_def_showinfo(fs,FALSE);
- filesystem_init(&fs);
-
- /*
- if (temp_device>=0) {
- memset(&opts,0,sizeof(struct mount_opts));
- opts.flags=MOUNT_FLAG_RW;
- res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
- if (res!=0) {
- cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
- } else
- cprintf("mounted /TEMP rw\n");
- }
- */
-
- libc_initialize();
-
-#ifndef NOTRACE
- TRC_init_phase2();
-#endif
-
- return 0;
-}
-
-/*
- *
- *
- *
- */
-
-struct {
- char *filename;
- int bitrate;
- int framerate;
-} mpegs[16]={
- /* 0 */
- {"/temp/m/2jaeger.mpg", 573225, 3000}, /* 3.27 bad*/
- {"/temp/m/alien.mpg", 289000, 2500}, /* 10.12 I */
- {"/temp/m/b0.mpg", 1725251, 3000}, /* 3.33 IBBPBBPBBPBB */
- {"/temp/m/canyon.mpg", 237194, 3000}, /* 58.60 IBBPBB */
- /* 4 */
- {"/temp/m/earth-ci.mpg", 974900, 2500}, /* 28.80 IBBPBB */
- {"/temp/m/flower.mpg", 1147101, 2997}, /* 5.01 bad */
- {"/temp/m/frisco.mpg", 397262, 3000}, /* 1.70 bad */
- {"/temp/m/hulahoop.mpg", 684126, 3000}, /* 1.33 bad */
- /* 8 */
- {"/temp/m/iicm.mpg", 527308, 3000}, /* 26.70 bad */
- {"/temp/m/micky.mpg", 711240, 3000}, /* 0.66 bad */
- {"/temp/m/mobile.mpg", 114622, 2997}, /* 5.01 bad */
- {"/temp/m/redsnigh.mpg", 597776, 2500}, /* 48.40 IBBBBBBBBBPBBBBBBBBB*/
- /* 12 */
- {"/temp/m/son.mpg", 1134335, 2500}, /* 6.92 IBBPBBPBBPBB */
- {"/temp/m/stoelend.mpg", 2248942, 3000}, /* 0.53 IBBPBB */
- {"/temp/m/sukhoi.mpg", 481521, 3000}, /* 25.47 I */
- {"/temp/m/us.mpg", 681599, 3000} /* 24.37 IBBPBB */
-};
-
-#define DEFINDEX 3
-
-char *getfilename(int index)
-{
- return mpegs[index%16].filename;
-}
-
-int getbitrate(int index)
-{
- return mpegs[index%16].bitrate;
-}
-
-int getframerate(int index)
-{
- return mpegs[index%16].framerate;
-}
-
-/*
- *
- *
- *
- */
-
-#ifdef FULLCOLOR
-
-#define TEXTCOLOR rgb16(0,255,0)
-#define TEXTCOLOR2 rgb16(255,255,255)
-#define TEXTBG rgb16(0,0,0)
-
-#else
-
-#define TEXTCOLOR 255
-#define TEXTCOLOR2 255
-#define TEXTBG 0
-
-#endif
-
-#define SCREENX 800
-#define SCREENY 600
-
-#define MAINSLEEP 20000
-
-g_sem_t grxsem;
-
-int main(int argc, char *argv[])
-{
- struct gvideoinfo info;
- KEY_EVT k;
- int index;
- int mode;
- int esc;
- int pid,grp;
- // int i;
- int sx=20;
- PID ph1,ph2,ph3;
-
- g_sem_init(&grxsem,1);
-
- /*
- if (argc<2) {
- cprintf("Usage: %s mpegfileordinal\n",argv[0]);
- sys_abort(301);
- }
- */
-
- /* init the "file reader tasks" module */
- x_init();
-
- /* Init the graph... */
-#ifndef NOGRX
- if (grx_init()==-1) {
- cprintf("No init!!!\n");
- sys_abort(255);
- }
-#ifdef FULLCOLOR
- mode=grx_getmode(SCREENX,SCREENY,16);
-#else
- mode=grx_getmode(SCREENX,SCREENY,8);
-#endif
- if (mode==-1) {
- cprintf("Mode not present!!!\n");
- sys_abort(255);
- }
-#endif
-
- cprintf("[hit enter to continue]\n");
- esc=FALSE;
- while (!esc) {
- keyb_getcode(&k,BLOCK);
- if (k.ascii==13) esc=TRUE;
- }
-
-#ifndef NOGRX
- if (grx_setmode(mode) == -1) {
- cprintf("No SetMode!!!\n");
- sys_abort(255);
- }
-#endif
-
-#ifndef NOGRX
- grx_text("HARTIK 4.0 (Lego)",12*2,22,TEXTCOLOR,TEXTBG);
- grx_text("[Filesystem demo]",12*2,22+10,TEXTCOLOR,TEXTBG);
-
- grx_text("Video : 8bit/pixel",250,450,TEXTCOLOR2,TEXTBG);
- grx_text("Double buffer: YES",250,450+10,TEXTCOLOR2,TEXTBG);
- grx_text("Algorithm : FCFS",250,450+20,TEXTCOLOR2,TEXTBG);
-#endif
-
- pid=gclock_init(32+64+64,540);
- task_activate(pid);
-
- //for (i=0;i<argc-1;i++) {
-
- //index=atoi(argv[i+1]);
- index=4;
-
- info.x=sx+30;
- info.y=80;
- info.pathname=getfilename(index);
- info.bitrate=getbitrate(index);
- info.framerate=getframerate(index);
- info.band=25;
-
- grp=gvideo_init("Video: earth.mpg", &info);
- //if (grp>0) group_activate(grp);
-
- sx+=info.w+15;
- //}
-
- pid=gload_init(1);
- task_activate(pid);
-
- ph1=gphoto_show("Photo: galaxy","/temp/b/ph2a.bmp",500,25);
- ph2=gphoto_show("Photo: canyon","/temp/b/ph3a.bmp",500,225);
- ph3=gphoto_show("Photo: nicole","/temp/b/ph7a.bmp",500,425);
-
- if (grp>0) group_activate(grp);
-
- esc=0;
-
- {
- struct timespec delay;
-
- delay.tv_sec = MAINSLEEP/1000000;
- delay.tv_nsec = (MAINSLEEP%1000000)*1000;
-
- while (!esc) {
- if (keyb_getcode(&k,NON_BLOCK)) {
- if(k.ascii==13) esc=1;
- else if (k.ascii=='a') task_activate(ph1);
- else if (k.ascii=='s') task_activate(ph2);
- else if (k.ascii=='d') task_activate(ph3);
- }
- nanosleep(&delay, NULL);
- }
- }
-
-#ifndef NOGRX
- grx_close();
-#endif
-
- sys_end();
- return 0;
-}
Index: rel_1_2/fsdemo/gbuffer.h
===================================================================
--- rel_1_2/fsdemo/gbuffer.h (revision 1198)
+++ rel_1_2/fsdemo/gbuffer.h (nonexistent)
@@ -1,9 +0,0 @@
-
-#ifndef __GBUFFER_H
-#define __GBUFFER_H
-
-#include "xread.h"
-
-int gbuffer_init(struct xbuffer *ptr, int group, int XC, int YC);
-
-#endif
Index: rel_1_2/cash/initcash.c
===================================================================
--- rel_1_2/cash/initcash.c (revision 1198)
+++ rel_1_2/cash/initcash.c (nonexistent)
@@ -1,128 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initcash.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- System initialization file
-
- The tick is set to TICK ms.
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBSHD (Constant Bandwidth Server with Hard Deadlines) level
- a Dummy level
-
-
-
-
- It can accept these task models (into () the mandatory fields):
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- NRT_TASK_MODEL at level 1
- ELASTIC_HARD_TASK_MODEL (cnormal,period,wcet,maxperiod) at level 5
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/tbs.h"
-#include "modules/cbs.h"
-#include "cash.h"
-#include "modules/dummy.h"
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 300
-
-#define RRTICK 5000
-
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBSGHD_register_level(CBSGHD_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- /* CBS_register_level(CBS_ENABLE_ALL, 0); */
- //CBSHD_register_level(CBSHD_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-
-
-
-
-
-
-
-
-
Index: rel_1_2/cash/cash.h
===================================================================
--- rel_1_2/cash/cash.h (revision 1198)
+++ rel_1_2/cash/cash.h (nonexistent)
@@ -1,177 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: cash.h,v 1.2 2003-01-07 17:10:16 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-01-07 17:10:16 $
- ------------
-
- This file contains the server CBSHD (CASH Algorithm)
-
- Title:
- CBSHD (Constant Bandwidth Server with hard deadlines)
-
- Task Models Accepted:
- ELASTIC_HARD_TASK_MODEL - Elastic Hard Tasks
- wcet field must be != 0
- cnormal field must be != 0
- period field must be != 0
-
- Description:
- This module schedule his tasks following the CBSHD scheme.
- (see Marco Caccamo, Giorgio Buttazzo and Lui Sha
- "Elastic Feedback Control"
- Proceedings of the EUROMICRO 2000)
-
- The tasks are inserted in an EDF level (or similar) with a JOB_TASK_MODEL,
- and the CBSHD level expects that the task is scheduled with the absolute
- deadline passed in the model.
-
- The task guarantee is based on the factor utilization approach.
-
- Exceptions raised:
- XUNVALID_GUEST
- This level doesn't support guests. When a guest operation
- is called, the exception is raised.
-
- These exceptions are pclass-dependent...
- XDEADLINE_MISS
- If a task miss his deadline, the exception is raised.
-
- Restrictions & special features:
- - This level doesn't manage the main task.
- - At init time we have to specify:
- . guarantee check
- (when all task are created the system will check that the task_set
- will not use more than the available bandwidth)
- - A function to return the used bandwidth of the level is provided.
- - A function to return the pending activations of the task.
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#ifndef __CBSGHD_H__
-#define __CBSGHD_H__
-
-#include <ll/ll.h>
-#include <kernel/config.h>
-#include <sys/types.h>
-#include <kernel/types.h>
-
-
-
-
-
-
-
-
-/*+ flags... +*/
-#define CBSGHD_ENABLE_GUARANTEE 1 /*+ Task Guarantee enabled +*/
-#define CBSGHD_ENABLE_ALL 1
-
-#define CBSGHD_FAILED_GUARANTEE 8 /*+ used in the module, unsettabl
- in EDF_register_level... +*/
-
-
-
-
-
-#define ELASTIC_HARD_PCLASS 0x0600
-
-#define CBSGHD_LEVELNAME "CBSGHD base"
-#define CBSGHD_LEVEL_CODE 106
-#define CBSGHD_LEVEL_VERSION 1
-
-
-/* -----------------------------------------------------------------------
- ELASTIC_HARD_TASK_MODEL: elastic hard Tasks
- ----------------------------------------------------------------------- */
-
-
-typedef struct {
- TASK_MODEL t;
- TIME cnormal;
- TIME period;
- TIME wcet;
- TIME maxperiod;
-} ELASTIC_HARD_TASK_MODEL;
-
-#define elastic_hard_task_default_model(m) \
- task_default_model((m).t,ELASTIC_HARD_PCLASS), \
- (m).cnormal = 0, \
- (m).period = 0, \
- (m).wcet = 0, \
- (m).maxperiod = 0
-#define elastic_hard_task_def_level(m,l) task_def_level((m).t,l)
-#define elastic_hard_task_def_arg(m,a) task_def_arg((m).t,a)
-#define elastic_hard_task_def_stack(m,s) task_def_stack((m).t,s)
-#define elastic_hard_task_def_stackaddr(m,s) task_def_stackaddr((m).t,s)
-#define elastic_hard_task_def_group(m,g) task_def_group((m).t,g)
-#define elastic_hard_task_def_usemath(m) task_def_usemath((m).t)
-#define elastic_hard_task_def_system(m) task_def_system((m).t)
-#define elastic_hard_task_def_nokill(m) task_def_nokill((m).t)
-#define elastic_hard_task_def_ctrl_jet(m) task_def_ctrl_jet((m).t)
-#define elastic_hard_task_def_cnormal(m,c) (m).cnormal = (c)
-#define elastic_hard_task_def_period(m,p) (m).period = (p)
-#define elastic_hard_task_def_wcet(m,w) (m).wcet = (w)
-#define elastic_hard_task_def_maxperiod(m,p) (m).maxperiod = (p)
-#define elastic_hard_task_def_joinable(m) task_def_joinable((m).t)
-#define elastic_hard_task_def_unjoinable(m) task_def_unjoinable((m).t)
-
-
-
-
-/*+ Registration function:
- int flags Options to be used in this level instance...
- LEVEL master the level that must be used as master level for the
- CBSGHD tasks
-
- returns the level number at which the module has been registered.
-+*/
-LEVEL CBSGHD_register_level(int flags, LEVEL master);
-
-/*+ Returns the used bandwidth of a level +*/
-bandwidth_t CBSGHD_usedbandwidth(LEVEL l);
-
-#endif
-
Index: rel_1_2/cash/readme.txt
===================================================================
--- rel_1_2/cash/readme.txt (revision 1198)
+++ rel_1_2/cash/readme.txt (nonexistent)
@@ -1,6 +0,0 @@
-This Example has been made by Marco Caccamo.
-
-There is not a lot of documentation available, so if you have problems please
-send an e-mail to Marco ( http://gandalf.sssup.it/~caccamo/ )
-
-Paolo
Index: rel_1_2/cash/makefile
===================================================================
--- rel_1_2/cash/makefile (revision 1198)
+++ rel_1_2/cash/makefile (nonexistent)
@@ -1,17 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-
-include $(BASE)/config/config.mk
-
-PROGS=testcash
-
-include $(BASE)/config/example.mk
-
-testcash:
- make -f $(SUBMAKE) APP=testcash INIT= OTHEROBJS="initcash.o cash.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
-
Index: rel_1_2/cash/testcash.c
===================================================================
--- rel_1_2/cash/testcash.c (revision 1198)
+++ rel_1_2/cash/testcash.c (nonexistent)
@@ -1,455 +0,0 @@
-/*
- * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Gerardo Lamastra <gerardo@sssup.it>
- *
- * Authors : Paolo Gai <pj@hartik.sssup.it>
- * (see authors.txt for full list of hartik's authors)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://hartik.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: testcash.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- testcash.c
- test for the CASH Module, directly derived from Test Number 13 (D)
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "cash.h"
-#include <math.h>
-#include <string.h>
-
-#define ASTER_LIM 60
-#define DISPLAY_MAX 15
-
-#define STAT_Y 9
-
-#define INPUT 0.5
-
-
-
-#define MAX_STAT 10000
-#define RVAL 1
-#define XVAL 2
-#define DVAL 3
-
-
-struct statistic {
- TIME r_time;
- TIME ex_time;
- long dead_post;
-};
-
-
-
- struct statistic stat[MAX_STAT];
- TIME val[MAX_STAT];
-
-int n_stat = 0;
-
-TASK hard_asteroide(void)
-{
- int i;
- int y = rand() % 7 + 1;
- double avg, l, fix, u;
- double wcet = 40200;
- int load1,j;
-
- char s[2];
-
- s[0] = 'H'; s[1] = 0;
- /* exponential distribution parameters */
- fix = wcet - 10.0/9.0 * wcet * (1 - INPUT);
- avg = 1.0/9.0 * wcet * (1 - INPUT);
- l = 10.0 / 9.0 * wcet * (1 - INPUT);
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- /* exponential distribution */
- u = (double)rand();
-
- u = u / (double)RAND_MAX;
-
- u = -avg * log(u);
- if (u > l)
- u = avg;
-
-
- load1 = fix + u;
-
- for (j=0; j<load1; j++) {
- puts_xy(i,y,rand()%15+1,s);
- }
- //kern_cli();
- //stat[n_stat].r_time = CBSGHD_get_response_time(1, exec_shadow);
- //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
- //kern_sti();
- //n_stat++;
- task_endcycle();
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
-}
-
-
-TASK hard_asteroide1(void)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = 'H'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 40000 + rand()%20000;
- for (j=0; j<load1; j++) {
- puts_xy(i,y,rand()%15+1,s);
- }
- //kern_cli();
- //stat[n_stat].r_time = CBSGHD_get_response_time(1, exec_shadow);
- //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
- //kern_sti();
- //n_stat++;
- task_endcycle();
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
-}
-
-
-TASK hard_asteroide2(void)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = 'H'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 80500; // + rand()%6000;
- for (j=0; j<load1; j++) {
- puts_xy(i,y,rand()%15+1,s);
- }
- //kern_cli();
- //stat[n_stat].r_time = CBSGHD_get_response_time(5, exec_shadow);
- //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
- //kern_sti();
- //n_stat++;
- task_endcycle();
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
-}
-
-TASK hard_asteroide3(void)
-{
- int i;
- int y = rand() % 7 + 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = 'T'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 27000;
- for (j=0; j<load1; j++) {
- puts_xy(i,y,rand()%15+1,s);
- }
- //kern_cli();
- //stat[n_stat].r_time = CBSGHD_get_response_time(5, exec_shadow);
- //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
- //kern_sti();
- //n_stat++;
- task_endcycle();
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
-}
-
-
-TASK clock()
-{
- int s = 0, m = 0;
-
- while(1) {
- printf_xy(62,1,WHITE,"%2d:%2d",m,s);
- printf_xy(62,2,WHITE,"Utot=%12u",MAX_BANDWIDTH);
- printf_xy(62,3,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
- printf_xy(62,4,WHITE,"Ucbs=%12u",CBSGHD_usedbandwidth(1));
- task_endcycle();
-
- if (++s > 59) {
- s = 0;
- m++;
- }
- printf_xy(62,1,WHITE,"%2d:%2d",m,s);
- printf_xy(62,2,WHITE,"Utot=%12u",MAX_BANDWIDTH);
- printf_xy(62,3,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
- printf_xy(62,4,WHITE,"Ucbs=%12u",CBSGHD_usedbandwidth(1));
- task_endcycle();
- }
-}
-
-
-
-/* we consider the first ASTER_MAX + 2 tasks from the PID 2
- and plot on the screen the elapsed times... */
-TASK jetcontrol()
-{
- int i; /* a counter */
- TIME sum, max, curr, last[5];
- int nact;
- int j; /* the elements set by jet_gettable */
- PID p;
-
-
- kern_cli();
- printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
- kern_sti();
-
- for (;;) {
- for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
- if (jet_getstat(p, &sum, &max, &nact, &curr) == -1) continue;
-
- for (j=0; j<5; j++) last[j] = 0;
- jet_gettable(p, &last[0], 5);
- kern_cli();
- printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6ld ³ %-6ld ³ %-4d ³ %-7ld ³ %-5ld ³ %-5ld ³ %-5ld ³ %-5ld ³ %-5ld", p, sum/(nact==0 ? 1 : nact), max,
- nact, curr, last[0], last[1], last[2], last[3], last[4]);
- kern_sti();
- i++;
- }
- task_endcycle();
- }
-}
-
-
-void save_stat(struct statistic p[], int n, char *name, int type)
-{
- DOS_FILE *f;
- int i;
- char outstring[500];
-
-
- for(i = 0; i < 500; i++)
- outstring[i] = '0';
-
- f = DOS_fopen(name, "w");
- if (!f) {
- cprintf("Cannot open %s!!!", name);
- goto end1;
- }
-
- for(i = 0; i < n; i++) {
- if (type == RVAL)
- val[i] = p[i].r_time;
- if (type == XVAL)
- val[i] = p[i].ex_time;
- if (type == DVAL)
- val[i] = p[i].dead_post;
- }
-
- memset(outstring, 0, 300);
- sprintf(outstring, "%ld \n", (long int)n);
- cprintf("%s", outstring);
- DOS_fwrite(outstring, 1, strlen(outstring), f);
-
- for(i = 0; i < n; i++) {
- memset(outstring, 0, 300);
- sprintf(outstring, "%ld %lu\n", (long int)i, val[i]);
- //cprintf("%s", outstring);
- DOS_fwrite(outstring, 1, strlen(outstring), f);
- }
- DOS_fclose(f);
-end1:cprintf("OK?");
-}
-
-
-void result_save(void *p)
-{
- save_stat(stat, n_stat, "stat1.tim", RVAL);
-}
-
-
-void fine()
-{
- sys_end();
-}
-
-int main(int argc, char **argv)
-{
- PID p1,p2,p3, p4, p5, p6, p7;
-
- ELASTIC_HARD_TASK_MODEL m;
- // int i;
- struct timespec fineprg;
-
-
- //sys_atrunlevel(result_save, NULL, RUNLEVEL_AFTER_EXIT);
- srand(7);
-
- elastic_hard_task_default_model(m);
- elastic_hard_task_def_wcet(m,500);
- elastic_hard_task_def_maxperiod(m,500000);
- elastic_hard_task_def_cnormal(m,500);
- elastic_hard_task_def_period(m,500000);
- elastic_hard_task_def_group(m,1);
- elastic_hard_task_def_ctrl_jet(m);
-
-
- p1 = task_create("Clock",clock,&m,NULL);
- if (p1 == -1) {
- perror("testhd.c(main): Could not create task <Clock> ...");
- sys_end();
- }
-
-
-
-
- elastic_hard_task_def_wcet(m,1000);
- elastic_hard_task_def_maxperiod(m,100000);
- elastic_hard_task_def_cnormal(m,1000);
- elastic_hard_task_def_period(m,100000);
-
-
- p2 = task_create("JetControl",jetcontrol,&m,NULL);
- if (p2 == -1) {
- perror("testhd.c(main): Could not create task <JetControl> ...");
- sys_end();
- }
-
-
-
- elastic_hard_task_def_wcet(m,21000);
- elastic_hard_task_def_maxperiod(m,155000);
- elastic_hard_task_def_cnormal(m,21000);
- elastic_hard_task_def_period(m,155000);
-
-
- p3 = task_create("Hard_asteroide1",hard_asteroide1,&m,NULL);
- if (p3 == -1) {
- perror("testhd.c(main): Could not create task <Hard asteroide> ...");
- sys_end();
- }
-
- elastic_hard_task_def_wcet(m,12000);
- elastic_hard_task_def_maxperiod(m,61000);
- elastic_hard_task_def_cnormal(m,12000);
- elastic_hard_task_def_period(m,61000);
-
-
-
-
- p4 = task_create("Hard_asteroide2",hard_asteroide,&m,NULL);
- if (p4 == -1) {
- perror("testhd.c(main): Could not create task <Hard asteroide> ...");
- sys_end();
- }
-
-
- elastic_hard_task_def_wcet(m,30000);
- elastic_hard_task_def_maxperiod(m,200000);
- elastic_hard_task_def_cnormal(m,30000);
- elastic_hard_task_def_period(m,200000);
-
-
- p5 = task_create("Hard_asteroide3",hard_asteroide2,&m,NULL);
- if (p5 == -1) {
- perror("testhd.c(main): Could not create task <Hard asteroide> ...");
- sys_end();
- }
-
- elastic_hard_task_def_wcet(m,30000);
- elastic_hard_task_def_maxperiod(m,100000);
- elastic_hard_task_def_cnormal(m,30000);
- elastic_hard_task_def_period(m,100000);
-
-
- p6 = task_create("Hard_asteroide3",hard_asteroide2,&m,NULL);
- if (p6 == -1) {
- perror("testhd.c(main): Could not create task <Hard asteroide> ...");
- sys_end();
- }
-
- elastic_hard_task_def_wcet(m,10000);
- elastic_hard_task_def_maxperiod(m,200000);
- elastic_hard_task_def_cnormal(m,2500);
- elastic_hard_task_def_period(m,49000);
-
-
- p7 = task_create("Hard_asteroide3",hard_asteroide3,&m,NULL);
- if (p7 == -1) {
- perror("testhd.c(main): Could not create task <Hard asteroide> ...");
- sys_end();
- }
-
-
-
-
- printf_xy(0,STAT_Y + 15,WHITE,"Hard asteroide PID= %-3d ",p3);
- printf_xy(0,STAT_Y + 17,WHITE,"Clock PID= %-3d ",p1);
- printf_xy(0,STAT_Y + 18,WHITE,"JetControl PID= %-3d ",p2);
-
-
-
- task_nopreempt();
- fineprg.tv_sec = 30;
- fineprg.tv_nsec = 0;
- kern_event_post(&fineprg,fine,NULL);
- group_activate(1);
- return 0;
-}
-
Index: rel_1_2/cash/cash.c
===================================================================
--- rel_1_2/cash/cash.c (revision 1198)
+++ rel_1_2/cash/cash.c (nonexistent)
@@ -1,817 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: cash.c,v 1.4 2003-01-07 17:10:16 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.4 $
- Last update: $Date: 2003-01-07 17:10:16 $
- ------------
-
- This file contains the aperiodic server CBS (Total Bandwidth Server)
-
- Read CBS.h for further details.
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#include "cash.h"
-#include <ll/stdio.h>
-#include <ll/string.h>
-#include <kernel/model.h>
-#include <kernel/descr.h>
-#include <kernel/var.h>
-#include <kernel/func.h>
-#include <kernel/trace.h>
-
-
-/*+ Status used in the level +*/
-#define CBSGHD_IDLE APER_STATUS_BASE /*+ waiting the activation +*/
-#define CBSGHD_ZOMBIE APER_STATUS_BASE+1 /*+ waiting the period end +*/
-
-/* structure of an element of the capacity queue */
-struct cap_queue {
- int cap;
- struct timespec dead;
- struct cap_queue *next;
-};
-
-/*+ the level redefinition for the CBS_HD level +*/
-typedef struct {
- level_des l; /*+ the standard level descriptor +*/
-
- /* The wcet are stored in the task descriptor, but we need
- an array for the deadlines. We can't use the timespec_priority
- field because it is used by the master level!!!...
- Notice that however the use of the timespec_priority field
- does not cause any problem... */
-
- struct timespec cbsghd_dline[MAX_PROC]; /*+ CBSGHD deadlines +*/
-
- TIME period[MAX_PROC]; /*+ CBSGHD activation period +*/
-
- TIME maxperiod[MAX_PROC]; /*+ maximum period of each elastic task +*/
-
- int cremaining[MAX_PROC]; /*+ instance remaining computation time +*/
-
- TIME act_period[MAX_PROC]; /*+ actual period of each elastic task: it
- must be less than maxperiod!!! +*/
-
- struct timespec request_time[MAX_PROC]; /* used for the response time */
- TIME last_response_time[MAX_PROC]; /* response time of the last instance */
-
- TIME cnormal[MAX_PROC]; /*+ CBSGHD normal computation time +*/
-
- struct timespec reactivation_time[MAX_PROC];
- /*+ the time at witch the reactivation timer is post +*/
- int reactivation_timer[MAX_PROC];
- /*+ the recativation timer +*/
-
- struct cap_queue *queue; /* pointer to the spare capacity queue */
-
- int flags; /*+ the init flags... +*/
-
- bandwidth_t U; /*+ the used bandwidth by the server +*/
-
- int idle; /* the idle flag... */
-
- struct timespec start_idle; /*gives the start time of the last idle period */
-
- LEVEL scheduling_level;
-
-} CBSGHD_level_des;
-
-
-/* insert a capacity in the queue capacity ordering by deadline */
-
-static int c_insert(struct timespec dead, int cap, struct cap_queue **que,
- PID p)
-{
- struct cap_queue *prev, *n, *new;
-
- prev = NULL;
- n = *que;
-
- while ((n != NULL) &&
- !TIMESPEC_A_LT_B(&dead, &n->dead)) {
- prev = n;
- n = n->next;
- }
-
-
- new = (struct cap_queue *)kern_alloc(sizeof(struct cap_queue));
- if (new == NULL) {
- kern_printf("\nNew cash_queue element failed\n");
- kern_raise(XINVALID_TASK, p);
- return -1;
- }
- new->next = NULL;
- new->cap = cap;
- new->dead = dead;
-
- if (prev != NULL)
- prev->next = new;
- else
- *que = new;
-
- if (n != NULL)
- new->next = n;
- return 0;
-}
-
-/* extract the first element from the capacity queue */
-
-static int c_extractfirst(struct cap_queue **que)
-{
- struct cap_queue *p = *que;
-
-
- if (*que == NULL) return(-1);
-
- *que = (*que)->next;
-
- kern_free(p, sizeof(struct cap_queue));
- return(1);
-}
-
-/* read data of the first element from the capacity queue */
-
-static void c_readfirst(struct timespec *d, int *c, struct cap_queue *que)
-{
- *d = que->dead;
- *c = que->cap;
-}
-
-/* write data of the first element from the capacity queue */
-
-static void c_writefirst(struct timespec dead, int cap, struct cap_queue *que)
-{
- que->dead = dead;
- que->cap = cap;
-}
-
-
-static void CBSGHD_activation(CBSGHD_level_des *lev,
- PID p,
- struct timespec *acttime)
-{
- JOB_TASK_MODEL job;
-
-
- /* This rule is used when we recharge the budget at initial task activation
- and each time a new task instance must be activated */
-
- if (TIMESPEC_A_GT_B(acttime, &lev->cbsghd_dline[p])) {
- /* we modify the deadline ... */
- TIMESPEC_ASSIGN(&lev->cbsghd_dline[p], acttime);
- }
-
- lev->act_period[p] = 0;
-
- if (proc_table[p].avail_time > 0)
- proc_table[p].avail_time = 0;
-
-
-
-
- /* there is a while because if the wcet is << than the system tick
- we need to postpone the deadline many times */
- while (proc_table[p].avail_time <= 0) {
-
- /* A spare capacity is inserted in the capacity queue!! */
- ADDUSEC2TIMESPEC(lev->period[p], &lev->cbsghd_dline[p]);
- lev->act_period[p] += lev->period[p];
- c_insert(lev->cbsghd_dline[p], lev->cnormal[p], &lev->queue, p);
-
-
- /* it exploits available capacities from the capacity queue */
- while (proc_table[p].avail_time < (int)lev->cnormal[p] &&
- lev->queue != NULL) {
- struct timespec dead;
- int cap, delta;
- delta = lev->cnormal[p] - proc_table[p].avail_time;
- c_readfirst(&dead, &cap, lev->queue);
- if (!TIMESPEC_A_GT_B(&dead, &lev->cbsghd_dline[p])) {
- if (cap > delta) {
- proc_table[p].avail_time += delta;
- c_writefirst(dead, cap - delta, lev->queue);
- }
- else {
- proc_table[p].avail_time += cap;
- c_extractfirst(&lev->queue);
- }
- }
- else
- break;
- }
- }
-
- lev->cremaining[p] = proc_table[p].wcet - proc_table[p].avail_time;
-
-
-#ifdef TESTG
- if (starttime && p == 3) {
- oldx = x;
- x = ((lev->cbsghd_dline[p].tv_sec*1000000+lev->cbsghd_dline[p].tv_nsec/1000)/5000 - starttime) + 20;
- // kern_printf("(a%d)",lev->cbsghd_dline[p].tv_sec*1000000+lev->cbsghd_dline[p].tv_nsec/1000);
- if (oldx > x) sys_end();
- if (x<640)
- grx_plot(x, 15, 8);
- }
-#endif
-
- /* and, finally, we reinsert the task in the master level */
- job_task_default_model(job, lev->cbsghd_dline[p]);
- job_task_def_yesexc(job);
- level_table[ lev->scheduling_level ]->
- private_insert(lev->scheduling_level, p, (TASK_MODEL *)&job);
-}
-
-
-/* this is the periodic reactivation of the task... */
-static void CBSGHD_timer_reactivate(void *par)
-{
- PID p = (PID) par;
- CBSGHD_level_des *lev;
-
- lev = (CBSGHD_level_des *)level_table[proc_table[p].task_level];
-
- if (proc_table[p].status == CBSGHD_IDLE) {
- /* the task has finished the current activation and must be
- reactivated */
-
- /* request_time represents the time of the last instance release!! */
- TIMESPEC_ASSIGN(&lev->request_time[p], &lev->reactivation_time[p]);
-
- /* If idle=1, then we have to discharge the capacities stored in
- the capacity queue up to the length of the idle interval */
- if (lev->idle == 1) {
- TIME interval;
- struct timespec delta;
- lev->idle = 0;
- SUBTIMESPEC(&lev->request_time[p], &lev->start_idle, &delta);
- /* length of the idle interval expressed in usec! */
- interval = TIMESPEC2NANOSEC(&delta) / 1000;
-
- /* it discharge the available capacities from the capacity queue */
- while (interval > 0 && lev->queue != NULL) {
- struct timespec dead;
- int cap;
- c_readfirst(&dead, &cap, lev->queue);
- if (cap > interval) {
- c_writefirst(dead, cap - interval, lev->queue);
- interval = 0;
- }
- else {
- interval -= cap;
- c_extractfirst(&lev->queue);
- }
- }
- }
-
- CBSGHD_activation(lev,p,&lev->reactivation_time[p]);
-
- /* check the constraint on the maximum period permitted... */
- if (lev->act_period[p] > lev->maxperiod[p]) {
- kern_printf("Deadline miss(timer_react.! process:%d act_period:%lu maxperiod:%lu\n",
- p, lev->act_period[p], lev->maxperiod[p]);
- kern_raise(XDEADLINE_MISS,p);
- }
-
-
- /* Set the reactivation timer */
- TIMESPEC_ASSIGN(&lev->reactivation_time[p], &lev->cbsghd_dline[p]);
- lev->reactivation_timer[p] = kern_event_post(&lev->reactivation_time[p],
- CBSGHD_timer_reactivate,
- (void *)p);
- event_need_reschedule();
- }
- else {
- /* this situation cannot occur */
- kern_printf("Trying to reactivate a task which is not IDLE!!!/n");
- kern_raise(XINVALID_TASK,p);
- }
-}
-
-
-
-
-
-static void CBSGHD_avail_time_check(CBSGHD_level_des *lev, PID p)
-{
-
- /*+ if the capacity became negative the remaining computation time
- is diminuished.... +*/
- /* if (p==4)
- kern_printf("(old dead:%d av_time:%d crem:%d)\n",
- lev->cbsghd_dline[p].tv_sec*1000000+
- lev->cbsghd_dline[p].tv_nsec/1000, proc_table[p].avail_time,
- lev->cremaining[p]); */
-
-
- if (proc_table[p].avail_time < 0)
- lev->cremaining[p] += proc_table[p].avail_time;
-
- if (lev->cremaining[p] <= 0) {
- kern_printf("Task:%d WCET violation \n", p);
- kern_raise(XWCET_VIOLATION, p);
- ll_abort(666);
- }
-
-
- /* there is a while because if the wcet is << than the system tick
- we need to postpone the deadline many times */
- while (proc_table[p].avail_time <= 0) {
- /* it exploits available capacities from the capacity queue */
- while (proc_table[p].avail_time < lev->cremaining[p]
- && lev->queue != NULL) {
- struct timespec dead;
- int cap, delta;
- delta = lev->cremaining[p] - proc_table[p].avail_time;
- c_readfirst(&dead, &cap, lev->queue);
- if (!TIMESPEC_A_GT_B(&dead, &lev->cbsghd_dline[p])) {
- if (cap > delta) {
- proc_table[p].avail_time += delta;
- c_writefirst(dead, cap - delta, lev->queue);
- }
- else {
- proc_table[p].avail_time += cap;
- c_extractfirst(&lev->queue);
- }
- }
- else
- break;
- }
-
- /* if (p==5 && proc_table[p].avail_time <= 0 &&
- lev->cremaining[p] > lev->cnormal[p])
- kern_printf("(inter dead:%d av_time:%d crem:%d)\n",
- lev->cbsghd_dline[p].tv_sec*1000000+
- lev->cbsghd_dline[p].tv_nsec/1000, proc_table[p].avail_time,
- lev->cremaining[p]); */
-
-
- /* The remaining computation time is modified according
- to the new budget! */
- if (proc_table[p].avail_time > 0)
- lev->cremaining[p] -= proc_table[p].avail_time;
- else {
- /* the CBSGHD rule for recharging the capacity: */
- if (lev->cremaining[p] > lev->cnormal[p]) {
- ADDUSEC2TIMESPEC(lev->period[p], &lev->cbsghd_dline[p]);
- lev->act_period[p] += lev->period[p];
- /* A spare capacity is inserted in the capacity queue!! */
- c_insert(lev->cbsghd_dline[p], lev->cnormal[p], &lev->queue, p);
- }
- else {
- TIME t;
- t = (lev->cremaining[p] * lev->period[p]) / lev->cnormal[p];
- ADDUSEC2TIMESPEC(t, &lev->cbsghd_dline[p]);
- lev->act_period[p] += t;
- /* A spare capacity is inserted in the capacity queue!! */
- c_insert(lev->cbsghd_dline[p], lev->cremaining[p], &lev->queue, p);
- }
- }
- }
-
- /* if (p==4)
- kern_printf("n dead:%d av_time:%d crem:%d)\n",
- lev->cbsghd_dline[p].tv_sec*1000000+
- lev->cbsghd_dline[p].tv_nsec/1000, proc_table[p].avail_time,
- lev->cremaining[p]); */
-
- /* check the constraint on the maximum period permitted... */
- if (lev->act_period[p] > lev->maxperiod[p]) {
- /*kern_printf("n dead:%d av_time:%d crem:%d)\n",
- lev->cbsghd_dline[p].tv_sec*1000000+
- lev->cbsghd_dline[p].tv_nsec/1000, proc_table[p].avail_time,
- lev->cremaining[p]); */
- kern_printf("Deadline miss(av.time_check! process:%d act_period:%lu maxperiod:%lu\n",
- p, lev->act_period[p], lev->maxperiod[p]);
- kern_raise(XDEADLINE_MISS,p);
- }
-
-
-
- if (TIMESPEC_A_LT_B(&lev->reactivation_time[p], &lev->cbsghd_dline[p])) {
- /* we delete the reactivation timer */
- kern_event_delete(lev->reactivation_timer[p]);
- /* repost the event at the next instance deadline... */
- lev->reactivation_time[p] = lev->cbsghd_dline[p];
- lev->reactivation_timer[p] = kern_event_post(&lev->reactivation_time[p],
- CBSGHD_timer_reactivate,
- (void *)p);
- }
-
-#ifdef TESTG
- if (starttime && p == 3) {
- oldx = x;
- x = ((lev->cbsghd_dline[p].tv_sec*1000000+
- lev->cbsghd_dline[p].tv_nsec/1000)/5000 - starttime) + 20;
- // kern_printf("(e%d avail%d)",lev->cbsghd_dline[p].tv_sec*1000000+
- lev->cbsghd_dline[p].tv_nsec/1000,proc_table[p].avail_time);
- if (oldx > x) sys_end();
- if (x<640)
- grx_plot(x, 15, 2);
- }
-#endif
-
-}
-
-
-/*+ this function is called when a killed or ended task reach the
- period end +*/
-static void CBSGHD_timer_zombie(void *par)
-{
- PID p = (PID) par;
- CBSGHD_level_des *lev;
-
- lev = (CBSGHD_level_des *)level_table[proc_table[p].task_level];
-
- /* we finally put the task in the FREE status */
- proc_table[p].status = FREE;
- iq_insertfirst(p,&freedesc);
-
- /* and free the allocated bandwidth */
- lev->U -= (MAX_BANDWIDTH/lev->period[p]) * lev->cnormal[p];
-
-}
-
-static PID CBSGHD_public_scheduler(LEVEL l)
-{
- CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
-
- /* it stores the actual time and set the IDLE flag in order to handle
- the capacity queue discharging!!! */
- lev->idle = 1;
- kern_gettime(&lev->start_idle);
-
-
- /* the CBSGHD don't schedule anything...
- it's an EDF level or similar that do it! */
- return NIL;
-}
-
-/* The on-line guarantee is enabled only if the appropriate flag is set... */
-static int CBSGHD_public_guarantee(LEVEL l, bandwidth_t *freebandwidth)
-{
- CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
-
- if (lev->flags & CBSGHD_FAILED_GUARANTEE) {
- *freebandwidth = 0;
- //kern_printf("guarantee :garanzia fallita!!!!!!\n");
- return 0;
- }
- else if (*freebandwidth >= lev->U) {
- *freebandwidth -= lev->U;
- return 1;
- }
- else {
- //kern_printf("guarantee :garanzia fallita per mancanza di banda!!!!!!\n");
- //kern_printf("freeband: %d request band: %d", *freebandwidth, lev->U);
- return 0;
- }
-}
-
-static int CBSGHD_public_create(LEVEL l, PID p, TASK_MODEL *m)
-{
- CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
- ELASTIC_HARD_TASK_MODEL *s;
- bandwidth_t b1, b2;
-
- if (m->pclass != ELASTIC_HARD_PCLASS) return -1;
- if (m->level != 0 && m->level != l) return -1;
- s = (ELASTIC_HARD_TASK_MODEL *)m;
-
- /* kern_printf("accept :ELASTIC TASK found!!!!!!\n"); */
- b1 = (MAX_BANDWIDTH / s->period) * s->cnormal;
- b2 = (MAX_BANDWIDTH / s->maxperiod) * s->wcet;
- if (!(s->wcet && s->cnormal && s->period && s->maxperiod &&
- s->wcet >= s->cnormal && b1 >= b2) )
- return -1;
- /* kern_printf("period: %d maxperiod: %d cnormal: %d wcet: %d, b1: %d b2:
- %d\n", s->period, s->maxperiod, s->cnormal, s->wcet, b1, b2); */
-
- /* now we know that m is a valid model */
-
-
- /* Enable wcet check */
- proc_table[p].avail_time = 0;
- proc_table[p].wcet = s->wcet;
- proc_table[p].control |= CONTROL_CAP;
-
- lev->period[p] = s->period;
- lev->maxperiod[p] = s->maxperiod;
- lev->cnormal[p] = s->cnormal;
- NULL_TIMESPEC(&lev->cbsghd_dline[p]);
- NULL_TIMESPEC(&lev->request_time[p]);
-
-
- /* update the bandwidth... */
- if (lev->flags & CBSGHD_ENABLE_GUARANTEE) {
- bandwidth_t b;
- b = (MAX_BANDWIDTH / s->period) * s->cnormal;
-
- /* really update lev->U, checking an overflow... */
- if (MAX_BANDWIDTH - lev->U > b)
- lev->U += b;
- else
- /* The task can NOT be guaranteed (U>MAX_BANDWIDTH)...
- (see EDF.c) */
- lev->flags |= CBSGHD_FAILED_GUARANTEE;
- }
-
-
-
- return 0; /* OK, also if the task cannot be guaranteed... */
-}
-
-static void CBSGHD_public_detach(LEVEL l, PID p)
-{
- /* the CBSGHD level doesn't introduce any dinamic allocated new field.
- we have only to reset the NO_GUARANTEE FIELD and decrement the allocated
- bandwidth */
-
- CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
-
- if (lev->flags & CBSGHD_FAILED_GUARANTEE)
- lev->flags &= ~CBSGHD_FAILED_GUARANTEE;
- else
- lev->U -= (MAX_BANDWIDTH / lev->period[p]) * lev->cnormal[p];
-
-
-}
-
-static void CBSGHD_public_dispatch(LEVEL l, PID p, int nostop)
-{
- CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
- level_table[ lev->scheduling_level ]->
- private_dispatch(lev->scheduling_level,p,nostop);
-
-}
-
-static void CBSGHD_public_epilogue(LEVEL l, PID p)
-{
- CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
- JOB_TASK_MODEL job;
-
- /* check if the budget is finished... */
- if ( proc_table[p].avail_time <= 0) {
- /* we kill the current activation */
- level_table[ lev->scheduling_level ]->
- private_extract(lev->scheduling_level, p);
-
- /* we modify the deadline */
- CBSGHD_avail_time_check(lev, p);
-
- /* and, finally, we reinsert the task in the master level */
- job_task_default_model(job, lev->cbsghd_dline[p]);
- job_task_def_yesexc(job);
- level_table[ lev->scheduling_level ]->
- private_insert(lev->scheduling_level, p, (TASK_MODEL *)&job);
- // kern_printf("epil : dl %d per %d p %d |\n",
- // lev->cbsghd_dline[p].tv_nsec/1000,lev->period[p],p);
-
- }
- else
- /* the task has been preempted. it returns into the ready queue by
- calling the guest_epilogue... */
- level_table[ lev->scheduling_level ]->
- private_epilogue(lev->scheduling_level,p);
-}
-
-static void CBSGHD_public_activate(LEVEL l, PID p)
-{
- CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
-
- kern_gettime(&lev->request_time[p]);
-
- /* If idle=1, then we have to discharge the capacities stored in
- the capacity queue up to the length of the idle interval */
- if (lev->idle == 1) {
- TIME interval;
- struct timespec delta;
- lev->idle = 0;
- SUBTIMESPEC(&lev->request_time[p], &lev->start_idle, &delta);
- /* length of the idle interval expressed in usec! */
- interval = TIMESPEC2NANOSEC(&delta) / 1000;
-
- /* it discharge the available capacities from the capacity queue */
- while (interval > 0 && lev->queue != NULL) {
- struct timespec dead;
- int cap;
- c_readfirst(&dead, &cap, lev->queue);
- if (cap > interval) {
- c_writefirst(dead, cap - interval, lev->queue);
- interval = 0;
- }
- else {
- interval -= cap;
- c_extractfirst(&lev->queue);
- }
- }
- }
-
- CBSGHD_activation(lev, p, &lev->request_time[p]);
-
-
- /* check the constraint on the maximum period permitted... */
- if (lev->act_period[p] > lev->maxperiod[p]) {
- kern_printf("Deadline miss(task_activ.! process:%d act_period:%lu maxperiod:%lu\n",
- p, lev->act_period[p], lev->maxperiod[p]);
- kern_raise(XDEADLINE_MISS,p);
- }
-
- /* Set the reactivation timer */
- TIMESPEC_ASSIGN(&lev->reactivation_time[p], &lev->cbsghd_dline[p]);
- lev->reactivation_timer[p] = kern_event_post(&lev->reactivation_time[p],
- CBSGHD_timer_reactivate,
- (void *)p);
-
- // kern_printf("act : %d %d |",lev->cbsghd_dline[p].tv_nsec/1000,p);
-}
-
-static void CBSGHD_public_unblock(LEVEL l, PID p)
-{
- printk("CBSGHD_task_insert\n");
- kern_raise(XINVALID_TASK,p);
-}
-
-static void CBSGHD_public_block(LEVEL l, PID p)
-{
- printk("CBSGHD_task_extract\n");
- kern_raise(XINVALID_TASK,p);
-}
-
-static int CBSGHD_public_message(LEVEL l, PID p, void *m)
-{
- CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
- struct timespec act_time, res;
-
- /* It computes the response time of the current instance... */
- kern_gettime(&act_time);
- SUBTIMESPEC(&act_time, &lev->request_time[p], &res);
- /* response time expressed in usec! */
- lev->last_response_time[p] = TIMESPEC2NANOSEC(&res) / 1000;
-
- level_table[ lev->scheduling_level ]->
- private_extract(lev->scheduling_level,p);
-
-
- /* A spare capacity is inserted in the capacity queue!! */
- if (proc_table[p].avail_time > 0) {
- c_insert(lev->cbsghd_dline[p], proc_table[p].avail_time, &lev->queue, p);
- proc_table[p].avail_time = 0;
- }
-
-
- proc_table[p].status = CBSGHD_IDLE;
-
- jet_update_endcycle(); /* Update the Jet data... */
- trc_logevent(TRC_ENDCYCLE,&exec_shadow); /* tracer stuff */
-
- return 0;
-}
-
-static void CBSGHD_public_end(LEVEL l, PID p)
-{
- CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
-
- /* check if the capacity became negative... */
- /* there is a while because if the wcet is << than the system tick
- we need to postpone the deadline many times */
- while (proc_table[p].avail_time < 0) {
- /* the CBSGHD rule for recharging the capacity */
- proc_table[p].avail_time += lev->cnormal[p];
- ADDUSEC2TIMESPEC(lev->period[p], &lev->cbsghd_dline[p]);
- }
-
- level_table[ lev->scheduling_level ]->
- private_extract(lev->scheduling_level,p);
-
- /* we delete the reactivation timer */
- kern_event_delete(lev->reactivation_timer[p]);
- lev->reactivation_timer[p] = -1;
-
-
- /* Finally, we post the zombie event. when the end period is reached,
- the task descriptor and banwidth are freed */
- proc_table[p].status = CBSGHD_ZOMBIE;
- lev->reactivation_timer[p] = kern_event_post(&lev->cbsghd_dline[p],
- CBSGHD_timer_zombie,
- (void *)p);
-}
-
-/* Registration functions */
-
-/*+ Registration function:
- int flags the init flags ... see CBS.h +*/
-LEVEL CBSGHD_register_level(int flags, LEVEL master)
-{
- LEVEL l; /* the level that we register */
- CBSGHD_level_des *lev; /* for readableness only */
- PID i; /* a counter */
-
- printk("CBSGHD_register_level\n");
-
- /* request an entry in the level_table */
- l = level_alloc_descriptor(sizeof(CBSGHD_level_des));
-
- lev = (CBSGHD_level_des *)level_table[l];
-
- printk(" lev=%d\n",(int)lev);
-
- /* fill the standard descriptor */
- lev->l.public_scheduler = CBSGHD_public_scheduler;
-
- if (flags & CBSGHD_ENABLE_GUARANTEE)
- lev->l.public_guarantee = CBSGHD_public_guarantee;
- else
- lev->l.public_guarantee = NULL;
-
- lev->l.public_create = CBSGHD_public_create;
- lev->l.public_detach = CBSGHD_public_detach;
- lev->l.public_end = CBSGHD_public_end;
- lev->l.public_dispatch = CBSGHD_public_dispatch;
- lev->l.public_epilogue = CBSGHD_public_epilogue;
- lev->l.public_activate = CBSGHD_public_activate;
- lev->l.public_unblock = CBSGHD_public_unblock;
- lev->l.public_block = CBSGHD_public_block;
- lev->l.public_message = CBSGHD_public_message;
-
- /* fill the CBSGHD descriptor part */
- for (i=0; i<MAX_PROC; i++) {
- NULL_TIMESPEC(&lev->cbsghd_dline[i]);
- lev->period[i] = 0;
- NULL_TIMESPEC(&lev->request_time[i]);
- lev->last_response_time[i] = 0;
- NULL_TIMESPEC(&lev->reactivation_time[i]);
- lev->reactivation_timer[i] = -1;
- }
-
-
- lev->U = 0;
- lev->idle = 0;
- lev->queue = NULL;
-
- lev->scheduling_level = master;
-
- lev->flags = flags & 0x07;
-
- return l;
-}
-
-
-int CBSGHD_get_response_time(LEVEL l, PID p)
-{
- CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
-
- return lev->last_response_time[p];
-}
-
-
-bandwidth_t CBSGHD_usedbandwidth(LEVEL l)
-{
- CBSGHD_level_des *lev = (CBSGHD_level_des *)(level_table[l]);
-
- return lev->U;
-}
-
Index: rel_1_2/soccer/calc.h
===================================================================
--- rel_1_2/soccer/calc.h (revision 1198)
+++ rel_1_2/soccer/calc.h (nonexistent)
@@ -1,1017 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: calc.h,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:44 $
- ------------
-*/
-
-/*
- * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/* GIMP header image file format (INDEXED): /mnt/disk/shark/base/images/runup//runup.h */
-
-//static unsigned int runup_width = 27;
-//static unsigned int runup_height = 27;
-
-
-/*Macro che disegan un calciatore che corre*/
-
-#define DIRDRAW(X,Y,D) \
- for(i=0;i<27;i++)\
- for(j=0;j<27;j++)\
- grx_plot(X+i,Y+j,rgb16(cmap[D][0],cmap[D][1],cmap[D][2]));\
- /* sprintf(a,"%d",f);\
- grx_text(a,X+30,Y+30, rgb16(255,255,255), rgb16(0,0,0));*/
-/*Macro che calcola i parametri di draw_calc*/
-#define DIREZ(A,C,G,S,F,X,Y) \
- if(col<12){\
- if( (A<=S)&&(A>=G)){ \
- if(C<=4) { \
- draw_calc(X, Y, F,i); \
- C++; \
- } \
- else if(C>4){ \
- draw_calc(X,Y,F+1,i); \
- C++; \
- if(C==8)C=0; \
- } \
- }\
- }
-
-/* Call this macro repeatedly. After each use, the pixel data can be extracted */
-
-#define HEADER_PIXEL(data,pixel) {\
-pixel[0] = runup_cmap[(unsigned char)data[0]][0]; \
-pixel[1] = runup_data_cmap[(unsigned char)data[0]][1]; \
-pixel[2] = runup_data_cmap[(unsigned char)data[0]][2]; \
-data ++; }
-
-static char cmap[256][3] = {
- { 0, 0, 0},
- { 0, 0, 64},
- { 0, 0,128},
- { 0, 0,255},
- { 0, 32, 0},
- { 0, 32, 64},
- { 0, 32,128},
- { 0, 32,255},
- { 0, 64, 0},
- { 0, 64, 64},
- { 0, 64,128},
- { 0, 64,255},
- { 0, 96, 0},
- { 0, 96, 64},
- { 0, 96,128},
- { 0, 96,255},
- { 0,128, 0},
- { 0,128, 64},
- { 0,128,128},
- { 0,128,255},
- { 0,160, 0},
- { 0,160, 64},
- { 0,160,128},
- { 0,160,255},
- { 0,192, 0},
- { 0,192, 64},
- { 0,192,128},
- { 0,192,255},
- { 0,255, 0},
- { 0,255, 64},
- { 0,255,128},
- { 0,255,255},
- { 32, 0, 0},
- { 32, 0, 64},
- { 32, 0,128},
- { 32, 0,255},
- { 32, 32, 0},
- { 32, 32, 64},
- { 32, 32,128},
- { 32, 32,255},
- { 32, 64, 0},
- { 32, 64, 64},
- { 32, 64,128},
- { 32, 64,255},
- { 32, 96, 0},
- { 32, 96, 64},
- { 32, 96,128},
- { 32, 96,255},
- { 32,128, 0},
- { 32,128, 64},
- { 32,128,128},
- { 32,128,255},
- { 32,160, 0},
- { 32,160, 64},
- { 32,160,128},
- { 32,160,255},
- { 32,192, 0},
- { 32,192, 64},
- { 32,192,128},
- { 32,192,255},
- { 32,255, 0},
- { 32,255, 64},
- { 32,255,128},
- { 32,255,255},
- { 64, 0, 0},
- { 64, 0, 64},
- { 64, 0,128},
- { 64, 0,255},
- { 64, 32, 0},
- { 64, 32, 64},
- { 64, 32,128},
- { 64, 32,255},
- { 64, 64, 0},
- { 64, 64, 64},
- { 64, 64,128},
- { 64, 64,255},
- { 64, 96, 0},
- { 64, 96, 64},
- { 64, 96,128},
- { 64, 96,255},
- { 64,128, 0},
- { 64,128, 64},
- { 64,128,128},
- { 64,128,255},
- { 64,160, 0},
- { 64,160, 64},
- { 64,160,128},
- { 64,160,255},
- { 64,192, 0},
- { 64,192, 64},
- { 64,192,128},
- { 64,192,255},
- { 64,255, 0},
- { 64,255, 64},
- { 64,255,128},
- { 64,255,255},
- { 96, 0, 0},
- { 96, 0, 64},
- { 96, 0,128},
- { 96, 0,255},
- { 96, 32, 0},
- { 96, 32, 64},
- { 96, 32,128},
- { 96, 32,255},
- { 96, 64, 0},
- { 96, 64, 64},
- { 96, 64,128},
- { 96, 64,255},
- { 96, 96, 0},
- { 96, 96, 64},
- { 96, 96,128},
- { 96, 96,255},
- { 96,128, 0},
- { 96,128, 64},
- { 96,128,128},
- { 96,128,255},
- { 96,160, 0},
- { 96,160, 64},
- { 96,160,128},
- { 96,160,255},
- { 96,192, 0},
- { 96,192, 64},
- { 96,192,128},
- { 96,192,255},
- { 96,255, 0},
- { 96,255, 64},
- { 96,255,128},
- { 96,255,255},
- {128, 0, 0},
- {128, 0, 64},
- {128, 0,128},
- {128, 0,255},
- {128, 32, 0},
- {128, 32, 64},
- {128, 32,128},
- {128, 32,255},
- {128, 64, 0},
- {128, 64, 64},
- {128, 64,128},
- {128, 64,255},
- {128, 96, 0},
- {128, 96, 64},
- {128, 96,128},
- {128, 96,255},
- {128,128, 0},
- {128,128, 64},
- {128,128,128},
- {128,128,255},
- {128,160, 0},
- {128,160, 64},
- {128,160,128},
- {128,160,255},
- {128,192, 0},
- {128,192, 64},
- {128,192,128},
- {128,192,255},
- {128,255, 0},
- {128,255, 64},
- {128,255,128},
- {128,255,255},
- {160, 0, 0},
- {160, 0, 64},
- {160, 0,128},
- {160, 0,255},
- {160, 32, 0},
- {160, 32, 64},
- {160, 32,128},
- {160, 32,255},
- {160, 64, 0},
- {160, 64, 64},
- {160, 64,128},
- {160, 64,255},
- {160, 96, 0},
- {160, 96, 64},
- {160, 96,128},
- {160, 96,255},
- {160,128, 0},
- {160,128, 64},
- {160,128,128},
- {160,128,255},
- {160,160, 0},
- {160,160, 64},
- {160,160,128},
- {160,160,255},
- {160,192, 0},
- {160,192, 64},
- {160,192,128},
- {160,192,255},
- {160,255, 0},
- {160,255, 64},
- {160,255,128},
- {160,255,255},
- {192, 0, 0},
- {192, 0, 64},
- {192, 0,128},
- {192, 0,255},
- {192, 32, 0},
- {192, 32, 64},
- {192, 32,128},
- {192, 32,255},
- {192, 64, 0},
- {192, 64, 64},
- {192, 64,128},
- {192, 64,255},
- {192, 96, 0},
- {192, 96, 64},
- {192, 96,128},
- {192, 96,255},
- {192,128, 0},
- {192,128, 64},
- {192,128,128},
- {192,128,255},
- {192,160, 0},
- {192,160, 64},
- {192,160,128},
- {192,160,255},
- {192,192, 0},
- {192,192, 64},
- {192,192,128},
- {192,192,255},
- {192,255, 0},
- {192,255, 64},
- {192,255,128},
- {192,255,255},
- {255, 0, 0},
- {255, 0, 64},
- {255, 0,128},
- {255, 0,255},
- {255, 32, 0},
- {255, 32, 64},
- {255, 32,128},
- {255, 32,255},
- {255, 64, 0},
- {255, 64, 64},
- {255, 64,128},
- {255, 64,255},
- {255, 96, 0},
- {255, 96, 64},
- {255, 96,128},
- {255, 96,255},
- {255,128, 0},
- {255,128, 64},
- {255,128,128},
- {255,128,255},
- {255,160, 0},
- {255,160, 64},
- {255,160,128},
- {255,160,255},
- {255,192, 0},
- {255,192, 64},
- {255,192,128},
- {255,192,255},
- {255,255, 0},
- {255,255, 64},
- {255,255,128},
- {255,255,255}
- };
-static char runup_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16, 0, 0,255, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16, 0, 0,16,16,16,16, 0,255, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
- 16,16, 0,255,233, 0,16,16,16,16, 0,255,233,233,233, 0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16, 0,233, 0, 0, 0, 0, 0,16, 0,233,233,233,233, 0,233, 0,16,16,16,16,16,16,16,16,16,
- 16,16, 0, 0,255,255,255,255,255, 0, 0,233, 0,233, 0,233, 0, 0, 0, 0, 0,16,16,16,16,16,16,
- 16,16, 0,255,255,255,255,255,255, 0, 0, 0,233, 0,233, 0,233, 0,255,255, 0, 0, 0,16,16,16,16,
- 16,16,16, 0,255,255,255,255,255, 0, 0,233, 0,233, 0, 0, 0, 0,255,255,255,255,255, 0,16,16,16,
- 16,16,16, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0,233, 0, 0, 0,255,255,255,255,255,255, 0,16,16,
- 16,16,16,16,16, 0, 0, 0, 0,255, 0, 0,233, 0, 0, 0, 0,255,255,255,255,255,255,255, 0, 0,16,
- 16,16,16,16,16,16,16,16, 0, 0,255, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0,233, 0,16,
- 16,16,16,16,16,16,16,16,16, 0, 0,255,255,255,255, 0,255, 0, 0,16,16, 0, 0,233, 0, 0,16,
- 16,16,16,16,16,16,16,16,16,16, 0, 0, 0,255, 0,255, 0, 0, 0,233,16,16, 0, 0, 0,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0, 0,233,233, 0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,255,255,255, 0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,255,255, 0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,255, 0, 0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
- };
-static char runup2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,255,0,16,16,16,16,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,233,233,233,255, 0,16,16,16,16,0,233,255,0,16,16,
- 16,16,16,16,16,16,16,16,16,0,233,0,233,233,233,233, 0,16,0,0,0,0,0,233,0,16,16,
- 16,16,16,16,16,16,0,0,0,0,0,233,0,233,0,233,0,0,255,255,255,255,255,0,0,16,16,
- 16,16,16,16,0,0,0,255,255,0,233,0,233,0,233,0,0,0,255,255,255,255,255,255,0,16,16,
- 16,16,16,0,255,255,255,255,255,0,0,0,0,233,0,233,0,0,255,255,255,255,255,0,16,16,16,
- 16,16,0,255,255,255,255,255,255,0,0,0,233,0,0,0,0,255,255,255,0,0,0,0,16,16,16,
- 16,0,0,255,255,255,255,255,255,255,0,0,0,0,233,0,0,255,0,0,0,0,16,16,16,16,16,
- 16,0,233,0,0,0,0,0,0,255,255,0,0,0,0,0, 255,0,0,16,16,16,16,16,16,16,16,
- 16,0,0,233,0,0,16,16,0,0,255,0,255,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,0,0,0,16,16,233,0,0,0,255,0,255,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,233,233,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,255,255,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,255,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
- };
-static char runru_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,4,77,0,12,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,4,100,246,169,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,37,68,68,68,8,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,219,255,219,0,8,16,16,16,4,0,0,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,0,219,255,255,219,0,12,16,4,36,36,0,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,4,110,255,255,255,219,4,16,45,219,218,73,4,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,0,110,255,255,255,41,8,36,182,0,4,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,12,0,146,255,255,73,0,32,233,242,165,0,12,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,218,182,0,0,132,133,233,233,165,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,219,146,32,201,133,132,233,233,165,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,146,0,0,32,100,32,132,132,32,68,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,146,36,165,64,100,100,132,133,100,100,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,219,110,64,0,132,100,0,165,64,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,37,255,110,0,0,0,0,0,73,110,4,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,37,255,255,73,36,0,37,73,255,255,73,4,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,4,37,110,73,219,219,255,255,255,255,37,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,4,110,73,110,146,109,255,255,255,255,37,8,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,36,73,68,0,0,4,73,255,255,255,218,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,77,255,238,133,137,48,8,73,255,255,182,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,12,4,146,255,255,101,72,16,4,0,73,255,110,8,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,4,36,218,182,109,4,16,16,8,32,100,137,0,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,0,0,4,16,16,16,8,32,100,100,0,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,0,0,4,16,16,16,16,16,8,4,4,12,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,0,4,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
- };
-
- static char runru2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,8,12,12,8,12,12,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,12,0,0,110,182,218,37,8,4,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,4,100,137,255,255,255,255,37,73,4,16,12,12,12,12,16,16,16,12,16,16,16,16,16,16,
- 16,16,4,100,100,73,255,255,255,255,255,110,0,100,68,0,0,12,16,4,0,8,16,16,16,16,16,
- 16,16,8,32,32,0,73,255,255,255,255,73,64,100,32,165,165,0,4,73,0,0,12,16,16,16,16,
- 16,16,16,8,8,4,8,73,255,255,73,0,165,133,132,233,233,165,0,218,36,0,16,16,16,16,16,
- 16,16,16,16,16,16,48,4,109,255,37,0,0,132,132,233,233,242,182,219,36,4,16,16,16,16,16,
- 16,16,16,16,16,72,137,0,146,219,0,0,100,100,32,132, 133,233,36,45,4,16,16,16,16,16,16,
- 16,16,16,16,4,101,133,0,110,219,36,0,132,100,100,133,132,32,8,16,16,16,16,16,16,16,16,
- 16,16,16,4,109,255,238,68,73,73,73,0,0,64,32,201,0,0,41,4,12,16,16,16,16,16,16,
- 16,16,4,0,182,255,255,73,110,110,255,110,64,165,0,32,0,73,255,219,0,8,8,8,12,16,16,
- 16,4,0,0,218,146,77,36,4,37,255,255,110,36,0,146,182,255,255,255,219,0,68,169,0,16,16,
- 12,0,0,0,36,4,12,12,16,4,37,37,219,146,146,219,218,255,255,255,255,219,68,246,77,16,16,
- 16,8,0,0,4,12,16,16,16,16,8,8,0,0,0,0,0,146,110,255,255,255,68,100,4,16,16,
- 16,16,12,16,16,16,16,16,16,16,16,16,12,12,16,12,12,0,0,110,219,219,37,4,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12,8,4,0,8,8,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
- };
-
-static char rundes_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,233,0,255,255,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,0,0,0,0,233,16,0,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,0,255,255,233,0,0,0,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,255,255,255,233,0,0,255,255,0,0, 0,0,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,0,0,0,0,255,0,0,255,255,0,0,0, 233,0,233,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,255,0,0,0,0,0, 0,233,0,0,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0,255,0,0,233,0, 233,0,233,233,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,255,255,0,0,0,233, 0,233,233,233,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0,255,0,233,0,0, 233,0,233,233,0,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,255,0,0,0,233, 0,233,233,255,0,255,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,255,0,0,0, 0,0,0,0,255,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,0, 0,0,16,16,0,0,0,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0,255,255, 255,255,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,255, 255,255,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,255, 255,255,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,255, 255,255,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255, 255,255,0,233,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 255,0,233,255,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,0,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-
-static char rundes2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,0,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 255,0,233,255,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255, 255,255,0,233,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,255, 255,255,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,255, 255,255,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,255, 255,255,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0,255,255, 255,255,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,0, 0,0,16,16,0,0,0,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,255,0,0,0, 0,0,0,0,255,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,255,0,0,0,233, 0,233,233,255,0,255,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0,255,0,233,0,0, 233,0,233,233,0,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,255,255,0,0,0,233, 0,233,233,233,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0,255,0,0,233,0, 233,0,233,233,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,255,0,0,0,0,0, 0,233,0,0,0,16,16,16,16,16,16,
- 16,16,16,16,0,0,0,0,255,0,0,255,255,0,0,0, 233,0,233,0,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,255,255,255,233,0,0,255,255,0,0, 0,0,0,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,0,255,255,233,0,0,0,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,0,0,0,0,233,16,0,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,233,0,255,255,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char runrd_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,0,4,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,0,0,4,16,16,16,16, 16,8,4,4,12,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,0,0,4,16,16,16, 8,32,100,100,0,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,4,36,218,182,109,4,16,16, 8,32,100,137,0,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,12,4,146,255,255,101,72,16, 4,0,73,255,110,8,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,77,255,238,133,137,48, 8,73,255,255,182,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,36,73,68,0,0,4, 73,255,255,255,218,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,4,110,73,110,146,109, 255,255,255,255,37,8,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,4,37,110,73,219,219,255, 255,255,255,37,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,37,255,255,73,36,0,37, 73,255,255,73,4,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,37,255,110,0,0,0,0, 0,73,110,4,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,219,110,64,0,132,100,0, 165,64,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,146,36,165,64,100,100,132, 133,100,100,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,146,0,0,32,100,32,132, 132,32,68,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,219,146,32,201,133,132,233, 233,165,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,218,182,0,0,132,133,233, 233,165,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,12,0,146,255,255,73,0,32,233,242, 165,0,12,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,0,110,255,255,255,41,8,36,182, 0,4,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,4,110,255,255,255,219,4,16,45,219, 218,73,4,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,0,219,255,255,219,0,12,16,4,36, 36,0,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,219,255,219,0,8,16,16,16,4, 0,0,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,37,68,68,68,8,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,4,100,246,169,8,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,4,77,0,12,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char runrd2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,12,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,8,4,0,8,8,16,16,16,16,
- 16,16,12,16,16,16,16,16,16,16,16,16,12,12,16,12, 12,0,0,110,219,219,37,4,16,16,16,
- 16,8,0,0,4,12,16,16,16,16,8,8,0,0,0,0, 0,146,110,255,255,255,68,100,4,16,16,
- 12,0,0,0,36,4,12,12,16,4,37,37,219,146,146,219, 218,255,255,255,255,219,68,246,77,16,16,
- 16,4,0,0,218,146,77,36,4,37,255,255,110,36,0,146, 182,255,255,255,219,0,68,169,0,16,16,
- 16,16,4,0,182,255,255,73,110,110,255,110,64,165,0,32, 0,73,255,219,0,8,8,8,12,16,16,
- 16,16,16,4,109,255,238,68,73,73,73,0,0,64,32,201, 0,0,41,4,12,16,16,16,16,16,16,
- 16,16,16,16,4,101,133,0,110,219,36,0,132,100,100,133, 132,32,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,72,137,0,146,219,0,0,100,100,32,132, 133,233,36,45,4,16,16,16,16,16,16,
- 16,16,16,16,16,16,48,4,109,255,37,0,0,132,132,233, 233,242,182,219,36,4,16,16,16,16,16,
- 16,16,16,8,8,4,8,73,255,255,73,0,165,133,132,233, 233,165,0,218,36,0,16,16,16,16,16,
- 16,16,8,32,32,0,73,255,255,255,255,73,64,100,32,165, 165,0,4,73,0,0,12,16,16,16,16,
- 16,16,4,100,100,73,255,255,255,255,255,110,0,100,68,0, 0,12,16,4,0,8,16,16,16,16,16,
- 16,16,4,100,137,255,255,255,255,37,73,4,16,12,12,12, 12,16,16,16,12,16,16,16,16,16,16,
- 16,16,12,0,0,110,182,218,37,8,4,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,8,12,12,8,12,12,8,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char rundown_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,255,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,255,255,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,255,255,255,0,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,233,233,0,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,0,0,0,16,16,233,0,0,0,255,0,255,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,0,0,233,0,0,16,16,0,0,255,0,255,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
- 16,0,233,0,0,0,0,0,0,255,255,0,0,0,0,0, 255,0,0,16,16,16,16,16,16,16,16,
- 16,0,0,255,255,255,255,255,255,255,0,0,0,0,233,0, 0,255,0,0,0,0,16,16,16,16,16,
- 16,16,0,255,255,255,255,255,255,0,0,0,233,0,0,0, 0,255,255,255,0,0,0,0,16,16,16,
- 16,16,16,0,255,255,255,255,255,0,0,0,0,233,0,233, 0,0,255,255,255,255,255,0,16,16,16,
- 16,16,16,16,0,0,0,255,255,0,233,0,233,0,233,0, 0,0,255,255,255,255,255,255,0,16,16,
- 16,16,16,16,16,16,0,0,0,0,0,233,0,233,0,233, 0,0,255,255,255,255,255,0,0,16,16,
- 16,16,16,16,16,16,16,16,16,0,233,0,233,233,233,233, 0,16,0,0,0,0,0,233,0,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,233,233,233,255, 0,16,16,16,16,0,233,255,0,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0, 255,0,16,16,16,16,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char rundown2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,255,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,233,233,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,0,255,0,255,0,0,0,233,16,16,0,0,0,16,16,
- 16,16,16,16,16,16,16,16,16,0,0,255,255,255,255,0,255,0,0,16,16,0,0,233,0,0,16,
- 16,16,16,16,16,16,16,16,0,0,255,0,0,0,0,0,255,255,0,0,0,0,0,0,233,0,16,
- 16,16,16,16,16,0,0,0,0,255,0,0,233,0,0,0,0,255,255,255,255,255,255,255,0,0,16,
- 16,16,16,0,0,0,0,255,255,255,0,0,0,0,233,0,0,0,255,255,255,255,255,255,0,16,16,
- 16,16,16,0,255,255,255,255,255,0,0,233,0,233,0,0,0,0,255,255,255,255,255,0,16,16,16,
- 16,16,0,255,255,255,255,255,255,0,0,0,233,0,233,0,233,0,255,255,0,0,0,16,16,16,16,
- 16,16,0,0,255,255,255,255,255,0,0,233,0,233,0,233,0,0,0,0,0,16,16,16,16,16,16,
- 16,16,0,233,0,0,0,0,0,16,0,233,233,233,233,0,233,0,16,16,16,16,16,16,16,16,16,
- 16,16,0,255,233,0,16,16,16,16,0,255,233,233,233,0,0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,16,16,16,16,0,255,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
- };
-
-static char runld_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,0,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,12,4,4,8,16,16,16,16,16,4, 0,0,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,0,100,100,32,8,16,16,16,4,0, 0,0,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,0,137,100,32,8,16,16,4,109,182, 218,36,4,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,8,110,255,73,0,4,16,72,101,255,255, 146,4,12,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,182,255,255,73,8,48,137,133,238,255, 77,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,218,255,255,255,73,4,0,0,68,73, 36,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,8,37,255,255,255,255,109,146,110,73,110, 4,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,37,255,255,255,255,219,219,73,110, 37,4,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,4,73,255,255,73,37,0,36,73,255, 255,37,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,4,110,73,0,0,0,0,0,110, 255,37,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,64,165,0,100,132,0,64, 110,219,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,100,100,133,132,100,100,64,165, 36,146,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,68,32,132,132,32,100,32,0, 0,146,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,165,233,233,132,133,201,32, 146,219,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,165,233,233,133,132,0,0, 182,218,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,12,0,165,242,233,32,0,73, 255,255,146,0,12,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,4,0,182,36,8,41,255, 255,255,110,0,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,4,73,218,219,45,16,4,219, 255,255,255,110,4,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,0,36,36,4,16,12,0, 219,255,255,219,0,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,0,0,4,16,16,16,8, 0,219,255,219,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,8, 68,68,68,37,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8, 169,246,100,4,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12, 0,77,4,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char runld2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,8,8,0,4,8,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,4,37,219,219,110,0,0,12,12,16,12,12,16, 16,16,16,16,16,16,16,16,12,16,16,
- 16,16,4,100,68,255,255,255,110,146,0,0,0,0,0,8, 8,16,16,16,16,12,4,0,0,8,16,
- 16,16,77,246,68,219,255,255,255,255,218,219,146,146,219,37, 37,4,16,12,12,4,36,0,0,0,12,
- 16,16,0,169,68,0,219,255,255,255,182,146,0,36,110,255, 255,37,4,36,77,146,218,0,0,4,16,
- 16,16,12,8,8,8,0,219,255,73,0,32,0,165,64,110, 255,110,110,73,255,255,182,0,4,16,16,
- 16,16,16,16,16,16,12,4,41,0,0,201,32,64,0,0, 73,73,73,68,238,255,109,4,16,16,16,
- 16,16,16,16,16,16,16,16,8,32,132,133,100,100,132,0, 36,219,110,0,133,101,4,16,16,16,16,
- 16,16,16,16,16,16,4,45,36,233,133,132,32,100,100,0, 0,219,146,0,137,72,16,16,16,16,16,
- 16,16,16,16,16,4,36,219,182,242,233,233,132,132,0,0, 37,255,109,4,48,16,16,16,16,16,16,
- 16,16,16,16,16,0,36,218,0,165,233,233,132,133,165,0, 73,255,255,73,8,4,8,8,16,16,16,
- 16,16,16,16,12,0,0,73,4,0,165,165,32,100,64,73, 255,255,255,255,73,0,32,32,8,16,16,
- 16,16,16,16,16,8,0,4,16,12,0,0,68,100,0,110, 255,255,255,255,255,73,100,100,4,16,16,
- 16,16,16,16,16,16,12,16,16,16,12,12,12,12,16,4, 73,37,255,255,255,255,137,100,4,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,8,37,218,182,110,0,0,12,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,8,12,12,8,12,12,8,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char runleft_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,255,255,0,233, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,255,255,255,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,255,255,255,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0,255,255,255,0,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,255,255,255,255,0,16, 233,0,0,0,0,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,255,255,255,255,0,0, 0,233,255,255,0,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,0,0,0,255,255,0, 0,233,255,255,255,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,0,233,0,233,0,0,0,255,255, 0,0,255,0,0,0,0,16,16,16,16,
- 16,16,16,16,16,16,0,0,0,233,0,0,0,0,0,0, 255,0,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,233,233,0,233,0,233,0,0,255, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,233,233,233,0,233,0,0,0,255, 255,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,0,233,233,0,233,0,0,233,0,255, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,255,0,255,233,233,0,233,0,0,0,255, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,255,0,0,0,0,0,0,0,255,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,0,0,0,16,16,0,0,0,255,255,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,255,255,255,255,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,255,255,255,255,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,255,255,255,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,255,255,255,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,233,0,255,255,255,0,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,255,233,0,255,0,0,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char runleft2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,255,233,0,255,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,233,0,255,255,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,255,255,255,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,255,255,255,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,255,255,255,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,255,255,255,255,0,0,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,0,0,0,16,16,0,0,0,255,255,0,0,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,255,0,0,0,0,0,0,0,255,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,255,0,255,233,233,0,233,0,0,0,255,0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,0,233,233,0,233,0,0,233,0,255,0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,233,233,233,0,233,0,0,0,255,255,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,233,233,0,233,0,233,0,0,255,0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,0,0,233,0,0,0,0,0,0,255,0,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,233,0,233,0,0,0,255,255,0,0,255,0,0,0,0,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,0,0,0,255,255,0,0,233,255,255,255,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,255,255,255,255,0,0,0,233,255,255,0,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,255,255,255,255,0,16,233,0,0,0,0,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0,255,255,255,0,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,255,255,255,0,0,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,255,255,255,0,0,0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,255,255,0,233,0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
- };
-
-static char runlu_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12, 0,77,4,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8, 169,246,100,4,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,8, 68,68,68,37,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,0,0,4,16,16,16,8, 0,219,255,219,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,0,36,36,4,16,12,0, 219,255,255,219,0,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,4,73,218,219,45,16,4,219, 255,255,255,110,4,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,4,0,182,36,8,41,255, 255,255,110,0,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,12,0,165,242,233,32,0,73, 255,255,146,0,12,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,165,233,233,133,132,0,0, 182,218,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,165,233,233,132,133,201,32, 146,219,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,68,32,132,132,32,100,32,0, 0,146,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,100,100,133,132,100,100,64,165, 36,146,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,64,165,0,100,132,0,64, 110,219,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,4,110,73,0,0,0,0,0,110, 255,37,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,4,73,255,255,73,37,0,36,73,255, 255,37,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,37,255,255,255,255,219,219,73,110, 37,4,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,8,37,255,255,255,255,109,146,110,73,110, 4,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,218,255,255,255,73,4,0,0,68,73, 36,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,182,255,255,73,8,48,137,133,238,255, 77,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,8,110,255,73,0,4,16,72,101,255,255, 146,4,12,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,0,137,100,32,8,16,16,4,109,182, 218,36,4,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,0,100,100,32,8,16,16,16,4,0, 0,0,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,12,4,4,8,16,16,16,16,16,4, 0,0,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,0,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char runlu2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,8,12,12,8,12,12,8,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,8,37,218,182,110,0,0,12,16,16,
- 16,16,16,16,16,16,12,16,16,16,12,12,12,12,16,4, 73,37,255,255,255,255,137,100,4,16,16,
- 16,16,16,16,16,8,0,4,16,12,0,0,68,100,0,110,255,255,255,255,255,73,100,100,4,16,16,
- 16,16,16,16,12,0,0,73,4,0,165,165,32,100,64,73,255,255,255,255,73,0,32,32,8,16,16,
- 16,16,16,16,16,0,36,218,0,165,233,233,132,133,165,0, 73,255,255,73,8,4,8,8,16,16,16,
- 16,16,16,16,16,4,36,219,182,242,233,233,132,132,0,0, 37,255,109,4,48,16,16,16,16,16,16,
- 16,16,16,16,16,16,4,45,36,233,133,132,32,100,100,0, 0,219,146,0,137,72,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,32,132,133,100,100,132,0, 36,219,110,0,133,101,4,16,16,16,16,
- 16,16,16,16,16,16,12,4,41,0,0,201,32,64,0,0, 73,73,73,68,238,255,109,4,16,16,16,
- 16,16,12,8,8,8,0,219,255,73,0,32,0,165,64,110, 255,110,110,73,255,255,182,0,4,16,16,
- 16,16,0,169,68,0,219,255,255,255,182,146,0,36,110,255, 255,37,4,36,77,146,218,0,0,4,16,
- 16,16,77,246,68,219,255,255,255,255,218,219,146,146,219,37, 37,4,16,12,12,4,36,0,0,0,12,
- 16,16,4,100,68,255,255,255,110,146,0,0,0,0,0,8, 8,16,16,16,16,12,4,0,0,8,16,
- 16,16,16,4,37,219,219,110,0,0,12,12,16,12,12,16, 16,16,16,16,16,16,16,16,12,16,16,
- 16,16,16,16,8,8,0,4,8,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-
-/*static char calcdes_data[] = {
- 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16,16, 0, 0,255, 0,233, 0,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16, 0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16, 0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16, 0, 0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16, 0,255,255,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16, 0,255,255, 0, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16, 0,255, 0, 0, 0, 0,233,233,233, 0, 0,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16, 0,255, 0, 0,233, 0,233, 0,233,233,255, 0,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16, 0,255,255, 0, 0, 0,233, 0,233, 0,233,233, 0,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16, 0,255,255, 0, 0, 0, 0,233, 0,233, 0,233, 0,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16, 0,255,255, 0, 0, 0, 0, 0,233, 0,233, 0, 0,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16, 0,255, 0, 0, 0,233, 0, 0,233, 0, 0,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16, 0, 0,255,255, 0, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16, 0,255,255,255,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16, 0,255,255,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16, 0, 0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16, 0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16, 0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16,16, 0, 0,255, 0,233, 0,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
- };
-
-static char calcdown_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,255,255,255,255, 255,255,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,255,255,0,0,0,0, 0,0,255,0,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,0,0,255,255,255,0,0,0,0, 0,0,255,255,0,0,0,16,16,16,16,
- 16,16,16,16,16,0,255,255,255,255,255,0,0,0,0,0, 233,0,0,255,255,255,255,0,16,16,16,
- 16,16,16,16,0,0,255,255,255,255,255,0,233,0,0,233, 0,0,0,255,255,255,255,0,0,16,16,
- 16,16,16,16,0,255,255,255,255,255,255,0,0,0,233,0, 233,233,0,255,255,255,255,255,0,16,16,
- 16,16,16,16,0,0,255,0,255,255,255,0,0,233,0,233, 0,233,0,255,255,0,255,0,0,16,16,
- 16,16,16,16,0,233,0,16,0,255,255,0,233,0,233,0, 233,233,0,255,0,16,0,233,0,16,16,
- 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 255,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-
-static char calcleft_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,233,0,255,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,255,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,255,255,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0, 255,255,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0,233,233,233,0,0, 0,0,255,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,255,233,233,0,233,0,233, 0,0,255,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,233,233,0,233,0,233,0, 0,0,255,255,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,233,0,233,0,233,0,0, 0,0,255,255,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,233,0,233,0,0,0, 0,0,255,255,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0,233,0,0,233,0, 0,0,255,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0, 255,255,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,255,255,255,255,255, 255,255,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,255,255,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,255,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,233,0,255,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char calcup_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 255,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
- 16,16,16,16,0,233,0,16,0,255,255,0,233,0,233,0, 233,233,0,255,0,16,0,233,0,16,16,
- 16,16,16,16,0,0,255,0,255,255,255,0,0,233,0,233, 0,233,0,255,255,0,255,0,0,16,16,
- 16,16,16,16,0,255,255,255,255,255,255,0,0,0,233,0, 233,233,0,255,255,255,255,255,0,16,16,
- 16,16,16,16,0,0,255,255,255,255,255,0,233,0,0,233, 0,0,0,255,255,255,255,0,0,16,16,
- 16,16,16,16,16,0,255,255,255,255,255,0,0,0,0,0, 233,0,0,255,255,255,255,0,16,16,16,
- 16,16,16,16,16,16,0,0,0,255,255,255,0,0,0,0, 0,0,255,255,0,0,0,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,255,255,0,0,0,0, 0,0,255,0,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,255,255,255,255, 255,255,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- }; */
-static char portsx_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,220,220,220, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,220,220,220,220, 220,220,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,220,220,0,0,0,0, 0,0,220,0,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,0,0,220,220,220,0,0,0,0, 0,0,220,220,0,0,0,16,16,16,16,
- 16,16,16,16,16,0,220,220,220,220,220,0,0,0,0,0, 233,0,0,220,220,220,220,0,16,16,16,
- 16,16,16,16,0,0,220,220,220,220,220,0,233,0,0,233, 0,0,0,220,220,220,220,0,0,16,16,
- 16,16,16,16,0,220,220,220,220,220,220,0,0,0,233,0, 233,233,0,220,220,220,220,220,0,16,16,
- 16,16,16,16,0,0,220,0,220,220,220,0,0,233,0,233, 0,233,0,220,220,0,220,0,0,16,16,
- 16,16,16,16,0,233,0,16,0,220,220,0,233,0,233,0, 233,233,0,220,0,16,0,233,0,16,16,
- 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 220,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char portdx_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 130,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
- 16,16,16,16,0,233,0,16,0,130,130,0,233,0,233,0, 233,233,0,130,0,16,0,233,0,16,16,
- 16,16,16,16,0,0,130,0,130,130,130,0,0,233,0,233, 0,233,0,130,130,0,130,0,0,16,16,
- 16,16,16,16,0,130,130,130,130,130,130,0,0,0,233,0, 233,233,0,130,130,130,130,130,0,16,16,
- 16,16,16,16,0,0,130,130,130,130,130,0,233,0,0,233, 0,0,0,130,130,130,130,0,0,16,16,
- 16,16,16,16,16,0,130,130,130,130,130,0,0,0,0,0, 233,0,0,130,130,130,130,0,16,16,16,
- 16,16,16,16,16,16,0,0,0,130,130,130,0,0,0,0, 0,0,130,130,0,0,0,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,130,130,0,0,0,0, 0,0,130,0,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,130,130,130,130, 130,130,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,130,130,130, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-
-
Index: rel_1_2/soccer/stadio.h
===================================================================
--- rel_1_2/soccer/stadio.h (revision 1198)
+++ rel_1_2/soccer/stadio.h (nonexistent)
@@ -1,8435 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: stadio.h,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:44 $
- ------------
-*/
-
-/*
- * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-static unsigned int faro_width = 100;
-static unsigned int faro_height = 100;
-static unsigned int scale_width = 150;
-static unsigned int scale_height = 100;
-static unsigned int schermo_width = 300;
-static unsigned int schermo_height = 100;
-
-
-static char stadio_cmap[256][3] = {
- { 0, 0, 0},
- { 0, 0, 51},
- { 0, 0,102},
- { 0, 0,153},
- { 0, 0,204},
- { 0, 0,255},
- { 51, 0, 0},
- { 51, 0, 51},
- { 51, 0,102},
- { 51, 0,153},
- { 51, 0,204},
- { 51, 0,255},
- {102, 0, 0},
- {102, 0, 51},
- {102, 0,102},
- {102, 0,153},
- {102, 0,204},
- {102, 0,255},
- {153, 0, 0},
- {153, 0, 51},
- {153, 0,102},
- {153, 0,153},
- {153, 0,204},
- {153, 0,255},
- {204, 0, 0},
- {204, 0, 51},
- {204, 0,102},
- {204, 0,153},
- {204, 0,204},
- {204, 0,255},
- {255, 0, 0},
- {255, 0, 51},
- {255, 0,102},
- {255, 0,153},
- {255, 0,204},
- {255, 0,255},
- { 0, 51, 0},
- { 0, 51, 51},
- { 0, 51,102},
- { 0, 51,153},
- { 0, 51,204},
- { 0, 51,255},
- { 51, 51, 0},
- { 51, 51, 51},
- { 51, 51,102},
- { 51, 51,153},
- { 51, 51,204},
- { 51, 51,255},
- {102, 51, 0},
- {102, 51, 51},
- {102, 51,102},
- {102, 51,153},
- {102, 51,204},
- {102, 51,255},
- {153, 51, 0},
- {153, 51, 51},
- {153, 51,102},
- {153, 51,153},
- {153, 51,204},
- {153, 51,255},
- {204, 51, 0},
- {204, 51, 51},
- {204, 51,102},
- {204, 51,153},
- {204, 51,204},
- {204, 51,255},
- {255, 51, 0},
- {255, 51, 51},
- {255, 51,102},
- {255, 51,153},
- {255, 51,204},
- {255, 51,255},
- { 0,102, 0},
- { 0,102, 51},
- { 0,102,102},
- { 0,102,153},
- { 0,102,204},
- { 0,102,255},
- { 51,102, 0},
- { 51,102, 51},
- { 51,102,102},
- { 51,102,153},
- { 51,102,204},
- { 51,102,255},
- {102,102, 0},
- {102,102, 51},
- {102,102,102},
- {102,102,153},
- {102,102,204},
- {102,102,255},
- {153,102, 0},
- {153,102, 51},
- {153,102,102},
- {153,102,153},
- {153,102,204},
- {153,102,255},
- {204,102, 0},
- {204,102, 51},
- {204,102,102},
- {204,102,153},
- {204,102,204},
- {204,102,255},
- {255,102, 0},
- {255,102, 51},
- {255,102,102},
- {255,102,153},
- {255,102,204},
- {255,102,255},
- { 0,153, 0},
- { 0,153, 51},
- { 0,153,102},
- { 0,153,153},
- { 0,153,204},
- { 0,153,255},
- { 51,153, 0},
- { 51,153, 51},
- { 51,153,102},
- { 51,153,153},
- { 51,153,204},
- { 51,153,255},
- {102,153, 0},
- {102,153, 51},
- {102,153,102},
- {102,153,153},
- {102,153,204},
- {102,153,255},
- {153,153, 0},
- {153,153, 51},
- {153,153,102},
- {153,153,153},
- {153,153,204},
- {153,153,255},
- {204,153, 0},
- {204,153, 51},
- {204,153,102},
- {204,153,153},
- {204,153,204},
- {204,153,255},
- {255,153, 0},
- {255,153, 51},
- {255,153,102},
- {255,153,153},
- {255,153,204},
- {255,153,255},
- { 0,204, 0},
- { 0,204, 51},
- { 0,204,102},
- { 0,204,153},
- { 0,204,204},
- { 0,204,255},
- { 51,204, 0},
- { 51,204, 51},
- { 51,204,102},
- { 51,204,153},
- { 51,204,204},
- { 51,204,255},
- {102,204, 0},
- {102,204, 51},
- {102,204,102},
- {102,204,153},
- {102,204,204},
- {102,204,255},
- {153,204, 0},
- {153,204, 51},
- {153,204,102},
- {153,204,153},
- {153,204,204},
- {153,204,255},
- {204,204, 0},
- {204,204, 51},
- {204,204,102},
- {204,204,153},
- {204,204,204},
- {204,204,255},
- {255,204, 0},
- {255,204, 51},
- {255,204,102},
- {255,204,153},
- {255,204,204},
- {255,204,255},
- { 0,255, 0},
- { 0,255, 51},
- { 0,255,102},
- { 0,255,153},
- { 0,255,204},
- { 0,255,255},
- { 51,255, 0},
- { 51,255, 51},
- { 51,255,102},
- { 51,255,153},
- { 51,255,204},
- { 51,255,255},
- {102,255, 0},
- {102,255, 51},
- {102,255,102},
- {102,255,153},
- {102,255,204},
- {102,255,255},
- {153,255, 0},
- {153,255, 51},
- {153,255,102},
- {153,255,153},
- {153,255,204},
- {153,255,255},
- {204,255, 0},
- {204,255, 51},
- {204,255,102},
- {204,255,153},
- {204,255,204},
- {204,255,255},
- {255,255, 0},
- {255,255, 51},
- {255,255,102},
- {255,255,153},
- {255,255,204},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255},
- {255,255,255}
- };
-static char farod_data[] = {
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,0,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,0,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,0,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,0,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,0,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,173,173,173,173,0,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,0,0,173,173,173,173,0,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,0,0,173,173,173,173,0,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,102,102,0,0,173,173,173,173,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,0,102,102,0,0,173,173,173,173,
- 0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
- 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
- 176,176,176,176,176,11,11,11,0,102,102,0,0,173,173,173,
- 173,0,90,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,102,102,102,0,0,90,90,
- 173,90,0,90,108,108,0,0,0,0,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,0,102,102,102,0,0,90,
- 90,0,90,90,90,0,0,0,0,0,0,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,0,102,102,102,0,0,
- 90,90,0,90,0,0,0,90,90,0,0,0,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,0,102,102,102,0,
- 0,90,90,0,0,0,90,90,90,90,0,0,0,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,0,102,102,102,
- 0,0,90,0,0,90,90,90,90,90,90,0,0,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,0,102,102,
- 102,0,0,0,0,90,90,90,90,90,90,0,0,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,0,102,
- 102,102,0,0,0,90,90,90,90,90,90,0,0,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,6,6,6,6,6,6,6,0,
- 102,102,90,0,0,0,90,90,90,90,0,0,0,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,197,210,210,210,210,210,210,210,
- 0,102,102,0,0,0,0,0,0,0,0,0,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,11,197,210,210,210,210,210,210,
- 210,0,102,102,0,0,0,0,0,0,0,90,90,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,197,215,210,210,210,210,
- 210,210,0,102,102,0,0,0,0,0,0,90,90,90,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,11,11,11,11,197,215,210,210,210,
- 210,210,210,0,102,102,0,0,0,90,90,0,90,90,90,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,197,215,210,210,
- 210,210,210,210,0,102,102,0,0,0,90,90,0,90,90,90,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
- 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
- 176,176,176,176,176,11,11,11,11,11,11,11,11,197,215,210,
- 210,210,210,210,6,0,102,102,0,0,0,90,90,0,90,90,
- 90,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,11,11,11,11,11,11,197,215,
- 210,210,210,210,6,11,0,102,102,0,0,0,90,90,0,90,
- 90,90,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,197,
- 215,210,210,210,6,11,11,0,102,102,0,0,0,90,90,0,
- 90,90,90,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 197,210,210,210,6,11,11,11,0,102,102,0,0,0,90,90,
- 0,90,90,90,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,197,210,210,6,11,11,11,11,0,102,102,0,0,0,90,
- 90,0,90,90,90,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,197,210,6,11,11,11,11,11,0,102,102,0,0,0,
- 90,90,0,90,90,90,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,197,6,11,11,11,11,11,11,0,102,102,0,0,
- 0,90,90,0,90,90,90,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,0,102,102,0,
- 0,0,90,90,0,90,90,90,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,0,102,102,
- 0,0,0,90,90,0,90,90,90,108,108,108,0,0,0,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,102,
- 102,0,0,0,90,90,0,90,90,90,108,0,0,0,0,0,
- 0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,
- 102,102,0,0,0,90,90,0,90,90,0,0,0,90,90,0,
- 0,0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 0,102,102,0,0,0,90,90,0,0,0,0,90,90,90,90,
- 0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,0,102,102,0,0,0,90,0,0,0,90,90,90,90,90,
- 90,0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,0,102,102,0,0,0,0,0,90,90,90,90,90,90,
- 90,90,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
- 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
- 176,176,176,176,176,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,6,6,6,
- 6,6,6,0,102,102,0,0,0,0,90,90,90,90,90,90,
- 90,90,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,197,210,210,
- 210,210,210,210,0,102,102,0,0,0,90,90,90,90,90,90,
- 90,90,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,197,210,
- 210,210,210,210,210,0,102,102,0,0,0,90,90,90,90,90,
- 90,0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,197,
- 210,210,210,210,210,210,0,102,102,0,0,0,90,90,90,90,
- 0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 197,210,210,210,210,210,210,0,102,102,0,0,0,0,0,0,
- 0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,197,210,210,210,210,210,210,0,102,102,0,0,0,0,0,
- 0,0,173,0,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,197,210,210,210,210,210,210,0,102,102,0,0,0,90,
- 90,173,173,173,0,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,197,210,210,210,210,210,210,0,102,102,0,0,0,
- 90,90,173,173,173,0,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,197,210,210,210,210,210,6,0,102,102,102,102,
- 0,90,173,173,173,0,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,197,210,210,210,210,6,11,0,102,102,102,
- 102,0,173,173,0,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,197,210,210,210,6,11,11,0,102,102,
- 102,102,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,197,210,210,6,11,11,11,0,102,
- 102,102,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,197,210,6,11,11,11,11,0,
- 102,0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,197,6,11,11,11,11,11,
- 0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
- 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
- 176,176,176,176,176,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,0,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,0,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,0,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,0,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,0,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,0,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,0,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,0,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,0,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,0,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,0,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
- 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
- 176,176,176,176,176,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,0,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,0,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,0,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,0,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,0,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,0,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,0,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,0,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,0,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,211,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,0,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,211,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,0,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,211,211,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,11,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,211,211,
- 211,211,211,211,211,211,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,104,104,211,211,
- 211,211,211,211,211,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,104,104,104,104,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,104,104,104,104,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,104,104,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108
- };
-static char faros_data[] = {
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,0,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,0,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,0,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,0,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,0,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,0,173,173,173,173,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,0,173,173,173,173,0,0,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,0,173,173,173,173,0,0,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,0,173,173,173,173,0,0,102,102,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,0,173,173,173,173,0,0,102,102,0,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,90,0,173,173,173,173,0,0,102,102,0,11,11,11,176,
- 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
- 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
- 176,176,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,0,0,0,0,108,108,
- 90,0,90,173,90,90,0,0,102,102,102,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,0,0,0,0,0,0,90,
- 90,90,0,90,90,0,0,102,102,102,0,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,0,0,0,90,90,0,0,0,
- 90,0,90,90,0,0,102,102,102,0,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,0,0,0,90,90,90,90,0,0,
- 0,90,90,0,0,102,102,102,0,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,0,0,90,90,90,90,90,90,0,
- 0,90,0,0,102,102,102,0,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,0,0,90,90,90,90,90,90,0,
- 0,0,0,102,102,102,0,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,0,0,90,90,90,90,90,90,0,
- 0,0,102,102,102,0,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,0,0,0,90,90,90,90,0,0,
- 0,90,102,102,0,6,6,6,6,6,6,6,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,0,0,0,0,0,0,0,0,
- 0,102,102,0,210,210,210,210,210,210,210,197,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,90,90,0,0,0,0,0,0,0,
- 102,102,0,210,210,210,210,210,210,210,197,11,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,90,90,90,0,0,0,0,0,0,102,
- 102,0,210,210,210,210,210,210,215,197,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,90,90,90,0,90,90,0,0,0,102,102,
- 0,210,210,210,210,210,210,215,197,11,11,11,11,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,90,90,90,0,90,90,0,0,0,102,102,0,
- 210,210,210,210,210,210,215,197,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,90,90,90,0,90,90,0,0,0,102,102,0,6,
- 210,210,210,210,210,215,197,11,11,11,11,11,11,11,11,176,
- 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
- 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
- 176,176,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,90,90,90,0,90,90,0,0,0,102,102,0,11,6,
- 210,210,210,210,215,197,11,11,11,11,11,11,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,90,90,90,0,90,90,0,0,0,102,102,0,11,11,6,
- 210,210,210,215,197,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 90,90,90,0,90,90,0,0,0,102,102,0,11,11,11,6,
- 210,210,210,197,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,90,
- 90,90,0,90,90,0,0,0,102,102,0,11,11,11,11,6,
- 210,210,197,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,90,90,
- 90,0,90,90,0,0,0,102,102,0,11,11,11,11,11,6,
- 210,197,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,90,90,90,
- 0,90,90,0,0,0,102,102,0,11,11,11,11,11,11,6,
- 197,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,90,90,90,0,
- 90,90,0,0,0,102,102,0,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,0,0,0,0,108,108,108,90,90,90,0,90,
- 90,0,0,0,102,102,0,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,0,0,0,0,0,0,108,90,90,90,0,90,90,
- 0,0,0,102,102,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,0,0,0,90,90,0,0,0,90,90,0,90,90,0,
- 0,0,102,102,0,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,0,0,0,90,90,90,90,0,0,0,0,90,90,0,0,
- 0,102,102,0,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 0,0,0,90,90,90,90,90,90,0,0,0,90,0,0,0,
- 102,102,0,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 0,0,90,90,90,90,90,90,90,90,0,0,0,0,0,102,
- 102,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 0,0,90,90,90,90,90,90,90,90,0,0,0,0,102,102,
- 0,6,6,6,6,6,6,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,176,
- 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
- 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
- 176,176,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 0,0,90,90,90,90,90,90,90,90,0,0,0,102,102,0,
- 210,210,210,210,210,210,197,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 0,0,0,90,90,90,90,90,90,0,0,0,102,102,0,210,
- 210,210,210,210,210,197,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,0,0,0,90,90,90,90,0,0,0,102,102,0,210,210,
- 210,210,210,210,197,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,0,0,0,0,0,0,0,0,0,102,102,0,210,210,210,
- 210,210,210,197,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 0,173,0,0,0,0,0,0,0,102,102,0,210,210,210,210,
- 210,210,197,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,
- 173,173,173,90,90,0,0,0,102,102,0,210,210,210,210,210,
- 210,197,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,173,
- 173,173,90,90,0,0,0,102,102,0,210,210,210,210,210,210,
- 197,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,173,
- 173,173,90,0,102,102,102,102,0,6,210,210,210,210,210,197,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,
- 173,173,0,102,102,102,102,0,11,6,210,210,210,210,197,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 0,0,102,102,102,102,0,11,11,6,210,210,210,197,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,0,102,102,102,0,11,11,11,6,210,210,197,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,0,102,0,11,11,11,11,6,210,197,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,0,11,11,11,11,11,6,197,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,0,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,176,
- 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
- 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
- 176,176,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,0,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,0,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,0,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,0,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,0,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,0,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,0,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,0,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,0,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,176,
- 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
- 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
- 176,176,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,0,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,0,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,0,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,0,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,0,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,0,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,0,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,0,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,0,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,0,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,0,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,211,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,211,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,211,211,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,211,211,211,211,211,211,211,211,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,104,
- 104,211,211,211,211,211,211,211,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,104,104,
- 104,104,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,104,104,
- 104,104,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,104,
- 104,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108
-};
-static char scale_data[] = {
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
- 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
- 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
- 176,176,11,11,11,11,176,176,176,176,176,176,176,176,176,11,
- 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,11,11,176,176,176,176,176,176,176,176,176,
- 11,11,11,11,176,176,176,176,176,176,176,176,176,11,11,11,
- 11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,176,
- 176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,176,
- 176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
- 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
- 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
- 0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
- 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
- 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
- 0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
- 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
- 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
- 176,176,11,11,11,11,176,176,176,176,176,176,176,176,176,11,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,11,176,176,176,176,176,176,176,176,176,
- 11,11,11,11,176,176,176,176,176,176,176,176,176,11,11,11,
- 11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,176,
- 176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,176,
- 176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
- 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
- 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
- 0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
- 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
- 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
- 0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
- 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
- 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
- 176,176,11,11,11,11,176,176,176,176,176,176,176,176,176,11,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,11,176,176,176,176,176,176,176,176,176,
- 11,11,11,11,176,176,176,176,176,176,176,176,176,11,11,11,
- 11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,176,
- 176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,176,
- 176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
- 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,11,0,0,0,0,0,0,0,0,0,0,
- 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
- 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
- 0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
- 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
- 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
- 0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
- 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
- 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
- 176,176,11,11,11,11,176,176,176,176,176,176,176,176,176,11,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,11,176,176,176,176,176,176,176,176,176,
- 11,11,11,11,176,176,176,176,176,176,176,176,176,11,11,11,
- 11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,176,
- 176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,176,
- 176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
- 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
- 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
- 0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
- 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
- 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
- 0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
- 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
- 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
- 176,176,11,11,11,11,176,176,176,176,176,176,176,176,176,11,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,11,176,176,176,176,176,176,176,176,176,
- 11,11,11,11,176,176,176,176,176,176,176,176,176,11,11,11,
- 11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,176,
- 176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,176,
- 176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
- 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
- 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
- 0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
- 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
- 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
- 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
- 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
- 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
- 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
- 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
- 176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
- 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
- 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
- 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
- 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
- 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
- 0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108
-};
-static char schermo_data[] = {
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,
- 0,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,176,176,176,176,176,176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,176,176,176,176,176,176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,176,176,176,176,176,176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,176,176,176,176,176,176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,176,176,176,176,176,176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,38,
- 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,38,38,38,38,38,38,38,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108
-};
-/*
-static char goal2_data[] = {
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,
- 0,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,176,176,176,176,176,176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,0,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,0,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,0,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,215,215,215,215,0,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,215,181,181,181,
- 181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,215,181,181,
- 181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,
- 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,215,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,215,181,181,
- 181,181,181,215,181,181,181,181,181,181,181,181,215,215,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
- 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
- 181,181,181,181,181,215,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,215,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 11,176,176,176,176,176,176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,215,181,
- 181,181,181,181,215,215,181,181,181,181,181,181,181,181,215,215,
- 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
- 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
- 181,181,181,181,181,215,181,181,181,181,215,215,215,181,181,181,
- 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,215,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,215,181,
- 181,181,181,181,215,181,215,181,181,181,181,181,181,181,181,181,
- 215,215,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,
- 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
- 181,181,181,181,181,181,215,215,215,215,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,215,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,215,
- 181,181,181,181,215,181,181,215,181,181,181,181,181,181,181,181,
- 181,181,215,215,215,181,215,215,215,215,181,181,215,0,0,0,
- 0,0,0,181,181,181,181,181,181,181,181,181,181,215,181,181,
- 181,181,181,181,181,181,181,181,181,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,215,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,215,
- 181,181,181,181,181,215,181,181,215,181,181,181,181,181,181,181,
- 181,181,181,181,181,215,215,181,181,181,215,0,0,215,215,215,
- 215,215,215,0,0,181,181,181,181,181,181,181,181,181,215,181,
- 181,181,181,181,181,181,181,181,181,215,181,181,215,215,215,215,
- 215,181,181,181,181,181,215,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,215,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 215,181,181,181,181,215,181,181,181,215,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,215,215,0,0,215,215,215,0,215,
- 215,215,215,215,215,0,0,181,181,181,181,181,181,181,215,181,
- 181,181,181,181,181,181,181,181,215,215,215,215,181,181,181,181,
- 181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,215,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 215,181,181,181,181,181,215,181,181,181,215,215,181,181,181,181,
- 181,181,181,181,181,181,181,181,0,215,0,215,215,0,0,0,
- 215,215,0,215,215,215,215,0,215,215,215,215,215,215,181,215,
- 181,181,181,215,215,215,215,215,181,215,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,215,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,215,181,181,181,181,215,181,181,181,181,181,215,181,181,181,
- 181,181,181,181,181,181,181,181,0,0,0,0,215,0,0,0,
- 215,0,0,0,215,215,215,0,181,181,181,181,181,181,215,215,
- 215,215,215,215,215,181,181,181,181,181,215,181,181,181,181,181,
- 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,215,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,181,215,181,181,181,181,215,181,181,181,181,181,215,181,181,
- 181,181,181,181,181,181,181,0,215,0,0,0,215,0,0,0,
- 215,0,0,0,215,215,0,215,0,181,215,215,215,215,181,181,
- 215,181,181,181,181,215,215,215,215,215,215,181,181,181,181,181,
- 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,215,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,181,215,181,181,181,181,215,181,181,181,181,181,181,215,181,
- 181,181,181,181,181,181,181,0,215,0,0,0,215,215,0,215,
- 215,0,0,0,215,0,0,0,0,215,181,181,181,181,181,181,
- 215,181,181,181,181,181,181,181,181,181,215,215,215,215,215,215,
- 215,215,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,181,215,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,181,181,215,181,181,181,181,215,181,181,181,181,181,181,215,
- 181,181,181,181,181,181,0,215,215,215,0,215,215,215,215,215,
- 215,215,0,215,215,0,0,0,215,0,181,181,181,181,181,181,
- 181,215,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
- 181,181,215,215,215,215,215,215,215,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,181,215,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,181,181,215,181,181,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,0,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,0,0,0,215,0,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,0,215,215,215,215,0,181,181,181,181,181,181,215,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,181,181,181,215,181,181,181,181,215,181,181,181,181,181,181,
- 181,181,215,181,181,181,0,215,215,0,215,215,215,215,215,215,
- 215,215,215,215,215,215,0,215,215,0,181,181,181,181,181,181,
- 181,181,215,181,181,181,181,181,181,181,181,215,181,181,181,181,
- 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,215,
- 215,215,215,181,181,181,181,181,181,181,181,181,181,215,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,215,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,181,181,181,215,181,181,181,181,215,181,181,181,181,181,181,
- 181,181,181,215,215,215,0,215,0,0,0,215,215,215,215,215,
- 0,215,215,215,215,215,215,215,215,0,215,181,181,181,181,181,
- 181,181,215,181,181,181,181,181,181,181,181,215,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
- 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,181,181,181,181,215,181,181,181,181,215,181,181,181,181,181,
- 215,215,215,181,215,181,0,215,0,0,0,215,215,215,215,0,
- 0,0,215,215,215,215,215,215,215,0,181,215,215,215,181,181,
- 181,181,181,215,181,181,181,181,181,181,181,215,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
- 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 11,176,176,176,176,176,176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,181,181,181,181,215,181,181,181,181,215,181,181,181,181,181,
- 181,181,181,181,181,181,0,215,0,0,0,215,215,215,215,0,
- 0,0,215,215,0,215,215,215,215,0,181,181,181,181,215,215,
- 181,181,181,215,181,181,181,181,181,181,181,215,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
- 181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,181,181,181,181,181,215,181,181,181,181,215,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,0,215,215,215,215,215,0,
- 0,0,215,0,0,0,215,215,0,181,181,181,181,181,181,181,
- 215,215,181,181,215,181,181,181,181,181,181,181,215,181,181,181,
- 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
- 181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,181,181,181,181,181,215,181,181,181,181,215,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,215,215,215,0,215,215,
- 0,215,215,0,0,0,215,215,0,181,181,181,181,181,181,181,
- 181,181,215,215,181,181,181,181,181,181,181,181,215,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
- 181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,181,181,181,181,181,181,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,0,215,215,215,0,0,0,215,
- 215,215,215,0,0,0,215,0,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,0,215,215,215,215,0,215,215,215,215,215,215,215,
- 215,215,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,0,215,215,215,0,0,0,215,
- 215,215,215,215,0,215,215,0,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
- 181,215,181,215,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,181,181,181,181,215,215,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,0,0,215,0,0,0,215,
- 215,215,215,215,215,0,0,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
- 181,215,181,215,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,181,181,181,215,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,0,0,0,215,215,
- 215,215,215,0,0,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
- 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,0,0,0,
- 0,0,0,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,215,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 181,215,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,181,215,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
- 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,181,215,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,215,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,181,215,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,181,215,215,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,181,215,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,181,215,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,215,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,215,215,0,215,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,0,215,215,215,215,0,181,181,215,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 11,176,176,176,176,176,176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,0,0,0,0,215,215,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,215,215,0,215,215,215,215,0,181,215,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,0,215,215,215,215,0,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
- 215,215,215,215,215,215,215,215,215,215,215,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,215,181,215,215,215,215,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,215,0,0,0,0,0,0,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,215,215,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,215,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,215,215,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,
- 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,215,215,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,215,215,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 11,176,176,176,176,176,176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
- 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,38,
- 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,38,38,38,38,38,38,38,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108
-};
-*/
-static char goal1_data[] = {
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
- 102,102,102,102,102,102,102,102,102,102,102,102,
- 0,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,176,176,176,176,176,176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,176,176,176,176,176,176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,176,176,176,176,176,176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
- 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
- 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
- 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,204,204,204,204,204,204,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,176,176,176,176,176,176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
- 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
- 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
- 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,
- 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
- 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 11,176,176,176,176,176,176,176,176,176,11,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,176,176,176,176,176,176,176,176,176,0,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 0,176,176,176,176,176,176,176,176,176,0,11,
- 11,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 0,0,0,0,0,0,0,0,0,0,0,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
- 11,11,11,11,11,11,11,11,11,11,11,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,38,
- 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
- 38,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,38,38,38,38,38,38,38,38,
- 38,38,38,38,38,38,38,38,38,38,38,38,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
- 108,108,108,108,108,108,108,108,108,108,108,108
- };
-
-
-
-
-
-
-
-
Index: rel_1_2/soccer/calc2.h
===================================================================
--- rel_1_2/soccer/calc2.h (revision 1198)
+++ rel_1_2/soccer/calc2.h (nonexistent)
@@ -1,693 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: calc2.h,v 1.1.1.1 2002-09-02 09:37:43 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:43 $
- ------------
-*/
-
-/*
- * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/* GIMP header image file format (INDEXED): /mnt/disk/shark/base/images/runup//runup.h */
-static char B_runup_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16, 0, 0, 35, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16, 0, 0,16,16,16,16, 0, 35, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
- 16,16, 0, 35,233, 0,16,16,16,16, 0, 35,233,233,233, 0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16, 0,233, 0, 0, 0, 0, 0,16, 0,233,233,233,233, 0,233, 0,16,16,16,16,16,16,16,16,16,
- 16,16, 0, 0, 35, 35, 35, 35, 35, 0, 0,233, 0,233, 0,233, 0, 0, 0, 0, 0,16,16,16,16,16,16,
- 16,16, 0, 35, 35, 35, 35, 35, 35, 0, 0, 0,233, 0,233, 0,233, 0, 35, 35, 0, 0, 0,16,16,16,16,
- 16,16,16, 0, 35, 35, 35, 35, 35, 0, 0,233, 0,233, 0, 0, 0, 0, 35, 35, 35, 35, 35, 0,16,16,16,
- 16,16,16, 0, 0, 0, 0, 35, 35, 35, 0, 0, 0, 0,233, 0, 0, 0, 35, 35, 35, 35, 35, 35, 0,16,16,
- 16,16,16,16,16, 0, 0, 0, 0, 35, 0, 0,233, 0, 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 0, 0,16,
- 16,16,16,16,16,16,16,16, 0, 0, 35, 0, 0, 0, 0, 0, 35, 35, 0, 0, 0, 0, 0, 0,233, 0,16,
- 16,16,16,16,16,16,16,16,16, 0, 0, 35, 35, 35, 35, 0, 35, 0, 0,16,16, 0, 0,233, 0, 0,16,
- 16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 35, 0, 35, 0, 0, 0,233,16,16, 0, 0, 0,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0, 0,233,233, 0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 35, 35, 0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 35, 0, 0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
- };
-static char B_runup2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35,0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0, 35,0,16,16,16,16,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,233,233,233, 35, 0,16,16,16,16,0,233, 35,0,16,16,
- 16,16,16,16,16,16,16,16,16,0,233,0,233,233,233,233, 0,16,0,0,0,0,0,233,0,16,16,
- 16,16,16,16,16,16,0,0,0,0,0,233,0,233,0,233,0,0, 35, 35, 35, 35, 35,0,0,16,16,
- 16,16,16,16,0,0,0, 35, 35,0,233,0,233,0,233,0,0,0, 35, 35, 35, 35, 35, 35,0,16,16,
- 16,16,16,0, 35, 35, 35, 35, 35,0,0,0,0,233,0,233,0,0, 35, 35, 35, 35, 35,0,16,16,16,
- 16,16,0, 35, 35, 35, 35, 35, 35,0,0,0,233,0,0,0,0, 35, 35, 35,0,0,0,0,16,16,16,
- 16,0,0, 35, 35, 35, 35, 35, 35, 35,0,0,0,0,233,0,0, 35,0,0,0,0,16,16,16,16,16,
- 16,0,233,0,0,0,0,0,0, 35, 35,0,0,0,0,0, 35,0,0,16,16,16,16,16,16,16,16,
- 16,0,0,233,0,0,16,16,0,0, 35,0, 35, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,0,0,0,16,16,233,0,0,0, 35,0, 35,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,233,233,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0, 35, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
- };
-static char B_runru_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,4,77,0,12,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,4,100,246,169,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,37,68,68,68,8,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,219, 35,219,0,8,16,16,16,4,0,0,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,0,219, 35, 35,219,0,12,16,4,36,36,0,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,4,110, 35, 35, 35,219,4,16,45,219,218,73,4,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,0,110, 35, 35, 35,41,8,36,182,0,4,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,12,0,146, 35, 35,73,0,32,233,242,165,0,12,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,218,182,0,0,132,133,233,233,165,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,219,146,32,201,133,132,233,233,165,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,146,0,0,32,100,32,132,132,32,68,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,146,36,165,64,100,100,132,133,100,100,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,219,110,64,0,132,100,0,165,64,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,37, 35,110,0,0,0,0,0,73,110,4,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,37, 35, 35,73,36,0,37,73, 35, 35,73,4,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,4,37,110,73,219,219, 35, 35, 35, 35,37,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,4,110,73,110,146,109, 35, 35, 35, 35,37,8,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,36,73,68,0,0,4,73, 35, 35, 35,218,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,77, 35,238,133,137,48,8,73, 35, 35,182,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,12,4,146, 35, 35,101,72,16,4,0,73, 35,110,8,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,4,36,218,182,109,4,16,16,8,32,100,137,0,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,0,0,4,16,16,16,8,32,100,100,0,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,0,0,4,16,16,16,16,16,8,4,4,12,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,0,4,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
- };
-
- static char B_runru2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,8,12,12,8,12,12,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,12,0,0,110,182,218,37,8,4,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,4,100,137, 35, 35, 35, 35,37,73,4,16,12,12,12,12,16,16,16,12,16,16,16,16,16,16,
- 16,16,4,100,100,73, 35, 35, 35, 35, 35,110,0,100,68,0,0,12,16,4,0,8,16,16,16,16,16,
- 16,16,8,32,32,0,73, 35, 35, 35, 35,73,64,100,32,165,165,0,4,73,0,0,12,16,16,16,16,
- 16,16,16,8,8,4,8,73, 35, 35,73,0,165,133,132,233,233,165,0,218,36,0,16,16,16,16,16,
- 16,16,16,16,16,16,48,4,109, 35,37,0,0,132,132,233,233,242,182,219,36,4,16,16,16,16,16,
- 16,16,16,16,16,72,137,0,146,219,0,0,100,100,32,132, 133,233,36,45,4,16,16,16,16,16,16,
- 16,16,16,16,4,101,133,0,110,219,36,0,132,100,100,133,132,32,8,16,16,16,16,16,16,16,16,
- 16,16,16,4,109, 35,238,68,73,73,73,0,0,64,32,201,0,0,41,4,12,16,16,16,16,16,16,
- 16,16,4,0,182, 35, 35,73,110,110, 35,110,64,165,0,32,0,73, 35,219,0,8,8,8,12,16,16,
- 16,4,0,0,218,146,77,36,4,37, 35, 35,110,36,0,146,182, 35, 35, 35,219,0,68,169,0,16,16,
- 12,0,0,0,36,4,12,12,16,4,37,37,219,146,146,219,218, 35, 35, 35, 35,219,68,246,77,16,16,
- 16,8,0,0,4,12,16,16,16,16,8,8,0,0,0,0,0,146,110, 35, 35, 35,68,100,4,16,16,
- 16,16,12,16,16,16,16,16,16,16,16,16,12,12,16,12,12,0,0,110,219,219,37,4,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12,8,4,0,8,8,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
- };
-
-static char B_rundes_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,233,0, 35, 35,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,0,0,0,0,233,16,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,0, 35, 35,233,0,0,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0, 35, 35, 35,233,0,0, 35, 35,0,0, 0,0,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,0,0,0,0, 35,0,0, 35, 35,0,0,0, 233,0,233,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0, 35,0,0,0,0,0, 0,233,0,0,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0, 35,0,0,233,0, 233,0,233,233,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0, 35, 35,0,0,0,233, 0,233,233,233,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0, 35,0,233,0,0, 233,0,233,233,0,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0, 35,0,0,0,233, 0,233,233, 35,0, 35,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0, 35,0,0,0, 0,0,0,0, 35,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35,0, 0,0,16,16,0,0,0,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,233,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35,0,233, 35,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,0,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-
-static char B_rundes2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,0,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35,0,233, 35,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,233,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35,0, 0,0,16,16,0,0,0,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0, 35,0,0,0, 0,0,0,0, 35,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0, 35,0,0,0,233, 0,233,233, 35,0, 35,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0, 35,0,233,0,0, 233,0,233,233,0,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,0, 35, 35,0,0,0,233, 0,233,233,233,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0, 35,0,0,233,0, 233,0,233,233,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0, 35,0,0,0,0,0, 0,233,0,0,0,16,16,16,16,16,16,
- 16,16,16,16,0,0,0,0, 35,0,0, 35, 35,0,0,0, 233,0,233,0,16,16,16,16,16,16,16,
- 16,16,16,0,0,0, 35, 35, 35,233,0,0, 35, 35,0,0, 0,0,0,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,0, 35, 35,233,0,0,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,0,0,0,0,233,16,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,233,0, 35, 35,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char B_runrd_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,0,4,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,0,0,4,16,16,16,16, 16,8,4,4,12,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,0,0,4,16,16,16, 8,32,100,100,0,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,4,36,218,182,109,4,16,16, 8,32,100,137,0,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,12,4,146, 35, 35,101,72,16, 4,0,73, 35,110,8,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,77, 35,238,133,137,48, 8,73, 35, 35,182,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,36,73,68,0,0,4, 73, 35, 35, 35,218,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,4,110,73,110,146,109, 35, 35, 35, 35,37,8,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,4,37,110,73,219,219, 35, 35, 35, 35,37,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,37, 35, 35,73,36,0,37, 73, 35, 35,73,4,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,37, 35,110,0,0,0,0, 0,73,110,4,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,219,110,64,0,132,100,0, 165,64,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,146,36,165,64,100,100,132, 133,100,100,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,146,0,0,32,100,32,132, 132,32,68,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,219,146,32,201,133,132,233, 233,165,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,218,182,0,0,132,133,233, 233,165,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,12,0,146, 35, 35,73,0,32,233,242, 165,0,12,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,0,110, 35, 35, 35,41,8,36,182, 0,4,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,4,110, 35, 35, 35,219,4,16,45,219, 218,73,4,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,0,219, 35, 35,219,0,12,16,4,36, 36,0,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,219, 35,219,0,8,16,16,16,4, 0,0,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,37,68,68,68,8,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,4,100,246,169,8,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,4,77,0,12,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char B_runrd2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,12,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,8,4,0,8,8,16,16,16,16,
- 16,16,12,16,16,16,16,16,16,16,16,16,12,12,16,12, 12,0,0,110,219,219,37,4,16,16,16,
- 16,8,0,0,4,12,16,16,16,16,8,8,0,0,0,0, 0,146,110, 35, 35, 35,68,100,4,16,16,
- 12,0,0,0,36,4,12,12,16,4,37,37,219,146,146,219, 218, 35, 35, 35, 35,219,68,246,77,16,16,
- 16,4,0,0,218,146,77,36,4,37, 35, 35,110,36,0,146, 182, 35, 35, 35,219,0,68,169,0,16,16,
- 16,16,4,0,182, 35, 35,73,110,110, 35,110,64,165,0,32, 0,73, 35,219,0,8,8,8,12,16,16,
- 16,16,16,4,109, 35,238,68,73,73,73,0,0,64,32,201, 0,0,41,4,12,16,16,16,16,16,16,
- 16,16,16,16,4,101,133,0,110,219,36,0,132,100,100,133, 132,32,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,72,137,0,146,219,0,0,100,100,32,132, 133,233,36,45,4,16,16,16,16,16,16,
- 16,16,16,16,16,16,48,4,109, 35,37,0,0,132,132,233, 233,242,182,219,36,4,16,16,16,16,16,
- 16,16,16,8,8,4,8,73, 35, 35,73,0,165,133,132,233, 233,165,0,218,36,0,16,16,16,16,16,
- 16,16,8,32,32,0,73, 35, 35, 35, 35,73,64,100,32,165, 165,0,4,73,0,0,12,16,16,16,16,
- 16,16,4,100,100,73, 35, 35, 35, 35, 35,110,0,100,68,0, 0,12,16,4,0,8,16,16,16,16,16,
- 16,16,4,100,137, 35, 35, 35, 35,37,73,4,16,12,12,12, 12,16,16,16,12,16,16,16,16,16,16,
- 16,16,12,0,0,110,182,218,37,8,4,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,8,12,12,8,12,12,8,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char B_rundown_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0, 35,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0, 35, 35,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0, 35, 35, 35,0,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,233,233,0,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,0,0,0,16,16,233,0,0,0, 35,0, 35,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,0,0,233,0,0,16,16,0,0, 35,0, 35, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
- 16,0,233,0,0,0,0,0,0, 35, 35,0,0,0,0,0, 35,0,0,16,16,16,16,16,16,16,16,
- 16,0,0, 35, 35, 35, 35, 35, 35, 35,0,0,0,0,233,0, 0, 35,0,0,0,0,16,16,16,16,16,
- 16,16,0, 35, 35, 35, 35, 35, 35,0,0,0,233,0,0,0, 0, 35, 35, 35,0,0,0,0,16,16,16,
- 16,16,16,0, 35, 35, 35, 35, 35,0,0,0,0,233,0,233, 0,0, 35, 35, 35, 35, 35,0,16,16,16,
- 16,16,16,16,0,0,0, 35, 35,0,233,0,233,0,233,0, 0,0, 35, 35, 35, 35, 35, 35,0,16,16,
- 16,16,16,16,16,16,0,0,0,0,0,233,0,233,0,233, 0,0, 35, 35, 35, 35, 35,0,0,16,16,
- 16,16,16,16,16,16,16,16,16,0,233,0,233,233,233,233, 0,16,0,0,0,0,0,233,0,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,233,233,233, 35, 0,16,16,16,16,0,233, 35,0,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0, 35,0,16,16,16,16,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char B_rundown2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,233,233,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,0, 35,0, 35,0,0,0,233,16,16,0,0,0,16,16,
- 16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 35,0, 35,0,0,16,16,0,0,233,0,0,16,
- 16,16,16,16,16,16,16,16,0,0, 35,0,0,0,0,0, 35, 35,0,0,0,0,0,0,233,0,16,
- 16,16,16,16,16,0,0,0,0, 35,0,0,233,0,0,0,0, 35, 35, 35, 35, 35, 35, 35,0,0,16,
- 16,16,16,0,0,0,0, 35, 35, 35,0,0,0,0,233,0,0,0, 35, 35, 35, 35, 35, 35,0,16,16,
- 16,16,16,0, 35, 35, 35, 35, 35,0,0,233,0,233,0,0,0,0, 35, 35, 35, 35, 35,0,16,16,16,
- 16,16,0, 35, 35, 35, 35, 35, 35,0,0,0,233,0,233,0,233,0, 35, 35,0,0,0,16,16,16,16,
- 16,16,0,0, 35, 35, 35, 35, 35,0,0,233,0,233,0,233,0,0,0,0,0,16,16,16,16,16,16,
- 16,16,0,233,0,0,0,0,0,16,0,233,233,233,233,0,233,0,16,16,16,16,16,16,16,16,16,
- 16,16,0, 35,233,0,16,16,16,16,0, 35,233,233,233,0,0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,16,16,16,16,0, 35,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
- };
-
-static char B_runld_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,0,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,12,4,4,8,16,16,16,16,16,4, 0,0,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,0,100,100,32,8,16,16,16,4,0, 0,0,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,0,137,100,32,8,16,16,4,109,182, 218,36,4,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,8,110, 35,73,0,4,16,72,101, 35, 35, 146,4,12,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,182, 35, 35,73,8,48,137,133,238, 35, 77,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,218, 35, 35, 35,73,4,0,0,68,73, 36,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,8,37, 35, 35, 35, 35,109,146,110,73,110, 4,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,37, 35, 35, 35, 35,219,219,73,110, 37,4,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,4,73, 35, 35,73,37,0,36,73, 35, 35,37,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,4,110,73,0,0,0,0,0,110, 35,37,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,64,165,0,100,132,0,64, 110,219,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,100,100,133,132,100,100,64,165, 36,146,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,68,32,132,132,32,100,32,0, 0,146,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,165,233,233,132,133,201,32, 146,219,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,165,233,233,133,132,0,0, 182,218,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,12,0,165,242,233,32,0,73, 35, 35,146,0,12,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,4,0,182,36,8,41, 35, 35, 35,110,0,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,4,73,218,219,45,16,4,219, 35, 35, 35,110,4,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,0,36,36,4,16,12,0, 219, 35, 35,219,0,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,0,0,4,16,16,16,8, 0,219, 35,219,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,8, 68,68,68,37,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8, 169,246,100,4,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12, 0,77,4,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char B_runld2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,8,8,0,4,8,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,4,37,219,219,110,0,0,12,12,16,12,12,16, 16,16,16,16,16,16,16,16,12,16,16,
- 16,16,4,100,68, 35, 35, 35,110,146,0,0,0,0,0,8, 8,16,16,16,16,12,4,0,0,8,16,
- 16,16,77,246,68,219, 35, 35, 35, 35,218,219,146,146,219,37, 37,4,16,12,12,4,36,0,0,0,12,
- 16,16,0,169,68,0,219, 35, 35, 35,182,146,0,36,110, 35, 35,37,4,36,77,146,218,0,0,4,16,
- 16,16,12,8,8,8,0,219, 35,73,0,32,0,165,64,110, 35,110,110,73, 35, 35,182,0,4,16,16,
- 16,16,16,16,16,16,12,4,41,0,0,201,32,64,0,0, 73,73,73,68,238, 35,109,4,16,16,16,
- 16,16,16,16,16,16,16,16,8,32,132,133,100,100,132,0, 36,219,110,0,133,101,4,16,16,16,16,
- 16,16,16,16,16,16,4,45,36,233,133,132,32,100,100,0, 0,219,146,0,137,72,16,16,16,16,16,
- 16,16,16,16,16,4,36,219,182,242,233,233,132,132,0,0, 37, 35,109,4,48,16,16,16,16,16,16,
- 16,16,16,16,16,0,36,218,0,165,233,233,132,133,165,0, 73, 35, 35,73,8,4,8,8,16,16,16,
- 16,16,16,16,12,0,0,73,4,0,165,165,32,100,64,73, 35, 35, 35, 35,73,0,32,32,8,16,16,
- 16,16,16,16,16,8,0,4,16,12,0,0,68,100,0,110, 35, 35, 35, 35, 35,73,100,100,4,16,16,
- 16,16,16,16,16,16,12,16,16,16,12,12,12,12,16,4, 73,37, 35, 35, 35, 35,137,100,4,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,8,37,218,182,110,0,0,12,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,8,12,12,8,12,12,8,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char B_runleft_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35,0,233, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16, 233,0,0,0,0,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,0, 0,233, 35, 35,0,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,0,0,0, 35, 35,0, 0,233, 35, 35, 35,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,0,233,0,233,0,0,0, 35, 35, 0,0, 35,0,0,0,0,16,16,16,16,
- 16,16,16,16,16,16,0,0,0,233,0,0,0,0,0,0, 35,0,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,233,233,0,233,0,233,0,0, 35, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,233,233,233,0,233,0,0,0, 35, 35,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,0,233,233,0,233,0,0,233,0, 35, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0, 35,0, 35,233,233,0,233,0,0,0, 35, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0, 35,0,0,0,0,0,0,0, 35,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,0,0,0,16,16,0,0,0, 35, 35,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0, 35, 35, 35,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,233,0, 35, 35, 35,0,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0, 35,233,0, 35,0,0,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char B_runleft2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0, 35,233,0, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,233,0, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0, 35, 35, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,0,0,0,16,16,0,0,0, 35, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0, 35,0,0,0,0,0,0,0, 35,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0, 35,0, 35,233,233,0,233,0,0,0, 35,0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,0,0,0,0,233,233,0,233,0,0,233,0, 35,0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,233,233,233,0,233,0,0,0, 35, 35,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,233,233,0,233,0,233,0,0, 35,0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,0,0,233,0,0,0,0,0,0, 35,0,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,233,0,233,0,0,0, 35, 35,0,0, 35,0,0,0,0,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,0,0,0, 35, 35,0,0,233, 35, 35, 35,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,0,0,233, 35, 35,0,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16,233,0,0,0,0,0,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0,0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35,0,233,0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
- };
-
-static char B_runlu_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12, 0,77,4,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8, 169,246,100,4,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,8, 68,68,68,37,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,0,0,4,16,16,16,8, 0,219, 35,219,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,0,36,36,4,16,12,0, 219, 35, 35,219,0,12,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,4,73,218,219,45,16,4,219, 35, 35, 35,110,4,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,4,0,182,36,8,41, 35, 35, 35,110,0,8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,12,0,165,242,233,32,0,73, 35, 35,146,0,12,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,165,233,233,133,132,0,0, 182,218,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,0,165,233,233,132,133,201,32, 146,219,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,68,32,132,132,32,100,32,0, 0,146,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,12,100,100,133,132,100,100,64,165, 36,146,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,64,165,0,100,132,0,64, 110,219,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,4,110,73,0,0,0,0,0,110, 35,37,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,4,73, 35, 35,73,37,0,36,73, 35, 35,37,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,8,37, 35, 35, 35, 35,219,219,73,110, 37,4,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,8,37, 35, 35, 35, 35,109,146,110,73,110, 4,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,218, 35, 35, 35,73,4,0,0,68,73, 36,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,182, 35, 35,73,8,48,137,133,238, 35, 77,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,8,110, 35,73,0,4,16,72,101, 35, 35, 146,4,12,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,0,137,100,32,8,16,16,4,109,182, 218,36,4,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,12,0,100,100,32,8,16,16,16,4,0, 0,0,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,12,4,4,8,16,16,16,16,16,4, 0,0,0,12,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,0,8,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char B_runlu2_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,8,12,12,8,12,12,8,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,8,37,218,182,110,0,0,12,16,16,
- 16,16,16,16,16,16,12,16,16,16,12,12,12,12,16,4, 73,37, 35, 35, 35, 35,137,100,4,16,16,
- 16,16,16,16,16,8,0,4,16,12,0,0,68,100,0,110, 35, 35, 35, 35, 35,73,100,100,4,16,16,
- 16,16,16,16,12,0,0,73,4,0,165,165,32,100,64,73, 35, 35, 35, 35,73,0,32,32,8,16,16,
- 16,16,16,16,16,0,36,218,0,165,233,233,132,133,165,0, 73, 35, 35,73,8,4,8,8,16,16,16,
- 16,16,16,16,16,4,36,219,182,242,233,233,132,132,0,0, 37, 35,109,4,48,16,16,16,16,16,16,
- 16,16,16,16,16,16,4,45,36,233,133,132,32,100,100,0, 0,219,146,0,137,72,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,8,32,132,133,100,100,132,0, 36,219,110,0,133,101,4,16,16,16,16,
- 16,16,16,16,16,16,12,4,41,0,0,201,32,64,0,0, 73,73,73,68,238, 35,109,4,16,16,16,
- 16,16,12,8,8,8,0,219, 35,73,0,32,0,165,64,110, 35,110,110,73, 35, 35,182,0,4,16,16,
- 16,16,0,169,68,0,219, 35, 35, 35,182,146,0,36,110, 35, 35,37,4,36,77,146,218,0,0,4,16,
- 16,16,77,246,68,219, 35, 35, 35, 35,218,219,146,146,219,37, 37,4,16,12,12,4,36,0,0,0,12,
- 16,16,4,100,68, 35, 35, 35,110,146,0,0,0,0,0,8, 8,16,16,16,16,12,4,0,0,8,16,
- 16,16,16,4,37,219,219,110,0,0,12,12,16,12,12,16, 16,16,16,16,16,16,16,16,12,16,16,
- 16,16,16,16,8,8,0,4,8,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-/*
-static char portesx_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,0, 100,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0, 100, 100,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0, 100, 100, 100,0,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,0,233,233,0,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,0,0,0,16,16,233,0,0,0, 100,0, 100,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,0,0,233,0,0,16,16,0,0, 100,0, 100, 100, 100, 100, 0,0,16,16,16,16,16,16,16,16,16,
- 16,0,233,0,0,0,0,0,0, 100, 100,0,0,0,0,0, 100,0,0,16,16,16,16,16,16,16,16,
- 16,0,0, 100, 100, 100, 100, 100, 100, 100,0,0,0,0,233,0, 0, 100,0,0,0,0,16,16,16,16,16,
- 16,16,0, 100, 100, 100, 100, 100, 100,0,0,0,233,0,0,0, 0, 100, 100, 100,0,0,0,0,16,16,16,
- 16,16,16,0, 100, 100, 100, 100, 100,0,0,0,0,233,0,233, 0,0, 100, 100, 100, 100, 100,0,16,16,16,
- 16,16,16,16,0,0,0, 100, 100,0,233,0,233,0,233,0, 0,0, 100, 100, 100, 100, 100, 100,0,16,16,
- 16,16,16,16,16,16,0,0,0,0,0,233,0,233,0,233, 0,0, 100, 100, 100, 100, 100,0,0,16,16,
- 16,16,16,16,16,16,16,16,16,0,233,0,233,233,233,233, 0,16,0,0,0,0,0,233,0,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,233,233,233, 100, 0,16,16,16,16,0,233, 100,0,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0, 100,0,16,16,16,16,0,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 100, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-
-
-static char calcdes_data[] = {
- 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16,16, 0, 0, 35, 0,233, 0,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16, 0, 0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16, 0, 35, 35, 0, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16, 0, 35, 0, 0, 0, 0,233,233,233, 0, 0,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16, 0, 35, 0, 0,233, 0,233, 0,233,233, 35, 0,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16, 0, 35, 35, 0, 0, 0,233, 0,233, 0,233,233, 0,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16, 0, 35, 35, 0, 0, 0, 0,233, 0,233, 0,233, 0,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16, 0, 35, 35, 0, 0, 0, 0, 0,233, 0,233, 0, 0,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16, 0, 35, 0, 0, 0,233, 0, 0,233, 0, 0,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16, 0, 0, 35, 35, 0, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16, 0, 35, 35, 35, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16, 0, 0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16,16, 0, 0, 35, 0,233, 0,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
-
- 16 ,16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
- };
-
-static char calcdown_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0, 35, 35,0,0,0,0, 0,0, 35,0,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,0,0,0, 35, 35, 35,0,0,0,0, 0,0, 35, 35,0,0,0,16,16,16,16,
- 16,16,16,16,16,0, 35, 35, 35, 35, 35,0,0,0,0,0, 233,0,0, 35, 35, 35, 35,0,16,16,16,
- 16,16,16,16,0,0, 35, 35, 35, 35, 35,0,233,0,0,233, 0,0,0, 35, 35, 35, 35,0,0,16,16,
- 16,16,16,16,0, 35, 35, 35, 35, 35, 35,0,0,0,233,0, 233,233,0, 35, 35, 35, 35, 35,0,16,16,
- 16,16,16,16,0,0, 35,0, 35, 35, 35,0,0,233,0,233, 0,233,0, 35, 35,0, 35,0,0,16,16,
- 16,16,16,16,0,233,0,16,0, 35, 35,0,233,0,233,0, 233,233,0, 35,0,16,0,233,0,16,16,
- 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 35,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char calcleft_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,233,0, 35,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0, 35, 35,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0,233,233,233,0,0, 0,0, 35,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0, 35,233,233,0,233,0,233, 0,0, 35,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,233,233,0,233,0,233,0, 0,0, 35, 35,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,233,0,233,0,233,0,0, 0,0, 35, 35,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0,233,0,233,0,0,0, 0,0, 35, 35,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,0,0,233,0,0,233,0, 0,0, 35,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0, 35, 35,0,0,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,233,0, 35,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };
-static char calcup_data[] = {
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 35,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
- 16,16,16,16,0,233,0,16,0, 35, 35,0,233,0,233,0, 233,233,0, 35,0,16,0,233,0,16,16,
- 16,16,16,16,0,0, 35,0, 35, 35, 35,0,0,233,0,233, 0,233,0, 35, 35,0, 35,0,0,16,16,
- 16,16,16,16,0, 35, 35, 35, 35, 35, 35,0,0,0,233,0, 233,233,0, 35, 35, 35, 35, 35,0,16,16,
- 16,16,16,16,0,0, 35, 35, 35, 35, 35,0,233,0,0,233, 0,0,0, 35, 35, 35, 35,0,0,16,16,
- 16,16,16,16,16,0, 35, 35, 35, 35, 35,0,0,0,0,0, 233,0,0, 35, 35, 35, 35,0,16,16,16,
- 16,16,16,16,16,16,0,0,0, 35, 35, 35,0,0,0,0, 0,0, 35, 35,0,0,0,16,16,16,16,
- 16,16,16,16,16,16,16,16,0,0, 35, 35,0,0,0,0, 0,0, 35,0,0,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
- };*/
-
Index: rel_1_2/soccer/position.h
===================================================================
--- rel_1_2/soccer/position.h (revision 1198)
+++ rel_1_2/soccer/position.h (nonexistent)
@@ -1,57 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: position.h,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:44 $
- ------------
-*/
-
-/*
- * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "iniziali.h"
-
-struct position{
- int x;
- int y;
- float dx;
- float dy;
-} initial_calc_position[]={{ORI_RES/5,VER_RES/5+100},{ORI_RES/5,8*VER_RES/10},{ORI_RES/2,VER_RES/2+40},{9*ORI_RES/10,VER_RES/5+100},{9*ORI_RES/10,8*VER_RES/10}};
-
-
Index: rel_1_2/soccer/images.h
===================================================================
--- rel_1_2/soccer/images.h (revision 1198)
+++ rel_1_2/soccer/images.h (nonexistent)
@@ -1,82 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: images.h,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:44 $
- ------------
-*/
-
-/*
- * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#define SFONDO rgb16(0,128,0)
-#define B 255 /*BIANCO*/
-#define V 16 /*verde*/
-#define M 200 /*marrone*/
-#define C 15 /*bianco*/
-#define G 14 /*Giallo*/
-#define N 0 /*NERO*/
-#define P 13 /*Rosa*/
-
-char pallone[64]={ V,V,V,V,V,V,V,V,
- V,V,B,B,B,B,V,V,
- V,N,B,B,B,B,N,V,
- B,B,N,B,B,N,B,B,
- B,B,B,N,N,B,B,B,
- B,B,N,B,B,N,B,B,
- V,N,B,B,B,B,N,V,
- V,V,B,B,B,B,V,V,
- };
-char goal_data[]={N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
- N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
- N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
- N,N,G,G,G,G,N,G,G,G,N,G,G,G,N,G,N,N,N,N,
- N,N,G,N,N,N,N,G,N,G,N,G,N,G,N,G,N,N,N,N,
- N,N,G,N,N,N,N,G,N,G,N,G,N,G,N,G,N,N,N,N,
- N,N,G,N,N,N,N,G,N,G,N,G,N,G,N,G,N,N,N,N,
- N,N,G,N,N,N,N,G,N,G,N,G,N,G,N,G,N,N,N,N,
- N,N,G,N,G,G,N,G,N,G,N,G,G,G,N,G,N,N,N,N,
- N,N,G,N,N,G,N,G,N,G,N,G,N,G,N,G,N,N,N,N,
- N,N,G,G,G,G,N,G,G,G,N,G,N,G,N,G,G,G,N,N,
- N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
- N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
- N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
- N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
- };
-
Index: rel_1_2/soccer/readme
===================================================================
--- rel_1_2/soccer/readme (revision 1198)
+++ rel_1_2/soccer/readme (nonexistent)
@@ -1,10 +0,0 @@
-S.Ha.R.K. SOCCER Demo
----------------------
-
-This demo has been developed by Merli Andrea and Zucchetti Alessandro
-in the context of an assignment during the course of industrial informatic
-at the University of Pavia, Italy.
-
-More informations in the soccer.ps file.
-
-Paolo
Index: rel_1_2/soccer/makefile
===================================================================
--- rel_1_2/soccer/makefile (revision 1198)
+++ rel_1_2/soccer/makefile (nonexistent)
@@ -1,17 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= soccer
-
-include $(BASE)/config/example.mk
-
-soccer:
- make -f $(SUBMAKE) APP=soccer INIT= OTHEROBJS="initfile.o" SHARKOPT="__OLDCHAR__ __GRX__"
-
-
Index: rel_1_2/soccer/iniziali.h
===================================================================
--- rel_1_2/soccer/iniziali.h (revision 1198)
+++ rel_1_2/soccer/iniziali.h (nonexistent)
@@ -1,100 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: iniziali.h,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:44 $
- ------------
-*/
-
-/*
- * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#define YMENU 10 /* menu level */
-#define XMIN 1
-#define XMAX 799
-#define YMIN 100
-#define YMAX 599
-#define D 27
-#define VEL 10 /* linear velocity (def. = 6) */
-#define ANG 15 /* angolo massimo sterzata (15) */
-#define ESC 27 /* ASCII code of ESCAPE key */
-#define MAX_P 10 /* max number of calc */
-#define MAX_B 1
-#define GROUP_SOFT 4
-#define GROUP_PLAY 2
-#define GROUP_BALL 3
-#define PERIOD_BALL 30000
-#define PERIOD_CALC 100000
-#define PERIOD_PORT 30000
-#define CALC_WCET 5000
-#define PORT_WCET 4000
-#define BALL_WCET 5000
-#define BALL_RADIUS 5
-#define VER_RES 600
-#define ORI_RES 800
-#define COL_DEP 16
-#define FREE_MODE 0 /*il giocatore corre palla al piede*/
-#define PASS_MODE 1 /*il giocatore passa la palla rasoterra*/
-#define NO_BALL_MODE 4
-#define PENALTY_MODE_BLUE 5
-#define PENALTY_MODE_WHITE 6
-#define RESTART 6
-#define CANC 370
-#define RLEFT 1 /*RUN LEFT*/
-#define RDOWN 3 /*RUN DOWN*/
-#define RUP 5 /*RUN UP*/
-#define RRIGHT 7 /*RUN RIGHT*/
-#define RRUP 9 /*RUN RIGHT UP*/
-#define RRDW 15 /*RUN RIGHT DOWN*/
-#define RLUP 11 /*RUN LEFT UP*/
-#define RLDW 13 /*RUN LEFT DOWN*/
-#define RLEFT2 17 /*RUN LEFT*/
-#define RDOWN2 19 /*RUN DOWN*/
-#define RUP2 21 /*RUN UP*/
-#define RRIGHT2 23 /*RUN RIGHT*/
-#define RRUP2 25 /*RUN RIGHT UP*/
-#define RRDW2 27 /*RUN RIGHT DOWN*/
-#define RLUP2 29 /*RUN LEFT UP*/
-#define RLDW2 31 /*RUN LEFT DOWN*/
-#define NO_ACT 0
-#define GOAL_ACT 2
-#define MENU_ACT 3
-#define NO_PENALTY 0
-#define PENALTY 1
Index: rel_1_2/soccer/soccer.c
===================================================================
--- rel_1_2/soccer/soccer.c (revision 1198)
+++ rel_1_2/soccer/soccer.c (nonexistent)
@@ -1,1245 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: soccer.c,v 1.2 2003-01-07 17:10:18 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.2 $
- Last update: $Date: 2003-01-07 17:10:18 $
- ------------
-*/
-
-/*
- * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-/*--------------------------------------------------------------*/
-/* */
-/* S.Ha.R.K. SOCCER SIMULATOR 2001 */
-/* */
-/* */
-/*Autori: Merli Andrea */
-/* Zucchetti Alessandro */
-/*--------------------------------------------------------------*/
-
-#include <kernel/kern.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <semaphore.h>
-#include <stdlib.h>
-#include <math.h>
-#include <modules/cabs.h>
-#include <ll/sys/types.h>
-#include "images.h"
-#include "position.h"
-#include "iniziali.h"
-#include "calc.h"
-#include "calc2.h"
-#include "stadio.h"
-
-struct target{
-int x;
-int y;
-};
-
-void draw_calc(int x, int y, int c,int f); /*disegna i calciatori*/
-void draw_ball(int c); /*disegna la palla*/
-void draw_port(int c,int p,int yp,int xp); /*disegna i portieri*/
-void init_calc(); /*carica i task calc*/
-void init_position(int num,int *ox,int *oy); /*inizializza la posizione dei calciatori*/
-void init_calc_area(int i,int *x_min,int *x_max,int *y_min,int *y_max); /*inizializza la zona di campo die calciatori*/
-void get_target(int modo,int i,struct target * obj,int x_max,int x_min,int y_max,int y_min);/*seleziona l'obietivo dei calciatori*/
-void collision_detection(int i);/*gestisce le collisioni tra i calciatori*/
-int get_direction(int x,int y,int x2, int y2);
-void init_portiere(); /*carica i task portiere*/
-void init_ball(); /*carica il task ball*/
-void act_goal(); /*carica il task gol*/
-void draw_goal(); /*gestisce il tabellone facendo apparire la scritta GOAL!!*/
-void disegna_campo(); /*disegna il campo di gioco*/
-int yportiere(int y1, int y2);
-int xportiere(int x1, int x2);
-int goal_behaviour(int f); /*gestisce gli eventi in occasione di un gol*/
-int rigore=0;
-float t;
-double tick = 1.0; /* system tick = 1 ms */
-int xb=300,yb=300,xob=300,yob=300; /* coordinate globali della palla*/
-struct position pos_calc[MAX_P+2];
-PID pid_calc,pid_calc2,pid_ball,pid_port,pid_gol;
-sem_t mutex,mutex2;
-CAB cbi[4];
-
-
-/*--------------------------------------------------------------*/
-TASK ball(void *arg)
-{
-float dx=0, dy=0;//,df=0,dg=0;
-float acc =0.0; /*accelerazione*/
-float x; /*spostamento*/
-int g=10; /*accelerazione di gravit…*/
-float cattr=0.05; /*coeff di attrito tra palla e campo*/
-int col=1000;
-int ij=0;
-int r1=0,r2=0; /*gol segnati*/
-char tetaa[15];
-double r; /*angolo in radianti*/
-int flag =0; /*variabile generatrice di eventi*/
-int outy,outx; /*variabile per rilevare il rimbalzo della palla*/
-float vel1=0.0,vel2=0.0; /*variabili di velocita*/
-float tau = 1.0; /*tempo base*/
-char *m; /*modo*/
-char *a; /*angolo*/
-char *s; /*speed*/
-char modo;
-char *o; /*azione*/
-char azione;
-int teta=0;
-char velocita;
-char mode;
- ij=0;
- m = cab_getmes(cbi[0]);
- mode = *m;
- cab_unget(cbi[0],m);
- if(mode==NO_BALL_MODE){
- xb = xob =(XMIN+XMAX)/2;
- yb = yob =(YMIN+YMAX)/2;
- }
- if(mode ==PENALTY_MODE_BLUE){
-
- xb=700;
- yb=(YMIN+YMAX)/2;
- }
- if(mode == PENALTY_MODE_WHITE){
- xb=100;
- yb=(YMIN+YMAX)/2;
- }
-
- sprintf(tetaa,"BLUE FC %3d AC WHITE %3d",(r1),(r2));
- grx_text(tetaa,XMIN+270 ,YMENU+60, rgb16(255,255,255), rgb16(0,0,0));
-/***************************************************************************/
- while (1) { //WHILE(1);
- m = cab_getmes(cbi[0]);
- mode = *m;
- cab_unget(cbi[0],m);
- /*posiziono la palla sul dischetto del rigore*/
- if(mode ==PENALTY_MODE_BLUE){
- xb=700;
- yb=(YMIN+YMAX)/2;
- }
- if(mode == PENALTY_MODE_WHITE){
- xb=100;
- yb=(YMIN+YMAX)/2;
- }
- /*se rigore=NO_PENALTY si calcolano le coordinate della palla
- in base alla velocit… e alla direzione del tiro*/
- if(rigore ==NO_PENALTY){
- a = cab_getmes(cbi[1]); /*direzione*/
- cab_unget(cbi[1],a);
- s = cab_getmes(cbi[2]); /*velocit…*/
- velocita = *s;
- cab_unget(cbi[2],s);
- acc = (float)cattr * g;
- r = (double)(36*(*a)/12) * PI / 180.;
- if(mode==PASS_MODE){
- vel1= velocita;
- }
- vel2 = vel1 - acc*tau;
- if(vel2>0){
- x = vel1 *tau -0.5*acc*tau*tau;
- dx = (float)(x * cos(r));
- dy = (float)(x * sin(r));
- xb += dx;
- yb += dy;
- ij++;
- outx = (xb > XMAX-2) || (xb < XMIN+2);
- outy = (yb > YMAX-6) || (yb < YMIN+6);
-
- if (outx || outy) {
- if ((yb>=(YMIN+YMAX)/2-50) &&(yb<=(YMIN+YMAX)/2+50)){
- dx=0;
- dy=0;
- }
- xb = xb - dx;
- yb = yb - dy;
- if (outx) teta = 60 - (*a);
- if (outy) teta = 120-(*a);
- if (teta > 120) teta -= 120;
- if (teta < 0) teta += 120;
- *a =(char)teta;
- r = (double)(36*(*a)/12) * PI / 180.;
- dx = (float)(x * cos(r));
- dy = (float)(x * sin(r));
- if ((yb>=(YMIN+YMAX)/2-50) &&(yb<=(YMIN+YMAX)/2+50)){
- dx=0;
- dy=0;
- }
- xb += dx;
- yb += dy;
- }
- modo = NO_BALL_MODE;
- m = cab_reserve(cbi[0]);
- *m = modo;
- cab_putmes(cbi[0],m);
-
- vel1 = vel2;
- }
- if (yb< YMIN+5) yb = yb+10;
- if(xb< XMIN+5) xb = xb +10;
- /*se c'Š un gol*/
- if ((yb>=(YMIN+YMAX)/2-50) &&(yb<=(YMIN+YMAX)/2+50)&&((xb<=XMIN+7)||
- (xb >=XMAX-7))){
- /*aggiorno i risultati*/
- if(xb<XMIN+50) r2++;
- else r1++;
- /*assegno alle variabili i valori di riposo*/
- yb =(YMAX+YMIN)/2;
- xb =(XMIN+XMAX)/2;
- teta=0;
- velocita=0;
- flag =1;
- }
- /* in base al valore di flag modifico il tabellone*/
- flag = goal_behaviour(flag);
- /*scrivo il nuovo risultato nel tabellone*/
- if (flag == 80){
- sprintf(tetaa,"BLUE FC %3d AC WHITE %3d",(r1),(r2));
- grx_text(tetaa,XMIN+270 ,YMENU+60, rgb16(255,255,255), rgb16(0,0,0));
- flag =0;
- o = cab_reserve(cbi[3]);
- azione = NO_ACT; /*nessuna azione*/
- *o = azione;
- cab_putmes(cbi[3],o);
- modo = NO_BALL_MODE;
- m = cab_reserve(cbi[0]);
- *m = modo;
- cab_putmes(cbi[0],m);
- }
-
- }//fine if(rigore==NO_PENALTY)
- draw_ball(0);
- draw_ball(col);
- xob = xb; yob = yb;
-
- task_endcycle();
- }
-
-}
-
-
-/*--------------------------------------------------------------*/
-
-
-
-/******************************************************************/
-
-TASK calc(void *arg){
-
-struct target obj;
-int ox=200, oy=200;
-int alpha=0;
-int teta;
-int col=0;
-char speed;
-char *s;
-char modo;
-char *m;
-char angolo;
-char *a;
-int i = (int)arg;
-int x_min=0,y_min=0;
-int x_max=0,y_max=0;
-/*Posiziono i calciatori nel punto iniziale*/
-
- init_position(i,&ox,&oy);
-
-
- /*Definisco l'area di gioco del calciatore basandomi sul suo PID*/
-
- init_calc_area(i,&x_min,&x_max,&y_min,&y_max);
-
-while (1) {
- m = cab_getmes(cbi[0]);
- modo = *m;
- cab_unget(cbi[0],m);
-
- /*Individua l'obiettivo del calciatore a seconda del modo e del */
- /*ruolo in PENALTY_MODE un calciatore va sul pallone gli altri */
- /*ai lati del campo */
- /*in NO_BALL_MODE l'obiettivo Š la palla se essa Š */
- /*nell'area definita dalla funzione init_calc_area(..) */
- /*altrimenti Š la posizione iniziale definita con init_position(.)*/
-
-
- get_target(modo,i,&obj,x_max,x_min,y_max,y_min);
-
- /*se raggiungo l'obbiettivo mi fermo*/
- if(obj.x==pos_calc[i].x) pos_calc[i].dx=0;
- if(obj.y==pos_calc[i].y) pos_calc[i].dy=0;
-
- /*direzione tra il calciatore e l'obiettivo*/
-
- alpha= get_direction(pos_calc[i].x,pos_calc[i].y,obj.x,obj.y);
-
- /*direzione di corsa iniziale*/
-
- pos_calc[i].dy = -VEL*sin((alpha*PI)/180);
- pos_calc[i].dx = VEL*cos((alpha*PI)/180);
-
-
- /*Per evitare che il calciatore corra prima dell'inizio della
- partita gli impongo di non muoversi in posizione iniziale*/
-
- if((obj.x==300)&&(obj.y==300)) {
- pos_calc[i].dx=0;
- pos_calc[i].dy=0;
- }
- /*velocità di corsa*/
-
- pos_calc[i].x+=pos_calc[i].dx;
- pos_calc[i].y+=pos_calc[i].dy;
-
- /*verifico se mi trovo in una situazione di collisione con */
- /*un altro calciatore */
-
- collision_detection(i);
-
-
-
- /*se il calciatore arriva sulla palla tira*/
- if((modo==NO_BALL_MODE)||(i==7)||(i==2))
- if(((pos_calc[i].x>=xb-27)&&(pos_calc[i].x<=xb+27))&&((pos_calc[i].y>=yb-27)&&(pos_calc[i].y<=yb+27)))
- {
-
- if((i==7)||(i==2)) rigore =NO_PENALTY;
- modo = PASS_MODE;
- m = cab_reserve(cbi[0]);
- *m = modo;
- cab_putmes(cbi[0],m);
- if(i<5){
- a = cab_reserve(cbi[1]);
- teta =(rand()%(90) + 135 );
- if(teta >360) teta -= 360;
- if (teta<0) teta += 360;
- angolo = (char)(teta/3);
- *a = angolo;
- cab_putmes(cbi[1],a);
- }
- if(i>4){
- a = cab_reserve(cbi[1]);
- teta =(rand()%(90) -45);
- if(teta >360) teta -= 360;
- if (teta<0) teta += 360;
- teta = (teta/3);
- *a = teta;//angolo;
- cab_putmes(cbi[1],a);
- }
- s = cab_reserve(cbi[2]);
- speed=16;
- *s =speed;
- cab_putmes(cbi[2],s);
-
- }
-
-
-
- draw_calc(ox, oy, CANC,0);
-
- /*Disegna l'omino voltato nella direzione della palla*/
- if(i<5){
- DIREZ(alpha,col,158,203, RLEFT,pos_calc[i].x,pos_calc[i].y);/*runleft*/
- DIREZ(alpha,col,249,292, RDOWN,pos_calc[i].x,pos_calc[i].y);/*rundown*/
- DIREZ(alpha,col, 68,113, RUP,pos_calc[i].x,pos_calc[i].y);/*runup*/
- DIREZ(alpha,col, 0, 23,RRIGHT,pos_calc[i].x,pos_calc[i].y);/*runright*/
- DIREZ(alpha,col,337,360,RRIGHT,pos_calc[i].x,pos_calc[i].y);
- DIREZ(alpha,col, 23, 68, RRUP,pos_calc[i].x,pos_calc[i].y);/*runrightup*/
- DIREZ(alpha,col,113,158, RLUP,pos_calc[i].x,pos_calc[i].y);/*runleftup*/
- DIREZ(alpha,col,203,249, RLDW,pos_calc[i].x,pos_calc[i].y);/*runleftdown*/
- DIREZ(alpha,col,292,337, RRDW,pos_calc[i].x,pos_calc[i].y);/*runrightdown*/
- }
-
- if(i>4){
-
- DIREZ(alpha,col,158,203, RLEFT2,pos_calc[i].x,pos_calc[i].y);/*runleft*/
- DIREZ(alpha,col,249,292, RDOWN2,pos_calc[i].x,pos_calc[i].y);/*rundown*/
- DIREZ(alpha,col, 68,113, RUP2,pos_calc[i].x,pos_calc[i].y);/*runup*/
- DIREZ(alpha,col, 0, 23,RRIGHT2,pos_calc[i].x,pos_calc[i].y);/*runright*/
- DIREZ(alpha,col,337,360,RRIGHT2,pos_calc[i].x,pos_calc[i].y);
- DIREZ(alpha,col, 23, 68, RRUP2,pos_calc[i].x,pos_calc[i].y);/*runrightup*/
- DIREZ(alpha,col,113,158, RLUP2,pos_calc[i].x,pos_calc[i].y);/*runleftup*/
- DIREZ(alpha,col,203,249, RLDW2,pos_calc[i].x,pos_calc[i].y);/*runleftdown*/
- DIREZ(alpha,col,292,337, RRDW2,pos_calc[i].x,pos_calc[i].y);/*runrightdown*/
- }
-
-
- ox =pos_calc[i].x; oy = pos_calc[i].y;
-
- task_endcycle();
- }
-}
-/****************************************************************/
-TASK gol(void *arg)
-{
- while(1){
- draw_goal();
- task_endcycle();
- }
-}
-/****************************************************************/
-TASK portiere(void *arg)
-{
-int yp,yp1,yp0,ypo_0=(YMAX+YMIN)/2,ypo_1=(YMAX+YMIN)/2;
-int xp0,xp1,xpo_0,xpo_1,xo0,xo1;
-int np= (int)arg;
-char speed;
-char *s;
-char modo;
-char *m;
-char angolo;
-char *a;
-
- yp = (YMIN+YMAX)/2; /* y di attesa*/
- yp0 = (YMIN+YMAX)/2;
- yp1 = (YMIN+YMAX)/2;
- xp0 = xpo_0 = XMIN+3; /* xp ascissa attuale portiere, xpo ascissa vecchia posizione portiere*/
- xp1 = xpo_1 = XMAX-30;
- xo0 = XMIN+3; /* x di attesa*/
- xo1 = XMAX-30; /* x di attesa*/
- draw_port(1,np,yp,xo0);
- draw_port(1,np,yp,xo1);
-
- while(1){
- m = cab_getmes(cbi[0]);
- modo = *m;
- cab_unget(cbi[0],m);
- /*in base alla posizione della palla si calcola la posizione del portiere*/
- if ((np==0) && (xb < (XMIN+XMAX)/2) &&(xb > XMIN+150)){
- yp0 = yportiere(yb,yp0);
- xp0 = xportiere(xo0,xp0);
- }
- if ((np==0) &&(xb <= XMIN+150)){
- yp0 = yportiere(yb,yp0);
- xp0= xportiere(xb,xp0);
- }
- if ((np==0) && (xb > (XMIN+XMAX)/2)){
- yp0 = yportiere(yp,yp0);
- xp0 = xportiere(xo0,xp0);
- }
- /*il portiere non esce oltre questi limiti*/
- if ((yp0< (YMIN+YMAX)/2-100)|| (yp0>(YMIN+YMAX)/2+100))
- yp0 = ypo_0;
- if(xp0> XMIN+150)
- xp0 =xpo_0;
-
- pos_calc[10].x = xp0;
- pos_calc[10].y = yp0;
-
- /*in base alla posizione della palla si calcola la posizione del portiere*/
- if ((np==1) && (xb > (XMIN+XMAX)/2) && (xb< XMAX-150)){
- yp1 = yportiere(yb,yp1);
- xp1 = xportiere(xo1,xp1);
- }
- if ((np==1) && (xb >= XMAX-150)){
- yp1 = yportiere(yb,yp1);
- xp1 = xportiere(xb,xp1);
- }
- if ((np==1) && (xb < (XMIN+XMAX)/2)){
- yp1 = yportiere(yp,yp1);
- xp1 = xportiere(xo1,xp1);
- }
- /*il portiere non esce oltre questi limiti*/
- if ((yp1< (YMIN+YMAX)/2-100)|| (yp1>(YMIN+YMAX)/2+100))
- yp1 =ypo_1;
- if(xp1 < XMAX-150)
- xp1 =xpo_1;
-
- pos_calc[11].x = xp1;
- pos_calc[11].y = yp1;
-
- /*in caso di rigore il portiere aspetta il tiro sulla linea della porta*/
- if (rigore ==PENALTY) xp0= XMIN+3;
-
- if ((np==0)){
- draw_port(0,np,ypo_0,xpo_0);
- draw_port(1,np,yp0,xp0);
- ypo_0 = yp0;
- xpo_0 =xp0;
- }
-
- /*in caso di rigore il portiere aspetta il tiro sulla linea della porta*/
- if(rigore ==PENALTY) xp1= XMAX-30;
-
- if((np==1)){
- draw_port(0,np,ypo_1,xpo_1);
- draw_port(1,np,yp1,xp1);
- ypo_1 = yp1;
- xpo_1 = xp1;
- }
-
- /*se para rinvia immediatamente*/
- if( (yp0 >=yb-5) && (yp0<yb+20) && ((xb<=xp0+20)&&(xb>=xp0-30))){
- m = cab_reserve(cbi[0]);
- modo = PASS_MODE;
- *m = modo;
- cab_putmes(cbi[0],m);
- a = cab_reserve(cbi[1]);
- angolo =0;
- *a = angolo;
- cab_putmes(cbi[1],a);
- s = cab_reserve(cbi[2]);
- speed=20;
- *s =speed;
- cab_putmes(cbi[2],s);
- }
- /*se para rinvia immediatamente*/
- if((yp1 >=yb-5) && (yp1<yb+20) && (xb<=xp1+20)&&(xb>= xp1-30) ){
- m = cab_reserve(cbi[0]);
- modo = PASS_MODE;
- *m = modo;
- cab_putmes(cbi[0],m);
- a = cab_reserve(cbi[1]);
- angolo =60;
- *a = angolo;
- cab_putmes(cbi[1],a);
- s = cab_reserve(cbi[2]);
- speed=20;
- *s =speed;
- cab_putmes(cbi[2],s);
- }
- task_endcycle();
- }
-}
-
-/****************************************************************/
-/* This function is called when the system exits */
-void byebye(void *arg)
-{
- grx_close();
- kern_printf("Bye Bye!\n");
-}
-
-/****************************** MAIN ******************************/
-
-int main(int argc, char **argv)
-{
-
-
- char c; /* character from keyboard */
- int z=0;
- int p=0;
- int ij=0;
- char modo;
- char *m;
- char *s;
- char speed;
- char *a;
- char angolo;
- char *o;
- char azione;
-
-
- TIME seme; /* used to init the random seed */
-
- /* Set the closing function */
- sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
-
- /* graphic card Initialization */
- if (grx_init() < 1) {
- sys_abort(1);
- }
-
- if (grx_open(ORI_RES,VER_RES,COL_DEP) < 0) {
- kern_printf("GRX Err\n");
- sys_abort(1);
- }
- kern_printf("Video card ok!\n");
- cbi[1] = cab_create("direzione",10,15);
- cbi[0] = cab_create("modo",4,15);
- cbi[2] = cab_create("velocita",10,15);
- cbi[3] = cab_create("azione",3,3);
- m = cab_reserve(cbi[0]);
- modo = NO_BALL_MODE;
- *m = modo;
- cab_putmes(cbi[0],m);
- a = cab_reserve(cbi[1]);
- angolo =0;
- *a = angolo;
- cab_putmes(cbi[1],a);
- s = cab_reserve(cbi[2]);
- speed=0;
- *s =speed;
- cab_putmes(cbi[2],s);
- o = cab_reserve(cbi[3]);
- azione = NO_ACT;
- *o = azione;
- cab_putmes(cbi[3],o);
-
- /* The scenario */
-
- grx_box(0,0,ORI_RES,VER_RES,0);
- disegna_campo();
- for(p=0;p<scale_width;p++)
- for(z=0;z<scale_height;z++){
- grx_plot(100+p,0+z,rgb16(stadio_cmap[(unsigned char)scale_data[z*150+p]][0],stadio_cmap[(unsigned char)scale_data[z*150+p]][1],stadio_cmap[(unsigned char)scale_data[z*150+p]][2]));
- grx_plot(550+p,0+z,rgb16(stadio_cmap[(unsigned char)scale_data[z*150+p]][0],stadio_cmap[(unsigned char)scale_data[z*150+p]][1],stadio_cmap[(unsigned char)scale_data[z*150+p]][2]));
- }
- for(p=0;p<faro_width;p++)
- for(z=0;z<faro_height;z++){
- grx_plot(0+p,0+z,rgb16(stadio_cmap[(unsigned char)faros_data[z*100+p]][0],stadio_cmap[(unsigned char)faros_data[z*100+p]][1],stadio_cmap[(unsigned char)faros_data[z*100+p]][2]));
- grx_plot(700+p,0+z,rgb16(stadio_cmap[(unsigned char)farod_data[z*100+p]][0],stadio_cmap[(unsigned char)farod_data[z*100+p]][1],stadio_cmap[(unsigned char)farod_data[z*100+p]][2]));
- }
- for(p=0;p<schermo_width;p++)
- for(z=0;z<schermo_height;z++){
- grx_plot(250+p,0+z,rgb16(stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][0],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][1],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][2]));
- }
- grx_text(" Simulation of Soccer", XMIN+260, YMENU+10, rgb16(255,255,255), rgb16(0,0,0));
- grx_text(" W rigore bianchi, E rigore blue", XMIN+260, YMENU+20, rgb16(255,255,255), rgb16(0,0,0));
- grx_text(" SPACE crea squadre, K kill all ", XMIN+260, YMENU+30, rgb16(255,255,255), rgb16(0,0,0));
- grx_text(" ESC Return to MS-DOS ", XMIN+260, YMENU+40, 12, rgb16(255,255,255));
- /* The program waits a space to create a calc */
- c = keyb_getch(BLOCK);
-
- /* randomize!!!!*/
- seme = sys_gettime(NULL);
- srand(seme);
-
- do {
- if ((c == ' ') &&(ij==0)) {
- init_ball();
- init_calc();
- init_portiere();
- ij++;
- }
- if ((c== 'w')){m = cab_reserve(cbi[0]);
- modo = PENALTY_MODE_WHITE;
- *m = modo;
- cab_putmes(cbi[0],m);
- rigore =PENALTY; }
- if ((c== 'e')){m = cab_reserve(cbi[0]);
- modo = PENALTY_MODE_BLUE;
- *m = modo;
- cab_putmes(cbi[0],m);
- rigore =PENALTY; }
- if ((c == 'k')) {
- group_kill(GROUP_PLAY);
- group_kill(GROUP_SOFT);
- group_kill(GROUP_BALL);
- ij=0;
- m = cab_reserve(cbi[0]);
- modo = NO_BALL_MODE;
- *m = modo;
- cab_putmes(cbi[0],m);
- disegna_campo();
- for(p=0;p<scale_width;p++)
- for(z=0;z<scale_height;z++){
- grx_plot(100+p,0+z,rgb16(stadio_cmap[(unsigned char)scale_data[z*150+p]][0],stadio_cmap[(unsigned char)scale_data[z*150+p]][1],stadio_cmap[(unsigned char)scale_data[z*150+p]][2]));
- grx_plot(550+p,0+z,rgb16(stadio_cmap[(unsigned char)scale_data[z*150+p]][0],stadio_cmap[(unsigned char)scale_data[z*150+p]][1],stadio_cmap[(unsigned char)scale_data[z*150+p]][2]));
- }
- for(p=0;p<faro_width;p++)
- for(z=0;z<faro_height;z++){
- grx_plot(0+p,0+z,rgb16(stadio_cmap[(unsigned char)faros_data[z*100+p]][0],stadio_cmap[(unsigned char)faros_data[z*100+p]][1],stadio_cmap[(unsigned char)faros_data[z*100+p]][2]));
- grx_plot(700+p,0+z,rgb16(stadio_cmap[(unsigned char)farod_data[z*100+p]][0],stadio_cmap[(unsigned char)farod_data[z*100+p]][1],stadio_cmap[(unsigned char)farod_data[z*100+p]][2]));
- }
- grx_text(" Simulation of Soccer", XMIN+260, YMENU+10, rgb16(255,255,255), rgb16(0,0,0));
- grx_text(" W rigore bianchi, E rigore blue", XMIN+260, YMENU+20, rgb16(255,255,255), rgb16(0,0,0));
- grx_text(" SPACE crea squadre, K kill all ", XMIN+260, YMENU+30, rgb16(255,255,255), rgb16(0,0,0));
- grx_text(" ESC Return to MS-DOS ", XMIN+260, YMENU+40, 12, rgb16(255,255,255));
- xb=(int)(XMAX-XMIN)/2;
- yb=(int)(YMIN+YMAX)/2;
- }
- c = keyb_getch(BLOCK);
- } while (c != ESC);
-
-
-
- sys_end();
-
- return 0;
-}
-
-/*--------------------------------------------------------------*/
-void draw_calc(int x, int y, int c,int f)
-{
- int i,j;/*needed in the macro*/
- sem_wait(&mutex);
- if(c==CANC){
-
- grx_box(x, y,x+27,y+27,SFONDO);
- if((x>(XMIN+XMAX)/2-27) && (x<(XMIN+XMAX)/2+27)){
- grx_line(XMIN+1,YMIN+1,XMAX-1,YMIN+1,rgb16(255,255,255));
- grx_line(XMIN+1,YMAX-1,XMAX-1,YMAX-1,rgb16(255,255,255));
- grx_line(XMIN+1,YMIN+1,XMIN+1,(YMIN+YMAX)/2-50,rgb16(255,255,255));
- grx_line(XMIN+1,(YMIN+YMAX)/2+50,XMIN+1,YMAX-1,rgb16(255,255,255));
- grx_line(XMAX-1,YMIN+1,XMAX-1,(YMIN+YMAX)/2-50,rgb16(255,255,255));
- grx_line(XMAX-1,(YMIN+YMAX)/2+50,XMAX-1,YMAX-1,rgb16(255,255,255));
- grx_line(((XMIN+XMAX)/2),YMIN,((XMIN+XMAX)/2),YMAX-1,rgb16(255,255,255));
- grx_circle((XMIN+XMAX)/2,(YMIN+YMAX)/2,54,rgb16(255,255,255));
- grx_line(XMIN,(YMIN+YMAX)/4+30,(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,rgb16(255,255,255));
- grx_line((XMIN+XMAX)/5,(YMIN+YMAX)/4+30,(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
- grx_line(XMIN,3*(YMIN+YMAX)/4-30,(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
- grx_line(XMIN,(YMIN+YMAX)/2-70,(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,rgb16(255,255,255));
- grx_line((XMIN+XMAX)/10,(YMIN+YMAX)/2-70,(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
- grx_line(XMIN,(YMIN+YMAX)/2+70,(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
- grx_line(4*(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,XMAX,(YMIN+YMAX)/4+30,rgb16(255,255,255));
- grx_line(4*(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,4*(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
- grx_line(4*(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,XMAX,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
- grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,XMAX,(YMIN+YMAX)/2-70,rgb16(255,255,255));
- grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,9*(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
- grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,XMAX,(YMIN+YMAX)/2+70,rgb16(255,255,255));
- grx_line(XMIN+1,(YMIN+YMAX)/2-50,XMIN+1,(YMIN+YMAX)/2+50,rgb16(100,100,100));
- grx_line(XMAX-1,(YMIN+YMAX)/2-50,XMAX-1,(YMIN+YMAX)/2+50,rgb16(100,100,100));
- grx_box(XMIN,(YMIN+YMAX)/2-50,XMIN+2,(YMIN+YMAX)/2+50,rgb16(50,0,50));
- grx_box(XMAX-2,(YMIN+YMAX)/2-50,XMAX,(YMIN+YMAX)/2+50,rgb16(50,0,50));
- }
- }
- else
- if(c==RLEFT)
- DIRDRAW(x,y,((unsigned char)runup_data[i*27+j]));
- if(c==RLEFT+1)
- DIRDRAW(x,y,((unsigned char)runup2_data[i*27+j]));
- if(c==RDOWN)
- DIRDRAW(x,y,((unsigned char)rundes2_data[i*27+j]));
- if(c==RDOWN+1)
- DIRDRAW(x,y,((unsigned char)rundes_data[i*27+j]));
- if(c==RUP)
- DIRDRAW(x,y,((unsigned char)runleft2_data[i*27+j]));
- if(c==RUP+1)
- DIRDRAW(x,y,((unsigned char)runleft_data[i*27+j]));
- if(c==RRIGHT)
- DIRDRAW(x,y,((unsigned char)rundown2_data[i*27+j]));
- if(c==RRIGHT+1)
- DIRDRAW(x,y,((unsigned char)rundown_data[i*27+j]));
- if(c==RRUP)
- DIRDRAW(x,y,((unsigned char)runld2_data[i*27+j]));
- if(c==RRUP+1)
- DIRDRAW(x,y,((unsigned char)runld_data[i*27+j]));
- if(c==RLUP)
- DIRDRAW(x,y,((unsigned char)runlu2_data[i*27+j]));
- if(c==RLUP+1)
- DIRDRAW(x,y,((unsigned char)runlu_data[i*27+j]));
- if(c==RLDW)
- DIRDRAW(x,y,((unsigned char)runru2_data[i*27+j]));
- if(c==RLDW+1)
- DIRDRAW(x,y,((unsigned char)runru_data[i*27+j]));
- if(c==RRDW)
- DIRDRAW(x,y,((unsigned char)runrd2_data[i*27+j]));
- if(c==RRDW+1)
- DIRDRAW(x,y,((unsigned char)runrd_data[i*27+j]));
-/**********************************************************************/
- if(c==RLEFT2)
- DIRDRAW(x,y,((unsigned char)B_runup_data[i*27+j]));
- if(c==RLEFT2+1)
- DIRDRAW(x,y,((unsigned char)B_runup2_data[i*27+j]));
- if(c==RDOWN2)
- DIRDRAW(x,y,((unsigned char)B_rundes2_data[i*27+j]));
- if(c==RDOWN2+1)
- DIRDRAW(x,y,((unsigned char)B_rundes_data[i*27+j]));
- if(c==RUP2)
- DIRDRAW(x,y,((unsigned char)B_runleft2_data[i*27+j]));
- if(c==RUP2+1)
- DIRDRAW(x,y,((unsigned char)B_runleft_data[i*27+j]));
- if(c==RRIGHT2)
- DIRDRAW(x,y,((unsigned char)B_rundown2_data[i*27+j]));
- if(c==RRIGHT2+1)
- DIRDRAW(x,y,((unsigned char)B_rundown_data[i*27+j]));
- if(c==RRUP2)
- DIRDRAW(x,y,((unsigned char)B_runld2_data[i*27+j]));
- if(c==RRUP2+1)
- DIRDRAW(x,y,((unsigned char)B_runld_data[i*27+j]));
- if(c==RLUP2)
- DIRDRAW(x,y,((unsigned char)B_runlu2_data[i*27+j]));
- if(c==RLUP2+1)
- DIRDRAW(x,y,((unsigned char)B_runlu_data[i*27+j]));
- if(c==RLDW2)
- DIRDRAW(x,y,((unsigned char)B_runru2_data[i*27+j]));
- if(c==RLDW2+1)
- DIRDRAW(x,y,((unsigned char)B_runru_data[i*27+j]));
- if(c==RRDW2)
- DIRDRAW(x,y,((unsigned char)B_runrd2_data[i*27+j]));
- if(c==RRDW2+1)
- DIRDRAW(x,y,((unsigned char)B_runrd_data[i*27+j]));
- sem_post(&mutex);
-}
-/*--------------------------------------------------------------*/
-void draw_ball(int c)
-{
- sem_wait(&mutex);
- if(c==0)
- grx_box(xob, yob,xob+5,yob+5,SFONDO);
- else grx_putimage(xb, yb,xb+5,yb+5,pallone);
- sem_post(&mutex);
-}
-void draw_port(int c,int p,int yp,int xp)
-{
- int i,j;
- sem_wait(&mutex);
- if (c==0){
- if(p==0){
- /*ridisegna l'area*/
- grx_box(xp,yp-15,xp+30,yp+25,SFONDO);
- grx_line(XMIN,(YMIN+YMAX)/4+30,(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,rgb16(255,255,255));
- grx_line((XMIN+XMAX)/5,(YMIN+YMAX)/4+30,(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
- grx_line(XMIN,3*(YMIN+YMAX)/4-30,(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
- grx_line(XMIN,(YMIN+YMAX)/2-70,(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,rgb16(255,255,255));
- grx_line((XMIN+XMAX)/10,(YMIN+YMAX)/2-70,(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
- grx_line(XMIN,(YMIN+YMAX)/2+70,(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
- grx_box(XMIN,(YMIN+YMAX)/2-50,XMIN+2,(YMIN+YMAX)/2+50,rgb16(50,0,50));
- }
- if(p==1){
- /*ridisegna l'area*/
- grx_box(xp,yp-15,xp+27,yp+25,SFONDO);
- grx_line(4*(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,XMAX,(YMIN+YMAX)/4+30,rgb16(255,255,255));
- grx_line(4*(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,4*(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
- grx_line(4*(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,XMAX,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
- grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,XMAX,(YMIN+YMAX)/2-70,rgb16(255,255,255));
- grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,9*(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
- grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,XMAX,(YMIN+YMAX)/2+70,rgb16(255,255,255));
- grx_box(XMAX-2,(YMIN+YMAX)/2-50,XMAX,(YMIN+YMAX)/2+50,rgb16(50,0,50));
- }
- }
- else{
- if(p==0)
- DIRDRAW(xp,yp,((unsigned char)portsx_data[i*27+j]));
- if(p==1)
- DIRDRAW(xp,yp,((unsigned char)portdx_data[i*27+j]));
- }
- sem_post(&mutex);
-}
-void init_ball(){
- HARD_TASK_MODEL m_ball;
- hard_task_default_model(m_ball);
- hard_task_def_ctrl_jet (m_ball);
- hard_task_def_arg (m_ball, (void *)0);
- hard_task_def_wcet (m_ball, BALL_WCET);
- hard_task_def_mit (m_ball, PERIOD_BALL);
- hard_task_def_group (m_ball, GROUP_BALL);
- hard_task_def_usemath (m_ball);
- pid_ball = task_create("ball", ball, &m_ball, NULL);
- if (pid_ball == NIL) {
- grx_close();
- perror("Could not create task <ball>");
- sys_abort(1);
- }
-
- task_activate(pid_ball);
-}
-void init_calc(){
- HARD_TASK_MODEL m_calc;
- int i;
- disegna_campo();
- for(i=0;i<MAX_P;i++){
- hard_task_default_model(m_calc);
- hard_task_def_ctrl_jet (m_calc);
- hard_task_def_arg (m_calc, (void *)i);
- hard_task_def_wcet (m_calc, CALC_WCET);
- hard_task_def_mit (m_calc, PERIOD_CALC);
- hard_task_def_group (m_calc, GROUP_PLAY);
- hard_task_def_usemath (m_calc);
- pid_calc = task_create("calc", calc, &m_calc, NULL);
- if (pid_calc == NIL) {
- grx_close();
- perror("Could not create task <calc>");
- sys_abort(1);
- }
- task_activate(pid_calc);
- }
- }
-void act_goal(){
-
-
- SOFT_TASK_MODEL m_goal;
- soft_task_default_model(m_goal);
- soft_task_def_arg (m_goal,(void*)0);
- soft_task_def_met (m_goal, 1000);
- soft_task_def_level (m_goal,1);
- soft_task_def_ctrl_jet (m_goal);
- soft_task_def_period (m_goal, 1200000);
- soft_task_def_group (m_goal, GROUP_SOFT);
- soft_task_def_usemath (m_goal);
- soft_task_def_aperiodic(m_goal);
-
- pid_gol = task_create("gol", gol, &m_goal, NULL);
- if (pid_gol == NIL) {
- grx_close();
- perror("Could not create task <port>");
- sys_abort(1);
- }
- task_activate(pid_gol);
- }
-void init_portiere(){
- HARD_TASK_MODEL m_port;
- int g;
- for(g=0;g<2;g++){
- hard_task_default_model(m_port);
- hard_task_def_arg (m_port, (void *)g);
- hard_task_def_wcet (m_port, PORT_WCET);
- hard_task_def_mit (m_port, PERIOD_PORT);
- hard_task_def_group (m_port, GROUP_SOFT);
- hard_task_def_usemath (m_port);
- pid_port = task_create("portiere", portiere, &m_port, NULL);
- if (pid_port == NIL) {
- grx_close();
- perror("Could not create task <port>");
- sys_abort(1);
- }
- task_activate(pid_port);
- }
-
- }
-void draw_goal(){
- int p,z;
- char *m;
- char modo;
- char *o;
- char azione;
- m = cab_reserve(cbi[0]);
- modo = NO_BALL_MODE;
- *m = modo;
- cab_putmes(cbi[0],m);
- o = cab_getmes(cbi[3]);
- azione = *o;
- cab_unget(cbi[3],o);
-
- /*scritta GOAL!!*/
- if(azione == GOAL_ACT){
- for(p=0;p<schermo_width;p++)
- for(z=0;z<schermo_height;z++){
- grx_plot(250+p,0+z,rgb16(stadio_cmap[(unsigned char)goal1_data[z*schermo_width+p]][0],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][1],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][2]));
- }
- o = cab_reserve(cbi[3]);
- azione = 0;
- *o = azione;
- cab_putmes(cbi[3],o);
- }
-
- /*risistema il menu sul tabellone*/
- if (azione == MENU_ACT){
- for(p=0;p<schermo_width;p++)
- for(z=0;z<schermo_height;z++){
- grx_plot(250+p,0+z,rgb16(stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][0],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][1],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][2]));
- }
- o = cab_reserve(cbi[3]);
- azione = NO_ACT;
- *o = azione;
- cab_putmes(cbi[3],o);
- grx_text(" Simulation of Soccer", XMIN+260, YMENU+10, rgb16(255,255,255), rgb16(0,0,0));
- grx_text(" W rigore bianchi, E rigore blue", XMIN+260, YMENU+20, rgb16(255,255,255), rgb16(0,0,0));
- grx_text(" SPACE crea squadre, K kill all ", XMIN+260, YMENU+30, rgb16(255,255,255), rgb16(0,0,0));
- grx_text(" ESC Return to MS-DOS ", XMIN+260, YMENU+40, 12, rgb16(255,255,255));
- }
-}
-
-/*calcola la y del portiere in base alla yi in ingresso*/
-int yportiere(int yi,int yf){
- int speedy =3;
- int dy=0;
- int yp;
- /*Se sto per raggiungere la palla rallento*/
- if(abs(yi-yf)<VEL) speedy=1;
- /*se raggiungo la palla mi fermo*/
- if(yi==yf)dy=0;
- /*se palla in basso*/
- if(yi>yf) dy= speedy;
- /*se palla in alto*/
- if(yi<yf) dy=-speedy;
- yp =yf+dy;
- return(yp);
-}
-/*calcola la x del portiere in base alla xi in ingresso*/
-int xportiere(int xi, int xf){
- int speedx=3;
- int dx=0;
- int xp;
- if(abs(xi-xf)<VEL) speedx=1;
- if(xi==xf)dx=0;
- if(xi>xf) dx= speedx;
- if(xi<xf) dx=-speedx;
- xp = xf +dx;
- return(xp);
-}
-/*disegna il campo di gioco*/
-void disegna_campo(){
- //grx_box(0,0,ORI_RES,VER_RES,0);
- grx_box(XMIN, YMIN, XMAX, YMAX, SFONDO);
- grx_rect(XMIN+1, YMIN+1, XMAX-1, YMAX-1, rgb16(255,255,255));
- grx_line(((XMIN+XMAX)/2),YMIN,((XMIN+XMAX)/2),YMAX-1,rgb16(255,255,255));
- grx_circle((XMIN+XMAX)/2,(YMIN+YMAX)/2,54,rgb16(255,255,255));
- grx_rect(XMIN,(YMIN+YMAX)/4+30,(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
- grx_rect(4*(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,XMAX,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
- grx_rect(XMIN,(YMIN+YMAX)/2-70,(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
- grx_rect(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,XMAX,(YMIN+YMAX)/2+70,rgb16(255,255,255));
- grx_box(XMIN,(YMIN+YMAX)/2-50,XMIN+2,(YMIN+YMAX)/2+50,rgb16(50,0,50));
- grx_box(XMAX-2,(YMIN+YMAX)/2-50,XMAX,(YMIN+YMAX)/2+50,rgb16(50,0,50));
-}
-void init_position(int num,int *ox,int *oy)
-{
- if(num<5){
- pos_calc[num].x = *ox = initial_calc_position[num].x+35;
- pos_calc[num].y = *oy = initial_calc_position[num].y;
- }
- if(num==2){
- pos_calc[num].x = *ox = initial_calc_position[num].x+100;
- pos_calc[num].y = *oy = initial_calc_position[num].y;
- }
- if(num>4){
- pos_calc[num].x = *ox = initial_calc_position[num-5].x;
- pos_calc[num].y = *oy = initial_calc_position[num-5].y+35;
- }
- if(num==7){
- pos_calc[num].x = *ox = initial_calc_position[num-5].x-100;
- pos_calc[num].y = *oy = initial_calc_position[num-5].y;
- }
-
-}
-void init_calc_area(int num,int *xmin,int *xmax,int *ymin,int *ymax){
-
-
- switch(num)
- {
- case 0: /*attaccante bianchi*/
- case 5: /*difensore blu*/
- {
- *xmin = XMIN;
- *ymin = YMIN;
- *xmax = 255;
- *ymax = 305;
- }
- break;
- case 1: /*attaccante bianchi*/
- case 6: /*difensore blu*/
- {
- *xmin = XMIN;
- *ymin = 295;
- *xmax = 255;
- *ymax = YMAX;
- }
- break;
- case 2: /*centrocampisti*/
- case 7:
- {
- *xmin = 255;
- *ymin = YMIN;
- *xmax = 525;
- *ymax = YMAX;
- } break;
- case 3: /*attaccante blu*/
- case 8: /*difensore bianco*/
- {
- *xmin = 525;
- *ymin = YMIN;
- *xmax = XMAX;
- *ymax = 305;
- }
- break;
- case 4: /*attaccante blu*/
- case 9: /*difensore bianco*/
- {
- *xmin = 505;
- *ymin = 305;
- *xmax = XMAX;
- *ymax = YMAX;
- }
- break;
- default:
- break;
- }
-}
-void get_target(int modo,int i,struct target * obj,int x_max,int x_min,int y_max,int y_min){
-
-
-
- if((modo==PENALTY_MODE_WHITE)||(modo==PENALTY_MODE_BLUE)){
-
-
-
- if((i<5)){
- obj->x = (XMAX)-100-50*i;
- if(pos_calc[i].y>(YMAX+YMIN)/2)
- obj->y = YMAX-60;
- if(pos_calc[i].y<(YMAX+YMIN)/2)
- obj->y = YMIN+60;
- if(modo==PENALTY_MODE_WHITE){
- if((i==2)){
- obj->x = xb;
- obj->y = yb;
- }
- }
- }
- if((i>4)){
- obj->x = (XMIN)+100+50*i;
- if(pos_calc[i].y>(YMAX+YMIN)/2)
- obj->y = YMAX-60;
- if(pos_calc[i].y<(YMAX+YMIN)/2)
- obj->y = YMIN+60;
- if(modo==PENALTY_MODE_BLUE){
- if((i==7)){
- obj->x = xb;
- obj->y = yb;
- }
- }
-
- }
- }
-
- if(modo==NO_BALL_MODE)
- {
-
- /*Valutazione se la palla sia in una zona di interesse per il */
- /*calciatore */
-
- if((xb>x_max)||(xb<x_min)||(yb>y_max)||(yb<y_min))
- {
- if(i<5)
- {
- obj->x=initial_calc_position[i].x;
- obj->y=initial_calc_position[i].y;
- }
- if(i>4)
- {
- obj->x=initial_calc_position[i-5].x;
- obj->y=initial_calc_position[i-5].y;
- }
- }
- else
- {
- obj->x=xb;
- obj->y=yb;
- }
- }
-
-
-
-
-}
-int get_direction(int x,int y,int x2,int y2){
-
-int ang=0;
- if((abs(x-x2) !=0)){
- if((x>x2)&&(y<=y2))
- ang = 180+
- atan((float)abs(y-y2)/
- (float)abs(x-x2))*
- 180/PI;
- if((x<x2)&&(y<y2))
- ang = 360-
- atan((float)abs(y-y2)/
- (float)abs(x-x2))*
- 180/PI;
- if((x<x2)&&(y>y2))
- ang =
- atan((float)abs(y-y2)/
- (float)abs(x-x2))*
- 180/PI;
- if((x>x2)&&(y>y2))
- ang = 180-
- atan((float)abs(y-y2)/
- (float)abs(x-x2))*
- 180/PI;
- }
-
-return ang;
-
-}
-
-void collision_detection(int i){
-
-int j;
-
-
-for(j=0;j<MAX_P+2;j++){
-
- if(i!=j){
- if(pos_calc[i].x<pos_calc[j].x+27 && pos_calc[i].x>pos_calc[j].x-27
- && pos_calc[i].y<pos_calc[j].y && pos_calc[i].y>pos_calc[j].y-27)
- {
- pos_calc[i].y=pos_calc[j].y-27;
- }
- if(pos_calc[i].x<pos_calc[j].x && pos_calc[i].x>pos_calc[j].x-27
- && pos_calc[i].y<pos_calc[j].y+27 && pos_calc[i].y>pos_calc[j].y-27)
- {
- pos_calc[i].x=pos_calc[j].x-27;
- }
- if(pos_calc[i].x<pos_calc[j].x+27 && pos_calc[i].x>pos_calc[j].x-27
- && pos_calc[i].y<pos_calc[j].y+27 && pos_calc[i].y>pos_calc[j].y)
- {
- pos_calc[i].y=pos_calc[j].y+27;
- }
- if(pos_calc[i].x<pos_calc[j].x+27 && pos_calc[i].x>pos_calc[j].x
- && pos_calc[i].y<pos_calc[j].y+27 && pos_calc[i].y>pos_calc[j].y)
- {
- pos_calc[i].x=pos_calc[j].x+27;
- }
- }
- }
-
- /*Per impedire un calciatore esca dal campo*/
-
- if(pos_calc[i].x>=XMAX-(pos_calc[i].dx+1)) pos_calc[i].x-=(pos_calc[i].dx+1);
- if(pos_calc[i].x<=XMIN+(pos_calc[i].dx+1)) pos_calc[i].x+=(pos_calc[i].dx+1);
- if(pos_calc[i].y>=YMAX-(pos_calc[i].dy+1)) pos_calc[i].y-=(pos_calc[i].dy+1);
- if(pos_calc[i].y<=YMIN+(pos_calc[i].dy+1)) pos_calc[i].y+=(pos_calc[i].dy+1);
-}
-
-int goal_behaviour(int flag){
-char *o;
-char azione;
-
- if (flag !=0) {
- flag++;
- yb =(YMAX+YMIN)/2;
- xb =(XMIN+XMAX)/2;
- }
- if (flag==20){
- yb =(YMAX+YMIN)/2;
- xb =(XMIN+XMAX)/2;
- /*seleziono l'azione da compiere sul tabellone*/
- o = cab_reserve(cbi[3]);
- azione = GOAL_ACT; /*scritta GOAL!!*/
- *o = azione;
- cab_putmes(cbi[3],o);
- /*carico il task gol*/
- act_goal();
- }
- if (flag==65){
- o = cab_reserve(cbi[3]);
- azione = MENU_ACT; /*sistema il menu su tabellone*/
- *o = azione;
- cab_putmes(cbi[3],o);
- /*carico il task gol*/
- act_goal();
- }
-
- return(flag);
-}
-
Index: rel_1_2/soccer/initfile.c
===================================================================
--- rel_1_2/soccer/initfile.c (revision 1198)
+++ rel_1_2/soccer/initfile.c (nonexistent)
@@ -1,120 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:44 $
- ------------
-
- System initialization file
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- NRT_TASK_MODEL at level 2
-
- This file is similar to the configuration of kernel/init/hartik3.c
-
- TICK is set to 0 (one-shot timer is used)
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/dosfs/myfile.txt
===================================================================
--- rel_1_2/dosfs/myfile.txt (revision 1198)
+++ rel_1_2/dosfs/myfile.txt (nonexistent)
@@ -1,3 +0,0 @@
-0.2.4.6.8.0.2.4.6.8.0.2.4.6.8.0.2.4.6.8.
-This is the myfile.txt file...
-
Index: rel_1_2/dosfs/initfile.c
===================================================================
--- rel_1_2/dosfs/initfile.c (revision 1198)
+++ rel_1_2/dosfs/initfile.c (nonexistent)
@@ -1,91 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai and Gabriele Bolognini
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-void read_myfile(void);
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- /* If you need to interact with the DOS Filesystem and you use
- the X eXtender, this is the better place where you can use
- the DOS_fXXX functions...
-
- WARNING: You can call these functions only when you are in
- real mode!!!
-
- The system is in real mode:
- - into __kernel_register_levels__()
- - into sys_atrunlevel functions posted with RUNLEVEL_AFTER_EXIT
- */
- read_myfile();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/dosfs/readme.txt
===================================================================
--- rel_1_2/dosfs/readme.txt (revision 1198)
+++ rel_1_2/dosfs/readme.txt (nonexistent)
@@ -1,46 +0,0 @@
---------------------------------------
-DOS_fXXX Demo
-
-by
-
-Paolo Gai pj@sssup.it
-and
-Gabriele Bolognini gabrieleb@sssup.it
-2001
-
---------------------------------------
-
-The DOS_fXXX functions provided into ll/i386/x-dos.h are a few
-shortcuts that can be used to call INT21's DOS calls.
-
-These functions can be used to read and write files before/after
-the kernel goes into i386 protected mode.
-
-THEY CANNOT BE USED IF YOU BOOT WITH GRUB.
-
---------------------------------------
-
-The demo is composed by:
-
-MAKEFILE The makefile used to compile the application;
- dosfs is the rule to compile the application
-README.TXT This file
-INITFILE.C The init file (only RR)
-DOSFS.C The DOS_fread and DOS_fwrite demo
-
---------------------------------------
-
-The demo works as follows:
-- Into __kernel_register_levels__() the demo reads up to 1000 bytes from
- myfile.txt
-- Then, into the main() function it prints the contents of the buffer at
- screen
-- Finally, at the end of the system it writes a file called myfile.out
- with up to 30 of the first bytes of the buffer
-
-The demo should work on any processor speed, and does not use keyboard or
-graphics.
-
-Bug: at the moment (01 Jun 2001) sometimes the demo hangs when using
-the one-shot timer.
-
Index: rel_1_2/dosfs/makefile
===================================================================
--- rel_1_2/dosfs/makefile (revision 1198)
+++ rel_1_2/dosfs/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= dosfs
-
-include $(BASE)/config/example.mk
-
-dosfs:
- make -f $(SUBMAKE) APP=dosfs INIT= OTHEROBJS="initfile.o" OTHERINCL=
-
Index: rel_1_2/dosfs/dosfs.c
===================================================================
--- rel_1_2/dosfs/dosfs.c (revision 1198)
+++ rel_1_2/dosfs/dosfs.c (nonexistent)
@@ -1,174 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: dosfs.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai and Gabriele Bolognini
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "string.h"
-#include "ll/i386/x-dos.h"
-
-
-/* This is the buffer used by read_myfile */
-char myfilebuf[1000];
-
-/* This is the number of bytes read by read_myfile */
-int myfilebuf_length;
-
-/* This function write myfile.out (up to 30 chars) */
-void write_myfile(void *arg);
-
-int main(int argc, char **argv)
-{
- int x;
-
- cprintf("\nBuffer contents:\n");
-
- for (x=0; x<myfilebuf_length; x++)
- cputc(myfilebuf[x]);
-
- /*
- WARNING: You can call these functions only when you are in
- real mode!!!
-
- The system is in real mode:
- - into __kernel_register_levels__()
- - into sys_atrunlevel functions posted with RUNLEVEL_AFTER_EXIT
- */
-
- if (myfilebuf_length)
- sys_atrunlevel(write_myfile, NULL, RUNLEVEL_AFTER_EXIT);
-
- return 0;
- /*
- * Since there is only one user task, the kernel will shut down after this
- * task finishes...
- */
-}
-
-/* This function read myfile.txt (up to 1000 chars) */
-void read_myfile(void)
-{
- /* DOS file descriptor */
- DOS_FILE *f;
-
- /* Error code */
- int err;
-
- /* open the DOS file for reading (you can specify only "r" or "w") */
- f = DOS_fopen("myfile.txt","r");
-
- /* check for open errors */
- if (!f) {
- /* error!! */
- err = DOS_error();
-
- /* note that if you call DOS_error() here, it return 0!!! */
- cprintf("Error %d opening myfile.txt...\n", err);
- myfilebuf_length = 0;
- return;
- }
-
- /* read up to 1000 chars */
- myfilebuf_length = DOS_fread(&myfilebuf,1,1000,f);
-
- /* check for errors */
- err = DOS_error();
-
- cprintf("Read %d bytes from myfile.txt...\n", myfilebuf_length);
-
- if (err) {
- cprintf("Error %d reading myfile.txt...\n", err);
- myfilebuf_length = 0;
- /* there is not return because I want to close the file! */
- }
-
- /* Close the file */
- DOS_fclose(f);
-}
-
-/* This function write myfile.out (up to 30 chars) */
-void write_myfile(void *arg)
-{
- DOS_FILE *f; /* DOS file descriptor */
- int err; /* Error code */
- int maxbytes;
- int writtenbytes; /* number of files written */
-
- /* open the DOS file for writing (you can specify only "r" or "w") */
- f = DOS_fopen("myfile.out","w");
-
- /* check for open errors */
- if (!f) {
- /* error!! */
- err = DOS_error();
-
- /* note that if you call DOS_error() here, it return 0!!! */
- cprintf("Error %d opening myfile.out...\n", err);
- return;
- }
-
- /* write up to 30 bytes */
- if (myfilebuf_length > 30)
- maxbytes = 30;
- else
- maxbytes = myfilebuf_length;
-
- writtenbytes = DOS_fwrite(myfilebuf,1,maxbytes,f);
-
- /* check for errors */
- err = DOS_error();
-
- cprintf("Written %d bytes into myfile.out...\n", writtenbytes);
-
- if (err) {
- cprintf("Error %d writing myfile.txt...\n", err);
- /* there is not return because I want to close the file! */
- }
-
- /* Close the file */
- DOS_fclose(f);
-}
-
-
Index: rel_1_2/orbit/makefile
===================================================================
--- rel_1_2/orbit/makefile (revision 1198)
+++ rel_1_2/orbit/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= orbit
-
-include $(BASE)/config/example.mk
-
-orbit:
- make -f $(SUBMAKE) APP=orbit INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
-
Index: rel_1_2/orbit/orbit.c
===================================================================
--- rel_1_2/orbit/orbit.c (revision 1198)
+++ rel_1_2/orbit/orbit.c (nonexistent)
@@ -1,341 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: orbit.c,v 1.4 2003-05-01 19:44:07 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.4 $
- Last update: $Date: 2003-05-01 19:44:07 $
- ------------
-*/
-
-/*
- * Copyright (C) 2000 Giorgio Buttazzo and Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/****************************************************************/
-/* SIMULAZIONE DI MASSE CHE ORBITANO */
-/****************************************************************/
-
-#include <kernel/kern.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <semaphore.h>
-#include <stdlib.h>
-#include <math.h>
-
-#define MAX 11 /* numero massimo pianeti */
-#define ESC 27 /* codice ASCII tasto ESCAPE */
-#define XMAX 639 /* valore massimo coordinata X */
-#define YMAX 479 /* valore massimo coordinata Y */
-
-struct coord {
- double x;
- double y;
-};
-
-char fbuf[1000]; // buffer for reading a file
-int flen; // file length
-
-double mass[MAX]; /* vettore masse pianeti */
-struct coord pos[MAX]; /* vettore posizioni attuali */
-struct coord vel[MAX]; /* vettore velocita' iniziali */
-
-int XGS, YGS; /* Coordinate centro spazio */
-int RP, RT; /* raggio pianeta, raggio Terra */
-int np; /* numero attuale di pianeti */
-double G; /* Gravitazione Universale */
-double tick; /* tick di sistema */
-double delta; /* incremento temporale */
-double scala; /* fattore grafico di scala */
-
-// -------------------------------------------------------
-// NOTA: %f o %lf significa double e %nf significa float
-// -------------------------------------------------------
-
-PID pid;
-int period; /* task period */
-int wcet; /* task wcet */
-sem_t mutex; /* semaforo di mutua esclusione */
-
-
-void get_par(void);
-
-/*--------------------------------------------------------------*/
-
-void my_fine(void *arg)
-{
- grx_close();
-}
-
-/*--------------------------------------------------------------*/
-
-int inside(int x, int y)
-{
- return ((x > RP) && (x < XMAX-RP) &&
- (y > RP) && (y < YMAX-RP));
-}
-
-/*--------------------------------------------------------------*/
-
-TASK massa(void *xxx)
-{
- int i = (int)xxx; /* parametro del task */
- int gx, gy; /* coordinate grafiche pallina */
- int ox, oy; /* vecchia posizione pallina */
- int j;
- int r, col; /* raggio e colore pianeta */
- double dt; /* incremento temporale */
- double dist=0.0, dx, dy; /* distanze pianeta-pianeta */
- double dist0=0.0; /* distanze pianeta-Terra */
- double x, y; /* posizione del pianeta */
- double vx, vy; /* velocita' del pianeta */
- double ax, ay; /* accelerazione del pianeta */
- double k; /* variabile ausiliaria */
- double arg; /* variabile di appoggio */
-
- x = pos[i].x; y = pos[i].y;
- vx = vel[i].x; vy = vel[i].y;
- ox = XGS + x / scala;
- oy = YGS + y / scala;
- dt = delta;
-
- do {
- x = pos[i].x;
- y = pos[i].y;
- ax = ay = 0.0;
- for (j=0; j<np; j++) {
- if (j != i) {
- dx = pos[j].x - x;
- dy = pos[j].y - y;
- arg = dx*dx + dy*dy;
- dist = sqrt(arg);
- if (dist < RP*scala) dist = RP*scala;
- k = G * mass[j] / (dist*dist*dist);
- ax += k * dx;
- ay += k * dy;
- }
- if (j == 0) dist0 = dist - (RP+RT)*scala;
- }
- x += vx*dt + 0.5*ax*dt*dt;
- y += vy*dt + 0.5*ay*dt*dt;
- vx += ax * dt;
- vy += ay * dt;
-
- gx = XGS + x / scala;
- gy = YGS + y / scala;
-
- r = RP;
- col = i + 1;
-
- sem_wait(&mutex);
- grx_disc(ox,oy,r,0);
- grx_disc(gx,gy,r,col);
- sem_post(&mutex);
-
- pos[i].x = x; pos[i].y = y;
- ox = gx; oy = gy;
-
- task_endcycle();
-
- } while ((dist0 > 0) && inside(gx,gy));
-
- sem_wait(&mutex);
- grx_disc(ox,oy,r,0);
- grx_disc(XGS,YGS,RT,12);
- grx_circle(XGS,YGS,RT,14);
- sem_post(&mutex);
-
- return NULL;
-}
-
-/*--------------------------------------------------------------*/
-/* MAIN */
-/*--------------------------------------------------------------*/
-
-int main()
-{
- HARD_TASK_MODEL m;
- char c; /* carattere letto da tastiera */
-
- sys_atrunlevel(my_fine, NULL, RUNLEVEL_BEFORE_EXIT);
-
- sem_init(&mutex,0,1);
-
- get_par();
- keyb_getch(BLOCK);
-
- grx_init();
- grx_open(640, 480, 8);
-
- grx_disc(XGS,YGS,RT,12);
- grx_circle(XGS,YGS,RT,14);
-
- np = 0;
-
- do {
- if (np < MAX-1) {
- np++;
- hard_task_default_model(m);
- hard_task_def_arg (m, (void *)np);
- hard_task_def_wcet (m, wcet);
- hard_task_def_mit (m, period);
- hard_task_def_usemath (m);
- pid = task_create("massa", massa, &m, NULL);
- if (pid == NIL) {
- sys_shutdown_message("Could not create task");
- sys_end();
- }
- task_activate(pid);
- }
- c = keyb_getch(BLOCK);
-
- } while (c != ESC);
-
- sys_end();
-
- return 0;
-}
-
-/*------------------------------------------------------*/
-/* file reading */
-/*------------------------------------------------------*/
-
-void read_file(void)
-{
- int err;
- DOS_FILE *fp;
-
- fp = DOS_fopen("orbit.dat","r");
-
- if (!fp) {
- err = DOS_error();
- cprintf("Error %d opening myfile.txt...\n", err);
- flen = 0;
- return;
- }
-
- flen = DOS_fread(&fbuf, 1, 1000, fp);
- cprintf("Read %d bytes from orbit.dat\n", flen);
-
- DOS_fclose(fp);
-}
-
-/*------------------------------------------------------*/
-/* get data from buffer */
-/*------------------------------------------------------*/
-
-void get_par(void)
-{
- int x = 0;
- int i;
- double vx, vy;
-
- while ((fbuf[x] != ':') && (x < flen)) x++;
- x++;
- sscanf(&fbuf[x], "%d", &period);
- cprintf("period = %d\n", period);
-
- while ((fbuf[x] != ':') && (x < flen)) x++;
- x++;
- sscanf(&fbuf[x], "%d", &wcet);
- cprintf("wcet = %d\n", wcet);
-
- while ((fbuf[x] != ':') && (x < flen)) x++;
- x++;
- sscanf(&fbuf[x], "%f", &delta);
- cprintf("delta = %f\n", delta);
-
- while ((fbuf[x] != ':') && (x < flen)) x++;
- x++;
- sscanf(&fbuf[x], "%f", &scala);
- cprintf("scala = %f\n", scala);
-
- while ((fbuf[x] != ':') && (x < flen)) x++;
- x++;
- sscanf(&fbuf[x], "%f", &G);
- cprintf("G = %20.15f\n", G);
-
- while ((fbuf[x] != ':') && (x < flen)) x++;
- x++;
- sscanf(&fbuf[x], "%d", &RP);
- cprintf("RP = %d\n", RP);
-
- while ((fbuf[x] != ':') && (x < flen)) x++;
- x++;
- sscanf(&fbuf[x], "%d", &RT);
- cprintf("RT = %d\n", RT);
-
- while ((fbuf[x] != ':') && (x < flen)) x++;
- x++;
- sscanf(&fbuf[x], "%d", &XGS);
- cprintf("XGS = %d\n", XGS);
-
- while ((fbuf[x] != ':') && (x < flen)) x++;
- x++;
- sscanf(&fbuf[x], "%d", &YGS);
- cprintf("YGS = %d\n", YGS);
-
- for (i=0; i<MAX; i++) {
- while ((fbuf[x] != ':') && (x < flen)) x++;
- x++; x++;
- sscanf(&fbuf[x], "%f", &mass[i]);
-
- while ((fbuf[x] != '\t') && (x < flen)) x++;
- x++;
- sscanf(&fbuf[x], "%f", &vx);
-
- while ((fbuf[x] != '\t') && (x < flen)) x++;
- x++;
- sscanf(&fbuf[x], "%f", &vy);
- pos[i].x = vx; pos[i].y = vy;
-
- while ((fbuf[x] != '\t') && (x < flen)) x++;
- x++;
- sscanf(&fbuf[x], "%f", &vx);
-
- while ((fbuf[x] != '\t') && (x < flen)) x++;
- x++;
- sscanf(&fbuf[x], "%f", &vy);
- vel[i].x = vx; vel[i].y = vy;
-
- cprintf("mass[%d] = %f\t", i, mass[i]);
- cprintf("pos: %f, %f\t", pos[i].x, pos[i].y);
- cprintf("vel: %f, %f\n", vel[i].x, vel[i].y);
- }
-}
-
-/*--------------------------------------------------------------*/
-
Index: rel_1_2/orbit/initfile.c
===================================================================
--- rel_1_2/orbit/initfile.c (revision 1198)
+++ rel_1_2/orbit/initfile.c (nonexistent)
@@ -1,124 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:45 $
- ------------
-
- System initialization file
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- NRT_TASK_MODEL at level 2
-
- This file is similar to the configuration of kernel/init/hartik3.c
-
- TICK is set to 0 (one-shot timer is used)
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-void read_file();
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(0);
- CBS_register_level(0, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- read_file();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: rel_1_2/orbit/orbit.dat
===================================================================
--- rel_1_2/orbit/orbit.dat (revision 1198)
+++ rel_1_2/orbit/orbit.dat (nonexistent)
@@ -1,21 +0,0 @@
-----------------------------------------------------
-period: 10000 wcet: 100
-delta: 1. scala: 150.
-G: 6.6e-15
-r_pianeta: 4 r_Terra: 8
-X_centro: 320 Y_centro: 240
-
-------------------- pianeti ------------------------
- massa pos.x pos.y vel.x vel.y
-0: 6.0e21 0. 0. 0. 0.
-1: 1.0e21 10000. 8000. -60. 0.
-2: 1.0e8 5000. 0. 0. 80.
-3: 5.0e18 10000. 8000. -50. 0.
-4: 1.0e9 10000. 8000. -40. 20.
-5: 1.0e15 1000. 5000. -80. 0.
-6: 1.0e5 1000. 5000. -80. 0.
-7: 1.0e17 1000. 5000. -80. 0.
-8: 1.0e5 1000. 5000. -80. 0.
-9: 1.0e5 1000. 5000. -80. 0.
-10: 1.0e5 1000. 5000. -80. 0.
-----------------------------------------------------
Index: rel_1_2/thdemo/fft.c
===================================================================
--- rel_1_2/thdemo/fft.c (revision 1198)
+++ rel_1_2/thdemo/fft.c (nonexistent)
@@ -1,533 +0,0 @@
-// FFT Part
-/*
-
-FFTPlay 1.0
------------
-
-This application reads data from the audio microphone and then put it
-to the screen in a graphical oscilloscope-like form (both standard Hartik
-SB driver and Alsa driver can be used).
-
-The application also calculate a FFT on the latest values, and displays
-the power spectrum in tho ways, one like an equalizator, and the other in a
-2D form.
-
-A resolution of 1024x768, 64K colors is used.
-
-The task set is composed by these tasks and functions:
-
-Self buffering functions (SB only)
-----------------------------------
-this function takes the samples read by the mic and then makes a window
-with the last WINDATA_NSAMPLES samples. The window is then put in
-the CAB windata.
-
-Task raw and task mixer (ALSA only)
------------------------------------
-These tasks are used with the Alsa driver; because it doesn't support the
-self-buffering mode, we have to do a forever cycle in witch we have to read
-all the data. Then the data are managed like the self-buffering functions of
-the SB driver or sent to the mixer task (with a STREAM mailbox) which makes
-the window.
-(This approach is not good for realtime...)
-
-Task wave
----------
-This task read the last window and then put it on the screen in a wave form
-on the top of the screen.
-The task's period is set to 40 ms (25 fps).
-
-Task fft
---------
-This task read the last window and then it computes the FFT.
-With the FFT data it computes the power spectrum, whitch is sent to the
-CAB pwrdata.
-The task's period is set to 10 ms (good for the 2D story task).
-This task is the only Hard Task.
-
-Task equ
---------
-This task read the last power spectrum and displays it in a graphical
-form, like a hi-fi equalizator.
-The Histograms can be white or coloured like the equ2D task (see EQU_SHADE)
-The task's period is set to 40 ms (25 fps).
-
-Task equ2D
-----------
-This task read the lasf power spectrum and displays it in a graphical
-one-line form. Each pixel is a power coefficient, and its colour shade
-from black (no power) to red (high power) passing through green and blue.
-The task display the last EQU2D_WIDTH power lines.
-The task's period is set to 10 ms (good for the 2D story task).
-
-****************************************************************************
-TASK LOAD
-****************************************************************************
-
- period wcet
-task tick (ms) us %
---------------------------------------------------------
-sound driver 24->3 12->1.5 200 0.016->0.133
-wave 80 40 11500 0.2875
-fft 20 10 3000 0.3000
-equ 80 40 7000 0.1750
-equ2D 20 10 500 0.0500
- -------------
- 0.812 (last 4)
-*/
-
-#include "demo.h"
-//#include <ll/ll.h>
-
-//#include <kernel/types.h>
-#include <kernel/model.h>
-#include <kernel/func.h>
-
-#include <modules/cabs.h>
-
-//#include <string.h>
-//#include <stdlib.h>
-#include <semaphore.h>
-
-//#include <drivers/keyb.h>
-//#include <drivers/crtwin.h>
-#include <drivers/glib.h>
-#include <drivers/sound.h>
-#include <rfftw.h>
-
-/* CAB ports... */
-CAB cab_windata; /* a window on the last WINDATA_DIM samples */
-CAB cab_pwrdata; /* the last power spectrum */
-
-/* for the cab_windata */
-typedef struct {
- int start;
- SAMPLE sample[WINDATA_NSAMPLES];
-} window;
-
-/* for the cab_pwrdata */
-typedef struct {
- fftw_real p[PWR_NSAMPLES];
-} power;
-
-
-// win is global... because is used by raw_infun...
-window win;
-
-/*
- This is the self-buffering function: read the samples and put their mean
- value in a CAB
-*/
-int raw_infun(void *b)
-{
- int i;
- char *w;
- SAMPLE *audiobuf = (SAMPLE *)b;
-
- for (i=0; i<rawdata_nsamples/2; i++) {
- win.sample[win.start] = audiobuf[i];
- win.start = (win.start+1) % WINDATA_NSAMPLES;
- }
-
- w = cab_reserve(cab_windata);
- memcpy(w, &win, sizeof(window));
- cab_putmes(cab_windata,w);
-
- #if defined(NO_GRX)
- cprintf("X"); //"XXX%d\n",win.sample[win.start]);
- #endif
- return 0;
-}
-
-
-
-void init_rawdata()
-{
- int i;
- char *w;
-
- win.start = 0;
- for (i=0; i<WINDATA_NSAMPLES; i++)
- win.sample[i] = 0;
-
- w = cab_reserve(cab_windata);
- memcpy(w, &win, sizeof(window));
- cab_putmes(cab_windata,w);
-}
-
-
-
-
-
-TASK wave_task()
-{
- window *p;
- int x,y;
- int s;
-
- while(1)
- {
- p = (window *)cab_getmes(cab_windata);
-
- /* let's print the wave */
- mutex_lock(&mutex);
- for(x = WAVE_X, s = p->start;
- x < WAVE_X+WAVE_NSAMPLES;
- x++, s = (s+1)%WINDATA_NSAMPLES )
- {
- y = WAVE_Y + (WAVE_HEIGHT * p->sample[s]) / MAX_SAMPLE;
- SHORT_CRITICAL_SECTIONS(x);
- grx_plot(x,y,white);
- }
- mutex_unlock(&mutex);
-
- task_endcycle();
-
- /* let's erase the wave */
- mutex_lock(&mutex);
- for(x = WAVE_X, s = p->start;
- x < WAVE_X+WAVE_NSAMPLES;
- x++, s = (s+1)%WINDATA_NSAMPLES )
- {
- y = WAVE_Y + (WAVE_HEIGHT * p->sample[s]) / MAX_SAMPLE;
- SHORT_CRITICAL_SECTIONS(x);
- grx_plot(x,y,black);
- }
- mutex_unlock(&mutex);
-
- cab_unget(cab_windata,(char *)p);
-
- }
-}
-
-
-rfftw_plan plan;
-
-void fft_close(void *arg)
-{
- rfftw_destroy_plan(plan);
-}
-
-
-TASK fft_task()
-{
- fftw_real in[FFT_NSAMPLES], out[FFT_NSAMPLES];
- power power_spectrum;
-
- #if defined(NO_GRX)
- fftw_real max = 0.0;
- #endif
-
- char *m;
-
- int k, i;
-
- window *p;
-
- plan = rfftw_create_plan(FFT_NSAMPLES, FFTW_REAL_TO_COMPLEX, FFTW_ESTIMATE);
-
- sys_atrunlevel(fft_close, NULL, RUNLEVEL_BEFORE_EXIT);
-
- while(1)
- {
- /* Let's prepare the intput FFT data */
- p = (window *)cab_getmes(cab_windata);
-
- for (k = 0, i = p->start;
- k < FFT_NSAMPLES;
- k++, i = (i+1)%WINDATA_NSAMPLES)
- in[k] = p->sample[i]/FFT_SCALE;
-
- cab_unget(cab_windata,(char *)p);
-
- /* zero-padding if needed */
- for (k=WINDATA_NSAMPLES; k < FFT_NSAMPLES; k++)
- in[k] = 0.0;
-
- rfftw_one(plan, in, out);
-
- /* power spectrum computation */
- power_spectrum.p[0] = out[0]*out[0]; /* DC component */
- for (k = 1; k < PWR_NSAMPLES; ++k) /* (k < N/2 rounded up) */
- power_spectrum.p[k] = out[k]*out[k] + out[FFT_NSAMPLES-k]*out[FFT_NSAMPLES-k];
- if (FFT_NSAMPLES % 2 == 0) /* N is even */
- power_spectrum.p[FFT_NSAMPLES/2] = out[FFT_NSAMPLES/2]*out[FFT_NSAMPLES/2]; /* Nyquist freq. */
-
- m = cab_reserve(cab_pwrdata);
- memcpy(m, &power_spectrum, sizeof(power));
- cab_putmes(cab_pwrdata,m);
-
- #if defined(NO_GRX)
- max = 0.0;
- for (k=0; k<PWR_NSAMPLES; k++)
- if (power_spectrum.p[k] > max)
- max = power_spectrum.p[k];
-
- //cprintf("%f %f\n",max,(max / EQU_SCALE) );
- #endif
-
- task_endcycle();
-
- }
-}
-
-/* structure is like the wave task... */
-TASK equ_task()
-{
- power *p;
-
- int x[PWR_NSAMPLES];
- int y;
- int s;
-
- int r,g,b;
-
- while(1)
- {
- p = (power *)cab_getmes(cab_pwrdata);
-
- /* print the lines */
- mutex_lock(&mutex);
- for(y = EQU_Y, s = 0;
- s < EQU_NSAMPLES;
- y++, s++ )
- {
- x[s] = (int)(p->p[s] / EQU_SCALE);
-
- if (x[s] > EQU_HEIGHT)
- x[s] = EQU_HEIGHT;
-
- x[s] = EQU_X - x[s];
-
-
- #if defined(EQU_SHADE)
-
- /* like the task equ2d... */
- r = (int)(p->p[s] / EQU2D_SCALE);
- if (r > EQU2D_CLIP)
- r = EQU2D_CLIP;
-
- if (r< 64) g = r * 4;
- else if (r<128) g = (128-r) * 4;
- else g = 0;
-
- if (r<128) b = 0;
- else if (r<192) b = (r-128) * 4;
- else b = (256-r) * 4;
-
- SHORT_CRITICAL_SECTIONS(y);
- grx_line(EQU_X,y,x[s],y,rgb16(r,g,b));
- #else
- SHORT_CRITICAL_SECTIONS(y);
- grx_line(EQU_X,y,x[s],y,white);
- #endif
- }
- mutex_unlock(&mutex);
-
- task_endcycle();
-
- /* erase the lines... */
- mutex_lock(&mutex);
- for(y = EQU_Y, s = 0;
- s < EQU_NSAMPLES;
- y++, s++ )
- {
- SHORT_CRITICAL_SECTIONS(y);
- grx_line(EQU_X,y,x[s],y,black);
- }
- mutex_unlock(&mutex);
-
- cab_unget(cab_pwrdata,(char *)p);
-
- }
-}
-
-TASK equ2d_task()
-{
- power *p;
-
- int pwrint;
-
- int x = 0;
-
- int y,s;
-
- int r,g,b;
-
- while(1)
- {
-
- p = (power *)cab_getmes(cab_pwrdata);
-
- /* print the line */
- mutex_lock(&mutex);
-
- for(y = EQU2D_Y, s = 0;
- s < EQU2D_NSAMPLES;
- y++, s++ )
- {
- pwrint = (int)(p->p[s] / EQU2D_SCALE);
-
- if (pwrint > EQU2D_CLIP)
- pwrint = EQU2D_CLIP;
-
- r = pwrint;
-
- if (pwrint< 64) g = pwrint * 4;
- else if (pwrint<128) g = (128-pwrint) * 4;
- else g = 0;
-
- if (pwrint<128) b = 0;
- else if (pwrint<192) b = (pwrint-128) * 4;
- else b = (256-pwrint) * 4;
-
- SHORT_CRITICAL_SECTIONS(y);
- grx_plot(EQU2D_X+x,y,rgb16(r,g,b));
- }
-
- x = (x+1) % EQU2D_WIDTH;
- grx_line(EQU2D_X+x,EQU2D_Y,EQU2D_X+x,EQU2D_Y+EQU2D_NSAMPLES-1,white);
-
- mutex_unlock(&mutex);
-
- cab_unget(cab_pwrdata,(char *)p);
-
- task_endcycle();
- }
-}
-
-
-void init_fftplay(int freq)
-{
- SOFT_TASK_MODEL m3, m4, m5, m6;
-
- PID p3,p4,p5,p6;
-
- cab_windata = cab_create("windata", sizeof(window), 5);
- cab_pwrdata = cab_create("pwr", sizeof(power), 5);
-
- /* Init the sound lib */
- sound_init((rawdata_nsamples * sizeof(SAMPLE)), NULL);
- sound_info();
-
- /* Init the data used by the raw_infun */
- init_rawdata();
-
- /* Start the self-buffering sampling operation */
- sound_setfun(raw_infun, (int (*)(void *))-1);
- sound_sample(NULL, freq, 0, DMA_OP | PCM16 | MYFUN, NULL);
-
- soft_task_default_model(m3);
- soft_task_def_level(m3,1);
- soft_task_def_period(m3, PERIOD_WAVE);
- soft_task_def_met(m3, WCET_WAVE);
- soft_task_def_ctrl_jet(m3);
- soft_task_def_group(m3, 1);
- p3 = task_create("wave", wave_task, &m3, NULL);
- if (p3 == -1) {
- grx_close();
- perror("FFTPlay: Could not create task <wave>\n");
- ll_abort(54);
- sys_end();
- }
-
- soft_task_default_model(m4);
- soft_task_def_level(m4,1);
- soft_task_def_period(m4, PERIOD_FFT);
- soft_task_def_met(m4, WCET_FFT);
- soft_task_def_group(m4, 1);
- soft_task_def_stack(m4,32*1024);
- soft_task_def_usemath(m4);
- soft_task_def_ctrl_jet(m4);
- p4 = task_create("fft", fft_task, &m4, NULL);
- if (p4 == -1) {
- grx_close();
- perror("FFTPlay: Could not create task <fft>\n");
- ll_abort(54);
- sys_end();
- }
-
- soft_task_default_model(m5);
- soft_task_def_level(m5,1);
- soft_task_def_period(m5, PERIOD_EQU);
- soft_task_def_met(m5, WCET_EQU);
- soft_task_def_group(m5, 1);
- soft_task_def_stack(m5,32*1024);
- soft_task_def_usemath(m5);
- soft_task_def_ctrl_jet(m5);
- p5 = task_create("equ", equ_task, &m5, NULL);
- if (p5 == -1) {
- grx_close();
- perror("FFTPlay: Could not create task <equ>\n");
- ll_abort(54);
- perror("FFTPlay: Could not create task <equ>\n");
- sys_end();
- }
-
- soft_task_default_model(m6);
- soft_task_def_level(m6,1);
- soft_task_def_period(m6, PERIOD_EQU2D);
- soft_task_def_met(m6, WCET_EQU2D);
- soft_task_def_group(m6, 1);
- soft_task_def_stack(m6,32*1024);
- soft_task_def_usemath(m6);
- soft_task_def_ctrl_jet(m6);
- p6 = task_create("equ2D", equ2d_task, &m6, NULL);
- if (p6 == -1) {
- grx_close();
- perror("FFTPlay: Could not create task <equ2d>\n");
- ll_abort(54);
- perror("FFTPlay: Could not create task <equ2D>\n");
- sys_end();
- }
-}
-
-void scenario_fftplay(int f)
-{
- int i,y;
- char s[50];
-
- grx_line(0,WAVE_Y-WAVE_HEIGHT-1,383,WAVE_Y-WAVE_HEIGHT-1,red);
- grx_line(0,WAVE_Y+WAVE_HEIGHT+1,383,WAVE_Y+WAVE_HEIGHT+1,red);
- grx_line(0,EQU_Y-11 ,383,EQU_Y-11 ,red);
-
-
-
- /* lines near the frequencies */
- grx_line(EQU_X +1,EQU_Y,EQU_X +1,EQU_Y+EQU_NSAMPLES-1,red);
- grx_line(EQU2D_X-1,EQU_Y,EQU2D_X-1,EQU_Y+EQU_NSAMPLES-1,red);
-
- for (i=0; i<SCENARIO_NLABEL; i++)
- {
- y = (i*EQU_NSAMPLES)/(SCENARIO_NLABEL-1);
- if (i == SCENARIO_NLABEL-1) y--;
- grx_line(EQU_X +1,EQU_Y+y,EQU_X +4,EQU_Y+y,red);
- grx_line(EQU2D_X-1,EQU_Y+y,EQU2D_X-4,EQU_Y+y,red);
-
- itoa((i*f)/(SCENARIO_NLABEL-1),s);
- grx_text(s,EQU_X+20,EQU_Y+y-8,white,black);
- }
-
- grx_text("Power Spectrum" , 0, EQU_Y-21, rgb16(0,0,255), black);
- grx_text("Power Spectrum Story", EQU2D_X+EQU2D_WIDTH-160, EQU_Y-21, rgb16(0,0,255), black);
- grx_text("Waveform" , 0, WAVE_Y-WAVE_HEIGHT-10, rgb16(0,0,255), black);
-}
-
-void compute_params(int *freq,WORD *nsamp)
-{
- if (*freq< 2000)
- {
- cprintf("WARNING: frequency less than 2000Hz\n ---> frequency set to 2000Hz\n");
- *freq = 2000;
- }
- if (*freq<= 8000) { *nsamp = 64; return; } //128
- if (*freq<=16000) { *nsamp = 64; return; } //256
- if (*freq<=24000) { *nsamp = 64; return; } //512
- if (*freq>48000)
- {
- cprintf("WARNING: frequency greather than 48000Hz\n ---> frequency set to 48000Hz\n");
- *freq = 48000;
- }
- if (*freq<=48000) { *nsamp = 64; return; } //1024
-}
-
Index: rel_1_2/thdemo/initfile.c
===================================================================
--- rel_1_2/thdemo/initfile.c (revision 1198)
+++ rel_1_2/thdemo/initfile.c (nonexistent)
@@ -1,146 +0,0 @@
-/*
- * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Gerardo Lamastra <gerardo@sssup.it>
- *
- * Authors : Paolo Gai <pj@hartik.sssup.it>
- * (see authors.txt for full list of hartik's authors)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://hartik.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- System initialization file
-
- h3pi.c
-
- This file is equal to hartik3.c plus the resources module...
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-//#define PI
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-
-#ifndef PI
-#include "modules/rrsoft.h"
-#endif
-
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-//#define RRTICK 3000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
-#ifdef PI
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
-#else
- RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
- RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //cbs
-#endif
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- NOP_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- kern_printf("TIME=%ld\n",sys_gettime(NULL));
- KEYB_init(NULL);
- kern_printf("TIME=%ld\n",sys_gettime(NULL));
-// KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-
-#ifdef PI
-void app_mutex_init(mutex_t *m)
-{
- PI_mutexattr_t attr;
-
- PI_mutexattr_default(attr);
-
- mutex_init(m, &attr);
-}
-#else
-void app_mutex_init(mutex_t *m)
-{
- NOP_mutexattr_t attr;
-
- NOP_mutexattr_default(attr);
-
- mutex_init(m, &attr);
-}
-#endif
Index: rel_1_2/thdemo/demo.c
===================================================================
--- rel_1_2/thdemo/demo.c (revision 1198)
+++ rel_1_2/thdemo/demo.c (nonexistent)
@@ -1,260 +0,0 @@
-/* Project: HARTIK 3.0 */
-/* Description: Hard Real TIme Kernel for 386 & higher machines */
-/* Author: Paolo Gai <pgai@rsk.it> */
-/* Advanced Linux Sound Architecture (ALSA) */
-/* Copyright (c) by Jaroslav Kysela <perex@jcu.cz> */
-/* Luca Abeni */
-/* FFTW by M. Frigo and S. G. Johnson */
-
-/* Date: 08/09/1999 */
-
-/* File: fftplay.c */
-/* Revision: 1.00 (Kernel 0.1.4; Library 0.0.9; Util 0.0.4) */
-
-
-
-#include "demo.h"
-
-//#include <kernel/types.h>
-//#include <kernel/model.h>
-#include <kernel/func.h>
-
-//#include <modules/cabs.h>
-
-#include <string.h>
-#include <stdlib.h>
-
-#include <drivers/keyb.h>
-//#include <drivers/crtwin.h>
-#include <drivers/glib.h>
-//#include <drivers/sound.h>
-//#include <ports/rfftw.h>
-
-
-
-/* Informations about the sampling rate and buffers */
-WORD rawdata_nsamples;
-WORD rawdata_buffer_size;
-WORD rawdata_freq;
-
-/* graphic mutex... */
-mutex_t mutex;
-
-/* useful colors... */
-int white;
-int black;
-int red;
-int gray;
-
-void app_mutex_init(mutex_t *m);
-
-
-static void version( void )
-{
- cprintf( "Hartik FFT Play 1.0\n" );
- cprintf( "-----------------------\n" );
- cprintf( "by Paolo Gai 1999\n" );
- cprintf( " <pj@hartik.sssup.it>\n" );
- cprintf( "-----------------------\n" );
-}
-
-void reverse(char s[])
-{
- int c, i, j;
-
- for (i = 0, j = strlen(s)-1; i<j; i++, j--)
- {
- c = s[i];
- s[i] = s[j];
- s[j] = c;
- }
-}
-
-char * itoa(int n, char *s)
-{
- int i, sign;
-
- if ((sign = n) < 0)
- n = -n;
-
- i = 0;
-
- do
- {
- s[i++] = n % 10 + '0';
- } while ((n /= 10) > 0);
-
- if (sign < 0)
- s[i++] = '-';
-
- s[i] = 0;
-
- reverse(s);
-
- return s;
-}
-
-void display_jet(PID i)
-{
- char st[200];
- TIME sum, max;
- int n;
-
- if (jet_getstat(i, &sum, &max, &n, NULL) != -1) {
- if (n==0) n=1;
- sprintf(st, "PID=%2d st=%3d Mean=%5d Max=%5d na=%10s",
- (int)i,
- (int)proc_table[i].status, (int)sum/n, (int)max,
- proc_table[i].name);
- mutex_lock(&mutex);
- grx_text(st, 0, 400+i*8, 255, 0);
- mutex_unlock(&mutex);
- }
-}
-
-
-
-void scenario(int f)
-{
- grx_text("HARTIK 4.0 - LEGO Version" , 0,0, rgb16(0,255,0), black );
- grx_text("Thesis Demo", 0,8, rgb16(0,255,0), black );
-
- #ifdef FFT_ON
- scenario_fftplay(f);
- #endif
-
- #ifdef FRAMEGRABBER_ON
- scenario_framegrabber();
- #endif
-
- #ifdef JET_ON
- scenario_jetcontrol();
- #endif
-
- #ifdef BALL_ON
- scenario_ball();
- #endif
-}
-
-
-void my_close(void *arg)
-{
- grx_close();
-}
-
-
-void endfun(KEY_EVT *k)
-{
- grx_close();
- cprintf("Ctrl-Brk pressed! Ending...\n");
- sys_end();
-}
-
-void zerofun(KEY_EVT *k)
-{
- int i;
- for (i=0; i<MAX_PROC; i++) jet_delstat(i);
-}
-
-void printeventqueue(void *arg)
-{
- struct event *p;
- extern struct event *firstevent;
-
- kern_cli();
- grx_close();
- kern_cli();
- for (p = firstevent; p != NULL; p = p->next) {
- kern_printf("par:%d time:%ld.%ld p:%d handler:%d\n",
- (int)p->par, p->time.tv_sec, p->time.tv_nsec/1000, (int)p, (int)p->handler);
- }
- kern_sti();
-}
-
-int main(int argc, char **argv)
-{
- int modenum;
-
- int f;
-
- KEY_EVT k;
-
- srand(4);
-
- version();
-
- #ifdef FRAMEGRABBER_ON
- if (argc == 1)
- {
- cprintf("type x fftplay <freq>");
- return 0;
- }
-
- f = atoi(argv[1]);
- compute_params(&f,&rawdata_nsamples);
- #endif
-
- keyb_set_map(itaMap);
- k.flag = CNTR_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,endfun);
- k.flag = CNTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,endfun);
- k.flag = ALTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,zerofun);
- k.flag = 0;
- k.scan = KEY_ENT;
- k.ascii = 13;
- keyb_hook(k,endfun);
-
- sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT);
-
-
- grx_init();
- modenum = grx_getmode(640, 480, 16);
-
- grx_setmode(modenum);
-
- /* init the graphic mutex */
- app_mutex_init(&mutex);
-
- /* useful colors ... */
- white = rgb16(255,255,255);
- black = rgb16(0,0,0);
- red = rgb16(255,0,0);
- gray = rgb16(128,128,128);
-
- scenario(f/2);
-// grx_close();
-// clear();
- #ifdef FFT_ON
- init_fftplay(f);
- #endif
-
- #ifdef FRAMEGRABBER_ON
- init_framegrabber();
- #endif
-
- #ifdef JET_ON
- init_jetcontrol();
- #endif
-
- #ifdef BALL_ON
- init_ball();
- #endif
-
- group_activate(1);
-
- #ifdef FRAMEGRABBER_ON
- start_framegrabber();
- #endif
-
- return 0;
-}
-
-
Index: rel_1_2/thdemo/fftplay.c
===================================================================
--- rel_1_2/thdemo/fftplay.c (revision 1198)
+++ rel_1_2/thdemo/fftplay.c (nonexistent)
@@ -1,769 +0,0 @@
-/* Project: HARTIK 3.0 */
-/* Description: Hard Real TIme Kernel for 386 & higher machines */
-/* Author: Paolo Gai <pgai@rsk.it> */
-/* Advanced Linux Sound Architecture (ALSA) */
-/* Copyright (c) by Jaroslav Kysela <perex@jcu.cz> */
-/* Luca Abeni */
-/* FFTW by M. Frigo and S. G. Johnson */
-
-/* Date: 08/09/1999 */
-
-/* File: fftplay.c */
-/* Revision: 1.00 (Kernel 0.1.4; Library 0.0.9; Util 0.0.4) */
-
-
-/*
-
-FFTPlay 1.0
------------
-
-This application reads data from the audio microphone and then put it
-to the screen in a graphical oscilloscope-like form (both standard Hartik
-SB driver and Alsa driver can be used).
-
-The application also calculate a FFT on the latest values, and displays
-the power spectrum in tho ways, one like an equalizator, and the other in a
-2D form.
-
-A resolution of 1024x768, 64K colors is used.
-
-The task set is composed by these tasks and functions:
-
-Self buffering functions (SB only)
-----------------------------------
-this function takes the samples read by the mic and then makes a window
-with the last WINDATA_NSAMPLES samples. The window is then put in
-the CAB windata.
-
-Task raw and task mixer (ALSA only)
------------------------------------
-These tasks are used with the Alsa driver; because it doesn't support the
-self-buffering mode, we have to do a forever cycle in witch we have to read
-all the data. Then the data are managed like the self-buffering functions of
-the SB driver or sent to the mixer task (with a STREAM mailbox) which makes
-the window.
-(This approach is not good for realtime...)
-
-Task wave
----------
-This task read the last window and then put it on the screen in a wave form
-on the top of the screen.
-The task's period is set to 40 ms (25 fps).
-
-Task fft
---------
-This task read the last window and then it computes the FFT.
-With the FFT data it computes the power spectrum, whitch is sent to the
-CAB pwrdata.
-The task's period is set to 10 ms (good for the 2D story task).
-This task is the only Hard Task.
-
-Task equ
---------
-This task read the last power spectrum and displays it in a graphical
-form, like a hi-fi equalizator.
-The Histograms can be white or coloured like the equ2D task (see EQU_SHADE)
-The task's period is set to 40 ms (25 fps).
-
-Task equ2D
-----------
-This task read the lasf power spectrum and displays it in a graphical
-one-line form. Each pixel is a power coefficient, and its colour shade
-from black (no power) to red (high power) passing through green and blue.
-The task display the last EQU2D_WIDTH power lines.
-The task's period is set to 10 ms (good for the 2D story task).
-
-****************************************************************************
-TASK LOAD
-****************************************************************************
-
- period wcet
-task tick (ms) us %
---------------------------------------------------------
-sound driver 24->3 12->1.5 200 0.016->0.133
-wave 80 40 11500 0.2875
-fft 20 10 3000 0.3000
-equ 80 40 7000 0.1750
-equ2D 20 10 500 0.0500
- -------------
- 0.812 (last 4)
-*/
-
-#include <ll/ll.h>
-
-#include <kernel/types.h>
-#include <kernel/model.h>
-#include <kernel/func.h>
-
-#include <modules/cabs.h>
-
-#include <string.h>
-#include <stdlib.h>
-#include <semaphore.h>
-
-#include <drivers/keyb.h>
-#include <drivers/crtwin.h>
-#include <drivers/glib.h>
-#include <drivers/sound.h>
-#include <ports/rfftw.h>
-
-/* now the load constants... */
-
-#define WCET_WAVE 11500
-#define WCET_FFT 3000
-#define WCET_EQU 500
-#define WCET_EQU2D 500
-
-#define PERIOD_WAVE 40000
-#define PERIOD_FFT 10000
-#define PERIOD_EQU 40000
-#define PERIOD_EQU2D 10000
-
-/* define if shorts critical sections wanted */
-#define SHORT_CRITICAL_SECTIONS(x) \
- if (!((x)%64)) \
- { \
- sem_post(&mutex); \
- sem_wait(&mutex); \
- }
-
-/* define if you want NRT or SOFT... */
-#define TASK_TYPE SOFT
-//#define TASK_TYPE NRT
-
-
-
-/* Only 4 Debug... */
-/*#define NO_GRX */
-
-/* Samples are 16-bit signed integers */
-typedef short SAMPLE;
-#define MAX_SAMPLE 32768
-
-/* Informations about the sampling rate and buffers */
-WORD rawdata_nsamples;
-WORD rawdata_buffer_size;
-WORD rawdata_freq;
-
-/* Numbers of samples of the sample window */
-#define WINDATA_NSAMPLES 1024
-
-/* task WAVE */
-/* the point (wave_x,wave_y) is on the center left of the area... */
-#define WAVE_NSAMPLES 1024
-#define WAVE_X 0
-#define WAVE_Y 130
-#define WAVE_HEIGHT 80
-
-/* task FFT */
-#define FFT_NSAMPLES WINDATA_NSAMPLES
-#define PWR_NSAMPLES (FFT_NSAMPLES/2+1)
-
-/* task EQU */
-/* the point (equ_x, equ_y) is the top right corner */
-#define EQU_NSAMPLES PWR_NSAMPLES
-#define EQU_X 170
-#define EQU_Y 255
-#define EQU_HEIGHT 170
-#define EQU_SHADE
-
-/* task EQU2D */
-/* the point (equ2d_x, equ2d_y) is the top left corner */
-#define EQU2D_NSAMPLES EQU_NSAMPLES
-#define EQU2D_X 255
-#define EQU2D_Y EQU_Y
-#define EQU2D_WIDTH 768
-#define EQU2D_CLIP 255
-
-/* scenario */
-#define SCENARIO_NLABEL 16
-
-/* Scale factors */
-#define FFT_SCALE (16384.0)
-#define EQU_SCALE (32.0)
-#define EQU2D_SCALE (8.0)
-//#define EQU_SCALE (64.0)
-//#define EQU2D_SCALE (16.0)
-
-
-/* CAB ports... */
-CAB cab_windata; /* a window on the last WINDATA_DIM samples */
-CAB cab_pwrdata; /* the last power spectrum */
-
-/* for the cab_windata */
-typedef struct {
- int start;
- SAMPLE sample[WINDATA_NSAMPLES];
-} window;
-
-/* for the cab_pwrdata */
-typedef struct {
- fftw_real p[PWR_NSAMPLES];
-} power;
-
-/* graphic mutex... */
-sem_t mutex;
-
-// win is global... because is used by raw_infun...
-window win;
-
-
-
-/* useful colors... */
-int white;
-int black;
-int red;
-
-static void version( void )
-{
- cprintf( "Hartik FFT Play 1.0\n" );
- cprintf( "-----------------------\n" );
- cprintf( "by Paolo Gai 1999\n" );
- cprintf( " <pj@hartik.sssup.it>\n" );
- cprintf( "-----------------------\n" );
-}
-
-void reverse(char s[])
-{
- int c, i, j;
-
- for (i = 0, j = strlen(s)-1; i<j; i++, j--)
- {
- c = s[i];
- s[i] = s[j];
- s[j] = c;
- }
-}
-
-char * itoa(int n, char *s)
-{
- int i, sign;
-
- if ((sign = n) < 0)
- n = -n;
-
- i = 0;
-
- do
- {
- s[i++] = n % 10 + '0';
- } while ((n /= 10) > 0);
-
- if (sign < 0)
- s[i++] = '-';
-
- s[i] = 0;
-
- reverse(s);
-
- return s;
-}
-
-
-
-/*
- This is the self-buffering function: read the samples and put their mean
- value in a CAB
-*/
-int raw_infun(void *b)
-{
- int i;
- char *w;
- SAMPLE *audiobuf = (SAMPLE *)b;
-
- for (i=0; i<rawdata_nsamples/2; i++) {
- win.sample[win.start] = audiobuf[i];
- win.start = (win.start+1) % WINDATA_NSAMPLES;
- }
-
- w = cab_reserve(cab_windata);
- memcpy(w, &win, sizeof(window));
- cab_putmes(cab_windata,w);
-
- #if defined(NO_GRX)
- cprintf("X"); //"XXX%d\n",win.sample[win.start]);
- #endif
- return 0;
-}
-
-
-
-void init_rawdata()
-{
- int i;
- char *w;
-
- win.start = 0;
- for (i=0; i<WINDATA_NSAMPLES; i++)
- win.sample[i] = 0;
-
- w = cab_reserve(cab_windata);
- memcpy(w, &win, sizeof(window));
- cab_putmes(cab_windata,w);
-}
-
-
-
-
-
-TASK wave_task()
-{
- window *p;
- int x,y;
- int s;
-
- while(1)
- {
- p = (window *)cab_getmes(cab_windata);
-
- /* let's print the wave */
- sem_wait(&mutex);
- for(x = WAVE_X, s = p->start;
- x < WAVE_X+WAVE_NSAMPLES;
- x++, s = (s+1)%WINDATA_NSAMPLES )
- {
- y = WAVE_Y + (WAVE_HEIGHT * p->sample[s]) / MAX_SAMPLE;
- SHORT_CRITICAL_SECTIONS(x);
- grx_plot(x,y,white);
- }
- sem_post(&mutex);
-
- task_endcycle();
-
- /* let's erase the wave */
- sem_wait(&mutex);
- for(x = WAVE_X, s = p->start;
- x < WAVE_X+WAVE_NSAMPLES;
- x++, s = (s+1)%WINDATA_NSAMPLES )
- {
- y = WAVE_Y + (WAVE_HEIGHT * p->sample[s]) / MAX_SAMPLE;
- SHORT_CRITICAL_SECTIONS(x);
- grx_plot(x,y,black);
- }
- sem_post(&mutex);
-
- cab_unget(cab_windata,(char *)p);
-
- }
-}
-
-
-rfftw_plan plan;
-
-void fft_close(void *arg)
-{
- rfftw_destroy_plan(plan);
-}
-
-
-TASK fft_task()
-{
- fftw_real in[FFT_NSAMPLES], out[FFT_NSAMPLES];
- power power_spectrum;
-
- #if defined(NO_GRX)
- fftw_real max = 0.0;
- #endif
-
- char *m;
-
- int k, i;
-
- window *p;
-
- plan = rfftw_create_plan(FFT_NSAMPLES, FFTW_REAL_TO_COMPLEX, FFTW_ESTIMATE);
-
- sys_atrunlevel(fft_close, NULL, RUNLEVEL_BEFORE_EXIT);
-
- while(1)
- {
- /* Let's prepare the intput FFT data */
- p = (window *)cab_getmes(cab_windata);
-
- for (k = 0, i = p->start;
- k < FFT_NSAMPLES;
- k++, i = (i+1)%WINDATA_NSAMPLES)
- in[k] = p->sample[i]/FFT_SCALE;
-
- cab_unget(cab_windata,(char *)p);
-
- /* zero-padding if needed */
- for (k=WINDATA_NSAMPLES; k < FFT_NSAMPLES; k++)
- in[k] = 0.0;
-
- rfftw_one(plan, in, out);
-
- /* power spectrum computation */
- power_spectrum.p[0] = out[0]*out[0]; /* DC component */
- for (k = 1; k < PWR_NSAMPLES; ++k) /* (k < N/2 rounded up) */
- power_spectrum.p[k] = out[k]*out[k] + out[FFT_NSAMPLES-k]*out[FFT_NSAMPLES-k];
- if (FFT_NSAMPLES % 2 == 0) /* N is even */
- power_spectrum.p[FFT_NSAMPLES/2] = out[FFT_NSAMPLES/2]*out[FFT_NSAMPLES/2]; /* Nyquist freq. */
-
- m = cab_reserve(cab_pwrdata);
- memcpy(m, &power_spectrum, sizeof(power));
- cab_putmes(cab_pwrdata,m);
-
- #if defined(NO_GRX)
- max = 0.0;
- for (k=0; k<PWR_NSAMPLES; k++)
- if (power_spectrum.p[k] > max)
- max = power_spectrum.p[k];
-
- //cprintf("%f %f\n",max,(max / EQU_SCALE) );
- #endif
-
- task_endcycle();
-
- }
-}
-
-/* structure is like the wave task... */
-TASK equ_task()
-{
- power *p;
-
- int x[PWR_NSAMPLES];
- int y;
- int s;
-
- int r,g,b;
-
- while(1)
- {
- p = (power *)cab_getmes(cab_pwrdata);
-
- /* print the lines */
- sem_wait(&mutex);
- for(y = EQU_Y, s = 0;
- s < EQU_NSAMPLES;
- y++, s++ )
- {
- x[s] = (int)(p->p[s] / EQU_SCALE);
-
- if (x[s] > EQU_HEIGHT)
- x[s] = EQU_HEIGHT;
-
- x[s] = EQU_X - x[s];
-
-
- #if defined(EQU_SHADE)
-
- /* like the task equ2d... */
- r = (int)(p->p[s] / EQU2D_SCALE);
- if (r > EQU2D_CLIP)
- r = EQU2D_CLIP;
-
- if (r< 64) g = r * 4;
- else if (r<128) g = (128-r) * 4;
- else g = 0;
-
- if (r<128) b = 0;
- else if (r<192) b = (r-128) * 4;
- else b = (256-r) * 4;
-
- SHORT_CRITICAL_SECTIONS(y);
- grx_line(EQU_X,y,x[s],y,rgb16(r,g,b));
- #else
- SHORT_CRITICAL_SECTIONS(y);
- grx_line(EQU_X,y,x[s],y,white);
- #endif
- }
- sem_post(&mutex);
-
- task_endcycle();
-
- /* erase the lines... */
- sem_wait(&mutex);
- for(y = EQU_Y, s = 0;
- s < EQU_NSAMPLES;
- y++, s++ )
- {
- SHORT_CRITICAL_SECTIONS(y);
- grx_line(EQU_X,y,x[s],y,black);
- }
- sem_post(&mutex);
-
- cab_unget(cab_pwrdata,(char *)p);
-
- }
-}
-
-TASK equ2d_task()
-{
- power *p;
-
- int pwrint;
-
- int x = 0;
-
- int y,s;
-
- int r,g,b;
-
- while(1)
- {
-
- p = (power *)cab_getmes(cab_pwrdata);
-
- /* print the line */
- sem_wait(&mutex);
-
- for(y = EQU2D_Y, s = 0;
- s < EQU2D_NSAMPLES;
- y++, s++ )
- {
- pwrint = (int)(p->p[s] / EQU2D_SCALE);
-
- if (pwrint > EQU2D_CLIP)
- pwrint = EQU2D_CLIP;
-
- r = pwrint;
-
- if (pwrint< 64) g = pwrint * 4;
- else if (pwrint<128) g = (128-pwrint) * 4;
- else g = 0;
-
- if (pwrint<128) b = 0;
- else if (pwrint<192) b = (pwrint-128) * 4;
- else b = (256-pwrint) * 4;
-
- SHORT_CRITICAL_SECTIONS(y);
- grx_plot(EQU2D_X+x,y,rgb16(r,g,b));
- }
-
- x = (x+1) % EQU2D_WIDTH;
- grx_line(EQU2D_X+x,EQU2D_Y,EQU2D_X+x,EQU2D_Y+EQU2D_NSAMPLES,white);
-
- sem_post(&mutex);
-
- cab_unget(cab_pwrdata,(char *)p);
-
- task_endcycle();
- }
-}
-
-TASK prova_task()
-{
- window *p;
-
- while(1)
- {
- p = (window *)cab_getmes(cab_windata);
- cprintf("%d %d %d\t", p->start /*sample[0]*/,p->sample[1],p->sample[2]);
- cab_unget(cab_windata,(char *)p);
-
- task_endcycle();
- }
-}
-
-
-void scenario(int f)
-{
- int i,y;
- char s[6];
-
- grx_line(0,WAVE_Y-WAVE_HEIGHT-1,1023,WAVE_Y-WAVE_HEIGHT-1,red);
- grx_line(0,WAVE_Y+WAVE_HEIGHT+1,1023,WAVE_Y+WAVE_HEIGHT+1,red);
- grx_line(0,EQU_Y-11 ,1023,EQU_Y-11 ,red);
-
-
-
- /* lines near the frequencies */
- grx_line(EQU_X +1,EQU_Y,EQU_X +1,EQU_Y+EQU_NSAMPLES,red);
- grx_line(EQU2D_X-1,EQU_Y,EQU2D_X-1,EQU_Y+EQU_NSAMPLES,red);
-
- for (i=0; i<SCENARIO_NLABEL; i++)
- {
- y = (i*EQU_NSAMPLES)/(SCENARIO_NLABEL-1);
- if (i == SCENARIO_NLABEL-1) y--;
- grx_line(EQU_X +1,EQU_Y+y,EQU_X +10,EQU_Y+y,red);
- grx_line(EQU2D_X-1,EQU_Y+y,EQU2D_X-10,EQU_Y+y,red);
-
- itoa((i*f)/(SCENARIO_NLABEL-1),s);
- grx_text(s,EQU_X+20,EQU_Y+y-8,white,black);
- }
-
- grx_text("FFTPlay 1.0 - by Paolo Gai 1999 <pj@hartik.sssup.it>", 0,8, rgb16(0,255,0), black );
- grx_text("...press ENTER key to exit..." , 0,24, rgb16(0,255,0), black );
-
- grx_text("FFT Power Spectrum", 0 , EQU_Y-21, rgb16(0,0,255), black);
- grx_text("FFT Power Story", EQU2D_X+16, EQU_Y-21, rgb16(0,0,255), black);
- grx_text("Waveform" , 0, WAVE_Y-WAVE_HEIGHT-10, rgb16(0,0,255), black);
-
-}
-
-
-
-
-void compute_params(int *freq,WORD *nsamp, WORD *per)
-{
- if (*freq< 2000)
- {
- cprintf("WARNING: frequency less than 2000Hz\n ---> frequency set to 2000Hz\n");
- *freq = 2000;
- }
- if (*freq<= 8000) { *nsamp = 128; *per = 10; return; }
- if (*freq<=16000) { *nsamp = 256; *per = 10; return; }
- if (*freq<=24000) { *nsamp = 512; *per = 10; return; }
- if (*freq>48000)
- {
- cprintf("WARNING: frequency greather than 48000Hz\n ---> frequency set to 48000Hz\n");
- *freq = 48000;
- }
- if (*freq<=48000) { *nsamp = 1024;*per = 10; return; }
-}
-
-
-
-void my_close(void *arg)
-{
- grx_close();
-}
-
-
-void endfun(KEY_EVT *k)
-{
- cprintf("Ctrl-Brk pressed! Ending...\n");
- sys_end();
-}
-
-int main(int argc, char **argv)
-{
- int modenum;
-
- int f;
-
- /* irq period... */
- WORD period;
-
- KEY_EVT k;
-
- SOFT_TASK_MODEL m3, m4, m5, m6;
-
- PID p3,p4,p5,p6;
-
- version();
-
- if (argc == 1)
- {
- cprintf("type x fftplay <freq>");
- return 0;
- }
-
- f = atoi(argv[1]);
- compute_params(&f,&rawdata_nsamples,&period);
-
- keyb_set_map(itaMap);
- k.flag = CNTR_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,endfun);
- k.flag = CNTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,endfun);
-
- cab_windata = cab_create("windata", sizeof(window), 4);
- cab_pwrdata = cab_create("pwr", sizeof(power), 4);
-
- /* Init the sound lib */
- sound_init((rawdata_nsamples * sizeof(SAMPLE)), NULL);
- sound_info();
-
- /* Init the data used by the raw_infun */
- init_rawdata();
-
- /* Start the self-buffering sampling operation */
- sound_setfun(raw_infun, (int (*)(void *))-1);
- sound_sample(NULL, f, 0, DMA_OP | PCM16 | MYFUN, NULL);
-
- cprintf("Press Enter...");
- while (keyb_getchar() != 13);
-
- sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT);
-
- #if !defined(NO_GRX)
- grx_init();
- modenum = grx_getmode(1024, 768, 16);
- grx_setmode(modenum);
-
- /* init the graphic mutex */
- sem_init(&mutex, 0, 1);
-
- /* useful colors ... */
- white = rgb16(255,255,255);
- black = rgb16(0,0,0);
- red = rgb16(255,0,0);
-
- scenario(f/2);
-
- #endif
-
- #if !defined(NO_GRX)
- soft_task_default_model(m3);
- soft_task_def_period(m3, PERIOD_WAVE);
- soft_task_def_met(m3, WCET_WAVE);
- soft_task_def_group(m3, 1);
- p3 = task_create("wave", wave_task, &m3, NULL);
- if (p3 == -1) {
- perror("FFTPlay: Could not create task <wave>\n");
- sys_end();
- }
- #endif
-
- soft_task_default_model(m4);
- soft_task_def_period(m4, PERIOD_FFT);
- soft_task_def_met(m4, WCET_FFT);
- soft_task_def_group(m4, 1);
- soft_task_def_stack(m4,32*1024);
- soft_task_def_usemath(m4);
- p4 = task_create("fft", fft_task, &m4, NULL);
- if (p4 == -1) {
- perror("FFTPlay: Could not create task <fft>\n");
- sys_end();
- }
-
- #if !defined(NO_GRX)
- soft_task_default_model(m5);
- soft_task_def_period(m5, PERIOD_EQU);
- soft_task_def_met(m5, WCET_EQU);
- soft_task_def_group(m5, 1);
- soft_task_def_stack(m5,32*1024);
- soft_task_def_usemath(m5);
- p5 = task_create("equ", equ_task, &m5, NULL);
- if (p5 == -1) {
- perror("FFTPlay: Could not create task <equ>\n");
- sys_end();
- }
- #endif
-
- #if !defined(NO_GRX)
- soft_task_default_model(m6);
- soft_task_def_period(m6, PERIOD_EQU2D);
- soft_task_def_met(m6, WCET_EQU2D);
- soft_task_def_group(m6, 1);
- soft_task_def_stack(m6,32*1024);
- soft_task_def_usemath(m6);
- p6 = task_create("equ2D", equ2d_task, &m5, NULL);
- if (p6 == -1) {
- perror("FFTPlay: Could not create task <equ2D>\n");
- sys_end();
- }
- #else
- /* Start the prova task */
- //task_def_wcet(m6,1000);
- //task_activate(task_create("prova",prova_task,TASK_TYPE,PERIODIC,200,&m6));
- #endif
-
- group_activate(1);
-
- /* Wait until the user get bored */
- while (keyb_getchar() != 13);
-
- sys_end();
-
- return 0;
-}
-
-
Index: rel_1_2/thdemo/jetctrl.c
===================================================================
--- rel_1_2/thdemo/jetctrl.c (revision 1198)
+++ rel_1_2/thdemo/jetctrl.c (nonexistent)
@@ -1,200 +0,0 @@
-// JetControl
-
-#include "demo.h"
-#include "kernel/func.h"
-
-TASK jetdummy_task(void *arg)
-{
- TIME now_dummy, last_dummy, diff_dummy, slice;
- struct timespec now, last, diff;
- int x = 0;
- int height;
-
- NULL_TIMESPEC(&last);
- last_dummy = 0;
- for (;;) {
- task_nopreempt();
- jet_getstat(DUMMY_PID, NULL, NULL, NULL, &now_dummy);
- sys_gettime(&now);
- task_preempt();
-
- SUBTIMESPEC(&now, &last, &diff);
- slice = diff.tv_sec * 1000000 + diff.tv_nsec/1000;
- diff_dummy = now_dummy - last_dummy;
-
- height = (int)(JET_DUMMY_HEIGHT*((float)diff_dummy)/((float)slice));
-
- TIMESPEC_ASSIGN(&last, &now);
- last_dummy = now_dummy;
-
- mutex_lock(&mutex);
- grx_line(JET_DUMMY_X+x,JET_DUMMY_Y,
- JET_DUMMY_X+x,JET_DUMMY_Y+height ,black);
- grx_line(JET_DUMMY_X+x,JET_DUMMY_Y+height,
- JET_DUMMY_X+x,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
- grx_line(JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y,
- JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y+JET_DUMMY_HEIGHT,255);
- mutex_unlock(&mutex);
-
- x = (x+1)%JET_DUMMY_WIDTH;
-
- task_endcycle();
- }
-}
-
-
-TASK jetctrl_task(void *arg)
-{
- char st[50];
- TIME sum, max;
- int n;
-
- PID i;
- int printed = 0;
-
- for (;;) {
- for (i=2, printed=0; i<MAX_PROC && printed<JET_NTASK; i++) {
- if (jet_getstat(i, &sum, &max, &n, NULL) != -1) {
- if (!n) n=1;
- sprintf(st, "%6d %6d %10s", (int)sum/n, (int)max, proc_table[i].name);
- mutex_lock(&mutex);
- grx_text(st, 384, JET_Y_NAME+16+printed*8, gray, black);
- mutex_unlock(&mutex);
- printed++;
- }
- }
- while (printed<JET_NTASK) {
- mutex_lock(&mutex);
- grx_text(" ",
- 384, JET_Y_NAME+16+printed*8, gray, black);
- mutex_unlock(&mutex);
- printed++;
- }
- task_endcycle();
- }
-}
-
-TASK jetslide_task(void *arg)
-{
- TIME sum, curr, max;
-
- TIME total[JET_NTASK];
- int slides[JET_NTASK];
-
- PID i;
- int printed = 0;
-
- for (;;) {
- // Fill the total array in a nonpreemptive section
- task_nopreempt();
- for (i=2, printed=0; i<MAX_PROC && printed<JET_NTASK; i++) {
- if (jet_getstat(i, &sum, NULL, NULL, &curr) != -1) {
- total[printed] = sum+curr;
- printed++;
- }
- }
- task_preempt();
-
- while (printed < JET_NTASK)
- total[printed++] = 0;
-
- // Compute the Max elapsed time
- max = 0;
- for (i=0; i<JET_NTASK; i++)
- if (total[i] > max) max = total[i];
- if (!max) max = 1;
-
- // Compute the slides width
- for (i=0; i<JET_NTASK; i++)
- slides[i] = (int)( (((float)total[i])/max) * JET_SLIDE_WIDTH);
-
- // print the data
- mutex_lock(&mutex);
- for (i=0; i<JET_NTASK; i++) {
- grx_box(JET_SLIDE_X, JET_Y_NAME+16+i*8,
- JET_SLIDE_X+slides[i], JET_Y_NAME+23+i*8, gray);
- grx_box(JET_SLIDE_X+slides[i], JET_Y_NAME+16+i*8,
- JET_SLIDE_X+JET_SLIDE_WIDTH, JET_Y_NAME+23+i*8, black);
- }
-
- while (i<JET_NTASK) {
- grx_box(JET_SLIDE_X, JET_Y_NAME+16+i*8,
- JET_SLIDE_X+JET_SLIDE_WIDTH, JET_Y_NAME+20+i*8, black);
- i++;
- }
- mutex_unlock(&mutex);
- task_endcycle();
- }
-}
-
-
-void scenario_jetcontrol(void)
-{
- grx_text("System load" , 384, 248, rgb16(0,0,255), black);
- grx_line(384,258,639,258,red);
-
- grx_text(" Mean Max Name Slide", 384, JET_Y_NAME, gray, black);
- grx_line(384,JET_Y_NAME+10,639,JET_Y_NAME+10,gray);
-
- grx_rect(JET_DUMMY_X-1, JET_DUMMY_Y-1,
- JET_DUMMY_X+JET_DUMMY_WIDTH, JET_DUMMY_Y+JET_DUMMY_HEIGHT+1, gray);
-
- grx_text("100%", JET_DUMMY_X-40, JET_DUMMY_Y, gray, black);
- grx_text(" 0%", JET_DUMMY_X-40, JET_DUMMY_Y+JET_DUMMY_HEIGHT-8, gray, black);
-
- grx_line(JET_DUMMY_X-1, JET_DUMMY_Y, JET_DUMMY_X-5, JET_DUMMY_Y, gray);
- grx_line(JET_DUMMY_X-1, JET_DUMMY_Y+JET_DUMMY_HEIGHT, JET_DUMMY_X-5, JET_DUMMY_Y+JET_DUMMY_HEIGHT, gray);
- grx_line(384,258,639,258,red);
-}
-
-void init_jetcontrol(void)
-{
- SOFT_TASK_MODEL m3, m4, m5;
-
- PID p3, p4, p5;
-
- soft_task_default_model(m3);
- soft_task_def_level(m3,1);
- soft_task_def_period(m3, PERIOD_JETCTRL);
- soft_task_def_met(m3, WCET_JETCTRL);
- soft_task_def_ctrl_jet(m3);
- soft_task_def_group(m3, 1);
- p3 = task_create("jctrl", jetctrl_task, &m3, NULL);
- if (p3 == -1) {
- grx_close();
- perror("FFTPlay: Could not create task <jetctrl>\n");
- ll_abort(54);
- sys_end();
- }
-
- soft_task_default_model(m4);
- soft_task_def_level(m4,1);
- soft_task_def_period(m4, PERIOD_JETDUMMY);
- soft_task_def_met(m4, WCET_JETDUMMY);
- soft_task_def_group(m4, 1);
- soft_task_def_usemath(m4);
- soft_task_def_ctrl_jet(m4);
- p4 = task_create("jdmy", jetdummy_task, &m4, NULL);
- if (p4 == -1) {
- grx_close();
- perror("FFTPlay: Could not create task <jetdummy>\n");
- ll_abort(54);
- sys_end();
- }
-
- soft_task_default_model(m5);
- soft_task_def_level(m5,1);
- soft_task_def_period(m5, PERIOD_JETSLIDE);
- soft_task_def_met(m5, WCET_JETSLIDE);
- soft_task_def_group(m5, 1);
- soft_task_def_usemath(m5);
- soft_task_def_ctrl_jet(m5);
- p5 = task_create("jsli", jetslide_task, &m5, NULL);
- if (p5 == -1) {
- grx_close();
- perror("FFTPlay: Could not create task <jetslide>\n");
- ll_abort(54);
- sys_end();
- }
-}
-
Index: rel_1_2/thdemo/camera.c
===================================================================
--- rel_1_2/thdemo/camera.c (revision 1198)
+++ rel_1_2/thdemo/camera.c (nonexistent)
@@ -1,516 +0,0 @@
-// framegrabber stuffs
-
-/* File name ......... : ELABOR.C
- * Project............ :
- * Object ............ :
- * Author ............ : Facchinetti Tullio
- * Language .......... : C
- * Compiler .......... : GNU C
- * Operative system .. : MS-DOS/HARTIK
- * Creation data ..... : 04/03/2000
- * Last modify ....... : 19/11/99
- */
-
-
-
-
-#include <kernel/func.h>
-#include <modules/cabs.h>
-#include <stdio.h>
-#include <drivers/pxc.h>
-#include "demo.h"
-
-PID camera_PID;
-PID tracking_PID;
-
-static CAB frameCAB; // CAB di deposito delle immagini
-static CAB trackingCAB; // CAB di deposito delle info di tracking
-
-
-int img_border = 10;
-int window_width = 40;
-int window_height = 40;
-TPixel pix_threshold = 128;
-
-// a 256 grayscale palette
-WORD gray_palette[256];
-
-// the image to be putted on the screen
-WORD converted_image[IMG_COL*IMG_ROW];
-
-TDataObj sequence[N_FRAMES];
-
-
-
-void border_up_function(KEY_EVT key)
-{
- img_border++;
-}
-
-void border_down_function(KEY_EVT key)
-{
- img_border--;
-}
-
-void threshold_up_function(KEY_EVT key)
-{
- char st[50];
- pix_threshold++;
- sprintf(st, "threshold %4d", pix_threshold);
- mutex_lock(&mutex);
- grx_text(st, 400, 100, 255, 0);
- mutex_unlock(&mutex);
-}
-
-void threshold_down_function(KEY_EVT key)
-{
- char st[50];
- pix_threshold--;
- sprintf(st, "threshold %4d", pix_threshold);
- mutex_lock(&mutex);
- grx_text(st, 400, 100, 255, 0);
- mutex_unlock(&mutex);
-}
-
-float distance(unsigned int x1, unsigned int y1,
- unsigned int x2, unsigned int y2)
-{
- return(sqrt(((y2 - y1) * (y2 - y1)) + ((x2 - x1) * (x2 - x1))));
-}
-
-char scan_window_frame(TDataObj *data, TPixel *in_frame,
- unsigned int xc, unsigned int yc, int border)
-{
- unsigned long int offset;
- unsigned int i, j;
- TPixel pix;
- double sum_x = 0.0, sum_y = 0.0;
- unsigned int n_pix = 0;
- int x1, y1, x2, y2; // Must be int!!!
- char found;
-
- data->x1 = N_COL;
- data->y1 = N_ROW;
- data->x2 = data->y2 = 0;
- data->xb = data->yb = -1;
- data->time_stamp = -1;
-
- found = 0;
-
- x1 = MAX_NUM((xc - window_width / 2), (border));
- y1 = MAX_NUM((yc - window_height / 2), (border));
- x2 = MIN_NUM((xc + window_width / 2), (N_COL - border));
- y2 = MIN_NUM((yc + window_height / 2), (N_ROW - border));
-
- for (i = y1; i < y2; i++) {
- for (j = x1; j < x2; j++) {
- offset = i * N_COL + j;
- pix = *(in_frame + offset);
-
-#ifdef __BLACK_ON_WHITE
- // Pixel found (object is black, background is white)
- if (pix < pix_threshold) {
-#else
- // Pixel found (object is white, background is black)
- if (pix > pix_threshold) {
-#endif
- data->time_stamp = sys_gettime(NULL);
- found = 1;
- n_pix++;
- sum_x += j;
- sum_y += i;
-// *(in_frame + offset) = 0;
- if (i < data->y1)
- data->y1 = i;
- if (i > data->y2)
- data->y2 = i;
- if (j < data->x1)
- data->x1 = j;
- if (j > data->x2)
- data->x2 = j;
-
- } else {
-// *(in_frame + offset) = 255;
- }
- }
- }
- data->xb = sum_x / n_pix;
- data->yb = sum_y / n_pix;
- return(found);
-}
-
-char scan_all_frame(TDataObj *data, TPixel *in_frame)
-{
- unsigned long int offset;
- unsigned int i, j;
- TPixel pix;
- double sum_x = 0.0, sum_y = 0.0;
- unsigned int n_pix = 0;
- char found;
-
- data->x1 = N_COL;
- data->y1 = N_ROW;
- data->x2 = data->y2 = 0;
- data->xb = data->yb = -1;
- data->time_stamp = -1;
-
- found = 0;
-
- // In a single image scanning it performs thresholding and computation
- for (i = img_border; i < N_ROW - img_border; i++) {
- for (j = img_border; j < N_COL - img_border; j++) {
- offset = i * N_COL + j;
- pix = *(in_frame + offset);
-
-#ifdef __BLACK_ON_WHITE
- // Pixel found (object is black, background is white)
- if (pix < pix_threshold) {
-#else
- // Pixel found (object is white, background is black)
- if (pix > pix_threshold) {
-#endif
- data->time_stamp = sys_gettime(NULL);
- found = 1;
- n_pix++;
- sum_x += j;
- sum_y += i;
-// *(in_frame + offset) = 0;
- if (i < data->y1)
- data->y1 = i;
- if (i > data->y2)
- data->y2 = i;
- if (j < data->x1)
- data->x1 = j;
- if (j > data->x2)
- data->x2 = j;
-
- } else {
-// *(in_frame + offset) = 255;
- }
- }
- }
- data->xb = sum_x / n_pix;
- data->yb = sum_y / n_pix;
- return(found);
-}
-
-void tracking(int top_frame, int *track_x, int *track_y, int *int_vx, int *int_vy, int time_to)
-{
- float vx, vy;
-
- vx = (float)(sequence[top_frame - 1].xb - sequence[top_frame - 2].xb) /
- (float)(sequence[top_frame - 1].time_stamp - sequence[top_frame - 2].time_stamp);
- vx *= 1000;
-
- vy = (float)(sequence[top_frame - 1].yb - sequence[top_frame - 2].yb) /
- (float)(sequence[top_frame - 1].time_stamp - sequence[top_frame - 2].time_stamp);
- vy *= 1000;
-
- *track_x = sequence[top_frame - 1].xb + vx * time_to;
- *track_y = sequence[top_frame - 1].yb + vy * time_to;
-
- *int_vx = vx * 1000;
- *int_vy = vy * 1000;
-}
-
-TASK tracking_task(void *arg)
-{
-// static unsigned int n_frame = 0;
- char found;
- TPixel *grabber_frame;
- int top_frame = 0;
- TDataObj current;
- TTracking *track;
-
- frameCAB = PXC_GetCab();
-
- grabber_frame = cab_getmes(frameCAB);
-
- // Executes first time
- found = scan_all_frame(&current, grabber_frame);
- if (found) {
- memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
- top_frame++;
- }
-
- cab_unget(frameCAB, grabber_frame);
-
- task_endcycle();
-
- while (1) {
- // Acquisizione immagine corrente
- grabber_frame = (TPixel *)cab_getmes(frameCAB);
- track = (TTracking *)cab_reserve(trackingCAB);
-
- // Estrazione della nuova trasformata sul frame corrente
- if (found) {
- found = scan_window_frame(&current, grabber_frame, current.xb, current.yb, img_border);
- } else {
- found = scan_all_frame(&current, grabber_frame);
- }
-
- track->found = found;
-
- if (found) {
- if (top_frame < N_FRAMES) {
- memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
- top_frame++;
- } else {
- top_frame = 0;
- memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
- }
-
- track->top_frame = top_frame;
- memcpy(&track->current, &current, sizeof(TDataObj));
-
- if (top_frame > 1) {
- tracking(top_frame, &track->predx, &track->predy,
- &track->vx, &track->vy, 100);
- }
- } else {
- track->top_frame = top_frame = 0;
- }
-
- // Release CABs
- cab_putmes(trackingCAB, (char *)track);
- cab_unget(frameCAB, grabber_frame);
-
- task_endcycle();
- }
-}
-
-
-
-
-
-
-
-/*
- *
- *
- *
- * Camera task
- *
- *
- *
- *
- */
-
-
-TASK camera_task(void *arg)
-{
- register int i,j,col,row;
- static unsigned int n_frame = 0;
- TPixel *grabber_frame;
- TTracking *track;
- char st[50];
-
- // Inizializzazione del task
- frameCAB = PXC_GetCab();
-
- while (1) {
- n_frame++;
- sprintf(st, "frame n. %5d", n_frame);
-
- grx_text(st, 400, 224, white, 0);
-
- // Acquisizione immagine corrente
- grabber_frame = cab_getmes(frameCAB);
-
- for (i=1; i<IMG_ROW-1; i++)
- for (j=0; j<IMG_COL; j++) {
- col = (j*(N_COL-1))/(IMG_COL-1);
- row = (i*(N_ROW-1))/(IMG_ROW-1);
- converted_image[i*IMG_COL+j] = gray_palette[*(grabber_frame+row*N_COL+col)];
- }
-
- // Release CAB
- cab_unget(frameCAB, grabber_frame);
-
- for (j=0; j<IMG_COL; j++) {
- converted_image[j] = gray_palette[0];
- converted_image[(IMG_ROW-1)*IMG_COL+j] = gray_palette[0];
- }
-
- mutex_lock(&mutex);
- grx_putimage(IMG_X, IMG_Y, IMG_X+IMG_COL-1, IMG_Y+IMG_ROW-1,
- (BYTE *)converted_image);
- mutex_unlock(&mutex);
-
- track = (TTracking *)cab_getmes(trackingCAB);
-
- if (track->found) {
- mutex_lock(&mutex);
-// sprintf(st, "found: %d", track->found);
-// grx_text(st, 400, 280, 255, 0);
-
- if (track->top_frame > 1) {
- int px, py;
-
-// sprintf(st, "top_frame %5d", track->top_frame);
-// grx_text(st, 400, 270, 255, 0);
-
- if (track->predx < img_border)
- px = img_border;
- else if (track->predx > N_COL-img_border)
- px = N_COL-img_border;
- else
- px = track->predx;
-
- if (track->predy < img_border)
- py = img_border;
- else if (track->predy > N_ROW-img_border)
- py = N_ROW-img_border;
- else
- py = track->predy;
-
- grx_disc(IMG_X+(px*2)/3, IMG_Y+(py*2)/3, 3, 127);
-
-// grx_disc(IMG_X+(current.xb*2)/3, IMG_Y+(current.yb*2)/3, 3, 127);
- grx_rect(IMG_X+(track->current.x1*2)/3, IMG_Y+(track->current.y1*2)/3,
- IMG_X+(track->current.x2*2)/3, IMG_Y+(track->current.y2*2)/3, 127);
-
- sprintf(st, "speed = (%5d, %5d) pix/s", track->vx, track->vy);
- grx_text(st, 400, 232, white, 0);
- }
- mutex_unlock(&mutex);
- }
- cab_unget(trackingCAB, (char *)track);
-
- task_endcycle();
- }
-}
-
-
-
-
-
-/*
- *
- *
- *
- * Framegrabber Initialization
- *
- *
- *
- *
- */
-
-void start_listener(TIME p);
-
-void framegrabber_close(void *arg)
-{
- PXC_Close();
-}
-
-void scenario_framegrabber()
-{
- grx_text("Camera" , 384, WAVE_Y-WAVE_HEIGHT-10, rgb16(0,0,255), black);
- grx_line(384,WAVE_Y-WAVE_HEIGHT-1,639,WAVE_Y-WAVE_HEIGHT-1,red);
-}
-
-void init_framegrabber(void)
-{
- register int i;
- KEY_EVT my_key;
- TIME period;
-
- my_key.ascii = 'a';
- my_key.scan = KEY_A;
- keyb_hook(my_key, (void (*)(KEY_EVT *))threshold_up_function);
-
- my_key.ascii = 'z';
- my_key.scan = KEY_Z;
- keyb_hook(my_key, (void (*)(KEY_EVT *))threshold_down_function);
-
- my_key.ascii = 's';
- my_key.scan = KEY_S;
- keyb_hook(my_key, (void (*)(KEY_EVT *))border_up_function);
-
- my_key.ascii = 'x';
- my_key.scan = KEY_X;
- keyb_hook(my_key, (void (*)(KEY_EVT *))border_down_function);
-
- // Aggiusta la palette
- for (i = 0; i < 256; i++)
- gray_palette[i] = rgb16(i,i,i);
- //for (i = 0; i < 256; i++)
- // grx_setcolor(i, i/4, i/4, i/4);
-
- mutex_lock(&mutex);
-// grx_text("Grabber enabled: no test!", 10, 10, 255, 0);
-
- // Some messages on screen
-// grx_text("A-Z change threshold", 400, 240, 255, 0);
-// grx_text("S-X change window borders", 400, 250, 255, 0);
- mutex_unlock(&mutex);
-
- period = PXC_Initiate(4);
-
- if (!period) {
- grx_close();
- cprintf("Problemi nell'inizializzazione del framegrabber\n");
- halt();
- sys_end();
- } else {
- TTracking *trdata;
- // tracking CAB init
- trackingCAB = cab_create("trackingCAB", sizeof(TTracking), 3);
- trdata = (TTracking *)cab_reserve(trackingCAB);
- trdata->found = 0;
- cab_putmes(trackingCAB, (char *)trdata);
-
- start_listener(period);
- }
-
- sys_atrunlevel(framegrabber_close, NULL, RUNLEVEL_BEFORE_EXIT);
-}
-
-
-void start_listener(TIME period)
-{
- SOFT_TASK_MODEL m1, m2;
-
- soft_task_default_model(m1);
- soft_task_def_level(m1,1);
- soft_task_def_met(m1,WCET_TRACKING);
- soft_task_def_usemath(m1);
-// soft_task_def_aperiodic(m1);
- soft_task_def_period(m1,(PERIOD_TRACKING));
- soft_task_def_group(m1,1);
- soft_task_def_ctrl_jet(m1);
- soft_task_def_skip_arrivals(m1);
- tracking_PID = task_create("track", tracking_task, &m1, NULL);
- if (tracking_PID == -1) {
- grx_close();
- perror("FFTPlay: Could not create task <tra>\n");
- ll_abort(54);
- perror("FFTPlay: Could not create task <tracking>\n");
- sys_end();
- }
-
- soft_task_default_model(m2);
- soft_task_def_level(m2,1);
- soft_task_def_met(m2,WCET_CAMERA);
- soft_task_def_usemath(m2);
-// soft_task_def_aperiodic(m2);
- soft_task_def_period(m2,PERIOD_CAMERA);
- soft_task_def_group(m2,1);
- soft_task_def_ctrl_jet(m2);
-// soft_task_def_skip_arrivals(m2);
- camera_PID = task_create("cam", camera_task, &m2, NULL);
- if (camera_PID == -1) {
- grx_close();
- perror("FFTPlay: Could not create task <came>\n");
- ll_abort(54);
- perror("FFTPlay: Could not create task <camera>\n");
- sys_end();
- }
-
-}
-
-void start_framegrabber()
-{
-// PXC_Push_Listener(tracking_PID,2);
- PXC_Start();
-}
Index: rel_1_2/thdemo/demo.h
===================================================================
--- rel_1_2/thdemo/demo.h (revision 1198)
+++ rel_1_2/thdemo/demo.h (nonexistent)
@@ -1,280 +0,0 @@
-
-
-#include <ll/ll.h>
-#include <kernel/types.h>
-#include <kernel/descr.h>
-#include <math.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-
-
-#define FFT_ON
-#define FRAMEGRABBER_ON
-#define JET_ON
-#define BALL_ON
-
-/*
- *
- * WCET, Periods and Models
- *
- */
-
-
-/* define if you want NRT or SOFT... */
-#define TASK_TYPE SOFT
-//#define TASK_TYPE NRT
-
-// on Celeron 366
-#define WCET_WAVE 450
-#define WCET_FFT 722
-#define WCET_EQU 1000
-#define WCET_EQU2D 318
-
-#define PERIOD_WAVE 40000
-#define PERIOD_FFT 3000
-#define PERIOD_EQU 40000
-#define PERIOD_EQU2D 3000
-
-
-
-
-#define WCET_TRACKING 4000
-#define WCET_CAMERA 7000
-
-#define PERIOD_TRACKING 40000
-#define PERIOD_CAMERA 40000
-
-
-#define WCET_JETCTRL 2600
-#define WCET_JETDUMMY 1000
-#define WCET_JETSLIDE 1000
-
-#define PERIOD_JETCTRL 100000
-#define PERIOD_JETDUMMY 100000
-#define PERIOD_JETSLIDE 100000
-
-
-#define WCET_BALL 60
-
-#define PERIOD_BALL 10000
-
-
-/*
- *
- * Soundcard related defines
- *
- */
-
-
-/* Samples are 16-bit signed integers */
-typedef short SAMPLE;
-#define MAX_SAMPLE 32768
-
-
-
-/*
- *
- * FFT defines
- *
- */
-
-/* Numbers of samples of the sample window */
-#define WINDATA_NSAMPLES 512
-
-/* task WAVE */
-/* the point (wave_x,wave_y) is on the center left of the area... */
-#define WAVE_NSAMPLES 384
-#define WAVE_X 0
-#define WAVE_Y 64
-#define WAVE_HEIGHT 32
-
-/* task FFT */
-#define FFT_NSAMPLES 512
-#define PWR_NSAMPLES (FFT_NSAMPLES/2+1)
-
-/* task EQU */
-/* the point (equ_x, equ_y) is the top right corner */
-#define EQU_NSAMPLES PWR_NSAMPLES
-#define EQU_X 64
-#define EQU_Y 128
-#define EQU_HEIGHT 64
-#define EQU_SHADE
-
-/* task EQU2D */
-/* the point (equ2d_x, equ2d_y) is the top left corner */
-#define EQU2D_NSAMPLES EQU_NSAMPLES
-#define EQU2D_X 128
-#define EQU2D_Y EQU_Y
-#define EQU2D_WIDTH 255
-#define EQU2D_CLIP 255
-
-/* scenario */
-#define SCENARIO_NLABEL 16
-
-/* Scale factors */
-#define FFT_SCALE (16384.0)
-#define EQU_SCALE (32.0)
-#define EQU2D_SCALE (8.0)
-//#define EQU_SCALE (64.0)
-//#define EQU2D_SCALE (16.0)
-
-
-
-/* Informations about the sampling rate and buffers */
-extern WORD rawdata_nsamples;
-extern WORD rawdata_buffer_size;
-extern WORD rawdata_freq;
-
-
-
-/*
- *
- * Global Stuffs
- *
- */
-
-/* graphic mutex... */
-extern mutex_t mutex;
-
-/* useful colors... */
-extern int white;
-extern int black;
-extern int red;
-extern int gray;
-
-/* define if shorts critical sections wanted */
-#define SHORT_CRITICAL_SECTIONS(x) \
- if (!((x)%64)) \
- { \
- mutex_lock(&mutex); \
- mutex_unlock(&mutex); \
- }
-
-void init_fftplay(int freq);
-void init_framegrabber();
-void init_jetcontrol();
-void init_ball(void);
-void start_framegrabber();
-
-
-void scenario_jetcontrol(void);
-void scenario_fftplay(int f);
-void scenario_framegrabber();
-void scenario_ball();
-
-void compute_params(int *freq,WORD *nsamp);
-
-char * itoa(int n, char *s);
-
-/*
- *
- * Framegrabber stuffs
- *
- */
-
-// if defined... object black on a white background
-#ifndef __BLACK_ON_WHITE
-#define __BLACK_ON_WHITE
-#endif
-
-#define ABS_NUM(a) ((a >= 0) ? a : -a)
-#define MIN_NUM(a, b) ((a < b) ? a : b)
-#define MAX_NUM(a, b) ((a > b) ? a : b)
-
-
-// Cols and rows of the framegrabber image
-#define N_COL 384
-#define N_ROW 288
-#define N_BPS 8 // Bits per pixel
-#define N_GRIGI 256
-
-#define N_FRAMES 100
-
-/* pixel of the video image */
-#define IMG_COL 256
-#define IMG_ROW 192
-
-/* position of the video image */
-#define IMG_X 384
-#define IMG_Y 32
-
-// I singoli pixel sono caratteri a 8 bit
-typedef unsigned char TPixel;
-
-typedef struct {
- int x1, y1;
- int x2, y2;
- int xb, yb;
- TIME time_stamp;
-} TDataObj;
-
-typedef struct {
- int found;
- int top_frame;
- int vx,vy;
- int predx;
- int predy;
- TDataObj current;
-} TTracking;
-
-
-float distance(unsigned int x1, unsigned int y1,
- unsigned int x2, unsigned int y2);
-
-char scan_all_frame(TDataObj *data, TPixel *in_frame);
-
-char scan_window_frame(TDataObj *data, TPixel *in_frame,
- unsigned int xc, unsigned int yc, int border);
-
-void threshold_up_function(KEY_EVT key);
-void threshold_down_function(KEY_EVT key);
-
-void border_up_function(KEY_EVT key);
-void border_down_function(KEY_EVT key);
-
-void tracking(int top_frame, int *track_x, int *track_y, int *int_vx, int *int_vy, int time_to);
-
-TASK elab_image_TASK(void);
-
-
-
-/*
- *
- * JETCONTROL stuffs
- *
- */
-
-#define JET_NTASK 18
-#define JET_Y_NAME 320
-
-#define DUMMY_PID 1
-
-#define JET_DUMMY_WIDTH 210
-#define JET_DUMMY_HEIGHT 40
-
-/* the point (x, y) is the top left corner */
-#define JET_DUMMY_X 428
-#define JET_DUMMY_Y 264
-
-#define JET_SLIDE_WIDTH 50
-#define JET_SLIDE_X 576
-
-
-
-
-/*
- *
- * BALL stuffs
- *
- */
-
-// x and y corners are specified whithout consider a border of 3 pixels
-#define BALL_Y 475 /* position of the floor */
-#define BALL_HEIGHT 70 /* initial height of the ball */
-#define BALL_XMIN 3 /* min position X of the ball */
-#define BALL_XMAX 380 /* max position X of the ball */
-#define BALL_VELX 5. /* horizontal ball velocity */
-#define BALL_VYMIN 11. /* velocit… minima per suono */
-#define BALL_MAX_P 50 /* max number of balls */
-
-#define BALL_GROUP 2 /* task group of the balls */
Index: rel_1_2/thdemo/readme.txt
===================================================================
--- rel_1_2/thdemo/readme.txt (revision 1198)
+++ rel_1_2/thdemo/readme.txt (nonexistent)
@@ -1,17 +0,0 @@
-PJ's Thesis demo
-----------------
-
-This is my Thesis Demo. The demo works correctly on my PC :-)
-(a celeron 366 Mhz), Probably It will have some problems with other slower PCs.
-
-The demo simply reads data from the soundblaster, then print the sound wave, compute a power spectrun and display it on the screen.
-
-Then there is another few tasks that reads data from a framegrabber and track a black image on a white board.
-
-Moreover, there are some noise balls to test the system in overload conditions, and there are finally a few tasks that displays the system load.
-
-If you have any problems using this demo, please contact pj@sssup.it
-
-bye
-
-Paolo
Index: rel_1_2/thdemo/camera2.c
===================================================================
--- rel_1_2/thdemo/camera2.c (revision 1198)
+++ rel_1_2/thdemo/camera2.c (nonexistent)
@@ -1,424 +0,0 @@
-// framegrabber stuffs
-
-/* File name ......... : ELABOR.C
- * Project............ :
- * Object ............ :
- * Author ............ : Facchinetti Tullio
- * Language .......... : C
- * Compiler .......... : GNU C
- * Operative system .. : MS-DOS/HARTIK
- * Creation data ..... : 04/03/2000
- * Last modify ....... : 19/11/99
- */
-
-
-
-
-#include <kernel/func.h>
-#include <modules/cabs.h>
-#include <stdio.h>
-#include <drivers/pxc.h>
-#include "demo.h"
-
-PID image_elab_PID;
-TIME periodo;
-CAB PXC_CAB;
-
-static CAB frameCAB; // CAB di deposito delle immagini
-static TDataObj current, older;
-
-// extern in INIT.C
-int img_border = 10;
-int window_width = 40;
-int window_height = 40;
-
-// a 256 grayscale palette
-WORD gray_palette[256];
-
-// the image to be putted on the screen
-WORD converted_image[IMG_COL*IMG_ROW];
-
-
-#ifdef __BLACK_ON_WHITE
-TPixel pix_threshold = 64;
-#else
-TPixel pix_threshold = 243;
-#endif
-
-
-// Global for testing!!!
-static char st[50];
-TIME before;
-
-TDataObj sequence[N_FRAMES];
-int top_frame = 0;
-
-double dist, speed;
-
-static TPixel *grabber_frame;
-
-void border_up_function(KEY_EVT key)
-{
- img_border++;
-}
-
-void border_down_function(KEY_EVT key)
-{
- img_border--;
-}
-
-void threshold_up_function(KEY_EVT key)
-{
- pix_threshold++;
- sprintf(st, "threshold %4d", pix_threshold);
- mutex_lock(&mutex);
- //grx_text(st, 400, 300, 255, 0);
- mutex_unlock(&mutex);
-}
-
-void threshold_down_function(KEY_EVT key)
-{
- pix_threshold--;
- sprintf(st, "threshold %4d", pix_threshold);
- mutex_lock(&mutex);
- //grx_text(st, 400, 300, 255, 0);
- mutex_unlock(&mutex);
-}
-
-float distance(unsigned int x1, unsigned int y1,
- unsigned int x2, unsigned int y2)
-{
- return(sqrt(((y2 - y1) * (y2 - y1)) + ((x2 - x1) * (x2 - x1))));
-}
-
-char scan_window_frame(TDataObj *data, TPixel *in_frame,
- unsigned int xc, unsigned int yc, int border)
-{
- unsigned long int offset;
- unsigned int i, j;
- TPixel pix;
- double sum_x = 0.0, sum_y = 0.0;
- unsigned int n_pix = 0;
- int x1, y1, x2, y2; // Must be int!!!
- char found;
-
- data->x1 = N_COL;
- data->y1 = N_ROW;
- data->x2 = data->y2 = 0;
- data->xb = data->yb = -1;
- data->time_stamp = -1;
-
- found = 0;
-
- x1 = MAX_NUM((xc - window_width / 2), (border));
- y1 = MAX_NUM((yc - window_height / 2), (border));
- x2 = MIN_NUM((xc + window_width / 2), (N_COL - border));
- y2 = MIN_NUM((yc + window_height / 2), (N_ROW - border));
-
- for (i = y1; i < y2; i++) {
- for (j = x1; j < x2; j++) {
- offset = i * N_COL + j;
- pix = *(in_frame + offset);
-
-#ifdef __BLACK_ON_WHITE
- // Pixel found (object is black, background is white)
- if (pix < pix_threshold) {
-#else
- // Pixel found (object is white, background is black)
- if (pix > pix_threshold) {
-#endif
- data->time_stamp = sys_gettime(NULL);
- found = 1;
- n_pix++;
- sum_x += j;
- sum_y += i;
- *(in_frame + offset) = 0;
- if (i < data->y1)
- data->y1 = i;
- if (i > data->y2)
- data->y2 = i;
- if (j < data->x1)
- data->x1 = j;
- if (j > data->x2)
- data->x2 = j;
-
- } else {
- *(in_frame + offset) = 255;
- }
- }
- }
- data->xb = sum_x / n_pix;
- data->yb = sum_y / n_pix;
- return(found);
-}
-
-char scan_all_frame(TDataObj *data, TPixel *in_frame)
-{
- unsigned long int offset;
- unsigned int i, j;
- TPixel pix;
- double sum_x = 0.0, sum_y = 0.0;
- unsigned int n_pix = 0;
- char found;
-
- data->x1 = N_COL;
- data->y1 = N_ROW;
- data->x2 = data->y2 = 0;
- data->xb = data->yb = -1;
- data->time_stamp = -1;
-
- found = 0;
-
- // In a single image scanning it performs thresholding and computation
- for (i = img_border; i < N_ROW - img_border; i++) {
- for (j = img_border; j < N_COL - img_border; j++) {
- offset = i * N_COL + j;
- pix = *(in_frame + offset);
-
-#ifdef __BLACK_ON_WHITE
- // Pixel found (object is black, background is white)
- if (pix < pix_threshold) {
-#else
- // Pixel found (object is white, background is black)
- if (pix > pix_threshold) {
-#endif
- data->time_stamp = sys_gettime(NULL);
- found = 1;
- n_pix++;
- sum_x += j;
- sum_y += i;
- *(in_frame + offset) = 0;
- if (i < data->y1)
- data->y1 = i;
- if (i > data->y2)
- data->y2 = i;
- if (j < data->x1)
- data->x1 = j;
- if (j > data->x2)
- data->x2 = j;
-
- } else {
- *(in_frame + offset) = 255;
- }
- }
- }
- data->xb = sum_x / n_pix;
- data->yb = sum_y / n_pix;
- return(found);
-}
-
-void tracking(int *track_x, int *track_y, int time_to)
-{
- float vx, vy;
-
- vx = (float)(sequence[top_frame - 1].xb - sequence[top_frame - 2].xb) /
- (float)(sequence[top_frame - 1].time_stamp - sequence[top_frame - 2].time_stamp);
- vx *= 1000000;
-
- vy = (float)(sequence[top_frame - 1].yb - sequence[top_frame - 2].yb) /
- (float)(sequence[top_frame - 1].time_stamp - sequence[top_frame - 2].time_stamp);
- vy *= 1000000;
-
- (*track_x) = sequence[top_frame - 1].xb + vx * time_to;
- (*track_y) = sequence[top_frame - 1].yb + vy * time_to;
-
- sprintf(st, "speed = (%5d, %5d) pix/s", (int)vx, (int)vy);
- mutex_lock(&mutex);
- //grx_text(st, 400, 410, 255, 0);
- mutex_unlock(&mutex);
-}
-
-void put_frame(TPixel *frame)
-{
- register int i,j,col,row;
-
- for (i=0; i<IMG_ROW; i++)
- for (j=0; j<IMG_COL; j++) {
- col = (j*(N_COL-1))/(IMG_COL-1);
- row = (i*(N_ROW-1))/(IMG_ROW-1);
- converted_image[i*IMG_COL+j] = gray_palette[*(frame+row*N_COL+col)];
- }
-
- mutex_lock(&mutex);
- //grx_putimage(IMG_X, IMG_Y, IMG_X+IMG_COL-1, IMG_Y+IMG_ROW-1,
- // (BYTE *)converted_image);
- mutex_unlock(&mutex);
-}
-
-
-TASK elab_image_TASK(void)
-{
-// register int i, j;
- static unsigned int n_frame = 0;
- char found;
- int pred_x, pred_y;
-
- // Inizializzazione del task
- frameCAB = PXC_GetCab();
-
- grabber_frame = cab_getmes(frameCAB);
-
- // Executes first time
- found = scan_all_frame(&current, grabber_frame);
-// found =0;
- if (found) {
- memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
- top_frame++;
- }
-
- cab_unget(frameCAB, grabber_frame);
-
- task_endcycle();
-
- while (1) {
-
-// before = sys_gettime(NULL);
-
- n_frame++;
- sprintf(st, "frame n. %5d", n_frame);
-
- mutex_lock(&mutex);
- //grx_text(st, 400, 290, 255, 0);
-
- sprintf(st, "top_frame %5d", top_frame);
- //grx_text(st, 400, 270, 255, 0);
-
- sprintf(st, "found: %d!", found);
- //grx_text(st, 400, 280, 255, 0);
- mutex_unlock(&mutex);
-
- // Acquisizione immagine corrente
- grabber_frame = cab_getmes(frameCAB);
-
- // copy current in older
- memcpy(&older, &current, sizeof(TDataObj));
-
- // Estrazione della nuova trasformata sul frame corrente
- if (found) {
- found = scan_window_frame(&current, grabber_frame, current.xb, current.yb, img_border);
- } else {
- found = scan_all_frame(&current, grabber_frame);
- }
-
-// //grx_putimage(0, 0, N_COL - 1, N_ROW - 1, grabber_frame);
- put_frame(grabber_frame);
-
- if (found) {
- if (top_frame < N_FRAMES) {
- memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
- top_frame++;
- } else {
- top_frame = 0;
- memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
- }
-
- if (top_frame > 1) {
- tracking(&pred_x, &pred_y, 100);
-
- mutex_lock(&mutex);
-// //grx_disc(IMG_X+(pred_x*2)/3, IMG_Y+(pred_y*2)/3, 3, 127);
-
- //grx_disc(IMG_X+(current.xb*2)/3, IMG_Y+(current.yb*2)/3, 3, 127);
- //grx_rect(IMG_X+(current.x1*2)/3, IMG_Y+(current.y1*2)/3,
- // IMG_X+(current.x2*2)/3, IMG_Y+(current.y2*2)/3, 127);
- mutex_unlock(&mutex);
-
- }
- } else {
- top_frame = 0;
- }
-
- // Release CAB
- cab_unget(frameCAB, grabber_frame);
-
-// sprintf(st, "durata = %3d ms", (int)(sys_gettime(NULL) - before)/1000);
-// mutex_lock(&mutex);
-// //grx_text(st, 400, 400, 255, 0);
-// mutex_unlock(&mutex);
-
- task_endcycle();
- }
-}
-
-
-void start_listener(void);
-
-void framegrabber_close(void *arg)
-{
- PXC_Close();
-}
-
-void init_framegrabber(void)
-{
- register int i;
- KEY_EVT my_key;
-
- my_key.ascii = 'a';
- my_key.scan = KEY_A;
- keyb_hook(my_key, (void (*)(KEY_EVT *))threshold_up_function);
-
- my_key.ascii = 'z';
- my_key.scan = KEY_Z;
- keyb_hook(my_key, (void (*)(KEY_EVT *))threshold_down_function);
-
- my_key.ascii = 's';
- my_key.scan = KEY_S;
- keyb_hook(my_key, (void (*)(KEY_EVT *))border_up_function);
-
- my_key.ascii = 'x';
- my_key.scan = KEY_X;
- keyb_hook(my_key, (void (*)(KEY_EVT *))border_down_function);
-
- // Aggiusta la palette
- for (i = 0; i < 256; i++)
- gray_palette[i] = rgb16(i,i,i);
- //for (i = 0; i < 256; i++)
- // grx_setcolor(i, i/4, i/4, i/4);
-
- mutex_lock(&mutex);
-// grx_text("Grabber enabled: no test!", 10, 10, 255, 0);
-
- // Some messages on screen
- //grx_text("A-Z change threshold", 400, 240, 255, 0);
- //grx_text("S-X change window borders", 400, 250, 255, 0);
- mutex_unlock(&mutex);
-
- periodo = PXC_Initiate(3);
- PXC_CAB = PXC_GetCab();
-
- if (!periodo) {
- //grx_close();
- cprintf("Problemi nell'inizializzazione del driver\n");
- sys_end();
- } else {
- start_listener();
- }
-
- sys_atrunlevel(framegrabber_close, NULL, RUNLEVEL_BEFORE_EXIT);
-}
-
-
-void start_listener(void)
-{
- SOFT_TASK_MODEL m_soft;
-
- soft_task_default_model(m_soft);
- soft_task_def_met(m_soft,IMAGING_WCET);
- soft_task_def_usemath(m_soft);
- soft_task_def_aperiodic(m_soft);
- soft_task_def_period(m_soft,(periodo*3));
- soft_task_def_group(m_soft,1);
- soft_task_def_ctrl_jet(m_soft);
-
- image_elab_PID = task_create("imaging", elab_image_TASK, &m_soft, NULL);
-
-/* task_activate( image_elab_PID);
- PXC_Push_Listener(image_elab_PID,2);
- PXC_Start();*/
-}
-
-void start_framegrabber()
-{
- PXC_Push_Listener(image_elab_PID,2);
- PXC_Start();
-}
Index: rel_1_2/thdemo/ball.c
===================================================================
--- rel_1_2/thdemo/ball.c (revision 1198)
+++ rel_1_2/thdemo/ball.c (nonexistent)
@@ -1,164 +0,0 @@
-/*--------------------------------------------------------------*/
-/* SIMULATION OF JUMPING BALLS */
-/*--------------------------------------------------------------*/
-
-/* CVS $Id: ball.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $ */
-
-
-#include "demo.h"
-#include <kernel/func.h>
-#include <stdlib.h>
-
-#define R 2 /* dimension of a ball */
-#define G 9.8 /* acceleration of gravity */
-
-static int ballexit = 0;
-static int npc = 0; /* number of tasks created */
-
-/*--------------------------------------------------------------*/
-/* Periodic task for ball simulation */
-/*--------------------------------------------------------------*/
-
-TASK palla(int i)
-{
-int x, y; /* coordinate grafiche pallina */
-int ox, oy; /* vecchia posizione pallina */
-int x0, y0; /* posizione iniziale X pallina */
-float vx, vy; /* velocit… della pallina */
-float vy0; /* velocita' pallina al primo rimbalzo */
-float ty, tx; /* variabile temporale */
-float dt; /* incremento temporale */
-
- y = oy = y0 = BALL_HEIGHT;
- x = ox = x0 = BALL_XMIN;
-
- vy0= sqrt(2. * G * (float)BALL_HEIGHT);
- vy = 0;
- vx = BALL_VELX + rand()%9;
- tx = 0;
- ty = 0;
- dt = ((float)PERIOD_BALL)/100000;
-
- while (1) {
- y = y0 + vy*ty - .5*G*ty*ty;
- x = x0 + vx * tx;
-
- if (y < 0) {
- y = 0;
-
- if (vy == 0.0)
- vy = vy0;
- else if (vy < BALL_VYMIN)
- vy = vy0 * (1.0 - (rand()%50)/100.0);
- else
- vy = 0.9 * vy;
-
- ty = 0.0;
- y0 = 0;
- }
-
- if (x > BALL_XMAX) {
- tx = 0.0;
- x0 = BALL_XMAX;
- vx = -vx;
- x = x0 + vx * tx;
- }
-
- if (x < BALL_XMIN) {
- tx = 0.0;
- x0 = BALL_XMIN;
- vx = -vx;
- x = x0 + vx * tx;
- }
-
- mutex_lock(&mutex);
- grx_disc(ox, oy, R, 0);
- ox = x;
- oy = BALL_Y - y;
- mutex_unlock(&mutex);
-
- if (ballexit) {
- npc--;
- return 0;
- }
-
- mutex_lock(&mutex);
- grx_disc(ox, oy, R, i);
- mutex_unlock(&mutex);
-
- {
- int xxx;
- for (xxx=0; xxx<10000; xxx++);
- }
- ty += dt;
- tx += dt;
- task_endcycle();
- }
-}
-
-void killball(KEY_EVT *k)
-{
- ballexit = 1;
-}
-
-void ballfun(KEY_EVT *k)
-{
- SOFT_TASK_MODEL mp;
- int r,g,b;
- PID pid;
-
- if (npc == BALL_MAX_P) return;
-
- ballexit = 0;
-
- r = 64 + rand()%192;
- g = 64 + rand()%192;
- b = 64 + rand()%192;
-
- soft_task_default_model(mp);
- soft_task_def_level(mp,1);
- soft_task_def_ctrl_jet(mp);
- soft_task_def_arg(mp, (void *)rgb16(r,g,b));
- soft_task_def_group(mp, BALL_GROUP);
- soft_task_def_met(mp, WCET_BALL);
- soft_task_def_period(mp,PERIOD_BALL);
- soft_task_def_usemath(mp);
- pid = task_create("palla", palla, &mp, NULL);
- if (pid != NIL) {
- task_activate(pid);
- npc++;
- }
-}
-
-
-/*--------------------------------------------------------------*/
-/* MAIN process */
-/*--------------------------------------------------------------*/
-
-void scenario_ball()
-{
- grx_text("Noise", 0, BALL_Y-BALL_HEIGHT-15, rgb16(0,0,255), black);
- grx_line(0,BALL_Y-BALL_HEIGHT-6,383,BALL_Y-BALL_HEIGHT-6,red);
-}
-
-void init_ball(void)
-{
- KEY_EVT k;
-
- mutex_lock(&mutex);
- grx_rect(BALL_XMIN-R-1, BALL_Y-BALL_HEIGHT-R-1,
- BALL_XMAX+R+1, BALL_Y+R+1, rgb16(0,200,0));
- mutex_unlock(&mutex);
-
- k.flag = 0;
- k.scan = KEY_SPC;
- k.ascii = ' ';
- keyb_hook(k,ballfun);
-
- k.flag = 0;
- k.scan = KEY_BKS;
- k.ascii = ' ';
- keyb_hook(k,killball);
-}
-
-/*--------------------------------------------------------------*/
Index: rel_1_2/thdemo/camera4.c
===================================================================
--- rel_1_2/thdemo/camera4.c (revision 1198)
+++ rel_1_2/thdemo/camera4.c (nonexistent)
@@ -1,168 +0,0 @@
-// framegrabber stuffs
-
-/* File name ......... : ELABOR.C
- * Project............ :
- * Object ............ :
- * Author ............ : Facchinetti Tullio
- * Language .......... : C
- * Compiler .......... : GNU C
- * Operative system .. : MS-DOS/HARTIK
- * Creation data ..... : 04/03/2000
- * Last modify ....... : 19/11/99
- */
-
-
-
-
-#include <kernel/func.h>
-#include <modules/cabs.h>
-#include <stdio.h>
-#include <drivers/pxc.h>
-#include "demo.h"
-
-PID image_elab_PID;
-TIME periodo;
-CAB PXC_CAB;
-
-static CAB frameCAB; // CAB di deposito delle immagini
-static TDataObj current, older;
-
-// extern in INIT.C
-int img_border = 10;
-int window_width = 40;
-int window_height = 40;
-
-// a 256 grayscale palette
-WORD gray_palette[256];
-
-// the image to be putted on the screen
-WORD converted_image[IMG_COL*IMG_ROW];
-
-
-#ifdef __BLACK_ON_WHITE
-TPixel pix_threshold = 64;
-#else
-TPixel pix_threshold = 243;
-#endif
-
-
-// Global for testing!!!
-static char st[50];
-TIME before;
-
-TDataObj sequence[N_FRAMES];
-int top_frame = 0;
-
-double dist, speed;
-
-static TPixel *grabber_frame;
-
-void put_frame(TPixel *frame)
-{
- register int i,j,col,row;
-
- for (i=1; i<IMG_ROW-1; i++)
- for (j=0; j<IMG_COL; j++) {
- col = (j*(N_COL-1))/(IMG_COL-1);
- row = (i*(N_ROW-1))/(IMG_ROW-1);
- converted_image[i*IMG_COL+j] = gray_palette[*(frame+row*N_COL+col)];
- }
-
- for (j=0; j<IMG_COL; j++) {
- converted_image[j] = gray_palette[0];
- converted_image[(IMG_ROW-1)*IMG_COL+j] = gray_palette[0];
- }
-
- mutex_lock(&mutex);
- grx_putimage(IMG_X, IMG_Y, IMG_X+IMG_COL-1, IMG_Y+IMG_ROW-1,
- (BYTE *)converted_image);
- mutex_unlock(&mutex);
-}
-
-
-TASK elab_image_TASK(void)
-{
-// register int i, j;
- static unsigned int n_frame = 0;
- char found;
- int pred_x, pred_y;
-
- // Inizializzazione del task
- frameCAB = PXC_GetCab();
-
- while (1) {
- n_frame++;
- sprintf(st, "frame n. %5d", n_frame);
-
- mutex_lock(&mutex);
- grx_text(st, 400, 290, 255, 0);
- mutex_unlock(&mutex);
-
- // Acquisizione immagine corrente
- grabber_frame = cab_getmes(frameCAB);
-
- put_frame(grabber_frame);
-
- // Release CAB
- cab_unget(frameCAB, grabber_frame);
-
- task_endcycle();
- }
-}
-
-
-void start_listener(void);
-
-void framegrabber_close(void *arg)
-{
- PXC_Close();
-}
-
-void init_framegrabber(void)
-{
- register int i;
- KEY_EVT my_key;
-
- // Aggiusta la palette
- for (i = 0; i < 256; i++)
- gray_palette[i] = rgb16(i,i,i);
-
- periodo = PXC_Initiate(3);
- PXC_CAB = PXC_GetCab();
-
- if (!periodo) {
- grx_close();
- cprintf("Problemi nell'inizializzazione del driver\n");
- sys_end();
- } else {
- start_listener();
- }
-
- sys_atrunlevel(framegrabber_close, NULL, RUNLEVEL_BEFORE_EXIT);
-}
-
-
-void start_listener(void)
-{
- SOFT_TASK_MODEL m_soft;
-
- soft_task_default_model(m_soft);
- soft_task_def_met(m_soft,IMAGING_WCET);
- soft_task_def_usemath(m_soft);
- soft_task_def_aperiodic(m_soft);
- soft_task_def_period(m_soft,(periodo));
- soft_task_def_group(m_soft,1);
- soft_task_def_ctrl_jet(m_soft);
-
- image_elab_PID = task_create("imaging", elab_image_TASK, &m_soft, NULL);
-
-/* task_activate( image_elab_PID);
- PXC_Push_Listener(image_elab_PID,2);
- PXC_Start();*/
-}
-
-void start_framegrabber()
-{
- PXC_Push_Listener(image_elab_PID,1);
- PXC_Start();
-}
Index: rel_1_2/thdemo/ball2.c
===================================================================
--- rel_1_2/thdemo/ball2.c (revision 1198)
+++ rel_1_2/thdemo/ball2.c (nonexistent)
@@ -1,156 +0,0 @@
-/*--------------------------------------------------------------*/
-/* SIMULATION OF JUMPING BALLS */
-/*--------------------------------------------------------------*/
-
-/* CVS $Id: ball2.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $ */
-
-
-#include "demo.h"
-#include <kernel/func.h>
-#include <stdlib.h>
-//#include <drivers/glib.h>
-//#include <drivers/keyb.h>
-//#include <math.h>
-
-#define R 2 /* dimension of a ball */
-#define G 9.8 /* acceleration of gravity */
-#define BASE 30 /* position of the floor */
-#define TOP 80 /* initial height of the ball */
-#define XMIN 3 /* min position X of the ball */
-#define XMAX 380 /* max position X of the ball */
-#define VELX 5. /* horizontal ball velocity */
-#define VMIN 11. /* velocit… minima per suono */
-#define ESC 27 /* ASCII code of ESCAPE key */
-#define MAX_P 50 /* max number of balls */
-
-double v0[MAX_P]; /* impact velocity with floor */
-
-/*--------------------------------------------------------------*/
-/* Periodic task for ball simulation */
-/*--------------------------------------------------------------*/
-
-TASK palla(int i)
-{
-int x, y; /* coordinate grafiche pallina */
-int ox, oy; /* vecchia posizione pallina */
-int x0; /* posizione iniziale X pallina */
-float vx, vy; /* velocit… della pallina */
-float t, tx; /* variabile temporale */
-float dt; /* incremento temporale */
-double arg; /* variabile di appoggio */
-
- y = oy = TOP;
- x = ox = x0 = XMIN;
-
- arg = 2. * G * (float)TOP;
- vy = sqrt(arg);
- vx = VELX;// + rand()%10;
- tx = 0.0;
- t = vy / G;
- dt = 0.1;
-
- while (1) {
- y = TOP + vy*t - .5*G*t*t;
- x = x0 + vx * tx;
-
- if (y < BASE) {
- t = 0.0;
- v0[i] = .9 * v0[i];
- // if (v0[i]<VMIN) {
-
- // v0[i] = sqrt(2. * G * (float)TOP);
- // v0[i] = sqrt(arg);// * (1-((float)(rand()%20))/100);
- //vx = vx + rand()%5 - 2;
- //tx = 0.0;
- //x0 = x;
- // }
-
- vy = v0[i];
- y = TOP + vy*t - .5*G*t*t;
- }
-
-
- if (x > XMAX) {
- tx = 0.0;
- x0 = XMAX;
- vx = -vx;
- x = x0 + vx * tx;
- }
-
- if (x < XMIN) {
- tx = 0.0;
- x0 = XMIN;
- vx = -vx;
- x = x0 + vx * tx;
- }
- y = 480-y;
-
- mutex_lock(&mutex);
- grx_disc(ox, oy, R, 0);
- grx_disc(x, y, R, i);
- mutex_unlock(&mutex);
-
- oy = y; ox = x;
- t += dt;
- tx += dt;
- task_endcycle();
- }
-}
-
-
-void ballfun(KEY_EVT *k)
-{
- static int npc = 0; /* number of tasks created */
- SOFT_TASK_MODEL mp;
- int r,g,b;
- PID pid;
-
- if (npc == MAX_P) return;
-
- r = 64 + rand()%192;
- g = 64 + rand()%192;
- b = 64 + rand()%192;
-
- soft_task_default_model(mp);
- soft_task_def_level(mp,1);
- soft_task_def_ctrl_jet(mp);
- soft_task_def_arg(mp, rgb16(r,g,b));
- soft_task_def_group(mp, 1);
- soft_task_def_met(mp, WCET_BALL);
- soft_task_def_period(mp,PERIOD_BALL);
- soft_task_def_usemath(mp);
- pid = task_create("palla", palla, &mp, NULL);
- if (pid != NIL) {
- task_activate(pid);
- npc++;
- }
-}
-
-
-/*--------------------------------------------------------------*/
-/* MAIN process */
-/*--------------------------------------------------------------*/
-
-
-void init_ball(void)
-{
- char c; /* character from keyboard */
- int i; /* pressed number */
- double arg; /* temporary variable */
- KEY_EVT k;
-
- arg = 2. * G * (float)TOP;
- for (i=0; i<MAX_P; i++) v0[i] = sqrt(arg);
-
- mutex_lock(&mutex);
- grx_rect(XMIN-R-1, 480-TOP-BASE-R-1, XMAX+R+1, 480-BASE+R+1, 14);
- mutex_unlock(&mutex);
-
- k.flag = 0;
- k.scan = KEY_SPC;
- k.ascii = ' ';
- keyb_hook(k,ballfun);
-
-}
-
-/*--------------------------------------------------------------*/
Index: rel_1_2/thdemo/makefile
===================================================================
--- rel_1_2/thdemo/makefile (revision 1198)
+++ rel_1_2/thdemo/makefile (nonexistent)
@@ -1,17 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= demo
-
-include $(BASE)/config/example.mk
-
-demo:
- make -f $(SUBMAKE) APP=demo INIT= OTHEROBJS="fft.o camera.o initfile.o jetctrl.o ball.o" SHARKOPT="__FFT__ __OLDCHAR__ __PXC__ __GRX__"
-
-
Index: rel_1_2/simcity/include/keyfunct.h
===================================================================
--- rel_1_2/simcity/include/keyfunct.h (revision 1198)
+++ rel_1_2/simcity/include/keyfunct.h (nonexistent)
@@ -1,10 +0,0 @@
-/*******************************keyfunct.h****************************/
-// keyboard handler functions
-#include <drivers/keyb.h>
-
-void h_car_create(KEY_EVT *);
-void s_car_create(KEY_EVT *);
-void h_car_kill(KEY_EVT *);
-void endfun(KEY_EVT *);
-void refresh(KEY_EVT *);
-void sensor_switch(KEY_EVT *);
Index: rel_1_2/simcity/include/constant.h
===================================================================
--- rel_1_2/simcity/include/constant.h (revision 1198)
+++ rel_1_2/simcity/include/constant.h (nonexistent)
@@ -1,99 +0,0 @@
-/*************************const.h*******************************/
-// constants and new types declaration
-#include <kernel/func.h>
-#define CST
-
-#define NO_SPRITE 8
-
-
-#define GRAPH
-#define SENSOR
-#define MAX_CAR 10
-#define MAX_TL 3
-#define S_POINT 4
-#define PERIOD_CAR 135000 //period for K62 350MHZ
-//#define PERIOD_CAR 87000 //period for PIII 733MHZ
-#define SPERIOD_CAR 13000
-#define SCAR_WCET 4300
-#define SECOND 1000000
-#define TL_WCET 200
-#define CAM_WCET 200
-#define GAUGE_WCET 200
-#define ARROW_WCET 100
-//#define CAR_WCET 7700 //wcet for PIII 733MHZ
-#define CAR_WCET 12400 //wcet for K62 350MHZ
-#define ROW 30
-#define COL 30
-#define NCAR 24
-#define W 640
-#define H 480
-#define SH 12
-#define SW 12
-#define MAX_DIST 50.0
-#define NORM_DIST 15.0
-#define COLL_DIST 25.0
-#define MIN_SPEED 0.0
-#define NORM_SPEED 4.0
-#define MAX_SPEED 6.0
-#define MAX_LOOK 50
-#define LOOK_ANGLE 70
-#define DIST_ANGLE 90
-#define CORR_FACT 0.7
-#define FRANTIC 0.0
-#define POS_RAND
-#define OBL_START 1
-#define DEG_TO_RAD(x) ((float)x)/180.0*3.14
-#define RAD_TO_DEG(x) ((float)x)/3.14*180.0
-#define RANDDIR (rand()%3-1)
-#define L 0
-#define R 1
-#define U 2
-#define D 3
-
-#define DRAW 1
-#define CANCEL 0
-#define VERTICAL 1
-#define HORIZONTAL 0
-
-#define STEER_LEFT 1
-#define STEER_RIGHT -1
-#define STRAIGHT 0
-
-#define CAMX 670
-#define CAMY 120
-#define MAPX 8
-#define MAPY 113
-
-#define FREE 0
-#define STOP 1
-#define CAR 2
-
-/*data types*/
-
-typedef struct car_d {
- int number;
- float xpos,ypos;
- int xp,yp;
- float dist_obs,dist_sem;
- float speed,middle,front,rear,somma;
- int angle,sat;
- char collision,boom,correggi,incrocio;
- char dir,running;
- struct car_d *next;
-} car_data;
-
-typedef struct {
- int x,y;
-} point;
-
-typedef struct {
- char vpos,hpos,tl_name[8];
- point l,r,u,d;
- PID pid;
- DWORD period;
-} tl_data;
-
-
-typedef struct {
- int xpos,ypos,angles;
-} starting_set;
Index: rel_1_2/simcity/include/misc.h
===================================================================
--- rel_1_2/simcity/include/misc.h (revision 1198)
+++ rel_1_2/simcity/include/misc.h (nonexistent)
@@ -1,18 +0,0 @@
-//*****************************misc.h************************************
-// miscellaneous useful functions
-#ifndef CST
-#include "constant.h"
-#endif
-
-int my_rint(float);
-void fill_table();
-void tl_init();
-void set_start_point();
-int returnCarIndex(int);
-int find_col(int,int);
-int find_tl(int,int,int);
-int allinea(int);
-int module(int,int,int,int);
-int normalize(int);
-
-
Index: rel_1_2/simcity/include/draw.h
===================================================================
--- rel_1_2/simcity/include/draw.h (revision 1198)
+++ rel_1_2/simcity/include/draw.h (nonexistent)
@@ -1,14 +0,0 @@
-//****************************draw.h*******************************
-// drawing functions
-#ifndef CST
-#include "constant.h"
-#endif
-
-void drawSprites(int,int,char,char);
-void drawStreet(int,int);
-void get_images();
-void drawCar(int,int,int,char);
-void bold_rect(WORD,WORD,WORD,WORD,BYTE,BYTE,BYTE);
-void draw_scenario();
-void draw_tl(int x,int y,DWORD img[SH][SW]);
-void drawFaces(int,int,short);
Index: rel_1_2/simcity/include/simcity.h
===================================================================
--- rel_1_2/simcity/include/simcity.h (revision 1198)
+++ rel_1_2/simcity/include/simcity.h (nonexistent)
@@ -1,77 +0,0 @@
-/********************************simcity.h***************************/
-// global variables and tasks bodies declaration
-
-#include <kernel/func.h>
-#include <semaphore.h>
-#ifndef CST
-#include "constant.h"
-#endif
-
-/*Global stuff*/
-
-extern car_data car_data_array[MAX_CAR];
-extern tl_data tl_data_array[MAX_TL];
-
-//car starting points
-extern starting_set starting_set_array[S_POINT];
-
-// PID vectors
-extern PID p_table[MAX_CAR];
-extern PID c_table[MAX_CAR];
-extern PID g_table[MAX_CAR];
-extern PID a_table[MAX_CAR];
-
-extern char kill_flag[MAX_CAR];
-//graphic mutex
-extern sem_t mutex;
-
-//kill_flag mutexes
-extern sem_t kill_mutex[MAX_CAR];
-
-//various sprites
-extern DWORD macchine[ROW][COL][NCAR];
-extern DWORD strada[H][W];
-extern BYTE street[H*W*2];
-extern BYTE vbuf[MAX_CAR][ROW*COL*2];
-extern BYTE clrcam[(ROW+2)*(COL+2)*2];
-extern BYTE gauge_img[ROW*COL*2];
-extern BYTE brk_gauge[ROW*COL*2];
-extern BYTE arrow[3][ROW*COL*2];
-extern DWORD sprites[ROW][COL][NO_SPRITE];
-extern BYTE clrscr[800*600*2];
-extern DWORD faces[2][74][47];
-
-extern char sens;
-//sine & cosine look-up tables
-extern float cosine[360],sine[360];
-
-//traffic light sprites
-extern DWORD y_sem[4][SH][SW];
-extern DWORD r_sem[4][SH][SW];
-extern DWORD g_sem[4][SH][SW];
-
-//useful colors
-extern DWORD white;
-extern DWORD black;
-extern DWORD red;
-extern DWORD gray;
-extern DWORD blue;
-extern DWORD green;
-extern DWORD border;
-extern DWORD tl_bg;
-
-//task chain pointers
-extern car_data *free_n,*busy_n,*free_o,*busy_o;
-// car counter
-extern short maxc;
-
-/*function declaration */
-
-/* task bodies*/
-TASK car(car_data *);
-TASK traffic_light(tl_data *);
-TASK camera(int);
-TASK gauge_c(int);
-TASK blink_arrow(int);
-TASK refresher(void *);
-TASK killer(void *);
Index: rel_1_2/simcity/include/proc.h
===================================================================
--- rel_1_2/simcity/include/proc.h (revision 1198)
+++ rel_1_2/simcity/include/proc.h (nonexistent)
@@ -1,23 +0,0 @@
-//***************************proc.h******************************
-// task management functions
-#ifndef CST
-#include "constant.h"
-#endif
-
-
-int add();
-void del(int);
-void init_struct();
-int del_o();
-void gauge_create(char *,int);
-void arrow_create(char *,int);
-void killer_create();
-void ref_create();
-void cam_create(char *,int);
-void stl_create(char *,int);
-void h_create(char *,int);
-void s_create(char *,int);
-void killing(int);
-
-
-
Index: rel_1_2/simcity/include/states.h
===================================================================
--- rel_1_2/simcity/include/states.h (revision 1198)
+++ rel_1_2/simcity/include/states.h (nonexistent)
@@ -1,21 +0,0 @@
-enum stati {
- NORM,
- INC1,
- DX1,
- STR1,
- STR2,
- SX1,
- SX2,
- SX3
-} ;
-
-enum sprite_type {
- EXPL,
- GAUGE,
- ARR_OFF,
- ARR_SX,
- ARR_DX,
- VECCHINA,
- V_SPLAT,
- GAUGE_ROTTO
-};
Index: rel_1_2/simcity/include/car.h
===================================================================
--- rel_1_2/simcity/include/car.h (revision 1198)
+++ rel_1_2/simcity/include/car.h (nonexistent)
@@ -1,10 +0,0 @@
-//*****************************car.h********************************
-// car management functions
-#ifndef CST
-#include "constant.h"
-#endif
-
-char collision_sensor(car_data *);
-int sensore(car_data *);
-void ch_spd(car_data *,char);
-
Index: rel_1_2/simcity/proc.c
===================================================================
--- rel_1_2/simcity/proc.c (revision 1198)
+++ rel_1_2/simcity/proc.c (nonexistent)
@@ -1,393 +0,0 @@
-#include <drivers/glib.h>
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-#include "include/simcity.h"
-#include "include/misc.h"
-#include "include/proc.h"
-
-int add() {
- if(maxc>0 && maxc<MAX_CAR-1) {
- busy_n->next=free_o;
- busy_n=free_o;
- free_o=free_o->next;
- busy_n->next=NULL;
- }
- if(maxc==0) {
- busy_n=busy_o=free_o;
- free_o=free_o->next;
- busy_n->next=NULL;
- }
- if(maxc==MAX_CAR-1) {
- busy_n->next=free_o;
- busy_n=free_o;
- free_o=free_n=NULL;
- busy_n->next=NULL;
- }
- if(maxc<MAX_CAR) {
- maxc++;
- return(busy_n->number);
- } else
- return(-1);
-}
-
-void del(int num) {
- car_data *d,*db;
-
- db=d=busy_o;
- if(maxc>1) {
- while((d->number)!=num) {
- db=d;
- d=d->next;
- }
- if(d==busy_n) {
- db->next=NULL;
- busy_n=db;
- } else if(d==busy_o) {
- busy_o=busy_o->next;
- } else {
- db->next=d->next;
- }
- if(maxc!=MAX_CAR) {
- free_n->next=d;
- free_n=d;
- free_n->next=NULL;
- }
- else {
- free_n=free_o=d;
- }
- }
- else {
- free_n->next=d;
- free_n=d;
- free_n->next=NULL;
- busy_n=busy_o=NULL;
- }
- maxc--;
-}
-
-void init_struct() {
- int i;
-
- free_o=&(car_data_array[0]);
- free_n=&(car_data_array[MAX_CAR-1]);
- busy_n=busy_o=NULL;
- for(i=0;i<MAX_CAR;i++)
- car_data_array[i].number=i;
- for(i=0;i<MAX_CAR;i++) {
- if(i<MAX_CAR-1)
- car_data_array[i].next=&(car_data_array[i+1]);
- else
- car_data_array[i].next=NULL;
- }
- maxc=0;
-}
-
-int del_o() {
-
- if(maxc<MAX_CAR && maxc>1) {
- free_n->next=busy_o;
- free_n=busy_o;
- busy_o=busy_o->next;
- free_n->next=NULL;
- } else
- if(maxc==MAX_CAR) {
- free_n=free_o=busy_o;
- busy_o=busy_o->next;
- free_n->next=NULL;
- } else
- if(maxc==1) {
- free_n->next=busy_o;
- free_n=busy_o;
- free_n->next=NULL;
- busy_o=busy_n=NULL;
- }
- if(maxc>0) {
- maxc--;
- return(free_n->number);
- } else
- return -1;
-}
-
-void gauge_create(char *name,int num) {
- void *par;
- PID pid;
- SOFT_TASK_MODEL stm;
-
- soft_task_default_model(stm);
- soft_task_def_level(stm,1);
- soft_task_def_ctrl_jet(stm);
- par=(void *) num;
- soft_task_def_arg(stm,par);
- soft_task_def_met(stm,GAUGE_WCET);
- soft_task_def_period(stm,PERIOD_CAR);
- soft_task_def_usemath(stm);
- pid = task_create(name, gauge_c, &stm, NULL);
- if (pid == NIL) {
- grx_close();
- perror("stl_create():Could not create task <Gauge_c>");
- sys_abort(1);
- }
- g_table[num]=pid;
- task_activate(pid);
-}
-
-
-void arrow_create(char *name,int num) {
- void *par;
- PID pid;
- SOFT_TASK_MODEL stm;
-
- soft_task_default_model(stm);
- soft_task_def_level(stm,1);
- soft_task_def_ctrl_jet(stm);
- par=(void *) num;
- soft_task_def_arg(stm,par);
- soft_task_def_met(stm,ARROW_WCET);
- soft_task_def_period(stm,PERIOD_CAR*4);
- pid = task_create(name,blink_arrow, &stm, NULL);
- if (pid == NULL) {
- grx_close();
- perror("stl_create():Could not create task <arrow>");
- sys_abort(1);
- }
- a_table[num]=pid;
- task_activate(pid);
-}
-
-void killer_create() {
- void *par;
- PID pid;
- SOFT_TASK_MODEL stm;
-
- soft_task_default_model(stm);
- soft_task_def_level(stm,1);
- soft_task_def_ctrl_jet(stm);
- par=(void *) 0;
- soft_task_def_arg(stm,par);
- soft_task_def_met(stm,1000);
- soft_task_def_period(stm,5*SECOND);
- pid = task_create("killer", killer, &stm, NULL);
- if (pid == NULL) {
- grx_close();
- perror("ref_create():Could not create task <killer>");
- sys_abort(1);
- }
- task_activate(pid);
-}
-
-
-void ref_create() {
- void *par;
- PID pid;
- SOFT_TASK_MODEL stm;
-
- soft_task_default_model(stm);
- soft_task_def_level(stm,1);
- soft_task_def_ctrl_jet(stm);
- par=(void *) 0;
- soft_task_def_arg(stm,par);
- soft_task_def_met(stm,3000);
- soft_task_def_period(stm,4*SECOND);
- pid = task_create("Refresher", refresher, &stm, NULL);
- if (pid == NULL) {
- grx_close();
- perror("ref_create():Could not create task <refresher>");
- sys_abort(1);
- }
- task_activate(pid);
-}
-
-void cam_create(char *name,int num) {
- void *par;
- PID pid;
- SOFT_TASK_MODEL stm;
-
- soft_task_default_model(stm);
- soft_task_def_level(stm,1);
- soft_task_def_ctrl_jet(stm);
- par=(void *) num;
- soft_task_def_arg(stm,par);
- soft_task_def_met(stm,CAM_WCET);
- soft_task_def_period(stm,PERIOD_CAR);
- pid = task_create(name, camera, &stm, NULL);
- if (pid == NULL) {
- grx_close();
- perror("stl_create():Could not create task <Camera>");
- sys_abort(1);
- }
- c_table[num]=pid;
- task_activate(pid);
-}
-
-void stl_create(char *name,int num) {
- void *par;
- PID pid;
- SOFT_TASK_MODEL stm;
-
- soft_task_default_model(stm);
- soft_task_def_level(stm,1);
- soft_task_def_ctrl_jet(stm);
- strcpy(tl_data_array[num].tl_name,name);
- par=(void *) &(tl_data_array[num]);
- soft_task_def_arg(stm,par);
- soft_task_def_met(stm,TL_WCET);
- soft_task_def_period(stm,tl_data_array[num].period);
- pid = task_create(name, traffic_light, &stm, NULL);
- if (pid == NULL) {
- grx_close();
- perror("stl_create():Could not create task <Traffic Light>");
- sys_abort(1);
- }
- tl_data_array[num].pid=pid;
- task_activate(pid);
-}
-
-void h_create(char *name,int num) {
- void *par;
- PID pid;
- int start_point=0;
- short flag=0;
- HARD_TASK_MODEL htm;
- car_data cd,*d;
-
-#ifdef POS_RAND
- start_point=rand()%S_POINT;
- if(busy_o!=NULL)
- do {
- flag=0;
- d=busy_o;
- do {
- if(d->number!=num)
- if(module(starting_set_array[start_point].xpos,d->xp,starting_set_array[start_point].ypos,d->yp)<256) {
- start_point=(start_point+1)%S_POINT;
- flag=1;
- break;
- }
- d=d->next;
- } while(d!=NULL);
- } while(flag);
-#endif
-#ifndef POS_RAND
- start_point=OBL_START;
-#endif
-
- cd.number=num;
- cd.xpos=cd.xp=starting_set_array[start_point].xpos;
- cd.ypos=cd.yp=starting_set_array[start_point].ypos;
- cd.angle=starting_set_array[start_point].angles;
- cd.speed=MIN_SPEED;
- cd.dist_obs=MAX_DIST;
- cd.collision=cd.boom=cd.correggi=cd.somma=0;
- cd.dir=STRAIGHT;
- car_data_array[num]=cd;
- hard_task_default_model(htm);
- hard_task_def_ctrl_jet(htm);
- par=(void *) &(car_data_array[num]);
- hard_task_def_arg(htm,par);
- hard_task_def_wcet(htm, CAR_WCET);
- hard_task_def_mit(htm,PERIOD_CAR);
- hard_task_def_usemath(htm);
- pid = task_create(name, car, &htm, NULL);
- if (pid == NULL) {
- grx_close();
- perror("h_create():Could not create task <hard car>");
- sys_abort(1);
- }
- else {
- p_table[num]=pid;
- sem_wait(&(kill_mutex[num]));
- kill_flag[num]=0;
- car_data_array[num].running=1;
- sem_post(&(kill_mutex[num]));
- task_activate(pid);
- }
-}
-
-void s_create(char *name,int num) {
- void *par;
- PID pid;
- int start_point=0;
- SOFT_TASK_MODEL stm;
- car_data cd,*d;
- short flag=0;
-
-#ifdef POS_RAND
- start_point=rand()%S_POINT;
- if(busy_o!=NULL)
- do {
- flag=0;
- d=busy_o;
- do {
- if(d->number!=num)
- if(module(starting_set_array[start_point].xpos,d->xp,starting_set_array[start_point].ypos,d->yp)<256) {
- start_point=(start_point+1)%S_POINT;
- flag=1;
- break;
- }
- d=d->next;
- } while(d!=NULL);
- } while(flag);
-#endif
-#ifndef POS_RAND
- start_point=OBL_START;
-#endif
-
- cd.number=num;
- cd.xpos=cd.xp=starting_set_array[start_point].xpos;
- cd.ypos=cd.yp=starting_set_array[start_point].ypos;
- cd.angle=starting_set_array[start_point].angles;
- cd.speed=MIN_SPEED;
- cd.dist_obs=MAX_DIST;
- cd.collision=cd.boom=cd.correggi=cd.somma=0;
- cd.dir=STRAIGHT;
- car_data_array[num]=cd;
- soft_task_default_model(stm);
- soft_task_def_level(stm,1);
- soft_task_def_ctrl_jet(stm);
- par=(void *) &(car_data_array[num]);;
- soft_task_def_arg(stm,par);
- soft_task_def_met(stm,SCAR_WCET);
- soft_task_def_period(stm,SPERIOD_CAR);
- soft_task_def_usemath(stm);
- pid = task_create(name, car, &stm, NULL);
- if (pid == NULL) {
- grx_close();
- perror("h_create():Could not create task <soft car>");
- sys_abort(1);
- }
- else {
- p_table[num]=pid;
- sem_wait(&(kill_mutex[num]));
- kill_flag[num]=0;
- car_data_array[num].running=1;
- sem_post(&(kill_mutex[num]));
- task_activate(pid);
- }
-}
-
-void killing(int num) {
- PID car_to_kill,cam_to_kill,gauge_to_kill,a_to_kill;
- int c;
-
- c=car_data_array[num].number*46;
- car_to_kill=p_table[num];
- cam_to_kill=c_table[num];
- gauge_to_kill=g_table[num];
- a_to_kill=a_table[num];
- sem_wait(&(kill_mutex[num]));
- kill_flag[num]=1;
- car_data_array[num].running=0;
- sem_post(&(kill_mutex[num]));
- task_kill(car_to_kill);
- task_kill(cam_to_kill);
- task_kill(gauge_to_kill);
- task_kill(a_to_kill);
- sem_wait(&mutex);
- grx_putimage(car_data_array[num].xp-15,car_data_array[num].yp-15,car_data_array[num].xp+14,car_data_array[num].yp+14,vbuf[car_data_array[num].number]);
- grx_putimage(CAMX-1,CAMY-1+c,CAMX+30,CAMY+30+c,clrcam);
- grx_putimage(CAMX+40-1,CAMY-1+c,CAMX+40+30,CAMY+c+30,clrcam);
- grx_putimage(CAMX+80-1,CAMY-1+c,CAMX+80+30,CAMY+c+30,clrcam);
- grx_text(" ",CAMX,CAMY+c+30,black,black);
- sem_post(&mutex);
-}
Index: rel_1_2/simcity/initfile.c
===================================================================
--- rel_1_2/simcity/initfile.c (revision 1198)
+++ rel_1_2/simcity/initfile.c (nonexistent)
@@ -1,106 +0,0 @@
-//****************************initfile.c*******************************
-#define PI
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-
-#ifndef PI
-#include "modules/rrsoft.h"
-#endif
-
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-#include <drivers/keyb.h>
-
-//#include "ll/i386/x-dos.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-//#define RRTICK 10000
-#define RRTICK 2000
-
-
-void getCars(void);
-void getRoad(void);
-void getSem(void);
-void getSprites(void);
-void getFaces(void);
-void tl_pos();
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
-
-// RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
-// RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //cbs
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- NOP_register_module();
-
- getFaces();
- getCars();
- getRoad();
- getSem();
- getSprites();
- tl_pos();
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-
-#ifdef PI
-void app_mutex_init(mutex_t *m)
-{
- PI_mutexattr_t attr;
-
- PI_mutexattr_default(attr);
-
- mutex_init(m, &attr);
-}
-#else
-void app_mutex_init(mutex_t *m)
-{
- NOP_mutexattr_t attr;
-
- NOP_mutexattr_default(attr);
-
- mutex_init(m, &attr);
-}
-#endif
Index: rel_1_2/simcity/sem/green_d.raw
===================================================================
--- rel_1_2/simcity/sem/green_d.raw (revision 1198)
+++ rel_1_2/simcity/sem/green_d.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/sem/green_u.raw
===================================================================
--- rel_1_2/simcity/sem/green_u.raw (revision 1198)
+++ rel_1_2/simcity/sem/green_u.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/sem/red_l.raw
===================================================================
--- rel_1_2/simcity/sem/red_l.raw (revision 1198)
+++ rel_1_2/simcity/sem/red_l.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/sem/yellow_l.raw
===================================================================
--- rel_1_2/simcity/sem/yellow_l.raw (revision 1198)
+++ rel_1_2/simcity/sem/yellow_l.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/sem/red_r.raw
===================================================================
--- rel_1_2/simcity/sem/red_r.raw (revision 1198)
+++ rel_1_2/simcity/sem/red_r.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€€€€€€€€€€€€€€€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/sem/green_l.raw
===================================================================
--- rel_1_2/simcity/sem/green_l.raw (revision 1198)
+++ rel_1_2/simcity/sem/green_l.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/sem/yellow_r.raw
===================================================================
--- rel_1_2/simcity/sem/yellow_r.raw (revision 1198)
+++ rel_1_2/simcity/sem/yellow_r.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/sem/red_d.raw
===================================================================
--- rel_1_2/simcity/sem/red_d.raw (revision 1198)
+++ rel_1_2/simcity/sem/red_d.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/sem/red_u.raw
===================================================================
--- rel_1_2/simcity/sem/red_u.raw (revision 1198)
+++ rel_1_2/simcity/sem/red_u.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/sem/yellow_d.raw
===================================================================
--- rel_1_2/simcity/sem/yellow_d.raw (revision 1198)
+++ rel_1_2/simcity/sem/yellow_d.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/sem/yellow_u.raw
===================================================================
--- rel_1_2/simcity/sem/yellow_u.raw (revision 1198)
+++ rel_1_2/simcity/sem/yellow_u.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/sem/green_r.raw
===================================================================
--- rel_1_2/simcity/sem/green_r.raw (revision 1198)
+++ rel_1_2/simcity/sem/green_r.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€€€€€€€€€€€€€€€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/car.c
===================================================================
--- rel_1_2/simcity/car.c (revision 1198)
+++ rel_1_2/simcity/car.c (nonexistent)
@@ -1,175 +0,0 @@
-#include <drivers/glib.h>
-#include <stdlib.h>
-#include <math.h>
-#include "include/simcity.h"
-#include "include/misc.h"
-#include "include/car.h"
-#include "include/draw.h"
-
-char collision_sensor(car_data *cd) {
- float i,dx,dx1,dy,dy1,deltax,deltay;
- int colore,colore1;
- int speed_done=0;
- char col=FREE;
-
- dx=cd->xpos+2.0*cosine[normalize(cd->angle+90)];
- dy=cd->ypos-2.0*sine[normalize(cd->angle+90)];
- dx1=cd->xpos-8.0*cosine[normalize(cd->angle+90)];
- dy1=cd->ypos+8.0*sine[normalize(cd->angle+90)];
-
- for (i=0.0;i<MAX_LOOK;i+=0.1) {
- deltax=i*cosine[normalize(cd->angle)];
- deltay=i*sine[normalize(cd->angle)];
- sem_wait(&mutex);
- colore=grx_getpixel(my_rint(dx+deltax),my_rint(dy-deltay));
- colore1=grx_getpixel(my_rint(dx1+deltax),my_rint(dy1-deltay));
- sem_post(&mutex);
- if (((colore==white)||(colore1==white) || ((colore==red)||(colore1==red)))) {
- if((colore==white)||(colore1==white))
- col=STOP;
- else
- col=CAR;
- cd->dist_obs=i;
- cd->collision=1;
- speed_done=1;
- }
- if (!speed_done) {
- if (sens) {
- sem_wait(&mutex);
- grx_plot(my_rint(dx+deltax),my_rint(dy-deltay),gray);
- grx_plot(my_rint(dx1+deltax),my_rint(dy1-deltay),gray);
- sem_post(&mutex);
- }
- }
- }
- if (!speed_done) {
- cd->collision=0;
- cd->dist_obs=MAX_LOOK;
- }
- return col;
-}
-
-int sensore(car_data *cd) {
- int col_front,col_rear,col_middle;
- int done_front=0,done_rear=0,done_middle=0;
- float front,rear,middle,store_middle;
- int angolo;
- float i;
- float x1,y1,x05,y05;
- float xs,ys,xs1,ys1;
- float coordx,coordy,distx,disty;
-
- cd->front=cd->rear=cd->middle=front=rear=middle=store_middle=NORM_DIST;
- x1=cd->xpos-10.0*cosine[normalize(cd->angle)]; // coordinata sensore dietro
- y1=cd->ypos+10.0*sine[normalize(cd->angle)];
-
- x05=cd->xpos-5.0*cosine[normalize(cd->angle)]; // coordinata sensore mezzo
- y05=cd->ypos+5.0*sine[normalize(cd->angle)];
-
- for (i=0.0;i<MAX_DIST;i+=0.1) {
- coordx=i*cosine[normalize(cd->angle-LOOK_ANGLE)];
- coordy=i*sine[normalize(cd->angle-LOOK_ANGLE)];
- distx=i*cosine[normalize(cd->angle-DIST_ANGLE)];
- disty=i*sine[normalize(cd->angle-DIST_ANGLE)];
- col_front=grx_getpixel(my_rint(cd->xpos+coordx),my_rint(cd->ypos-coordy));
- col_rear=grx_getpixel(my_rint(x1+coordx),my_rint(y1-coordy));
- col_middle=grx_getpixel(my_rint(x05+distx),my_rint(y05-disty));
- if ((col_front==border) && !done_front) {
- done_front=1;
- cd->front=front=i;
- }
- if ((col_middle==border) && !done_middle) {
- done_middle=1;
- middle=cd->middle=i;
- }
- if ((col_rear==border) && !done_rear) {
- done_rear=1;
- cd->rear=rear=i;
- }
- if (sens) {
- sem_wait(&mutex);
- if (!done_front) {
- grx_plot(my_rint(cd->xpos+coordx),my_rint(cd->ypos-coordy),gray);
- }
- if (!done_rear) {
- grx_plot(my_rint(x1+coordx),my_rint(y1-coordy),blue);
- }
- if (!done_middle) {
- grx_plot(my_rint(x05+distx),my_rint(y05-disty),green);
- }
- sem_post(&mutex);
- }
- }
-
- if (!done_front) {
- front=cd->front=MAX_DIST;
- }
- if (!done_rear) {
- rear=cd->rear=MAX_DIST;
- }
- if (!done_middle) {
- cd->middle=middle=MAX_DIST;
- }
- xs=cd->xpos+front*cosine[normalize(cd->angle-LOOK_ANGLE)];
- xs1=x1+rear*cosine[normalize(cd->angle-LOOK_ANGLE)];
- ys=cd->ypos-front*sine[normalize(cd->angle-LOOK_ANGLE)];
- ys1=y1-rear*sine[normalize(cd->angle-LOOK_ANGLE)];
- if (xs==xs1) {
- angolo=90;
- } else {
- angolo=my_rint(RAD_TO_DEG(atan((-ys1+ys)/(xs1-xs))));
- }
-
- if (angolo<0) angolo+=360;
- if (angolo>=360) angolo-=360;
-
- if ((ys-ys1<0) && (xs1-xs>0)) {
- angolo-=180;
- }
- if ((ys-ys1>=0) && (xs1-xs>0)) {
- angolo+=180;
- }
-
- if ((xs1-xs==0) && (ys-ys1>0)) {
- angolo=270;
- }
-
- if (abs(middle-NORM_DIST)>FRANTIC) {
- cd->correggi=1;
- } else {
- cd->somma=0;
- cd->correggi=0;
- }
-
- if (cd->correggi) {
- if (middle>NORM_DIST) {
- cd->somma-=CORR_FACT;
- }
- if (middle<NORM_DIST) {
- cd->somma+=CORR_FACT;
- }
- }
- angolo+=cd->somma;
- return angolo;
-}
-
-void ch_spd(car_data *cd,char ob_type) {
- float set_spd=0.0;
- float bf;
-
- if(cd->collision) {
- if(ob_type==STOP)
- bf=0.001;
- else
- bf=0.7;
- set_spd=cd->speed-(MAX_LOOK-cd->dist_obs)*bf;
- if(set_spd<0)
- set_spd=0;
- }
- else {
- set_spd=cd->speed+0.4;
- if(set_spd>MAX_SPEED)
- set_spd=MAX_SPEED;
- }
- cd->speed=set_spd;
-}
Index: rel_1_2/simcity/reading.c
===================================================================
--- rel_1_2/simcity/reading.c (revision 1198)
+++ rel_1_2/simcity/reading.c (nonexistent)
@@ -1,237 +0,0 @@
-/********************************************reading.c******************************/
-#include <kernel/func.h>
-#include <drivers/glib.h>
-#include <ll/i386/x-dos.h>
-#include <stdlib.h>
-#include <string.h>
-#include "include/constant.h"
-#define rgb rgb16
-
-DWORD macchine[ROW][COL][NCAR];
-DWORD strada[H][W];
-DWORD sprites[ROW][COL][NO_SPRITE];
-DWORD y_sem[4][SH][SW];
-DWORD r_sem[4][SH][SW];
-DWORD g_sem[4][SH][SW];
-DWORD faces[2][74][47];
-extern tl_data tl_data_array[MAX_TL];
-
-char nomefile[17];
-char nomestrada[17];
-char nomesem[17];
-char nomesprite[16];
-
-void getSem() {
- int i,j,k,count;
- BYTE colore[3];
- DOS_FILE *fp;
- char letter[5];
-
- strcpy(letter,"lrud");
- strcpy(nomesem,"sem/green_ .raw");
-
-//green traffic light....
- for(k=0;k<4;k++) {
- nomesem[10]=letter[k];
- fp=DOS_fopen(nomesem,"r");
- if(!fp) {
- perror(nomesem);
- sys_abort(1);
- }
- for(i=0;i<SH;i++) {
- for(j=0;j<SW;j++) {
- count=DOS_fread(&colore,sizeof(BYTE),3,fp);
- if(count!=3) break;
- g_sem[k][i][j]=rgb(colore[0],colore[1],colore[2]);
- }
- }
- DOS_fclose(fp);
- fp=0;
- }
-
-//red traffic light...
- strcpy(nomesem,"sem/red_ .raw");
- for(k=0;k<4;k++) {
- nomesem[8]=letter[k];
- fp=DOS_fopen(nomesem,"r");
- if(!fp) {
- perror(nomesem);
- sys_abort(1);
- }
- for(i=0;i<SH;i++) {
- for(j=0;j<SW;j++) {
- count=DOS_fread(&colore,sizeof(BYTE),3,fp);
- if(count!=3) break;
- r_sem[k][i][j]=rgb(colore[0],colore[1],colore[2]);
- }
- }
- DOS_fclose(fp);
- fp=0;
- }
-
-//yellow traffic light...
- strcpy(nomesem,"sem/yellow_ .raw");
- for(k=0;k<4;k++) {
- nomesem[11]=letter[k];
- fp=DOS_fopen(nomesem,"r");
- if(!fp) {
- perror(nomesem);
- sys_abort(1);
- }
- for(i=0;i<SH;i++) {
- for(j=0;j<SW;j++) {
- count=DOS_fread(&colore,sizeof(BYTE),3,fp);
- if(count!=3) break;
- y_sem[k][i][j]=rgb(colore[0],colore[1],colore[2]);
- }
- }
- DOS_fclose(fp);
- fp=0;
- }
-}
-
-void getCars() {
- int i,j,k,l,index;
- int tmp;
- char id_car[3];
- BYTE colore[3];
- DOS_FILE *fp;
-
- strcpy(nomefile,"img/car_XXXn.raw");
- k=0;
- for (index=0;index<360;index+=15) {
- tmp=index;
- for (l=2;l>=0;l--) {
- id_car[l]=tmp%10+'0';
- tmp/=10;
- }
- nomefile[8]=id_car[0];
- nomefile[9]=id_car[1];
- nomefile[10]=id_car[2];
- fp=DOS_fopen(nomefile,"r");
- if (!fp) {
- perror(nomefile);
- sys_abort(1);
- }
-
- for (i=0;i<ROW;i++) {
- for (j=0;j<COL;j++) {
- DOS_fread(&colore,sizeof(BYTE),3,fp);
- macchine[i][j][k]=rgb(colore[0],colore[1],colore[2]);
- }
- }
- DOS_fclose(fp);
- fp=0;
- k++;
- }
-}
-
-void getRoad() {
- DOS_FILE *fp;
- int i,j,test;
- BYTE colore[3];
-
- strcpy(nomestrada,"img/street.raw");
- fp=DOS_fopen(nomestrada,"r");
- if (!fp) {
- perror(nomestrada);
- sys_abort(1);
- }
-
- for (i=0;i<H;i++) {
- for (j=0;j<W;j++) {
- test=DOS_fread(&colore,sizeof(BYTE),3,fp);
- if(test!=3) {
- perror("Few bytes read!!!!!!\n");
-
- }
- strada[i][j]=rgb(colore[0],colore[1],colore[2]);
- }
- }
- DOS_fclose(fp);
-}
-
-void getSprites(void) {
- int i,j,k;
- DOS_FILE *fp;
- BYTE colore[3];
-
- strcpy(nomesprite,"sprite/sp_X.raw");
- for (k=0;k<NO_SPRITE;k++) {
- nomesprite[10]=k+'0';
- fp=DOS_fopen(nomesprite,"r");
- if (!fp) {
- perror(nomesprite);
- sys_abort(1);
- }
- for (i=0;i<ROW;i++) {
- for (j=0;j<COL;j++) {
- DOS_fread(&colore,sizeof(BYTE),3,fp);
- sprites[i][j][k]=rgb(colore[0],colore[1],colore[2]);
- }
- }
- DOS_fclose(fp);
- fp=0;
- }
-}
-
-void tl_pos(void) {
- DOS_FILE *fp;
- int i;
- char buf[7];
- int dimx,dimy;
-
- fp=DOS_fopen("sem.raw","r");
- if (!fp) {
- perror("sem.raw");
- sys_abort(1);
- }
- buf[6]='\0';
- for (i=0;i<MAX_TL;i++) {
- DOS_fread(&buf,sizeof(char),6,fp);
- dimx=(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
- dimy=(buf[3]-'0')*100+(buf[4]-'0')*10+(buf[5]-'0');
- tl_data_array[i].u.x=dimx;
- tl_data_array[i].u.y=dimy;
- DOS_fread(&buf,sizeof(char),6,fp);
- dimx=(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
- dimy=(buf[3]-'0')*100+(buf[4]-'0')*10+(buf[5]-'0');
- tl_data_array[i].d.x=dimx;
- tl_data_array[i].d.y=dimy;
- DOS_fread(&buf,sizeof(char),6,fp);
- dimx=(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
- dimy=(buf[3]-'0')*100+(buf[4]-'0')*10+(buf[5]-'0');
- tl_data_array[i].l.x=dimx;
- tl_data_array[i].l.y=dimy;
- DOS_fread(&buf,sizeof(char),6,fp);
- dimx=(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
- dimy=(buf[3]-'0')*100+(buf[4]-'0')*10+(buf[5]-'0');
- tl_data_array[i].r.x=dimx;
- tl_data_array[i].r.y=dimy;
- }
- DOS_fclose(fp);
-}
-
-void getFaces(void) {
- int i,j,k;
- DOS_FILE *fp;
- BYTE colore[3];
-
- strcpy(nomesprite,"img/bbX.raw");
- for (k=0;k<2;k++) {
- nomesprite[6]=k+'0';
- fp=DOS_fopen(nomesprite,"r");
- if (!fp) {
- perror(nomesprite);
- sys_abort(1);
- }
- for (i=0;i<74;i++) {
- for (j=0;j<47;j++) {
- DOS_fread(&colore,sizeof(BYTE),3,fp);
- faces[k][i][j]=rgb(colore[0],colore[1],colore[2]);
- }
- }
- DOS_fclose(fp);
- fp=0;
- }
-}
Index: rel_1_2/simcity/simcity.c
===================================================================
--- rel_1_2/simcity/simcity.c (revision 1198)
+++ rel_1_2/simcity/simcity.c (nonexistent)
@@ -1,154 +0,0 @@
-/************************** Simcity ************************/
-// Main,initialization functions and global variables allocation
-#include <kernel/func.h>
-#include <string.h>
-#include <stdlib.h>
-#include <drivers/keyb.h>
-#include <drivers/glib.h>
-#include <kernel/kern.h>
-#include <semaphore.h>
-#include <math.h>
-#include "include/constant.h"
-#include "include/misc.h"
-#include "include/draw.h"
-#include "include/proc.h"
-#define rgb rgb16
-
-/* graphic mutex... */
-sem_t mutex;
-//kill flag mutexes
-sem_t kill_mutex[MAX_CAR];
-
-// various sprites to use with grx_putimage()....
-BYTE vbuf[MAX_CAR][ROW*COL*2];
-BYTE clrscr[800*600*2];
-BYTE clrcam[(ROW+2)*(COL+2)*2];
-BYTE gauge_img[ROW*COL*2];
-BYTE brk_gauge[ROW*COL*2];
-BYTE arrow[3][ROW*COL*2];
-BYTE street[H*W*2];
-
-//task chain pointers
-car_data *free_n,*free_o,*busy_n,*busy_o;
-
-// various sprites to plot
-extern DWORD macchine[ROW][COL][NCAR];
-extern DWORD sprites[ROW][COL][NO_SPRITE];
-extern DWORD strada[H][W];
-
-//resolution to use
-WORD r=600;
-WORD c=800;
-BYTE bpp=16;
-
-// useful colors...
-DWORD white;
-DWORD black;
-DWORD red;
-DWORD gray;
-DWORD blue;
-DWORD green;
-DWORD border;
-DWORD tl_bg;
-
-//PID vectors
-
-PID p_table[MAX_CAR];
-PID c_table[MAX_CAR];
-PID g_table[MAX_CAR];
-PID a_table[MAX_CAR];
-
-char kill_flag[MAX_CAR];
-float cosine[360],sine[360];
-
-// data structures
-car_data car_data_array[MAX_CAR];
-tl_data tl_data_array[MAX_TL];
-starting_set starting_set_array[S_POINT];
-
-void keyb_h(void);
-
-static void version( void )
-{
- cprintf("\n\nDemo presented by\n");
- cprintf("Aguzzi Marco\n");
- cprintf(" &\n");
- cprintf("Ferrari Fabio\n");
-}
-
-void my_close(void *arg)
-{
- grx_close();
- kern_printf("Shutting down SIMCITY\n");
-}
-
-int main(int argc, char **argv)
-{
- int i;
- char tl_name[4];
-
- version();
-
- sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT);
-
-//resetting kill flags
- for(i=0;i<MAX_CAR;i++) {
- p_table[i]=0;
- kill_flag[i]=0;
- }
-
-// graphic mode initialization
-#ifdef GRAPH
- if (grx_init() < 1) {
- kern_printf("Error initializing graphics\n");
- sys_abort(1);
- }
- if (grx_open(c,r,bpp) < 0) {
- kern_printf("GRX Open Err\n");
- sys_abort(1);
- }
- get_images();
-#endif
- srand(sys_gettime(NULL));
-
-//init the graphic mutex
- sem_init(&mutex,1,1);
-//init kill flag mutexes
- for(i=0;i<MAX_CAR;i++) sem_init(&(kill_mutex[i]),1,1);
-//fill sine & cosine lookup tables
- fill_table();
-/*init keys*/
- keyb_h();
- set_start_point();
- tl_init();
- init_struct();
-
-/* useful colors ... */
- white = rgb(255,255,255);
- black = rgb(0,0,0);
- red = rgb(255,0,0);
- gray = rgb(210,210,210);
- blue = rgb(0,0,220);
- green = rgb(0,255,0);
- border= rgb(128,128,128);
- tl_bg= rgb(0,128,0);
-#ifdef GRAPH
-/* paint scenario*/
- draw_scenario();
-#endif
-#ifndef GRAPH
- cprintf("Main: max_tl:%d\n",MAX_TL);
-#endif
-
-//creating refresher,killer and traffic light processes...
- ref_create();
- killer_create();
- for(i=0;i<MAX_TL;i++) {
- sprintf(tl_name,"tl%d",i+1);
-#ifndef GRAPH
- cprintf("main:tname=%s",tl_name);
-#endif
- stl_create(tl_name,i);
- }
- return 0;
-}
Index: rel_1_2/simcity/tasks.c
===================================================================
--- rel_1_2/simcity/tasks.c (revision 1198)
+++ rel_1_2/simcity/tasks.c (nonexistent)
@@ -1,409 +0,0 @@
-//*******************************tasks.c************************************
-// task bodies
-#include <drivers/glib.h>
-#include <stdlib.h>
-#include <string.h>
-#include <kernel/func.h>
-#include <drivers/glib.h>
-#include <semaphore.h>
-#include <math.h>
-#include "include/simcity.h"
-#include "include/states.h"
-#include "include/draw.h"
-#include "include/misc.h"
-#include "include/car.h"
-#include "include/proc.h"
-#define rgb rgb16
-
-/*extern starting_set starting_set_array[S_POINT];
-extern short maxc; */
-
-TASK killer(void *arg) {
- short i,j=0;
- DWORD col[3];
- char flag=0;
-
- col[0]=red;
- col[1]=green;
- col[2]=white;
-
- while(1) {
- if(maxc>0) {
- for(i=0;i<MAX_CAR;i++) {
- sem_wait(&(kill_mutex[i]));
- if(car_data_array[i].boom && car_data_array[i].running) flag=1;
- else flag=0;
- sem_post(&(kill_mutex[i]));
- if(flag) {
- del(i);
- killing(i);
- }
- }
- }
- j=(j+1)%3;
- sem_wait(&mutex);
- grx_text("Killer active!",CAMX,CAMY+MAX_CAR*46,col[j],black);
- sem_post(&mutex);
- task_endcycle();
- }
-}
-
-
-TASK refresher(void *arg) {
- int i;
- tl_data *d;
-
- while(1) {
- sem_wait(&mutex);
- grx_putimage(MAPX,MAPY,MAPX+W-1,MAPY+H-1,street);
- for(i=0;i<MAX_TL;i++) {
- d=&(tl_data_array[i]);
- if((d->vpos=='g')) {
- draw_tl(d->u.x,d->u.y,g_sem[U]);
- draw_tl(d->d.x,d->d.y,g_sem[D]);
- draw_tl(d->l.x,d->l.y,r_sem[L]);
- draw_tl(d->r.x,d->r.y,r_sem[R]);
- } else if(d->vpos=='y') {
- draw_tl(d->u.x,d->u.y,y_sem[U]);
- draw_tl(d->d.x,d->d.y,y_sem[D]);
- draw_tl(d->l.x,d->l.y,r_sem[L]);
- draw_tl(d->r.x,d->r.y,r_sem[R]);
- } else if(d->hpos=='g') {
- draw_tl(d->u.x,d->u.y,r_sem[U]);
- draw_tl(d->d.x,d->d.y,r_sem[D]);
- draw_tl(d->l.x,d->l.y,g_sem[L]);
- draw_tl(d->r.x,d->r.y,g_sem[R]);
- } else if(d->hpos=='y') {
- draw_tl(d->u.x,d->u.y,r_sem[U]);
- draw_tl(d->d.x,d->d.y,r_sem[D]);
- draw_tl(d->l.x,d->l.y,y_sem[L]);
- draw_tl(d->r.x,d->r.y,y_sem[R]);
- }
- }
- sem_post(&mutex);
- task_endcycle();
- }
-}
-
-TASK blink_arrow(int number) {
- char ld=0,prev=0,dir=0;
- short c;
- BYTE *arrow_img;
-
- c=number*46;
- while(1) {
- if(kill_flag[number]) {
- return 0;
- }
- if(!car_data_array[number].boom) {
- dir=car_data_array[number].dir+1;
- if(dir==prev) {
- ld=(ld+1)%2;
- if(ld==1)
- arrow_img=arrow[(int)dir];
- else
- arrow_img=arrow[1];
-
- sem_wait(&mutex);
- grx_putimage(CAMX+80,CAMY-1+c,CAMX+80+29,CAMY-1+c+29,arrow_img);
- sem_post(&mutex);
- } else {
- prev=dir;
- ld=0;
- sem_wait(&mutex);
- grx_putimage(CAMX+80,CAMY-1+c,CAMX+80+29,CAMY-1+c+29,arrow[(int)dir]);
- sem_post(&mutex);
- }
- }
- task_endcycle();
- }
-}
-
-
-TASK gauge_c(int number) {
- int c;
- float angle,ro;
- int x,y;
- char vel[5];
-
- c=number*46;
- while(1) {
- if(kill_flag[number]) {
- return 0;
- }
- if(!car_data_array[number].boom) {
- angle=180.0*car_data_array[number].speed/MAX_SPEED;
- sprintf(vel,"%.1f",car_data_array[number].speed);
- ro=9.0;
- y=my_rint(ro*sine[my_rint(angle)]);
- x=my_rint(ro*cosine[my_rint(angle)]);
- sem_wait(&mutex);
- grx_putimage(CAMX,CAMY+c,CAMX+29,CAMY+29+c,gauge_img);
- grx_line(CAMX+14,CAMY-1+c+25,CAMX+14-x,CAMY-1+c+25-y,blue);
- grx_text(vel,CAMX,CAMY+c+30,white,black);
- sem_post(&mutex);
- } else {
- sem_wait(&mutex);
- grx_putimage(CAMX,CAMY+c,CAMX+29,CAMY+29+c,brk_gauge);
- sem_post(&mutex);
- }
- task_endcycle();
- }
-}
-
-TASK camera(int number) {
- int c;
-
- c=number*46;
- grx_rect(CAMX+40-1,CAMY-1+c,CAMX+40+30,CAMY+30+c,green);
- while(1) {
- if(kill_flag[number]) {
- return 0;
- }
- sem_wait(&mutex);
- grx_putimage(CAMX+40,CAMY+c,CAMX+40+29,CAMY+c+29,vbuf[number]);
- sem_post(&mutex);
- task_endcycle();
- }
-}
-
-TASK traffic_light(tl_data *d) {
- char hpos,vpos,flag;
-
- flag=0;
- vpos=d->vpos;
- if(vpos=='g') {
- hpos='r';
-#ifdef GRAPH
- sem_wait(&mutex);
- draw_tl(d->l.x,d->l.y,r_sem[L]);
- draw_tl(d->r.x,d->r.y,r_sem[R]);
- draw_tl(d->u.x,d->u.y,g_sem[U]);
- draw_tl(d->d.x,d->d.y,g_sem[D]);
- sem_post(&mutex);
-#endif
- } else {
- vpos='r';
- hpos='g';
-#ifdef GRAPH
- sem_wait(&mutex);
- draw_tl(d->l.x,d->l.y,g_sem[L]);
- draw_tl(d->r.x,d->r.y,g_sem[R]);
- draw_tl(d->u.x,d->u.y,r_sem[U]);
- draw_tl(d->d.x,d->d.y,r_sem[D]);
- sem_post(&mutex);
-#endif
- }
- task_endcycle();
- while(1) {
- if(vpos=='g') {
- vpos='y';
- flag=1;
-#ifdef GRAPH
- sem_wait(&mutex);
- draw_tl(d->u.x,d->u.y,y_sem[U]);
- draw_tl(d->d.x,d->d.y,y_sem[D]);
- sem_post(&mutex);
-#endif
- }
- if((vpos=='y')&&(!flag)) {
- vpos='r';
- hpos='g';
- flag=1;
-#ifdef GRAPH
- sem_wait(&mutex);
- draw_tl(d->u.x,d->u.y,r_sem[U]);
- draw_tl(d->d.x,d->d.y,r_sem[D]);
- draw_tl(d->l.x,d->l.y,g_sem[L]);
- draw_tl(d->r.x,d->r.y,g_sem[R]);
- sem_post(&mutex);
-#endif
- }
- if((vpos=='r')&&(!flag)) {
- if(hpos=='g') {
- hpos='y';
- flag=1;
-#ifdef GRAPH
- sem_wait(&mutex);
- draw_tl(d->l.x,d->l.y,y_sem[L]);
- draw_tl(d->r.x,d->r.y,y_sem[R]);
- sem_post(&mutex);
-#endif
- }
- if((hpos=='y')&&(!flag)) {
- hpos='r';
- vpos='g';
-#ifdef GRAPH
- sem_wait(&mutex);
- draw_tl(d->l.x,d->l.y,r_sem[L]);
- draw_tl(d->r.x,d->r.y,r_sem[R]);
- draw_tl(d->u.x,d->u.y,g_sem[U]);
- draw_tl(d->d.x,d->d.y,g_sem[D]);
- sem_post(&mutex);
-#endif
- }
- }
- flag=0;
- d->vpos=vpos;
- d->hpos=hpos;
-#ifndef GRAPH
- sem_wait(&mutex);
- cprintf("semaforo %s: verticale:%c orizz.:%c\n",d->tl_name,vpos,hpos);
- sem_post(&mutex);
-#endif
- task_endcycle();
- }
-}
-
-TASK car(car_data *cd) {
- char ob_type=FREE;
- int start_point,sat_angle=0;
- int tl=0;
- short stato=NORM,dir_flag=0;
-
- sem_wait(&(kill_mutex[cd->number]));
- while(kill_flag[cd->number]){
- cd->running=0;
- sem_post(&(kill_mutex[cd->number]));
- return 0;
- }
- sem_post(&(kill_mutex[cd->number]));
- while(1) {
- sem_wait(&(kill_mutex[cd->number]));
- while(kill_flag[cd->number]){
- cd->running=0;
- sem_post(&(kill_mutex[cd->number]));
- return 0;
- }
- sem_post(&(kill_mutex[cd->number]));
- if(cd->xp>630||cd->yp>590||cd->xp<18||cd->yp<MAPY+3) {
- start_point=rand()%S_POINT;
- if(start_point==2)
- start_point++;
- cd->xpos=cd->xp=starting_set_array[start_point].xpos;
- cd->ypos=cd->yp=starting_set_array[start_point].ypos;
- cd->angle=starting_set_array[start_point].angles;
- }
- if (!cd->boom) {
-// Control State Machine
- if(stato==NORM) {
- cd->dir=STRAIGHT;
- ob_type=collision_sensor(cd);
- ch_spd(cd,ob_type);
- if(cd->dist_obs<30 && ob_type==STOP) {
- stato=INC1;
- }
- if(ob_type==FREE || cd->dist_obs>=27 || cd->speed>=2.0) {
- cd->angle=sensore(cd);
- cd->angle=normalize(cd->angle);
- }
- }
- if(stato==INC1) {
- tl=find_tl(cd->angle,cd->xp,cd->yp);
- if(!dir_flag)
- cd->dir=rand()%3-1;
- if(find_col(cd->angle,tl)=='g') {
- switch(cd->dir) {
- case STEER_RIGHT:
- stato=DX1;
- break;
- case STRAIGHT:
- case STEER_LEFT:
- stato=STR1;
- break;
- default:
- stato=DX1;
- }
- } else {
- cd->speed=0.0;
- dir_flag=1;
- }
- }
- if(stato==DX1) {
- dir_flag=0;
- cd->speed=4.0;
- cd->angle=sensore(cd);
- if(ob_type!=STOP)
- stato=NORM;
- else {
- ob_type=collision_sensor(cd);
- if(ob_type==CAR)
- ch_spd(cd,ob_type);
- }
- }
- if(stato==STR1) {
- dir_flag=0;
- cd->angle=allinea(cd->angle);
- sensore(cd);
- cd->speed=4.0;
- ob_type=collision_sensor(cd);
- if(ob_type==CAR)
- ch_spd(cd,ob_type);
- if(cd->middle==MAX_DIST) {
- if(cd->dir==STRAIGHT)
- stato=STR2;
- else {
- sat_angle=cd->angle+90;
- stato=SX1;
- }
- }
- }
- if(stato==STR2) {
- cd->speed=4.0;
- sensore(cd);
- ob_type=collision_sensor(cd);
- if(ob_type==CAR)
- ch_spd(cd,ob_type);
- if(abs(cd->front-cd->rear)<0.1 && ((cd->middle-NORM_DIST)<7.0))
- stato=NORM;
- }
- if(stato==SX1) {
- cd->speed=4.0;
- sensore(cd);
- ob_type=collision_sensor(cd);
- if(ob_type==CAR)
- ch_spd(cd,ob_type);
- else {
- cd->angle+=7;
- if(cd->angle>=sat_angle) {
- cd->angle=sat_angle;
- }
- }
- if(abs(cd->front-cd->rear)<0.1 && ((cd->middle-NORM_DIST)<7.0))
- stato=NORM;
- }
- }
- if (cd->dist_obs<COLL_DIST && ob_type==CAR) {
- cd->boom=1;
- cd->speed=0.0;
- }
- sem_wait(&mutex);
- grx_getimage(cd->xp-15,cd->yp-15,cd->xp+14,cd->yp+14,vbuf[cd->number]);
- if (cd->boom==0) {
- drawCar(cd->xp,cd->yp,cd->angle,DRAW);
- }
- if (cd->boom==1) {
- drawSprites(cd->xp,cd->yp,0,DRAW);
- }
- sem_post(&mutex);
- task_endcycle();
- sem_wait(&mutex);
- if (cd->boom==0) {
- grx_putimage(cd->xp-15,cd->yp-15,cd->xp+14,cd->yp+14,vbuf[cd->number]);
- } else {
- drawSprites(cd->xp,cd->yp,0,CANCEL);
- }
- sem_post(&mutex);
- sem_wait(&(kill_mutex[cd->number]));
- while(kill_flag[cd->number]){
- cd->running=0;
- sem_post(&(kill_mutex[cd->number]));
- return 0;
- }
- sem_post(&(kill_mutex[cd->number]));
- cd->xpos+=cd->speed*cos(DEG_TO_RAD(cd->angle));
- cd->ypos-=cd->speed*sin(DEG_TO_RAD(cd->angle));
- cd->xp=my_rint(cd->xpos);
- cd->yp=my_rint(cd->ypos);
- }
-}
Index: rel_1_2/simcity/sprite/sp_0.raw
===================================================================
--- rel_1_2/simcity/sprite/sp_0.raw (revision 1198)
+++ rel_1_2/simcity/sprite/sp_0.raw (nonexistent)
@@ -1 +0,0 @@
-ÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÀÀÀÿÿÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÀÀÀÿÿÿÀÀÀÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿ€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÀÀÀÿÿÿÀÀÀÀÀÀÀÀÀÿÿÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿ€€ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿ€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/sprite/sp_1.raw
===================================================================
--- rel_1_2/simcity/sprite/sp_1.raw (revision 1198)
+++ rel_1_2/simcity/sprite/sp_1.raw (nonexistent)
@@ -1 +0,0 @@
-vtvÀÀÀÀÀÀÀÀÀÂÀÂÂÀÂÂÀÂÀÀÀ'&'œ›œ•—•{{€€{{~~||{{€€µ´µKLKÂÀ‰Š‰~~RNRMNMRNRNONPOPRORaba~~¦¥¦vtv'''ÀÀÀ~~tutRQRÞÝÞÞÛÞÞÝÞXYXÞÛÞÞÛÞ¢¤¢XYX{{™™™˜˜˜ŠŽŠ€}€jljikiÞÛÞXWXÞÝÞÙÛÙÞÛÞÜÛÜÚÝÚXYXÁ¿ÁRMR€€KLKÂÀŠbbb…‰…ÞÛÞÞÝÞÚÛÚÚÛÚÚÛڅƒ…±°±ÞÜÞÞÛÞÞÛÞÞßÞMNMtut¦¥¦vtvqtq¦£¦WXW¥¤¥…ƒ…°°°ÚÜÚÙÛÙÞÛÞÞÛÞXYXÜÛÜÚÛÚÙÛÙÙÛÙXWXÞÝÞiiijljÀ¾À'%''''ÀÀÀlklÀÁÀÞÛÞÞÜÞÙÛÙXWXÞÜÞÙÛÙXWX………±¯±ÙÛÙÞÛÞÜÝÜÚÛÚÞÛÞÞÞޅ‡…š™š–˜–—›—š—šÞÝÞXWXÙÛÙÚÝÚ¯®¯………ÚÛÚÜÛÜXWXXYXÜÛÜÚÝÚÚÛÚ*+*ÞÜÞ¬¯¬………¶µ¶µ´µKLKŒ]b]ÚÛÚÜÝÜÞÛÞÙÛÙ±®±ÞÛÞÙÛÙÞÜÞÞÛÞÙÛÙÞÛÞÙÛÙ,+,ÚÝÚÜÛÜÞÛÞ¢¤¢€€ONOKNK‚¥£¥ÞÝÞÙÛÙÙÛÙÞÛÞÞÛÞXYXÞÝÞÜÛÜÚÛÚÙÛÙÞÛÞÙÜÙÞÛÞXXXXYXÞÛÞÜÛÜÚÝÚÞÜÞsss¦¦¦§¦§xsx¥¤¥ÚÛÚÜÛÜÞÝÞÚÛÚÚÝÚÚÛÚÚÛÚÜÛÜÞÛÞÚÝÚÚÛÚÚÛÚÞÛÞ,+,ÚÛÚÜÛÜÙÜÙÞÛÞsvs~~vtv¦¥¦swsXYX…ƒ…,,,ÙÜÙÞÛÞÙÛÙÞÛÞÙÛÙÜÛÜÚÜÚÙÛÙÞÛÞÞÛÞÙÜÙÞÛÞÞÝÞÞÛÞÙÝÙÞÛހƒ€”’”lllqqqvtvjij¾ÂÞÛÞÞÝÞXWXÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞÙÝÙÞÛÞÚÛÚÚÛÚÚÜÚÞÛÞÙÛÙÙÛÙXYX,,,ÞÜÞÞÜޅ‡…š™š%&%qqqlllÀÁÀÙÛمƒ…±±±ÙÛÙÞÛÞÙÝÙÞÛÞÚÝÚÜÛÜÙÛÙÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞÞÜÞXWXXXXXYXÞÝÞÙÛمˆ…š—š%%%'''™™™ŠˆŠÞÝÞÞÛހƒ€,,,ÞÛÞÚÜÚÜÛÜÙÛÙÞÛÞÜÛÜÚÛÚÚÛÚÜÛÜÙÛÙÞÝÞÙÛÙÙÛÙXWX,+,ÚÛÚÜÛÜÞÛÞada‹‹‹&&&ššš…‡…ÜÛÜÚÛÚÞÝÞÞÛÞÙÜÙÞÛÞÜÛÜÚÛÚÚÛÚÜÛÜÞÛÞÙÛÙÜÝÜÚÛÚÚÛÚÜÛÜÞÛÞÚÝÚÜÛÜÞÜÞÙÛÙÞÛÞÞÛÞ]`]Žb`b………±¯±ÞÛÞÙÛÙÙÛÙÞÛÞÚÛÚÜÛÜÞÝÞÙÛÙÜÝÜÚÛÚÞÝÞÙÛÙÞÛÞÙÛÙÜÝÜÚÛÚÙÛÙÜÛÜÚÛÚÞÛÞÙÛÙXWX¥¦¥‚ONO‹Œ‹abaÞÜÞÜÛÜÚÛÚÞÛÞÜÝÜÚÛÚÙÜÙÜÛÜÚÛÚÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞÙÛÙÞÝÞÙÛÙÞÛÞÞÛÞÙÝÙÞÛÞÙÛÙÜÛÜÚÛÚ¢¢¢ƒƒƒKLKONO‚¥£¥ÚÝÚÜÛÜÞÛÞÙÝÙÙÛÙÞÛÞÚÛÚÜÛÜÞÛÞÙÜÙÞÛÞÙÛÙÞÛÞÙÛÙÞÝÞÚÛÚÜÛÜÙÛÙÚÝÚÜÛÜXWX…ƒ…,,,ÞÝÞÞÜÞsss¦¦¦KLKƒƒƒ¢¤¢ÞÛÞ¬®¬XWXÜÛÜÚÛÚÙÝÙÜÛÜÚÝÚÞÛÞÙÛÙÞÛÞÚÝÚÜÛÜÙÜÙÞÛÞÜÛÜÚÛÚÞÛÞÙÛÙXWXÞÝÞXXXÙÜÙÞÛÞquq§£§ONO‚¥£¥ÙÛÙ±®±………XYXÞÛÞÙÝÙÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞÜÛÜÚÛÚÚÛÚÜÛÜÙÛÙÚÛÚÜÛÜXWX…ƒ…±±±ÞÛÞÙÛÙsss¦¨¦KLKƒƒƒ¢¢¢XWX±®±XWXÙÛÙÞÛÞÚÛÚÜÛÜÙÛÙÞÛÞÙÛÙÞÝÞÚÛÚÜÛÜÞÛÞÙÛÙÜÛÜÚÝÚÞÛÞÙÝÙXWX…ƒ…,,,ÙÛÙXYXsts¦¥¦ONO‚MNMÞÝÞÙÛÙÞÜÞÚÛÚÜÛÜÙÜÙÞÛÞÜÛÜÚÝÚÚÛÚÜÝÜÙÛÙÞÛÞÜÛÜÚÜÚÞÜÞÙÛÙÞÛÞÙÛÙÞÛÞÞÛÞÙÝÙÞÛÞÞÛÞ¢¤¢XVX§£§KLKŒbbb½¾½ÂÀ½¾½ÀÀÀ¾À¾Â¾Â½¾½¾¿¾ÀÀÀÀÀÀ¾¾¾Â¾Â½¾½¾À¾À¾À½À½Â¿Â½À½ÂÀ½¾½½À½Â¾Â½À½½À½’’xwx¢¨¢
\ No newline at end of file
Index: rel_1_2/simcity/sprite/sp_2.raw
===================================================================
--- rel_1_2/simcity/sprite/sp_2.raw (revision 1198)
+++ rel_1_2/simcity/sprite/sp_2.raw (nonexistent)
@@ -1 +0,0 @@
-ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ
\ No newline at end of file
Index: rel_1_2/simcity/sprite/sp_3.raw
===================================================================
--- rel_1_2/simcity/sprite/sp_3.raw (revision 1198)
+++ rel_1_2/simcity/sprite/sp_3.raw (nonexistent)
@@ -1 +0,0 @@
-ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿ@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿ@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ
\ No newline at end of file
Index: rel_1_2/simcity/sprite/sp_4.raw
===================================================================
--- rel_1_2/simcity/sprite/sp_4.raw (revision 1198)
+++ rel_1_2/simcity/sprite/sp_4.raw (nonexistent)
@@ -1 +0,0 @@
-ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@ÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@ÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ
\ No newline at end of file
Index: rel_1_2/simcity/sprite/sp_5.raw
===================================================================
--- rel_1_2/simcity/sprite/sp_5.raw (revision 1198)
+++ rel_1_2/simcity/sprite/sp_5.raw (nonexistent)
@@ -1,26 +0,0 @@
-ÿÿÿÿ
-ÿÿÿÿÿÿ
-ÿÀÿÿÀÿÿÀÿÿÀÿ
-
-
-
-
-
-ÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@
-ÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@@@@@@@ÿÀÿÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÿÀÿ@@@@@@@@@@@@@@@@@@@@@@@@ÿÀÿÿÀÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€~*~*~*~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*~*~*~*€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*~*~*~*
-€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
-€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
-€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
-€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€ÜÜÜÜÜ܀€€€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€ÜÜ܀€€€€€€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*
-
-
-@@@@@@
-@@@@@@~*
-
-
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~*
-
-
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~*
\ No newline at end of file
Index: rel_1_2/simcity/sprite/sp_6.raw
===================================================================
--- rel_1_2/simcity/sprite/sp_6.raw (revision 1198)
+++ rel_1_2/simcity/sprite/sp_6.raw (nonexistent)
@@ -1,23 +0,0 @@
-
-ÿÿÿÿÿÿÿÿÿÿÿÿ
-
-
-
-
-
-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*~*~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*~*~*
-ÿÿÿÿÿÿÿÿÿ~*
-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
-ÿÿÿÿÿÿÿÿÿ~*
-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿ
-
-ÿÿÿ
-ÿÿÿ~*
-
-
-
-ÿÿÿÿÿÿÿÿÿÿÿÿ
-
-
-
-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*
\ No newline at end of file
Index: rel_1_2/simcity/sprite/sp_7.raw
===================================================================
--- rel_1_2/simcity/sprite/sp_7.raw (revision 1198)
+++ rel_1_2/simcity/sprite/sp_7.raw (nonexistent)
@@ -1 +0,0 @@
-vtvÀÀÀÀÀÀÀÀÀÂÀÂÂÀÂÂÀÂÀÀÀ'&'œ›œ•—•{{€€{{~~||{{€€µ´µKLKÂÀ‰Š‰~~RNRMNMRNRNONPOPRORaba~~¦¥¦vtv'''ÀÀÀ~~tutRQRÞÝÞÞÝÞXYXÞÛÞÞÛÞ¢¤¢XYX{{™™™˜˜˜ŠŽŠ€}€jljikiÞÛÞXWXÙÛÙÞÛÞÜÛÜÚÝÚXYXÁ¿ÁRMR€€KLKÂÀŠbbb…‰…ÞÛÞÞÝÞÚÛÚÚÛڅƒ…±°±ÞÜÞÞÛÞÞÛÞÞßÞMNMtut¦¥¦vtvqtq¦£¦WXW¥¤¥…ƒ…°°°ÚÜÚÙÛÙÞÛÞXYXÜÛÜÚÛÚÙÛÙÙÛÙXWXÞÝÞiiijljÀ¾À'%''''ÀÀÀlklÀÁÀÞÛÞÞÜÞÙÛÙXWXÞÜÞXWX………±¯±ÙÛÙÞÛÞÜÝÜÚÛÚÞÛÞÞÞޅ‡…š™š–˜–—›—š—šÞÝÞXWXÙÛÙÚÝÚ¯®¯………ÚÛÚÜÛÜXYXÜÛÜÚÝÚÚÛÚÞÜÞ¬¯¬………¶µ¶µ´µKLKŒ]b]ÚÛÚÜÝÜÞÛÞÙÛÙ±®±ÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞ¢¤¢€€ONOKNK‚¥£¥ÞÝÞÙÛÙÞÛÞÞÛÞXYXÞÝÞÜÛÜÙÛÙÙÜÙÞÛÞXXXXYXÞÛÞÜÛÜsss¦¦¦§¦§xsx¥¤¥ÚÛÚÜÛÜÚÛÚÚÝÚÚÛÚÚÛÚÜÛÜÚÛÚÚÛÚÞÛÞ,+,ÚÛÚÜÛÜÙÜÙÞÛÞsvs~~vtv¦¥¦swsXYX…ƒ…,,,ÙÜÙÙÛÙÞÛÞÙÛÙÞÛÞÞÛÞÙÜÙÞÛÞÞÝÞÞÛÞÙÝÙÞÛހƒ€”’”lllqqqvtvjij¾ÂÞÛÞÞÝÞXWXÞÛÞÙÛÙÙÛÙÙÝÙÞÛÞÚÛÚÚÜÚÞÛÞÙÛÙÙÛÙXYX,,,ÞÜÞÞÜޅ‡…š™š%&%qqqlllÀÁÀÙÛمƒ…±±±ÙÛÙÞÛÞÙÝÙÚÝÚÜÛÜÙÛÙÞÛÞÙÛÙÙÛÙÞÛÞÞÜÞXWXXXXXYXÞÝÞÙÛمˆ…š—š%%%'''™™™ŠˆŠÞÝÞÞÛހƒ€,,,ÞÛÞÚÜÚÜÛÜÞÛÞÜÛÜÚÛÚÚÛÚÜÛÜÙÛÙÙÛÙXWX,+,ÚÛÚÜÛÜÞÛÞada‹‹‹&&&ššš…‡…ÜÛÜÚÛÚÞÝÞÞÛÞÙÜÙÞÛÞÚÛÚÚÛÚÜÛÜÞÛÞÙÛÙÜÝÜÚÛÚÞÛÞÚÝÚÜÛÜÞÜÞ]`]Žb`b………±¯±ÞÛÞÙÛÙÙÛÙÞÛÞÜÛÜÞÝÞÙÛÙÜÝÜÚÛÚÞÝÞÞÛÞÙÛÙÜÝÜÞÛÞÙÛÙXWX¥¦¥‚ONO‹Œ‹abaÞÜÞÜÛÜÚÛÚÞÛÞÜÝÜÙÜÙÜÛÜÚÛÚÞÛÞÙÛÙÞÛÞÙÛÙÙÛÙÞÝÞÙÛÙÞÛÞÞÛÞÙÝÙÞÛÞÙÛÙÜÛÜÚÛÚ¢¢¢ƒƒƒKLKONO‚¥£¥ÚÝÚÜÛÜÞÛÞÙÝÙÙÛÙÚÛÚÜÛÜÞÛÞÙÜÙÞÛÞÙÛÙÞÛÞÚÛÚÜÛÜÙÛÙÚÝÚÜÛÜXWX…ƒ…,,,ÞÝÞÞÜÞsss¦¦¦KLKƒƒƒ¢¤¢ÞÛÞ¬®¬XWXÜÛÜÙÝÙÜÛÜÚÝÚÞÛÞÙÛÙÞÛÞÜÛÜÙÜÙÞÛÞÙÛÙXWXÞÝÞXXXÙÜÙÞÛÞquq§£§ONO‚¥£¥ÙÛÙ±®±………XYXÞÛÞÙÝÙÙÛÙÞÛÞÙÛÙÞÛÞÞÛÞÜÛÜÚÛÚÚÛÚÜÛÜÙÛÙXWX…ƒ…±±±ÞÛÞÙÛÙsss¦¨¦KLKƒƒƒ¢¢¢XWX±®±ÜÛÜÙÛÙÞÛÞÞÝÞÚÛÚÜÛÜÞÛÞÙÛÙÜÛÜÚÝÚÞÛÞÙÝÙÙÛÙXYXsts¦¥¦ONO‚MNMÞÜÞÚÛÚÜÛÜÙÜÙÞÛÞÜÛÜÚÝÚÜÝÜÙÛÙÞÛÞÜÛÜÚÜÚÞÜÞÙÛÙÞÛÞÙÛÙÞÛÞÞÛÞÙÝÙÞÛÞ¢¤¢XVX§£§KLKŒbbb½¾½ÂÀ½¾½ÀÀÀ¾À¾Â¾Â½¾½¾¿¾ÀÀÀÀÀÀ¾¾¾Â¾Â½¾½¾À¾À¾À½À½Â¿Â½À½ÂÀ½¾½½À½Â¾Â½À½½À½’’xwx¢¨¢
\ No newline at end of file
Index: rel_1_2/simcity/keyfunct.c
===================================================================
--- rel_1_2/simcity/keyfunct.c (revision 1198)
+++ rel_1_2/simcity/keyfunct.c (nonexistent)
@@ -1,85 +0,0 @@
-/**************** Functions called by keyboard handler*********/
-#include <drivers/keyb.h>
-#include <drivers/glib.h>
-#include <drivers/glib.h>
-#include <stdlib.h>
-#include <string.h>
-#include "include/simcity.h"
-#include "include/proc.h"
-
-short maxc=0;
-char sens=0;
-
-extern starting_set starting_set_array[S_POINT];
-
-void h_car_create(KEY_EVT *k)
-{
- char name[10];
- int num;
-
- if((maxc<MAX_CAR)) {
- num=add();
- if(num>=0) {
- sprintf(name,"car%d",num);
- h_create(name,num);
- sprintf(name,"camera%d",num);
- cam_create(name,num);
- sprintf(name,"speed%d",num);
- gauge_create(name,num);
- sprintf(name,"arrow%d",num);
- arrow_create(name,num);
- }
- }
-}
-
-void s_car_create(KEY_EVT *k)
-{
- char name[10];
- int num;
-
- if((maxc<MAX_CAR)) {
- num=add();
- if(num>=0) {
- sprintf(name,"car%d",num);
- h_create(name,num);
- sprintf(name,"camera%d",num);
- cam_create(name,num);
- sprintf(name,"speed%d",num);
- gauge_create(name,num);
- sprintf(name,"arrow%d",num);
- arrow_create(name,num);
- }
- }
-}
-
-void h_car_kill(KEY_EVT *k) {
- int num;
-
- if(maxc>0) {
- num=del_o();
- if(num>=0) {
- killing(num);
- }
- }
-}
-
-void endfun(KEY_EVT *k)
-{
- grx_close();
- cprintf("Brk command pressed! Ending...\n");
- sys_end();
-}
-
-void refresh(KEY_EVT *k){
-
- sem_wait(&mutex);
-//heavy and obsolete.....
-//draw_scenario();
- grx_putimage(MAPX,MAPY,MAPX+W-1,MAPY+H-1,street);
- sem_post(&mutex);
-}
-
-void sensor_switch(KEY_EVT *k) {
- if(sens==0) sens=1;
- else sens=0;
-}
Index: rel_1_2/simcity/img/car_240n.raw
===================================================================
--- rel_1_2/simcity/img/car_240n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_240n.raw (nonexistent)
@@ -1 +0,0 @@
-€ÿ€€€€€€€€ÿÿ€€€€ÿ€€€€€€€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€€ÿ€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€ÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€€ÿÿÿÿÿ€€€€ÿÿ€€€€€€ÿÿ€€€€€€€€€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿ€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿ€ÿ€€€€€€€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€€€€ÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿ€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿ€
\ No newline at end of file
Index: rel_1_2/simcity/img/car_015n.raw
===================================================================
--- rel_1_2/simcity/img/car_015n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_015n.raw (nonexistent)
@@ -1 +0,0 @@
-€€€ÿ€€€ÿÿÿÿ€ÿ€€€ÿÿ€€€€€€€€€€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿÿ€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿ€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€ÿ€€€€€€€€€ÿÿ€€€€€€ÿÿ€ÿ€€€ÿ€ÿ€€€
\ No newline at end of file
Index: rel_1_2/simcity/img/car_150n.raw
===================================================================
--- rel_1_2/simcity/img/car_150n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_150n.raw (nonexistent)
@@ -1 +0,0 @@
-ÿÿÿ€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿ€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€ÿ€ÿÿÿ€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿ€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€€ÿÿ€ÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿ€€€€€€€€€ÿ€€€€ÿ€€€ÿÿ€ÿ
\ No newline at end of file
Index: rel_1_2/simcity/img/car_060n.raw
===================================================================
--- rel_1_2/simcity/img/car_060n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_060n.raw (nonexistent)
@@ -1 +0,0 @@
-€ÿÿÿÿÿÿÿÿÿÿÀÀÀ€€€€ÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿ€€€€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€€€€€€€ÿ€ÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€ÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€€€€€€€€€ÿÿ€€€€€€ÿÿ€€€€ÿÿÿÿÿ€€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿ€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€ÿ€€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€€€€€€€ÿ€€€€ÿÿ€€€€€€€€ÿ€
\ No newline at end of file
Index: rel_1_2/simcity/img/car_105n.raw
===================================================================
--- rel_1_2/simcity/img/car_105n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_105n.raw (nonexistent)
@@ -1 +0,0 @@
-ÿÿÿÿÿÿ€ÿÿ€€€€€€ÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€ÿ€ÿÿÿ€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€ÿ€€€€€€€€€€€€€€€€€€ÿÿÿ€€€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/img/car_330n.raw
===================================================================
--- rel_1_2/simcity/img/car_330n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_330n.raw (nonexistent)
@@ -1 +0,0 @@
-ÿ€ÿÿ€€€ÿ€€€€ÿ€€€€€€€€€ÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿ€ÿÿ€€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€ÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€ÿÿÿ€ÿ€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€ÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€ÿÿÿ
\ No newline at end of file
Index: rel_1_2/simcity/img/car_045n.raw
===================================================================
--- rel_1_2/simcity/img/car_045n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_045n.raw (nonexistent)
@@ -1 +0,0 @@
-€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÀÀÀ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€€€€€€ÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€€€ÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€ÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€ÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€ÿÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿ€€€€€€€€€ÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿ€€€ÿ€€€€€€ÿÿ€€€€€€ÿ€€€€€€ÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€€€€ÿÿÿ€€€ÿ€€€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/img/old_sk.raw
===================================================================
--- rel_1_2/simcity/img/old_sk.raw (revision 1198)
+++ rel_1_2/simcity/img/old_sk.raw (nonexistent)
@@ -1,23 +0,0 @@
-
-ÿÿÿÿÿÿÿÿÿÿÿÿ
-
-
-
-
-
-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*~*~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*~*~*
-ÿÿÿÿÿÿÿÿÿ~*
-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
-ÿÿÿÿÿÿÿÿÿ~*
-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿ
-
-ÿÿÿ
-ÿÿÿ~*
-
-
-
-ÿÿÿÿÿÿÿÿÿÿÿÿ
-
-
-
-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*
\ No newline at end of file
Index: rel_1_2/simcity/img/car_180n.raw
===================================================================
--- rel_1_2/simcity/img/car_180n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_180n.raw (nonexistent)
@@ -1 +0,0 @@
-€ÿÿ€€€ÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€€€€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€€€€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€ÿ€ÿÿ€€€ÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿ€€€
\ No newline at end of file
Index: rel_1_2/simcity/img/car_090n.raw
===================================================================
--- rel_1_2/simcity/img/car_090n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_090n.raw (nonexistent)
@@ -1 +0,0 @@
-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÀÀÀÀÀÀÿÿÿÀÀÀÀÀÀÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿÀÀÀÀÀÀÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿ€ÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿ€€ÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿ€€ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ€ÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ
\ No newline at end of file
Index: rel_1_2/simcity/img/car_270n.raw
===================================================================
--- rel_1_2/simcity/img/car_270n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_270n.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€ÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€€€€ÿÿ€€€€€€€€€€€€€€€ÿÿ€€€€€€ÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
\ No newline at end of file
Index: rel_1_2/simcity/img/car_135n.raw
===================================================================
--- rel_1_2/simcity/img/car_135n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_135n.raw (nonexistent)
@@ -1 +0,0 @@
-ÿÿÿ€ÿÿÿÿÿÿ€€€ÀÀÀ€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿ€€€€€€ÿÿÿ€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿ€ÿ€€€ÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿÿ€ÿ€€€€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿ€€€€€€ÿ€€€€€€ÿÿ€€€€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿÿ€€€€€€ÿ€€€€€€€€ÿ€€€€€€
\ No newline at end of file
Index: rel_1_2/simcity/img/car_225n.raw
===================================================================
--- rel_1_2/simcity/img/car_225n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_225n.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€€€ÿ€€€ÿÿÿ€€€€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿ€€€€€€ÿ€€€€€€ÿÿ€€€€€€ÿ€€€ÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿ€€€€€€€€€ÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿÿ€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿ€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿ€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿ€€€€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÀÀÀ€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿ€
\ No newline at end of file
Index: rel_1_2/simcity/img/car_315n.raw
===================================================================
--- rel_1_2/simcity/img/car_315n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_315n.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€ÿ€€€€€€€€ÿ€€€€€€ÿÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€€€€ÿÿ€€€€€€ÿ€€€€€€ÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€€€€ÿ€ÿÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿ€€€ÿ€ÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€ÿÿÿ€€€€€€ÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿ€ÿÿÿ
\ No newline at end of file
Index: rel_1_2/simcity/img/car_075n.raw
===================================================================
--- rel_1_2/simcity/img/car_075n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_075n.raw (nonexistent)
@@ -1 +0,0 @@
-€ÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€€€€€€ÿ€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿ€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€ÿÿÿ€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿ€ÿÿÿ€€€€€€€€€€€€€€€€€€ÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€€ÿÿ
\ No newline at end of file
Index: rel_1_2/simcity/img/car_165n.raw
===================================================================
--- rel_1_2/simcity/img/car_165n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_165n.raw (nonexistent)
@@ -1 +0,0 @@
-€€€ÿÿÿÿ€€€ÿ€€ÿÿ€€€€€€€€€€€€ÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿ€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€ÿÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€ÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿ€€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€€€€ÿÿ€€€€€€€€€ÿ€€€ÿ€ÿ€€€ÿ€
\ No newline at end of file
Index: rel_1_2/simcity/img/car_255n.raw
===================================================================
--- rel_1_2/simcity/img/car_255n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_255n.raw (nonexistent)
@@ -1 +0,0 @@
-ÿÿ€€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿ€€€€€€€€€€€€€€€€€€ÿÿÿ€ÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€ÿÿÿ€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€ÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€ÿ€€€€€€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿ€
\ No newline at end of file
Index: rel_1_2/simcity/img/car_345n.raw
===================================================================
--- rel_1_2/simcity/img/car_345n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_345n.raw (nonexistent)
@@ -1 +0,0 @@
-€ÿ€€€ÿ€ÿ€€€ÿ€€€€€€€€€ÿÿ€€€€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€€ÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿ€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿÿ€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€ÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€ÿ€€€ÿÿ€€€€€€€€€€€€ÿÿ€€ÿ€€€ÿÿÿÿ€€€
\ No newline at end of file
Index: rel_1_2/simcity/img/old.raw
===================================================================
--- rel_1_2/simcity/img/old.raw (revision 1198)
+++ rel_1_2/simcity/img/old.raw (nonexistent)
@@ -1,26 +0,0 @@
-ÿÿÿÿ
-ÿÿÿÿÿÿ
-ÿÀÿÿÀÿÿÀÿÿÀÿ
-
-
-
-
-
-ÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@
-ÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@@@@@@@ÿÀÿÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÿÀÿ@@@@@@@@@@@@@@@@@@@@@@@@ÿÀÿÿÀÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€~*~*~*~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*~*~*~*€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*~*~*~*
-€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
-€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
-€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
-€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€ÜÜÜÜÜ܀€€€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€ÜÜ܀€€€€€€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*
-
-
-@@@@@@
-@@@@@@~*
-
-
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~*
-
-
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~*
\ No newline at end of file
Index: rel_1_2/simcity/img/car_195n.raw
===================================================================
--- rel_1_2/simcity/img/car_195n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_195n.raw (nonexistent)
@@ -1 +0,0 @@
-€€€ÿ€ÿ€€€ÿ€ÿÿ€€€€€€ÿÿ€€€€€€€€€ÿ€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€ÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€ÿÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€€€€€€€€€€ÿÿ€€€ÿ€ÿÿÿÿ€€€ÿ€€€
\ No newline at end of file
Index: rel_1_2/simcity/img/car_285n.raw
===================================================================
--- rel_1_2/simcity/img/car_285n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_285n.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€€€ÿÿÿ€€€€€€€€€€€€€€€€€€ÿ€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€ÿÿÿ€ÿ€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿ€€€€€€ÿÿ€ÿÿÿÿÿÿ
\ No newline at end of file
Index: rel_1_2/simcity/img/car_000n.raw
===================================================================
--- rel_1_2/simcity/img/car_000n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_000n.raw (nonexistent)
@@ -1 +0,0 @@
-€€€ÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿ€€€ÿÿ€ÿ€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€€€€ÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€€€€ÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿ€€€ÿÿ€
\ No newline at end of file
Index: rel_1_2/simcity/img/Bb0.raw
===================================================================
--- rel_1_2/simcity/img/Bb0.raw (revision 1198)
+++ rel_1_2/simcity/img/Bb0.raw (nonexistent)
@@ -1 +0,0 @@
-ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBZ9Rc„ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJJ9)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBsZÿÞçÎçÎçÎçÎ99cJ)))ZޜçÎï΄Œ!!!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1kBïÎçÎçÎçÎçÎçÎçÎïÎïÎçÎïÖçÎçÎÿÞçÎïÎïÎsc)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZJscçÎïÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎïÖïÎïÎçÎçÎçÎçÎçÎÿÞïÎ{„ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1ZRçÎçÎçÎçÎçÆçÆçÎçÆçÆçÎ÷ÖïÎçÎïÎïÖïÎçÎçÎçÎçÎïÎçÎçÎçÎïČÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)9B)!sZïÎçÎ÷ÖïÖçÎçÎçÆçÎçÆçÎçÎçÆçÆçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÆçÎïÖ9c1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ!!1­”çÎçÎçÎïÎçÎçÎçÎçÎçÎçÆçÎçÎçÎçÆçÎçÆçÆçÎçÎçÎçÆïÎçÆçÎïÎçÎçÎçÎçÎçÎJBkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ{kïÎçÎçÎïÎçÆçÆçÎçÆçÆçÎçÆçÎïÎçÎçÆçÎçÎçÎçÎïÎçÎçÆçÎçÎçÆçÎçÎçÎïÎçÎçÎïÎksÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎRZkÿÞçÎçÎçÆçÎçÎçÎçÆçÎçÎçÎçÎçÎçÆçÆçÎçÎçÎïÎçÎçÆçÎçÎïÎçÎçÎçÆïÎçÎçÎçÎçÎçÎçέµRRZkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆέ”çÎçÎçÆçÆçÆçÆçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÆïÎçÎçÎçÎïÎçÎçÎçÎçÎçÎïÎçÆçÎçÎïք{!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ19ZïÎïÎçÎçÆçÆçÆçÎçÎçÆçÆçÆçÆçÎçÎçÆçÎçÎçÆçÎçÎçÎïÎçÎçÎçÎçÎçÎçÆçÎçÎçÆïÎçÎçÎçÎçÆçÆçÎçÎ1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆέ”çÎçÎçÆçÆçÆçÆçÆçÎçÎçÎçÎçÆçÆçÎçÎçÎïÎçÎçÎïÎçÎçÎçÎçÎïÎçÆïÎçÎçÎçÎçÎçÎçÎçÎçÎçÆçÎçÎçÎ99ÆÆÎÆÆÎÆÆÎÆÆÎ99BçÎçÎçÎçÆçÆÞ½çÎçÎçÎçÎçÆçÎçÎçÆçÎçÎçÎçÎïÎçÆçÎçÎçÎçÎçÎçÎçÎçÎçÆïÎçÆçÎçÎçÎïÎçÎçÎïÎçÎ1ÆÆÎÆÆÎÆÆÎÆÆÎ9çÎçÎçÎçÆçÆçÎçÎçÎçÎçÆçÎçÎçÎçÎçÎçÎçÎçÎçÆçÎçÆïÎçÎïÎçÎçÎïÎçÎçÎçÆçÎïÎçÎçÎçÎçÆçÆçÎçÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZ)ïÎçÎçÎçÎçÎçÎçÎçÆçÆçÆçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÆçÎçÎçÎçÆçÎçÆçÎïÎçÎçÎçÆçÎçÎçÎïÎçÆçÎçÎ19ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ{JçÎçÎçÎçÎçÆçÎçÎçÎçÎçÎçÎçÆçÎçÎçÎïÎçÆçÎïÎçÆçÎïÎçÆçÎçÆïÎçÎçÎçÆçÆçÎçÎçÎçÎçÎçÎçÎçÎïÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎsZçÎçÎçÎçÎçÆçÆçÎçÆçÎçÎçÆçÎçÎçÆçÎçÎçÎçÎçÆïÎçÎçÎçÆçÎçÎçÎçÎçÎçÆçÎçÎçÎçÎçÎçÎçÎçÎçÎçέ”ÆÆÎÆÆÎÆÆÎÆÆε„ïÎçÎïÎçÆçÆçÎçÎçÎçÆçÎçÎçÎçÎçÆçÎçÆçÎçÎçÆçÆçÆçÎçÎçÎçÎçÎçÎçÆçÎçÆçÎçÎçÎçÎçÆçÎïÎçÎçÎçÎZRÆÆÎÆÆÎÆÆÎÆÆΜsçÎçÎçÎçÆçÆçÎçÎçÎçÎïÎçÆçÎçÎçÎïÎçÆçÎçÎçÆçÎïÎçÆçÆçÆçÎçÎçÎçÎçÆçÆçÎçÎçÎçÎçÎïÎçÎçÎçÎçÎRÆÆÎÆÆÎÆÆÎJZB¥{çÎçÎçÆçÆçÆçÆçÆçÆçÎçÎçÎçÎçÎçÎçÆçÆçÆçÎçÆçÎçÎçÎçÎçÆçÎçÆçÎçÎçÎçÆçÆçÎïÎïÖçÎçÎçÎïÎçÎ¥ÞÆÆÎÆÆÎÆÆÎ¥„çÎçÎçÆçÆçÆçÎçÎçÎçÆçÆçÆçÎçÎçÆçÎçÆçÆçÎçÎçÆïÎçÆïÎçÎïÎçÎçÆçÆçÎçÆçÆïÎïÖÞÎçÎçÎïÎçÎçÎBJBkÆÆÎÆÆÎÆÆÎZskçÎçÎçÎçÆçÆçÎçÎçÎçÎçÎçÎçÎçÎçÆçÎçÎçÎïÎ÷ÖçÎçÎçÎçÎçÎçÎçÎçÎçÎçÆçÆçÆçÎçέ”ZJÞÎ÷ÖÿÞçÎBÆÆÎÆÆÎÆÆÎÆÆÎ!!JïÎçÎçÎçÆçÆçÎçÎçÎçÎçÎçÆçÎçÎçÎçÆçÎçÎïÎÿÞçƽ¥çÎÆÆçÎçÎçÎïÎçÎçÎÆÆ1ïÎçÎçÎ1c1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎsZçÎçÎçÆçÆÞ½çÎçÆçÎçÎçÎçÎçÆçÆçÎçÎçÎïÎçČïÿ„ŒŒsïÎçÎ{JçÎçÎÆÆÿÞçÆç΄ŒÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ{kçÎçÎçÆçÆçÆÞÎçÎçÆÞÎÞ½çÎçÎçÎçÆçÎçÆçÎçÎkBïÿRsçÎ{„1sçÎçÎÆÆÞ½çÎçÎçÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎkBçÎçÎçÆÞ½çÆçÆçÎÞÎÞ½çÎçÎçÆçÎçÎçÆçÎç΄Œ1çÎïÖks„ŒçÎ{„)çÎçÎçΌsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΜsçÎçÎçÆçÆçÎÞÎçÆçÆçÎçÎçÆçÎçÆçÎçÎçÎRs!!{9J„kZk1JŒZJ!!1sc!sc!199BŒsZBk1J¥ŒÿZRZ9ZskÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΔkçÎçÎçÎçÆçÆçÆçÎçÆçÎçÆçÎçÎçÆçÎçÎ1ƄZç¥Rç¥Zç¥Zç¥Zï¥Zç¥Rç¥Zç¥Rç¥Rç¥Rç¥Rç¥Zç¥R­ŒsZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ¥{çÎçÆçÎçÆÞ½çÆÞ½çÎÞÎçÎçÆïÎçÎçÎ)֔Zç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥Zç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆν¥ïÎÞ½çÎçÆçÆÞÎçÎçÎçÆçÆçÆçÎçÎ11ƄZç¥Zç¥Zç¥Jï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥Rç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1”kçÎÞ½çÎçÆçÆçÆçÎçÎÞ½çÆïÎÆÆsç¥Zç¥Zç¥Rç¥Rç¥Rç¥Rï¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥R֔ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎޜçÎçÆçÎçÆÞ½ÞÎÞÎçÎçÎçÆçÎÞ½œcBç¥Zç¥Rç¥Rï¥Zç¥Zï¥Rç¥Jç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆέ”çÎÞ½çÎçÆçÎçÆçÎÞ½çÆçÆçÎçÎç¥Zç¥Rç¥Rç¥Rç¥Rï¥Rç¥Rç¥Jç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥Rç¥Zç¥R”{BÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïÎÞ½çÎçÆÞ½çÎÞÎçÎçÎçÆçÎïÎç¥Zç¥Rç¥Rï¥Rç¥Rç¥Rç­Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥ZƔBBkZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÎçÆçÎçÎÞÎçÆÞ½çÎçÎçΌJ1ï¥Zç¥Rç¥Rç¥Rç¥Rç¥Zï¥Rç¥Zç¥Rç¥Jç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΌsçÎçÆçÎçÆçÆÞ½çÎçÎçÆçÆçÎç΄cBç¥Rï¥Jç¥Rç¥Zç¥Rï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥Zç¥Rç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZRçÎÞ½çÆçÆÞ½çÎÞ½ÞÎçÆçÎçÎçÎç¥Rï¥Rç¥Jï¥Rï¥Zç¥Rç¥Rç¥Rç¥Zï¥Rï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥RZJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎÞ½çÆÞ½çÎçÎçÎçÆçÎçÎçÎ֔Zï¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥Rç¥Rï¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥Rï¥ZJ1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïÎçÎÞ½çÆçÆÞÎÞ½ÞÎÞ½ïÎçÎçνsBï¥Rç¥Rï¥Rç¥Zk9¥{1ç¥Zï¥Rç¥Rç¥Rç¥Rï¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÆçÆçÆçÎçÎçÆÞÎçÆçÎçεk9ç¥Zç¥Rï¥Rï¥Rç¥R­ŒJsZ)֔Jï¥Rï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Z¥{BÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÆÞ½çÆÞÎÞ½çÎçÆçÆçÎçνsBç¥Rç¥Rç¥Rç¥Rï¥Rï¥Z­ŒJ!!½„1ÿ­Rï¥Zç¥Zç¥Rç¥Zç¥Rç¥Rç¥Rç¥RkRB9ckÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΌsçÎÞ½çÆçÆçÆçÎçÆçÆïÎçÎçΜcBç¥Zç¥Rç¥Rç¥Rç¥Rï¥Rÿ­R”{B1)Œc)ç¥Rç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥ZkJ!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÆçÆÞ½Þ½çÎçÆçÎçÎçÎcç¥Zï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rï¥Rï¥ZBkZ)ƄZç¥Jç¥Rç¥Zç¥Rç¥Rç¥Rç¥RRBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÎçÆçÆçÎçÎçÎçÎçÎçÎkç¥Zï¥Rç¥Rç¥Jç¥Rç¥Rç¥Jï¥Rç¥Rç¥Z”{B1!RB!ç¥Rç¥Zç¥Rç¥Zç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎŒsçÎçÎçÆçÎçÎçÎ1¥µŒ!ïÎ{1)ï¥Jç¥Rç¥Rç¥Rï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥R„cBŒc!֔Jç¥Rç¥Rï¥RccJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)kBçÎçÎçÆçÎçÎïÎZJ„JJÿ1)BƄZï¥Rç¥Rç¥Rç¥Rç¥Rç¥Jç¥Rç¥Rç¥Rç¥Jç¥Rç¥R”{B1)œs)ï¥RŒ„s19RJJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9ïÎçÎçÆçÎçÎ)BJ9RJBkRJJ1„cBï¥Jï¥Jç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥R­ŒJ¥kÿœ9ç¥Rç¥Rç¥Z”„R¥{BBB!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZZkçÎçÎçÎçÎçÎ9)kRBç¥Rç¥Rç¥Rï¥Rç¥Rç¥Rç¥Rç¥Zç¥Zç¥Rï¥Zï¥R­ŒJcœÿÿœ9ç¥Rç¥Rï¥Zç¥ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÎçÎçÎB)kRBç¥Rç¥Rç¥Rç¥Rç¥Rç¥Jç¥Rç¥Zç¥Zç¥Rç¥Rç¥Rï¥Zï¥Z”k9œœ„ÿÿÿµÖÿΌBç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ÷½çÎïÎçÎcï¥Zç¥Rç¥Zï¥Rç¥Jç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zï¥Rï¥R½„1ZskBkŒkcZççÖÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÎ1))ç¥Rï¥Rç¥Rç¥Rç¥Jç¥Rç¥Rç¥Zç¥Zç¥Rç¥Rç¥Rç¥Rï¥R֔J)!ZskœµÖÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÎï¥Z1J)ç¥Rï¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zï¥Zç¥Zï¥Zç¥Rç¥Rï¥Rï¥Z­ŒJ„cBµ”cŒ„s)111ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎ1ç¥Zç¥Rç¥Zç¥Rç¥Zç¥Jç¥Rç¥Rç¥Rç¥Jï¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rï¥Zç¥Rç¥ZRJJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBkŒkBçÎç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rï¥Rï¥Rç¥Rç¥Rç¥Rï¥Zç¥Zç¥Zç¥Zç¥Zç¥Zç¥Rï¥Rç¥Rç¥Rç¥ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBZRç¥Zç¥Rç¥Jç¥Rç¥Rï¥Rç¥Rç¥R֔Jç¥Rç¥Jç¥Rç¥Rç¥Zç¥Zç¥Zç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zç¥R!!1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Rç¥Rç¥Rç¥Rç¥Jï¥Zks9!!RZ1¥{Bç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥J„c!J!9sZ)ç¥Zç¥ZŒsZ)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZskç¥Rç¥Zç¥Rç¥Rç¥Jï¥Zç¥ZsZ)”„RcJ)ç¥Zç¥Rç¥Rç¥Rç¥Zç¥Rç¥ZŒc!ccJBB!ç¥Rç¥Z„cBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Zç¥Rç¥Jç¥Rç¥Rï¥Zç¥R­ŒJç¥Rks9ÿœ9ç¥Rç¥Rç¥Rç¥Zç¥R֔JB!ï¥Z1111!֔Jç¥Rç¥Z1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Z)„R)ï¥Zï¥Jÿœ9ÿ­Rÿ­Rï¥R{c1cJ){c1µ”cŒsZ{c1΄9ç¥ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Zç¥Jç¥Rç¥Rç¥Rç¥Zç¥Rç¥RkRBJZZÞï÷sZ)”{B”s1΄!ÿ­Rÿœ9ï¥Rµ„BƜcµ”c19!!1µŒ!µ„BÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Rç¥Rç¥Jç¥Rç¥Rç¥Rç¥Rï¥Z֔JJZBZsksµÿ19ÿÿÿœœ„œs½„1ÿµRÿµRÿµR)ÆÆÎÆÆÎ1!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Zç¥Jç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rï¥Z­ŒZ)BB1ÿÿÿ„ÿÿ1ÿÿÿ­ŒZç¥Zç¥Z99ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1ç¥Rç¥Rç¥Rç¥R֔Jç¥Zç¥Rç¥Zç¥Zç¥Rç¥Rç¥Z”„R)))!!!Œ½ÆJZB”„R„sJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1ç¥Zç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥Rç¥Rç¥Rç¥Rç¥Z֔Z1BB!1)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ!!ç¥Rç¥Zç¥Rç¥Jç¥Jç¥Zç¥Zç¥Zç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥Rç¥Z­ŒJkRB1)11!!!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9ç¥Zç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zç¥Zç¥Zç¥Zç¥Zç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥R„{RBJRÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Zç¥Rç¥Rç¥Zç¥Zç¥Zç¥Zç¥Zç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥R­ŒZ111JZZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1)Z9ç¥Zç¥Rç¥Rç¥Z֔Zç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥Zç¥Zç¥Rç¥Rï¥Jï¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Z„kZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Zç¥Rç¥Zç¥Jç¥Rç¥Zç¥Rç¥Rç¥R„c!BB!ÆÆÎ){Jç¥Rç¥Zç¥Rç­Zï¥Zç¥Rç¥Rç¥R¥s!ccZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Rç¥Rç¥Jç¥Rç¥Rç¥Rç¥ZsZ)))ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBRZcJ)µ„Bç¥Rç¥Rç¥Zï¥Zç¥RskBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Rç¥Zï¥Rç¥Rç¥Rç¥Rœs)ZskÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΔk9ï¥Rç¥Zµ”c1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBç¥Rç¥Rç¥Rç¥Rç¥Zç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ΄9÷Œ)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Zç¥Rç¥RkBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBJRÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ
\ No newline at end of file
Index: rel_1_2/simcity/img/bb1.raw
===================================================================
--- rel_1_2/simcity/img/bb1.raw (revision 1198)
+++ rel_1_2/simcity/img/bb1.raw (nonexistent)
@@ -1 +0,0 @@
-ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZcc!)!911))111ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ111J))91)Z))J)9))ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJJJ)19!9!)Z)c19)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)JJ)c1)))!91)!!)91ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9)J)1c1B1Z!J191)91))J))!!ZZZkcZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)9!)c1J)J)c1B1)!!91)!)9)))9)J11)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9JB))J)Z)9)9))!J!9))))91)9)kcZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJJ)1)1)J1Z)))J1)B1))91)!)91!!9)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)1))1))9))!!J911))))1)J)!!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJ)))1)J)1)!!J))B191)1)!!9!)!cZBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1JJ)k1B1)!9!9)JJ!))9))9!9)!!)!)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJ9)9)Z)))J!9)1B1))1)9!)J!)!!!RB9ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1)J!J)1)Z)Z)))9!J11J)9!J!)9!Z)Z))Z)Z)B1)1)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9!Z)))!9!)))))!J)919)J!!)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)B11)J19!J)B1Z)c1)91)91)J9J))!!9))1)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)!)19)J1J)J)!)J19)J9911)91)911)9)J)9!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ))9!9)9))!J)c1))9)91911))J!)9)Jk1Z)9!!!!)!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)!)))!J!9)9))ZB1))J1))91!!))))ç­Bï­B)))sB9)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)!)))9!)B1J!k1)J9J))))B19!)9!ç­Bç­Bç­Bç­Bç­Bç­Bç­BÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)))sBc1sB1)­k!­c)1J1)B1))ç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­B1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)!)1)9!c1))ïœç­Bç­B)))J9)ç­Bç­Bç­Bç­J÷­Jç­Bç­Bç­Jç­B„RkcZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ))çœ!ïœçœ!ç­Bç­Bç­Bÿ¥9))))))ç­Bç­Bç­Jç­Bï­Bç­JçµZç­Bç­Bç­Jç­B1B91ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎB1k1ïœçœ!çœ!ç­Bç­Bï­Bç­Bç­Bç­B)))J9)ç­Bç­Bç­Bç¥9ç­Bç­Bç­Rïµkç­Bç­Bç­Bç­J))ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎk1„Bçœ!ïœçœ!ç­Bç¥9ç¥9ç­Jç­Bç­Bç¥9ޔ!”c!„Rç­Jç­Bç­Bç­Bç¥9ç­Bç­Bç­Rç­Rïµsïµsç­Bç­B)!)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ))΄çœ!çœ!ç­Bç¥9ç­Bç­Bç­Bç­Bç­Bç­Bï­Bç¥9Þ­Jï­Bï­Bç­Bç­Bç­Bç­Bç­Bç­Jç­Jç­Rïµkïµkïµsç­BZBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!ï¥)ç¥9ç­Bç¥9ç­Bç­Jç­Bç­Bç¥9ç­Jç­Bï­Bç¥9ç­Bç­Jç­Bç­Bç­Jç­Bç­Bç­RçµZçµZçµsïµkïµkç­BÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!ïœï¥)ç¥9ç­Bç­Bç­Bç­Bç­Jç­Bç­Bç­Bç­Bç­Bç­Bç­Jç­Jç­Bç­Bç­Jç­Jç­Bç­JçµZÞ­cïµkïµkïµsïµkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!çœ1çœ1ç¥9ç­Jç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Jç­Jç­Bç­Bç­Bç­Jç­JçµZÞ­cïµsïµkïµkïµsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœçœ!çœ1ç¥9ç­Bç­Bç­Bç­Bç­Jç­Bç­Bç­Bç­Jç¥9ç¥9ç­Jç­Bç­Jç­Jç­Bç­Bç­Jç­Rç­RïµkçµZçµsïµkïµkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!ï¥)ç¥)çœ1ç­Bç­Bç­Bç­Jç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Jç­Jç­Jç­Jç­Rç­Jç­RçµZïµkïµsïµkïµsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!÷œ!çœ1ç¥9ç­Bç­Bç­Bç­Bç¥9ç­Jç­Jç­Jç­Bï­Bç­Bç­Bç­Bç­Jç­Bç­Jç­Rç­JçµZçµZçµZÞ­cïµkïµkïµk!)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!ïœçœ1çœ1ç¥9ç¥9ç­Bç­Bç­J½œJ­Œ1ç­Bç­Jï­Bç­Bç­Bç­Bç­Bç­Jç­JÞ­J­”Rœ„B­ŒRÞ­cïµkïµkçµsïµk1)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!ïœç¥)çœ1ç­Bç­Bç­Bï­Bç­Js1Ö¥Bç­Bç­Bç­Jç­Rç­Jç­B½œJΜRï½kçµZïµkïµs)1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!ç¥)ç¥9ç­Bç­Jç­Bç­JÿÖRÿÿcç¥9ç­Bç­Jïµkç­RÞ­J„„B1kBJkB”kBÿÆcçµZÞ­kçµZïµsïµkB91ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!çœ!çœ1ç¥9ç­Bç­Bç¥9ÿ½JJ{B!ZB)c1ç¥9ç­Bç­RçµZç­RçµZ¥”B19!)çµZçµZïµkçµZÞ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœçœ!ç¥)ç¥9ç­Bç­Bç­Bÿ½J„BB1÷­Jç­Bç­RεkB1çµZµ”Bµ{JçµZçµZçµZÞ­kçµZçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!ç¥)ç¥9ç­Bç­Bç­Bç­Bÿ½J½œJsB)ï­Bç­Jç­J­­kçµZçµZçµZçµZÞ­kçµZïµkï½kçµZçµZïµsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1ksçœ!ïœç¥)ç¥9ç­Bç­Bç­Jç­Jï­Bÿ½Jÿ½Jÿ½Jç­Bç­Bï­Bµ­{9çµZçµZç­RçµZçµZçµZÞ­cÞ­kÞ­cçµZïµkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!çœ!çœ1ç¥9ç¥9ç­Bç­Jç­Jç­Bï­Bï­Bç­Bç­Bç­J½­sJJçµZçµZç­Rç­RçµZçµZï½kçµsçµZçµZçµsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZ)çœ!çœ!ïœç¥)ç¥9ç­Jç­Jç­Bç­Bç­J÷­Jç­Jç­Jç­Bç­BÞ­ccZc!9çµZç­RçµZçµZÞ­cïµkçµsÞ­cçµZïµsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!ïœç¥)ç¥9ç­Bç­Jç­Bÿ½JÖ¥B))çµZç­Jç­Bç­Bç­R½­s„„B1)­ŒRçµZçµZÞ­kçµZçµZçµZïµkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!ޔޔ!Þ¥1ç¥9ç­B÷­JΜRœs1çµZçµZçµZçµZçµZçµZçµZçµZ{ŒJçµZÞ­cï½kçµZçµZçµZJkBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJRsçœ!ÿ”çœ!ïœçœ1ç¥9ç¥9ÿ½J„Bç­RçµZçµZÞ­cçµZçµZs„cçµZçµZÞ­kÞ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJJïœçœ!ïœç¥)Þ¥1ç¥9ÿ½J„BçµZçµZçµZœœk!ZBçµZçµZçµsçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎR{{çœ!ïœޔ!çœ1ç¥9ç­J½œJµ”BŒc1÷­c)1Þ­kçµZçµZJJ”B)çµZçµZçµZçµZçµZïµkçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœçœ!ç¥)Þ¥1ç­Bï­Bÿ½Jÿ½JÿÖR{9R!çµZµÞ­÷­JçµZçµZïµkÞ­cçµsçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!ïœç¥)ç¥9ç¥9ç­Bç­BÞ¥B÷­J¥”BÿÞ¥„ZïµkçµZçµZçµZçµZï½kÞ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1„Bçœ!ïœޔ!ç¥9Þ¥Bç­BÞ¥Bç­Bï­BÞ­Jc)9B)1÷­JçµZçµZÞ­cïµkïµkçµsçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœï¥)çœ1ç¥9ç­Bç­Jç­Bç­BçµZçµZçµZçµZçµZçµZçµZçµZÞ­cÞ­cçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!çœ!çœ!ç¥9ç¥9ç¥9ç¥9ç¥9çµZçµZçµZçµZçµZçµZçµZçµZï½kçµZçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!c„kç¥9ç¥9ç¥9ç¥9ç¥9¥{B1B!ksZcJ1çµZçµZçµZÞ­cçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)ccïœçœ!½{!ç¥9ç¥9ç¥9¥”Bç¥9k{„s)Œc1çµZçµZï½kÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1çœ!„Rÿ”ç¥9Ö¥B­”RkZBB1cBc9Jÿÿÿ9BR„cB9RZ{JJ„sBçµZÞ­cÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9sBBJÿ”Ɣ11Zœ99)1{!)11J„9çµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ!!9{R½sÿ”ÿ¥9µ”B­”RŒs9cJ1­”RçµZçµZΜRÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎk1çœ!ÿ”ÿ”ÿ¥9ÿ¥9ÿ¥9„„B)J1ZZ)BR)1))J1ZZ)ïµkçµZçµZï½k„sBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ÿ”ÿ”çœ1ï­Bÿ¥9ÿ½J¥”BŒs9sc)kk9„sB½œJçµZçµZÞ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ!)ZœJÿ”ÿ”ï¥)ÿ¥9ï­B÷­J÷­J÷­Jÿ¥9÷­JçµZÿ½kÿ½kçµZçµZÞ­cÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ÿ”çœ!ç¥9ï­B÷­JçµZ÷­J÷­c÷­Jÿ½k÷Æ{÷Æ{ïµsÞ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœïœç¥9c)Œs9ïµsÞ­cÞ­cïµkïք­­k”„ZïµsçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ!)Zsÿ”çœ!ï¥)ZŒ9µ{Jç½{Þ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!ç­Bç¥9ç¥9ç¥9çµZçµZçµZïµkçµZçµZçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!ïœç¥9ç­Jç­Jç­RçµZçµZÞ­kÞµsçµZçµZÞ­c1cBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJRskïœçœ!Þ¥1ç¥9Þ¥BÞ¥Bç­RÞ­cÞ­cïµkÞµsÞµsÞ­c­”RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!Þ¥1Þ¥1Þ¥BÞ­Jç­RçµZÞ­cÞ­kçµsÞµsçµZ­ŒR)J1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΜJÿ”Þ”!ޔ!ç¥9ç­Rç­RçµZÞ­kÞ­kçµsÞµsçµZ”„Z111ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJJJJÿ”Þ”Þ¥1Þ¥BÞ­Jç­RΜRïµkÞ­kÞµsç½{çµZŒc1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!ޔ!ç¥9Ö¥BÞ­cÞ­cçµZïµkçµsç½{çµZ”kBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœޔ!çœ!Þ­Jç­RÞ­cÞ­cïµkïµsïµsçµZŒkJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!ïœçœ!ïœÞ­cçµZÞ­cçµZÞ­cçµZçµZœ„B9ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!çœ!çœ!çœ!çµZçµZçµZçµZçµZçµZçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZ„cJ1çµZçµZÞ­kçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZcc9B)9)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ
\ No newline at end of file
Index: rel_1_2/simcity/img/car_210n.raw
===================================================================
--- rel_1_2/simcity/img/car_210n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_210n.raw (nonexistent)
@@ -1 +0,0 @@
-€ÿ€ÿ€€€ÿÿ€€€ÿÿ€€€€€€€€€ÿ€€€€€€€ÿÿ€ÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿ€
\ No newline at end of file
Index: rel_1_2/simcity/img/car_120n.raw
===================================================================
--- rel_1_2/simcity/img/car_120n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_120n.raw (nonexistent)
@@ -1 +0,0 @@
-€ÿÿÿÿÿ€ÀÀÀÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿ€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿ€ÿÿÿÿÿ€€€€ÿÿ€€€€€€ÿÿ€€€€€€€€€ÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€€ÿ€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€€ÿ€€€€€€€€€ÿÿ€€€€€€€ÿÿ€€€€ÿ€€€€
\ No newline at end of file
Index: rel_1_2/simcity/img/car_030n.raw
===================================================================
--- rel_1_2/simcity/img/car_030n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_030n.raw (nonexistent)
@@ -1 +0,0 @@
-€ÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿ€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿ€ÿÿ€€€€€€€ÿ€€€€€€€€€ÿÿ€€€ÿÿ€€€ÿ€ÿ€
\ No newline at end of file
Index: rel_1_2/simcity/img/car_300n.raw
===================================================================
--- rel_1_2/simcity/img/car_300n.raw (revision 1198)
+++ rel_1_2/simcity/img/car_300n.raw (nonexistent)
@@ -1 +0,0 @@
-€€€€ÿ€€€€ÿÿ€€€€€€€ÿÿ€€€€€€€€€ÿ€€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€ÿ€€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿ€€€€€€€€€ÿÿ€€€€€€ÿÿ€€€€ÿÿÿÿÿ€ÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€ÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÀÀÀ€ÿÿÿÿÿ€
\ No newline at end of file
Index: rel_1_2/simcity/img/street.raw
===================================================================
--- rel_1_2/simcity/img/street.raw (revision 1198)
+++ rel_1_2/simcity/img/street.raw (nonexistent)
@@ -1 +0,0 @@
-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑ­›Ñukÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãʵÓfPé=6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿޘ…å@-øF7ÝG@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÄ­ßTEû<.øI5ø;6èskÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚ|kèC5î=0â[Fø<3í;6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿܲ—å>5í@7×gWöÐÅÖD4ùB4ÜeYÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×iU÷<4æ88ñ̼öýñ݅uõB3í@8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔ Ší<,ð72Ý~yèäÙÞãÞôàØäF9÷@-Ó[Vÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖűÛPBöE3ÙA<ôáÙA=4;98øôì圃î@.èA4ؖ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ؆rï?0ë70䤛úûôŠ‰„‰†ˆüüôùïÚÔP>ü;,ãOMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿⱡßC7ìA1ÝVRûóïöùõ¦¡š911—“øùò髤ï?/ôC6ّÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØs\÷<5ã:3ê¾´ýüûÖØÔ=*830(z|üóñÕ`J÷C,áHBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿТŒí>7õ80×{küùôúøöUYRjYS) %®©¨LHDòíæá¶æ97êE+ßlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØYKó?6Û=5øÜÑüüùŸ™˜tsn“ˆ„%¬¥¥QPLññèýöíÝlfñ@,áE0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˗‚ñ93ì60睒üûöùüýÊÄÂòî蠙”P?;¾´±ÚÛÔóùïúúðïÐÆìA5û=*âjeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕO:ù?1ßIK÷òìúýüúýþûúôöñìB?<ˆ‚}SMJúüõóþïöüïûûñâ{nõ;)í=4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜmiøB0ì<'ð³°íÿúýøûûûýôþòž“ijhööô?;8¿¼÷ûíþùëúúìøáÒÚF2û>1Ú_Tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã@8û;-æ`VøøðåêêêåæúøöááÚ820ÔÑÐèéç·´³RLK÷ôîõóéìëäúùïà•„î?-î72ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêQLù;*â8,ôÏÈéèä%# ab]ÃÁ·TVLz{uvl('#èéçJHE±¢˜Àµ­©©öìãÙO9ý=1ÒXDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô<'ì>.ٍ€úý÷|poÏÍÌ©™Žmf`ëêé{pj)")ààÞ¦ mbVçäáD?:D66ôòï骚æB1ó9,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛP1ñI/ÙEEûêéÊÁÃ0WLNñîî1!0$%ñìí\ON)ÔÔÕxuk!³²´œ™— ……‰ûõñÅZKý82ÞC:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñE.ð:+ò«§÷ü÷º¿¶˜›’ÕÒÏååݍŒ‚¢¤Ÿûýù››ˆ‚‚ãáÞÊŇ~|µ´²ðîì~|uƒ€|ùúõê¾°àC5ô<6߆oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé88öD6óB2ÓaUï\]á`Oàg[ßfcä_Yêc`æciçnhêp_âtpÝuuÞnuåszÛxsèzÔ{oê€vã~è‚zíE8û@9ßC*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù<3ú>3û:0ü?5ý?6ü=3û=3ú=8ø=;ùA>ö;6ø?7÷=2ûB0ú@-ø@-ø@-ø@,ù<0ù@4ú=1ú:0ü<3ù?0üE3ù>3Øxeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿӅvÞb\ßbYê\Mí`Që]Nì\MêYIèTBæQ;æS;éP8êR7èO7æFBêHDá>:æB?èDAâE7ÞB2ÞA1áA2Ú9+Ù:*ã;.ß:0½dQÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABBABBABBABBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABBABÿÿÿÿÿBABBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABBABÿÿÿÿÿÿÿÿÿBABBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABBABÿÿÿÿÿÿÿÿÿBABBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABBABBABÿÿÿBABBABBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABBABBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑ­›Ñukÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãʵÓfPé=6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿޘ…å@-øF7ÝG@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÄ­ßTEû<.øI5ø;6èskÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚ|kèC5î=0â[Fø<3í;6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿܲ—å>5í@7×gWöÐÅÖD4ùB4ÜeYÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×iU÷<4æ88ñ̼öýñ݅uõB3í@8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔ Ší<,ð72Ý~yèäÙÞãÞôàØäF9÷@-Ó[Vÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖűÛPBöE3ÙA<ôáÙA=4;98øôì圃î@.èA4ؖ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ؆rï?0ë70䤛úûôŠ‰„‰†ˆüüôùïÚÔP>ü;,ãOMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿⱡßC7ìA1ÝVRûóïöùõ¦¡š911—“øùò髤ï?/ôC6ّÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØs\÷<5ã:3ê¾´ýüûÖØÔ=*830(z|üóñÕ`J÷C,áHBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿТŒí>7õ80×{küùôúøöUYRjYS) %®©¨LHDòíæá¶æ97êE+ßlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØYKó?6Û=5øÜÑüüùŸ™˜tsn“ˆ„%¬¥¥QPLññèýöíÝlfñ@,áE0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˗‚ñ93ì60睒üûöùüýÊÄÂòî蠙”P?;¾´±ÚÛÔóùïúúðïÐÆìA5û=*âjeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕO:ù?1ßIK÷òìúýüúýþûúôöñìB?<ˆ‚}SMJúüõóþïöüïûûñâ{nõ;)í=4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜmiøB0ì<'ð³°íÿúýøûûûýôþòž“ijhööô?;8¿¼÷ûíþùëúúìøáÒÚF2û>1Ú_Tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã@8û;-æ`VøøðåêêêåæúøöááÚ820ÔÑÐèéç·´³RLK÷ôîõóéìëäúùïà•„î?-î72ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêQLù;*â8,ôÏÈéèä%# ab]ÃÁ·TVLz{uvl('#èéçJHE±¢˜Àµ­©©öìãÙO9ý=1ÒXDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô<'ì>.ٍ€úý÷|poÏÍÌ©™Žmf`ëêé{pj)")ààÞ¦ mbVçäáD?:D66ôòï骚æB1ó9,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛP1ñI/ÙEEûêéÊÁÃ0WLNñîî1!0$%ñìí\ON)ÔÔÕxuk!³²´œ™— ……‰ûõñÅZKý82ÞC:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñE.ð:+ò«§÷ü÷º¿¶˜›’ÕÒÏååݍŒ‚¢¤Ÿûýù››ˆ‚‚ãáÞÊŇ~|µ´²ðîì~|uƒ€|ùúõê¾°àC5ô<6߆oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé88öD6óB2ÓaUï\]á`Oàg[ßfcä_Yêc`æciçnhêp_âtpÝuuÞnuåszÛxsèzÔ{oê€vã~è‚zíE8û@9ßC*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù<3ú>3û:0ü?5ý?6ü=3û=3ú=8ø=;ùA>ö;6ø?7÷=2ûB0ú@-ø@-ø@-ø@,ù<0ù@4ú=1ú:0ü<3ù?0üE3ù>3Øxeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿӅvÞb\ßbYê\Mí`Që]Nì\MêYIèTBæQ;æS;éP8êR7èO7æFBêHDá>:æB?èDAâE7ÞB2ÞA1áA2Ú9+Ù:*ã;.ß:0½dQÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
\ No newline at end of file
Index: rel_1_2/simcity/misc.c
===================================================================
--- rel_1_2/simcity/misc.c (revision 1198)
+++ rel_1_2/simcity/misc.c (nonexistent)
@@ -1,215 +0,0 @@
-#include <math.h>
-#include "include/misc.h"
-#include "include/simcity.h"
-
-int my_rint(float num) {
- return (int)floor(num+0.5);
-}
-
-void fill_table(void) {
- int i;
- for (i=0;i<360;i++) {
- sine[i]=sin(DEG_TO_RAD(i));
- cosine[i]=cos(DEG_TO_RAD(i));
- }
-}
-
-void tl_init() {
-//MAPX,MAPY
- char col[2];
- short i;
-
- col[0]='r';
- col[1]='g';
- for(i=0;i<MAX_TL;i++) {
- tl_data_array[i].vpos=col[i%2];
- tl_data_array[i].period=(i+3)*SECOND;
- tl_data_array[i].l.x+=MAPX;
- tl_data_array[i].l.y+=MAPY;
- tl_data_array[i].r.x+=MAPX;
- tl_data_array[i].r.y+=MAPY;
- tl_data_array[i].u.x+=MAPX;
- tl_data_array[i].u.y+=MAPY;
- tl_data_array[i].d.x+=MAPX;
- tl_data_array[i].d.y+=MAPY;
- }
-}
-
-void set_start_point() {
- //MAPX,MAPY
- starting_set_array[0].xpos=607+MAPX;
- starting_set_array[0].ypos=20+MAPY;
- starting_set_array[0].angles=180;
- starting_set_array[1].xpos=12+MAPX;
- starting_set_array[1].ypos=62+MAPY;
- starting_set_array[1].angles=0;
- starting_set_array[2].xpos=260+MAPX;
- starting_set_array[2].ypos=460+MAPY;
- starting_set_array[2].angles=90;
- starting_set_array[3].xpos=605+MAPX;
- starting_set_array[3].ypos=205+MAPY;
- starting_set_array[3].angles=180;
-}
-
-int returnCarIndex(int a) {
- int indice=-1;
- int angle;
-
- angle=normalize(a);
- if (((angle>=0) && (angle<=8)) || ((angle>353) && (angle<360))) { // 0 (+8 ; -7)
- indice=0;
- }
- if ((angle<=23) && (angle>8)) { // 15
- indice=1;
- }
- if ((angle<=38) && (angle>23)) { // 30
- indice=2;
- }
- if ((angle<=53) && (angle>38)) { // 45
- indice=3;
- }
- if ((angle<=68) && (angle>53)) { // 60
- indice=4;
- }
- if ((angle<=83) && (angle>68)) { // 75
- indice=5;
- }
- if ((angle<=98) && (angle>83)) { // 90
- indice=6;
- }
- if ((angle<=113) && (angle>98)) { // 105
- indice=7;
- }
- if ((angle<=128) && (angle>113)) { // 120
- indice=8;
- }
- if ((angle<=143) && (angle>128)) { // 135
- indice=9;
- }
- if ((angle<=158) && (angle>143)) { // 150
- indice=10;
- }
- if ((angle<=173) && (angle>158)) { // 165
- indice=11;
- }
- if ((angle<=188) && (angle>173)) { // 180
- indice=12;
- }
- if ((angle<=203) && (angle>188)) { // 195
- indice=13;
- }
- if ((angle<=218) && (angle>203)) { // 210
- indice=14;
- }
- if ((angle<=233) && (angle>218)) { // 225
- indice=15;
- }
- if ((angle<=248) && (angle>233)) { // 240
- indice=16;
- }
- if ((angle<=263) && (angle>248)) { // 255
- indice=17;
- }
- if ((angle<=278) && (angle>263)) { // 270
- indice=18;
- }
- if ((angle<=293) && (angle>278)) { // 285
- indice=19;
- }
- if ((angle<=308) && (angle>293)) { // 300
- indice=20;
- }
- if ((angle<=323) && (angle>308)) { // 315
- indice=21;
- }
- if ((angle<=338) && (angle>323)) { // 330
- indice=22;
- }
- if ((angle<=353) && (angle>338)) { // 345
- indice=23;
- }
- if (angle==360) {
- indice=0;
- }
- return indice;
-}
-
-int normalize(int angle) {
- if(angle<0)
- return ((angle+360));
- if(angle>=360)
- return ((angle-360));
- return angle;
-}
-
-int module(int x1,int x2,int y1,int y2) {
- int x,y;
-
- x=x1-x2;
- y=y1-y2;
- x*=x;
- y*=y;
- return x+y;
-}
-
-int allinea(int angle) {
-int old_angle;
-
- old_angle=normalize(angle);
- if(old_angle<45)
- old_angle=0;
- else if(old_angle<135)
- old_angle=90;
- else if(old_angle<225)
- old_angle=180;
- else
- old_angle=270;
- return old_angle;
-}
-
-int find_tl(int angle,int xp,int yp) {
- int a,min_tl,old_min,mins,i;
-
- a=allinea(angle);
- min_tl=old_min=10000;
- for(mins=i=0;i<MAX_TL;i++) {
- switch(a) {
- case 0:
- min_tl=module( xp,tl_data_array[i].l.x, yp,tl_data_array[i].l.y);
- break;
- case 90:
- min_tl=module( xp,tl_data_array[i].d.x, yp,tl_data_array[i].d.y);
- break;
- case 180:
- min_tl=module( xp,tl_data_array[i].r.x, yp,tl_data_array[i].r.y);
- break;
- case 270:
- min_tl=module( xp,tl_data_array[i].u.x, yp,tl_data_array[i].u.y);
- break;
- default:
- break;
- }
- if(min_tl<old_min) {
- old_min=min_tl;
- mins=i;
- }
- }
- return mins;
-}
-
-int find_col(int angle,int tl) {
- int min_tl=0,a;
-
- a=allinea(angle);
- switch(a) {
- case 0:
- case 180:
- min_tl=tl_data_array[tl].hpos;
- break;
- case 90:
- case 270:
- min_tl=tl_data_array[tl].vpos;
- break;
- }
- return min_tl;
-}
Index: rel_1_2/simcity/sem.raw
===================================================================
--- rel_1_2/simcity/sem.raw (revision 1198)
+++ rel_1_2/simcity/sem.raw (nonexistent)
@@ -1 +0,0 @@
-199146290278187261299163441142537285427269538166193318290431178423298324
Index: rel_1_2/simcity/makefile
===================================================================
--- rel_1_2/simcity/makefile (revision 1198)
+++ rel_1_2/simcity/makefile (nonexistent)
@@ -1,15 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= simcity
-
-include $(BASE)/config/example.mk
-
-simcity:
- make -f $(SUBMAKE) APP=simcity INIT= OTHEROBJS="initfile.o keyboard.o keyfunct.o tasks.o reading.o misc.o draw.o proc.o car.o" SHARKOPT="__OLDCHAR__ __GRX__"
Index: rel_1_2/simcity/draw.c
===================================================================
--- rel_1_2/simcity/draw.c (revision 1198)
+++ rel_1_2/simcity/draw.c (nonexistent)
@@ -1,139 +0,0 @@
-#include <drivers/glib.h>
-#include "include/draw.h"
-#include "include/simcity.h"
-#include "include/states.h"
-#include "include/misc.h"
-#define rgb rgb16
-
-void draw_tl(int x,int y,DWORD img[SH][SW]) {
- int i,j;
-
- for(i=0;i<SH;i++) {
- for(j=0;j<SW;j++) {
- //if(img[i][j]==tl_bg) continue;
- grx_plot(x+j,y+i,img[i][j]);
- }
- }
-}
-
-void draw_scenario() {
- char msg1[35];
- int color,fbg;
-
- color=rgb(235,235,235);
- fbg=rgb(198,198,206);
- grx_putimage(0,0,799,599,clrscr);
- bold_rect(0,0,300,100,0,0,(255-120));
- bold_rect(656,102,799,599,(254-120),(255-120),0);
- grx_putimage(MAPX,MAPY,MAPX+W-1,MAPY+H-1,street);
- bold_rect(0,102,655,599,0,0,(255-120));
- bold_rect(301,0,799,100,(255-120),0,0);
- grx_box(308,8,791,92,fbg);
- grx_text("Alt + x , Enter -> Stop SIMCITY",10,10,color,black);
- sprintf(msg1,"c -> Create a new hard car (max %d)",MAX_CAR);
- grx_text(msg1,10,20,color,black);
- sprintf(msg1,"s -> Create a new soft car (max %d)",MAX_CAR);
- grx_text(msg1,10,30,color,black);
- grx_text("k -> Kill oldest car",10,40,color,black);
- grx_text("r -> Refresh screen",10,50,color,black);
- grx_text("d -> Toggle sensor",10,60,color,black);
- grx_text("road spd",CAMX,CAMY-10,gray,black);
- grx_text("Simcity is presented by",450,20,black,fbg);
- grx_text(" Aguzzi Marco",450,50,rgb(200,140,5),fbg);
- grx_text(" &",450,60,black,fbg);
- grx_text(" Ferrari Fabio",450,70,rgb(120,40,226),fbg);
- drawFaces(390,15,0);
- drawFaces(640,15,1);
-}
-
-void bold_rect(WORD x1,WORD y1,WORD x2,WORD y2,BYTE r,BYTE g,BYTE b) {
- int c1,c2,c3,c4;
-
- if(r>=255) r=255;
- if(g>=255) g=255;
- if(b>=255) b=255;
-
- c1=rgb(r,g,b);
- c2=rgb((r+40),(g+40),(b+40));
- c3=rgb((r+80),(g+80),(b+80));
- c4=rgb((r+120),(g+120),(b+120));
- grx_rect(x1,y1,x2,y2,c1);
- grx_rect((x1+1),(y1+1),(x2-1),(y2-1),c2);
- grx_rect((x1+2),(y1+2),(x2-2),(y2-2),c3);
- grx_rect((x1+3),(y1+3),(x2-3),(y2-3),c4);
- grx_rect((x1+4),(y1+4),(x2-4),(y2-4),c4);
- grx_rect((x1+5),(y1+5),(x2-5),(y2-5),c3);
- grx_rect((x1+6),(y1+6),(x2-6),(y2-6),c2);
- grx_rect((x1+7),(y1+7),(x2-7),(y2-7),c1);
-}
-
-void drawCar(int x,int y,int angle,char mode) {
- int i,j;
-
- for (i=0;i<ROW;i++) {
- for (j=0;j<COL;j++) {
- if (macchine[i][j][returnCarIndex(angle)]!=0) {
- grx_plot(x+j-15,y+i-15,macchine[i][j][returnCarIndex(angle)]*mode);
- }
- }
- }
-}
-
-
-void get_images() {
-
- grx_getimage(0,0,799,599,clrscr);
- drawStreet(0,0);
- grx_getimage(0,0,639,479,street);
- grx_putimage(0,0,799,599,clrscr);
- grx_getimage(0,0,31,31,clrcam);
- drawSprites(15,15,GAUGE,DRAW);
- grx_getimage(0,0,29,29,gauge_img);
- grx_putimage(0,0,30,30,clrcam);
- drawSprites(15,15,ARR_OFF,DRAW);
- grx_getimage(0,0,29,29,arrow[1]);
- grx_putimage(0,0,30,30,clrcam);
- drawSprites(15,15,ARR_SX,DRAW);
- grx_getimage(0,0,29,29,arrow[2]);
- grx_putimage(0,0,30,30,clrcam);
- drawSprites(15,15,ARR_DX,DRAW);
- grx_getimage(0,0,29,29,arrow[0]);
- grx_putimage(0,0,30,30,clrcam);
- drawSprites(15,15,GAUGE_ROTTO,DRAW);
- grx_getimage(0,0,29,29,brk_gauge);
- grx_putimage(0,0,30,30,clrcam);
-
-}
-
-void drawStreet(int x,int y) {
- int i,j;
-
- for (i=0;i<H;i++) {
- for (j=0;j<W;j++) {
- grx_plot(x+j,y+i,strada[i][j]);
- }
- }
-}
-
-void drawSprites(int x,int y,char number,char mode) {
- int i,j;
-
- for (i=0;i<ROW;i++) {
- for (j=0;j<COL;j++) {
- if (sprites[i][j][(int)number]!=0) {
- grx_plot(x+j-15,y+i-15,sprites[i][j][(int)number]*mode);
- }
- }
- }
-}
-
-void drawFaces(int x,int y,short face) {
- int i,j;
-
- for (i=0;i<74;i++) {
- for (j=0;j<47;j++) {
- grx_plot(x+j,y+i,faces[face][i][j]);
- }
- }
-}
-
Index: rel_1_2/simcity/keyboard.c
===================================================================
--- rel_1_2/simcity/keyboard.c (revision 1198)
+++ rel_1_2/simcity/keyboard.c (nonexistent)
@@ -1,49 +0,0 @@
-/* ------------------ */
-/* Keyboard handler */
-/* ------------------ */
-
-#include <drivers/keyb.h>
-#include "include/keyfunct.h"
-
-void keyb_h() {
- KEY_EVT k;
- keyb_set_map(itaMap);
-/* Exit keys: ALT-X, ENTER */
- k.flag = ALTL_BIT;
- k.scan = KEY_X;
- k.ascii = 'x';
- keyb_hook(k, endfun);
- k.flag = ALTR_BIT;
- k.scan = KEY_X;
- k.ascii = 'x';
- keyb_hook(k, endfun);
- k.flag = 0;
- k.scan = KEY_ENT;
- k.ascii = 13;
- keyb_hook(k, endfun);
-/* Create HARD cars */
- k.flag = 0;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k, h_car_create);
-/* kill hard cars*/
- k.flag = 0;
- k.scan = KEY_K;
- k.ascii = 'k';
- keyb_hook(k, h_car_kill);
-//refresh map
- k.flag=0;
- k.scan = KEY_R;
- k.ascii = 'r';
- keyb_hook(k, refresh);
-//create soft cars
- k.flag=0;
- k.scan = KEY_S;
- k.ascii = 's';
- keyb_hook(k, s_car_create);
-//toggle sensors
- k.flag=0;
- k.scan = KEY_D;
- k.ascii = 'd';
- keyb_hook(k, sensor_switch);
-}
Index: rel_1_2/mesaref/readme.txt
===================================================================
--- rel_1_2/mesaref/readme.txt (revision 1198)
+++ rel_1_2/mesaref/readme.txt (nonexistent)
@@ -1,52 +0,0 @@
---------------------------------------
-MESA Demo (reflect)
-
-by
-
-Giacomo Guidi <giacomo@gandalf.sssup.it>
-
-Last update 20/03/2003
---------------------------------------
-
-This is a simple test demo for the MESA (5.0)
-libraries, the low level graphic drivers is
-the SVGA (from the SVGAlib)
-
-See drivers/svga/readme for supported cards
-
-You need a test.png file present in the
-same directory of the demo. Remember that
-the file system support only a DOS FAT16 fs.
-
-The PNGlib will load this file and it
-will be used as a texture.
-
---------------------------------------
-
-The demo is composed by:
-
-MAKEFILE The makefile used to compile the application
-README.TXT This file
-INITFILE.C The init file (with fs initialization)
-MESAREF.C The MESA Demo
-TEST.PNG The PNG texture image
-
---------------------------------------
-
-- To specify your card change the line
-
-#define CARD <driver name>
-
-- The demo calls the grx and off-screen Mesa functions.
-The resolution must be 16 bitsperpixel (64K colors) and
-the graphic access mode must be linear.
-
-- There are two buffers
-
- The video buffer (video_buf)
- The virtual buffer (rgb_565_buf)
-
- copy_videomem_16to16 links these buffers
-
-- If the texture load fails, sys_end() is called
-
Index: rel_1_2/mesaref/makefile
===================================================================
--- rel_1_2/mesaref/makefile (revision 1198)
+++ rel_1_2/mesaref/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS = mesaref
-
-include $(BASE)/config/example.mk
-
-mesaref:
- make -f $(SUBMAKE) APP=mesaref INIT= OTHEROBJS="initfile.o" SHARKOPT="__OSMESA__ __PNG__ __OLDCHAR__ __SVGA__"
-
Index: rel_1_2/mesaref/test.png
===================================================================
--- rel_1_2/mesaref/test.png (revision 1198)
+++ rel_1_2/mesaref/test.png (nonexistent)
@@ -1,373 +0,0 @@
-‰PNG
-
- -IHDRÈÈ":9ÉbKGDÿÿÿ ½§“ pHYs. . ÕtIMEÓ ÿÅ IDATxœì¼ùómÙUط֞Ît‡ï÷ûæîVOzjµf 4€(3ÉNÇ®Æ8ÓONŠ vå—üI¥R•TBœCBœªT\6B˜l™…µ‰žÇ×ݯß{ßáÞ{¦=®µòÃ}ï©5`‚ ¨ÜhÕ÷{ëÞ[ûܳÏޟ³ÖÚk¯uPDà­&ûkÂòÏüÌÏ~Ó7}ã}÷]AõÕîÔ_0yˎ·ˆ@)¿Ú½ù‹'oM°˜xžg"úWþòÖ öjŠ™ßŠ¶þ_y˂…ÀÌÌüÕîË_Dykƒ%D$ò5°¾
-ò–ë ¶ïkë«%oI°¾ _ó±¾ZòKäv ‹ˆJÉøµÖWCނƒŽ"""9ç”2"~Meýù‹ùjwàÏBP)¹m
-åk1Ò?oyëi,¹» üšƒõU”·X"p—%PJ)õV»Æ%ä-9è"€ˆÎ9­5~Íþ¹Ë[¬Û!*cŒÖú«Û›¿˜òÿƒóþÇú1øGk `Ü7¹Ó
-áÍ1Î;-¿âoˆ¼ùÇEöž:f!A•ÀÖ™% ºAo+9`¾ýX@áµ¼s6($H 4* -€œ@)û›Uà „_|¸ñµì— €òÅ÷:ßþâîúC„ PÁ~ЀH¢VÀˆ·Jî !Âz‚„PˆŒÖ,‚w¦Fö.€B`±ê+iäÎ_JRYw¦¾TGý™¯
-ÿT€(ÄýD¾é»¯ÔÞ@¿ -³ÞOÔÝs "
-ð!!(«€ î-‘RH)DTû£ïLŠ‚Rû‹€€B*ŒJ)@L¢´ƒ¹Ë ‚h‚BDáÛx‰ªý„ï‡ÿ6 _¸‹”ÚŸE¡ÜÍ$+¥à~X´ª@ÔmîT­ôþæCD¸¡3 Â"J©Â¬‚ˆ0+¥ö7±Ò ¡(¾3€R¨Dª;cÄ€ˆ@$ˆˆˆ¢4#X»o&1€‚ʾy¾þ¬ÀúãxÚ_/ßn)À{RD@ÝñÀ÷è¶Ï¤E„åN›Û -@ÉÙßÔŠ²
-ÊÔN±zù¹§·7Ÿ7h꺑R
-‹8k™¹Úÿ8"*­µÖLDDˆXJÉ97MSJQÊZk k,3ÏólŒa…‘U«µC*µ’ºÂ9Œ"ÐÖMŽ‘ )D¥À8s÷*ˆˆ™•6š™‰ÈZ‹ˆÞûº©BÊ,Ò4-(-€©ä˜BS- :!Ì A!צÍ9³°°ä’…¥­£Íèg4V¹*bPZD8ÇÖUN«¼F¥-ÌÞW•Ûw)çl­K1c”R¥3Õu]raDPJ§”œ³MÓâÞG_€Ð,šJÂÐhb(²^\yÿ׿y~ÿÌ5Ö ¾Ôfíwñ˜Š€ˆìGJ@ùv¢ž߁‹(ïÃû×Û0íßÞ>ò¶î(9GžmӍ;¸öüÓÏ~ö“a¸á”R1ÆýÙµÖ,L…ˆ¨”¢”ªªªª*æR¨TU…ý0Xk©ëjcL¡®ëÓìg­M ;xš2fBdXÔvÙR¯µ>X-£÷@Ei…€®ª˜y¯„bˆ1ÅåÁÚ97Žã<Ï®ªœµ³÷—.õý˜Y–‡çÚÅ*î‡)R6Ú9å*­Ê)î(-&†hŒ±Îúyö!4UU¹j 1²^¸,ÚlúÁìùÈéüziû¾¯ÆmŒÑ:kŒQ¨B‹E'ÄÔ6m)e×ﺶË9û˜@ÄU•ÖºigmJùx;Üê“ÕÕu#óŅQÖ"«ûï{ð?ÿßòÏ ,ù‚Ö¹ -"ÞÝlÙ߯B¥ìú1\@XöTÝþ¸¤}ºýÏ·Íã>Î~:P #Gá­Ó1ϭ惶 ->(EÎ9"R(Z"U
-ÄDR[hkMLT n”sÎJ(9ëF#’)•;[¦Ö¸B2o|‰DdSA"¡R ӁK­mmaS+£1„R'‘©ªª¬í©Ud Ð\i® ØJ9
-5æ0sÕP¢£m›‹ÑTÕÎ@ "JҔŒ¶V4×Õ È¡VBTÈÊa@S¥Ak„œ²•„qn”‚£ -„ VZ‡ëÆ*«¢ä‹‚2†Drݶ˜eš³°(&¥QȤRäJ‰`¡"èKfÿÏ
-¬½™“7ɛ?Ò*
-è6Nwá…˨nǔå6UDDÄ,,oËíß,…™¬8{wA’—5pɱ”h4֕ -¬5Î9ï½vms.9‚T•Sb-*Èu­gŽÝ¢Æ˜RTJi- ÔÔõ¶ÆyfJªKX‰R 2ÌÁ„Ñ)•cHa¶­câæÊZ­5—äºÆ™*GïçI - ueQ"E¡ÄiDA`ÇLY͡ԍžcĊqJžKªœA`d­8'¡âœ[/L¬B“àì£Odk•D-›V@â¶m9ykM×u)%f®*£AŽÑk*Æ؅s ç8禪÷›cÀœS¢B ,M»ŠTQ
-`Hkur¶5¦®êöÏ ¬7côfãµÿ¸7@D$% %x“zʁ)ß±–·ùRpÇxQ)Ä,̉øntïQ)lPR.¬ÂD
-(ûY™T/—{oFk=Ž£1Æ9BPJ-—Ëa†a`fcœR8ÏsŠYk­P·M+¬D¸®ë¦iBÎY^®F}æÌ$JRVP)ëªÆ—´®ªJ €6ÆX#J+TJŒ5p'¥'ç¼ïÌÂQ|J@Y"™b±Ê²vhjFcªµªªjšw…Éj¥µÖ‚`Œ›â´Ýõ!Ay¢/\²B´Ï‘c^w«aR*«•ÈÌ µÕÚ*ÔÒU -*Í"uÛ¸ªŠ› -ƒTUM¥0@Îe¿K–
-IeSÑ!Ñ…‰*ü¥ ®?XoŽ,¼Ùgº½j}“D!f@ÔÄ̔51û˜AécHI˜KNÎh)‘r¬­æ’gŸµ­™)¦YDJÉⴚ¦Ñs×Ó"¢8ûº®sʈ`­Ýl¶µsXé>l›åaÊÐÏÁ-Ve0i¥Cò…sa=OSœÃ¹ó版2;<—SžyVJ±Ö:‡r°<äɇâr¹N‰b–4Ÿ1D¨)ÓbÑñ<Æä,k™[GMc7}TÆç8ù\¢u6„`¬ªšÅn×[ëDd+¢î–nðñúñëT-YòªÔf<¾nlå#§@ -Bí
-˜8£«Ê#±Á„ì–m֜‘L[é
-5ÃnܬœµÊŸìòT<•“~K…D&d–£­QW(Z|Œ…8g,Ji0T$ÆbLÕ¶õ<Ï»'°TR[kš}Uk·\”qljÔ͗&½ýKj¬/‹ÝÖ7w”ŒhÄRÊ]ëFDDYC&–œ ƒòÞO>å\Yƒœ(6H9Î>(¥ *ÌD” BÐZ‹H¿ë)g\,BûŠÓ®xU öaB<=)›[7j73Û˜¹ªª‚bnË1R(…R@Î+F*¹¬W«RJˆ!ÇÄuUWm‰¾¤P‚ÏDÑÏÖVP(Ffkµ¶”RÊÙº…caUréû‘šºÑ bµʔ£¡…r,iÑuBُýj½ŽsŠ!H!%hµQPr)¹­¬Ñj³Ý8ÉRxŽá… 9¥Íé®ëºR‚ºqUs6x?Ž  ¦çP5N¡iºVˆ je•ÕŠxf‚‚¶ÎXìws!i«vÇq7)ÑõaŒR •<ù]½Ð­«£8Ѳ]TVçþT`}Š›ý§½W.ÌàŽ/tÇ~QFŽ,3e’ižÇٗR(ggµ.iö(”Ål´.”RŒˆP(ÅÛÚ óTÊ4MÖXcÌØ襤)¦ÄDܶ¾ïA Á‹à¼ f£‹Q TDؔÑ¥[…%†¼Aœ’ŸKÉе%†4ÏD4î¶J¸¶¦$M9Qaƒ`
- d"sJ9À8ÏљRË<‡R-ÆY`"ƒ¦1…"¨MŽ@ÜÁºï{aV 1Ê<% -•Ñõªî,©œ
-°&@¥YJÊY!¬sÉÞS9D®juv6@TYh]kk›óæd·3Ö*­´Ñ
-!à4ŘÈ4Ñç¹$aîÚÖÙÚFß-¬ Œc4Ö± 6M‡Êìú‘YÖ«ƒâËöd@VÎãn¨šÖi•BúSõå0ÝýxW]ÝՈì×ØwE˜€CÊ%äbö>Ì1¦”JŠV«JcŽ³âL9aJJ ”S`&¢äý|txÂ^1d¨ªŠ™‚ÑÏû3†y†A£ò
-Å1šú\ŒB£tô¡ C)¨výˆ" pš§˜’³ÖÇ8oCôsÐÆ6m7 ãÙv×Ö5‘Œ£'A MS ©
-)öÞS!Ô*)SkیÉ07«&ÌÁƒU,‚ bʅX)]4Q™BÞöór¹œCâݘ2©
-­³µhT0úÂ,((Ä@"(Æd†$öµ[­µsÍà©[ÕsŠ4LÞԈ ÑÇ8ÇΚ£ 1ŠP5ËÕîx¢]•cÈRHXRÓê]ßǜ‡!SJ©ëLˆ‹ÔM—JÙn·Î¹ƒz(€ŠYH %ò#Kí¬ñO ֗¾Ü%ß+()¥ÄSJDB”gbHyò!Æ …r
- ±˜â 9göˆA8Sb"@Ž!Páyž•Rû’ÖÞ97Íó¾$•Y`œF«mm,;žR?ö:f´±Àͳ @œãªªˆôœ2@KŠˆX €=ÞÌ9烃ƒ¦ZúÍF¿^™!H.‘mUK’ÍgæÌ
-­Ê‘´±ËÕ¡62‡b”b|.ÅÂ>¶]„Y!§ª^lNN6þXDT‹S?”$‰8‹Š1¹a$¥cŒ>„˜Ù9nëF”îÇÙk$U>ÇÖëP Œó¶šŽ ЅèoÛ¦Ù{K)f¡A¨äm
-d0ÛÊ{:i›ŽJلDÛd®ëåÈ܇ ´aÈ Žó\rc‹@zO¨êšõT¢@I)­í9ó¥²bçýËåMƎöʉJáE$çBˆ1–R„K
-ƒ1&ç9¦œî€%TZ§S˜8G -ÆX2[«‰2Q1VåœÊ閙\UYcÇqTJYk#åÓ¾âYDæyÖ¨×ÝR,lG¢Åœp7—œóf&ë,Zj-YJ£ÑûÈÂÎ:•r.¹mÚ³]œçÙëeÞEØô)¥2ç¹0°¨LbQ)ÏvŽU­ c,"¢R1Ì%e"äãÓ -Új;¦Pk$NÆ(¥ ¹U'3•ÅbAm¶žYŒs™‹¾l6¢Õ8Í%§ ±*ÄxôÞ: M,ºnF¥sάԨ´/d¬%m¦TI1gTi•)‚”%ø1±g9ÔÚZQz;{*Ô3dT‘yB¥@g–ÊDdÒØ6 2"²‚¢=hÕ¹Š¹”\°mÝ¢ûӁõÅhí—g9ç»ê*çœK¡Râ8îÁòއr)ÂŏۘS&gB )Ç(璓w*…™S0
-¦!¥È®29ǜ“±šJ™¦¡ª*£c.ÅÏsÓ4
-ZK&â£RègO…¶C4:َκÓÁaFŒ™mƒõ4Mû3Ÿ?wè ŸÚÖ JL%"McJ:ã¦>ZϹ€6퍛·Úv¡´žcÒAªºNbD!P)!ÆNkmm¦òڍ›G Gp·uÍC$2Z@RË ,!$Ó.O§4³ªêeT.$Ii«ØXŸ’P%Q–~j@ÅsŒJƒ©êî`í ‚³ ÑX³X.—MS˜•Ö¦­½S
-Ó<#'@ÛìbX,šÕ¥‹ÞOþ´¯—KH…<*[WÜDµZP@Œ«Û–P«œƒ1f¹\„BJ‹Å¢[,ú1Œ·¶»)Ýxé܅ 5Mg}oW hÿ°ÞG¸+w]õ/ Bw
-ªQ@H˜Hr¡˜bÌ9æäcL9©Ì£Ÿ#å)øÄäSœç¹L>¡Ì)¦¾ß¦Ñ[Aa)ª6c…Úšde
-#†’CàBV.êÎX+…„dŠ ƒ¯meZ=Ž±Bĺ®ÆœEÒ GªqÑh¸Ñ‚[]Ò¥ºfqìaÕ­¹…˜âŒº;Zn·»VE¨9<ðMM:MÞßbÊZ/¦äÒÑ;=@˜æ샤rÔvÔ4#¬§Mß×ΐˆgŒR÷ž÷ÆúiѺzšF£u1þyæ\_:P€4y¥Ûõò€D¦n=k%
-Ñâá•wsŽ³o«\cŸ¦©—S)(¡ÌFÝwoY.^öÓÄ<ÎÑ&Q¶™$Ÿ;X­zÛ­×^âeÝ‚9f¶­Œ}[¹¤øù×ßxàÝïcfÛlu2¢Öë~núpéÒúún÷ÒÞ7_¯zè¡[·n]¿~}Uw)#2.H'ÑQôåf1ª¦XkÚÏ®uzq´cëÐE\þËh¬»îÔݺõ»Á¤RJ
-¹¥RBŽs>øœ3Å4zO±äÄԏÃ4Œ˜ÙSÎÀÃ8–”cŒg譙cPÞÊ z¦q¬«jž'h›6sa°Ú£pI(qš»F¬Å©ä=è%£çˆÃ0¶«ÀRJBkÛÕ2ÌóX’Ql -S§©«Î¸“oë-s­Ë,»\í 0W¶ò1ljìš6:äÎeN4‹‰ò”µÑ ‘€€¶Vœc­Éê€AbÉ9W9å\È(Ä«DcÔÆ$ -)Ǻm‘­>wî܍ëoÄB³”œCœ'®ô–³qF4²”›Ó®F\¬W%Dh«ZFïmSS.§ý®ÖÖu­'Ó¶ƒŸKÝ4Ï.gý1£RvóÈ(®ivÓ¨S
-•'ÎeÕ-^+Eˆ‰|Š T1è›Úø˜GÉzÙBã"2—˜…—m­ëêO ÖÅÍîºSw=ª˜
-³¦œsˆÁ‡Sœ†qšç")ÑϳŸ}?O9 ³Ã8ÂÉ뮉)IŽ¢ÐZÛTM§“~·^­“°€”¥Ä"MÅV¢™(p±
-çX+í¬£K1 ‘Ák"%‹”Î>NóŒme–- { b@º®JÙ(i*[W™9娜ò A˜uʵsÍER4œ.•)Q—/¨Äg7O@t•®ìÄ¥¶Ú®œKœ1…È‚¨+m3¥ U]˜:ëšÃƒ2Ø4Ä@È.ÛâÃÎP5 (3RéšÅáÅó¬Ôéñ±6F¡ªŒe£À55 ĜëÅRˆ‡akgê:ƒm‹U=—d“IrLW._ž¦É{Ï(1çœUzï¤VÊ.^«[,l$Œ`[æ4r6fÍɨƒ{..Öˬ$SnºÖÕµ˜/MßúcÀú’=b.Tö;M_pՙY¤pITR)1E#­+[Jö1ùççvýnL¬&Iyú)ÅYKŒQ¡j»¶Q!­ua™R„ÂTJrMU;7úÙ)S/ºª®)¦’òٰݏKJÅ*Ì(Zëº^²Ö…´5 -6U£•òeöTŠmÓ*çÆyY·ïzඪ¶ý®ŸÒMÛ®–\ˆs!æyö•s–0í|ãªÖ5n½X¶‹ÍæÌK¶UCsl–mÚ1DR˜A„Š˜§ ­vv‘| Y S·è€T µ\(†¦iÀYpFˆvó$’—‹EÈØkº«­Òu×Ã`œó9§œ˜¹ÖzêLjØ."œbŒ1èºY.”ö[Já\²6¬©l¥­æIçÜ-º8M”²Óf&©´‡jë KŽéâŋçW몪ÞvéÊf³ ™8³-,·=–9ÅÜv]eÝns¡,Ž.
-Ñà§?X{žnÇ<E˜9SÉ9çœïj¬œsfITbLsôÓ<÷ã0{ÏÌ$B(!§až‡yúq·Ù% Òj±\ÄL±p&6»ÊÚ¦²•®łœ²R­„,P¹ÊÛoz»X6u»¬ÛÆVã8ž½0¨BR
-+%Jk+Ÿ£VÖµëonÚõÅ+WÎÏg7oÝÔZ×u5‡btl.¬._¹<‡@½'6,ÊbuîhBœ¦¹”<Í#‘,LëçÙvêÒå —Î_X/W/e¼QúØO‹¶»ò®K¨Ì3/¾T4äÂÎê¢÷i½\i¥*ÔÑrõ®«ôÃ𹧟<Þn¬Õ%Ó@³6F+k]=ÍÓZ¹{Ö綼u‘¦qÌ>EçêÖ5ëåÊÏs îpÝ)£ófÌjÅÌ]ÕhÌXBBfI\<8*)ŸMs"îŒVh4`mí¹ûîí¯ßR™ªªmm›¦yýõ×mÛÝwñò<û?|ü‰+W®¬êî$ uJ+ƒ* -óºmëeHœ‡Ygº¼:tֈ ÊÃîٍãæäìÿ+X{¤î¨ölåœSJûðÁþ}ÎyÊeš§ižCŒs ýÐ÷Ã0ú9QQFG.Ex7ý¦/‰TåŠp"N$$èCÆÑøä1rm]Iyœ¦JYE*ë@Î<ÏsÃ9nÆ­­ººqÆ1ɧº®ÓP&*dœVÐbÝ4ªÈîÆñ™ÔµR I1£8eÅ\[WætëädŠa˜Ç˜“¶F+¼ÿàâááÑÃ˯^;[W5Y¤*dQSÌÈB1Ýܽ~ãõësÍiðJWëªãRÒäU[Q,Õ²VV© KÈá`µ¨´ª„;t’÷ý™Z4Mëc¨m“}Ì)ä¿üíýÐþ`!Š! »áɧžü'?ù“oŸ½ûÑGÿí¿õCΝ·¨Î­nÞ¸ñó?ÿ³¿ö{ŸÚ%¯þ­ïÿëßðþ|úsŸÿÌÓO»]:¯^}øû?ñW®½üÊOü“Ÿûͺ]rÈ>Ç{ŽŽþÆ'þµïøÈ7ÏãT7 -•’KÙívÿ¿ÿûßû=ß½\.ôGôÒ¥Kÿáÿ0‹üèOüħŸ}J<@¡š÷ßøïúøw|ê³OüÿËO\Z¯ÿ³þ»GëÉÏh ù©Ÿÿ~ãñO°¾|I(w²Uö©vû (a.…r¡\(•bòÞÇï7ÛÝ4ϱ$Â0Ž»¾ÏÈ>„LT€Må|ˆ1¥ «£zÑíÂT
-Íã˜üÜTÕáúmÎÚ³ã
-‰¶gg³÷ËõƔ­©ºÊ €5URvÜö³€,:Š±®ëºqµÑϝoêz×÷gîkë¶rh”s.R`SÌg›ÓXQ[×"clšÆ8Ûdz>ûy(ã<bUcÓtÃnDsŽ7oޜR\ž;DyöS:ú9Å×ßÆauá@‰š½?ÛlDrjì‚+…° 8û ›ÚQ ×^}9ƒkêœÒÁz]ÙúÊŋ‰Š­«Ý8mê÷=põ‘+÷ýæ§~ç•k×¾îCúæ¿ùCvÿŏüHçªw?üÐîl÷;ŸúÔò`Í9ûq^T­­ªnÑ}ïÇ¿ó‘û°ºúñÀM¥®û֏~äÓ(GËUŒIˆ+WéÚõ}ÿô“OÚ>\¹x黾ë»~÷÷ï—ÿù¯ŽÞß¼yóýïyo,iÇó¼ó<¤Œ~웿ù7Ÿüm´A¬´þðû>øî޾ۍ‹ºjŒ}ÿ#ï|兗ž{êÉ(EP÷§›U÷e«Bù² ÏېyŸ–IL™Ê>¤>‡2ǔ 1•Ýì}ðÃ0ߺu*$<Îay;‡!z¥U.%æÜ«J­éH9ŠC¹~¶ÕF¯ºÅÑrJž­„ÍÔßêρ2zÕ-:ƒGMe)™\u±ŸŠ”‚Ô-iœ-åH/<X¯Ûʼn5u«ÙšKj±:°Ú¹—_Ú^ºtwXÕK½°€J+£µ5Ú¥õºj(åT¨i;mlˆYã¸É~˜Æ1E´ZD´Ñëvu|z"Z -ƒNñyè–mœr¢¢e)gÇ')ùZ³i-CA*R"(1]5ç(‰Gâ2Nu‘¢§»•–k©qdëvwÕºnµõÃðË¿ò˟úô§?÷ðÿÿà¾[4ÅÀã'å—ÿá?þ?W÷]J1×35•Cà«Wï½ïüÅž{n­ÔñsÏ?õÊ3›þlsóºßmCœãÜw•ÃT€Û¦eøü Õã8äð—žyæé_úµ^êêV™e¤¬–í¹Ãs2Æ?xáÙ·?ôàҘ³qEîyøí÷<ðÀ>ó\Öà --…ËOþß?óS?÷³ö`Á…«®kW_Ù~yÈjÿöÍ&ˆb,1¦ÙûÉÏÃ4 -ÓèCð>ö}Ï"Êê˜Ò<Ï)%öq
-^[Û¶m&PR‚×ÏNÞ؞úµ³½ŸŒµ‚ ´žü¹d*ž’[v©÷Y0 2Bˆ‰ÐtέÖk¥a±ê–Ë…s¶ŽÒ²·§ÓÉIÒZ
-BJ[¼+¾&1Ii2®R•5ÎTÚZ¥ÕÁŚH¬s ô4‡˜ÊüæÖIÉIJQ
-À 6U}iupϕ+„pãôxœç®®±ÉÏ,Ò4biªÊ¢Ê9kPX€³0#hkNOÏVUÛuÝéÉÖÚ µ6ښºÝö½EFyÊõÙñ髯½:NÓSO=uíÚµEÛ -ã8ŽcÁY TŠŸfÜõ‚8ÞÍ%ÿí~øå×_ý…_øù¿ñWÿõ‹/l>û;ûˆÄ˜BJ¢µ5&û©ß­WTògŸüüÙv³emÈ)£¸¶a£tL)å„ZýêoüÆ÷ý›í?ü¿ý[ÆÚoyì±ÍnûÒSO^xÇP×µÄOÏNUšq6çòe%v_äc}Ñþ SþbªˆHD`a³Ùl‡~œ¦ižç9ìv;VÖøÇq )Æ~œ§©n›Æ8QYb’\6ÉRN™h·ÛicúÁLÞûœs™Jâbj'sÎ"1…ÆZM™R–ÆÙ¶ª4[2ŒI˜ã6N>QκrÐ8ö™f5)eÓ´÷8UÉSN‚Z)­³ÆYeŒ©«е‹f¢– IDAT±Ô¨.¬Wp°~Û¹óÁû·nÞ<¾sn¬n­qÆ´]§Œ9=;+1ÕuÅ,ÊÙ2û0LuUuU“­óPP´JÂèLgŒ!ˆkö[æ¥d­uL±Ÿ'VÖ`e0Î>Ŝµ«ÞñÎwV‹îc} ý ¿ôKÈÂDZéw=ú®ïüøwrçÆà_øü3¯¼üÒ}÷]ùà‡¿ážøì§ÿýïþøwÞwß½J©Ã4M1¥œs¤”³TJ;™ƒêÚèçÓí)£D.u×f¦~ ¶­Kʬ¸äœJ1•ûüÓO~{ü¾÷¿ë=æqíìG>ü‘k×®m¶Ûóðྖ$~ä‘G{ì1ªŒQæ7û·WŽþH°îRu#æ”Óݝ¾Û
-h|ÌÃ0lw»Ív;L£~³écŒ¨PúC™Êît“J¦”SLU]ç’7CÏFá9Æyšº®[­V!„aY¤ªkF#€5ºvnµì–ë…UJ¥\ÆY˜0G¢©ÑVÆj…h•`FRÊXE…Ør.%ËK]Q¥[‹PŒ&fÊ J*A)­Æ -…Rn(m]Õt‹eÕ4çÎ/Û®{Ûý—ΟówÖ(Ò§ílžƒäƦ]·”˜+ç¦úàUí¦Zt‹a³ -ã¼^.©Ð²j˜%%¯µ©ªÊ9BšCtÖø0V¥qm„—Ž.‰ÀùóþÓ¿÷wÑ¢®_zö…O~ò“ÊgªŒúø·ûG?öVú¥×¯ÿ؏ýøõ×_}ôÑGÏ>þÄÊhâ‡?ü‘÷üîo}úӟa&&bBQßvùòQ·èûmîýhœÝßXçÖËU†°í5*Ò֊´z.é©gŸùº÷¾ÿÏ]8å҃÷ßÿ?þô¼÷שׁªm;fnk÷×ÿÚ÷Û_þNÓÔg»Ýÿ½ÿ$‘èw7²p{(‰ˆ9çcœç9„ཟç9؍ÓÙæl˜Æmß÷ã@L›Í&ç"™ ‰ѶïJ,Ùç~ÒÆd¦~\Ó´m³¨›ƒvñ¡÷½ÿá‡ÚìvŸûÃÏß:>Ωh£«ªiÌA±íªE,±ïyâcuÐ4(`¨ÒªµR[6ˆY0§9)£q jV šE³(bæ, ´BD`’œcfc®ò)†%ÆñìµyU^\­ևM×®W«ÕÁÚ9wv¼}áÅú³ -3)ƒhµÖÖ\½ïsõÒ>}íÅt—ï¹ò‘÷¼oq¸~öüó¯^{uÝtM7çøʍ7ú~èºVk[
-圸î. 목ëæá‡ßþØÇ;=;þ/ÿ»ÿö÷ÿÌ×àCÿÑßù÷¿çû¾÷þÒÏÖÎåX~ùŸ}òõWn…áú­›Û7NJHßð óËÏ>?ôۗž{á»?ñ‰«W¯þÎïüŽµÖãœ5ÕÊÜ{áÂ7}ðC
-ñ•›¯=þÔçn܈˶sJu¶úºw½7!>ùÌÓ]]G‚¦iLå2õûæ±üwέ>ôþ(¥üñw½ý* žw]HåÇÿçðýâÏéU‹¢^¼öÊ=ÝÿÀzsžÂÞäåœsÉ>„½­ !Œã8ŽãÊév»ëûÂ4 Ãv·E…óìSJژªm®\8ïªê•×^úátØ"[9J%¤˜J¶Ùp4Ð=nߐkE3ÅaRF¯ÚEÛ.ªº²ÙÇ0̛±ä„1]hË£¥±„•f+dJR‰€H
-“fRˆZ+(B̝ˆb‚”J ÙV¨ -j·«Ã£"”R  ˜Xˆ‹$³I¹ßžigÛÅâèÜÑÑáÑzyîêƒOÑ~~íÆE81¤’oÞ¸YÜ`AÍÃT×uœæWŸz®^/Cœ×M·²õåÅÁµÓ[Z› .P‘Rx»Ý¥T4B*̂ĐS)¥¼ôüKO?ûìoðÖññsÏ='ÄðŽw>²øv¹X®WK«µòó|zó8îÆ«<ô‘~ÝAÓþ{ûßR"W.\vÖ.—˺®µ6Z«¦iªº
-!Þºy³Ñö±oþÆ˽ŸyÛó_ý×R4ÇJ°f¬¬{àÂe·Ëw«`NñÚk¯ÍÃøMùèÕG}ⳟDZ†B”r.ªh…›ÍÙ /¼`Öݸ.Ýwߗ?ÇàN
-9 Q)D…8•s1Ìó<Žó<Ï)çqŽýàûÙ÷Ó´†BҐs 1ŽãÈÌm×vMsß=÷v‹…Ñú¥W^q'•C¬›ÆX3 îßqÎ {Ä^¡Ç7"t‹õásև|È2¢øƚºS®®–¬$ރÏD™™A$šŒ…}õ±Úç@µ¥TSc½h")9§B$Ä""À‚¹¢b₨4 ¦’ršæi»9{£m»ÃÕÁÁáÑѹ££Ãƒƒínwëôd˜ý'»©nÛ®=îÏ¢Åa@ã‰NŽ3SÛ4»²Ûmú76·Š…ûο­­»œ‹¦©,›•J>”œç~è§)å2õ£SFJ,M·HS
-sH™®ß¸ù‹ÏçJ;­Äšûï½÷¾ËW~ýWóÕ×_C…¯\{M×îý<Z 2‘Ò*§”û1ÆøÂføßþñ?úäoÿ†íª^¿& %%4z7ö/¿úŠ«›L¥¤Œ”%”’ !bÍ“ׯ_ÿΏÜvÍ?øñK1æ”Ê‚Û¾P ÔÖUö!¥è¾¸   “¤\2"Š¹Ì!ÎÁûï‡aJ¹lΆÝnÂäSæy& -!Žã¸ŸR*¹”” ¦¸ú¦ªœsËåòúõë¾µA"šæ*c;[Umc¨„m_bhëzÑAmœÐ̊ÎI]¥,èۏ-@©¥”VZïí 2bæ†T–êèâš1QÁ”SÉeÿäœC*6—”sN A@ˆÊ>¦Ç"‚˜¤dJq7œß8]œ¿ty}xxÏÑù£nyãÖ7óÉgnL±ˆ
-gߐA)Å̾ð4MÖZ¢¹âÔT®¶º2ŠSPh$—PŠµ¶®kT:&ãäX!†9”X4j¥´Æ"ý¶Ï¹ž;÷àƒºUsëôô¥ç_~û;®vm÷s?÷óϾøÂéØ÷›³aÿæüÀ¹váç ^:þ[>øá~žDä¥k¯\ö©º©‡q<\ÖΩÚõ9¾vzSiBa˒·Cœ£ r†át÷ùçžþà7}¤ŸÆ_|±ªêª®Ï5Ý{¯¼mÓïœ1WßõÈG¾ñËÃCDýÒõ×ë/߄އ«
-ñ~{&…C ý^Y;‡yò›Mï}Ã8ÎÓ8Ž9çív;Ž#ìŸ1Æq¯_¿NDUU3{cû”b…DSŠmëºj*wÔ­¹ÄPr.­ƒ +»lt¢™A3JÑ
-´V¦TN´VZ­µ1Zk¥Ð!(¥´ÖJ©}!†Çy€º®)»sçÏ75"ï :øn%
-1MÓ´_ÕïCŒY´² €V™T(yšç7nÞê–Ë˗ï¹péâÃ=|xîÜÍӓPò²jÀ(òiê{ç¬1V •ª’µ¼þúo¼ú†åG|Ìû‡6^¾|¹”rýúõ®[ø”±ÅwýØuÝÞË6V}ûwü¥¯ûƯ×Î\?=þ§¿øÏÞÿ®wÏ!>ðàƒ÷=üà¯üÖ¯ß|íÕ§ž|JP}Ë·~ë3Ï<3ŒãÇ>ö±÷}à“Àô~ú§?óÙÇcJÕ}÷ôÑ÷xïSH±”(”s%E‡31ÅZm¦‘ Î\>óÔ~Ûñ͗_~éÕë¯Ç’ØÏܬ–Õj Ö~ß_ù«û¶o7Z‡Rþ§ŸøñO}ö÷¿,œ¦‰™S¢˜bH)•4?NÓ®ïÇqÇi'fúišæÝØŸ—Rö F˜æ¹®ë”Ò8Ž{˜bJÎ¥”´ÖûõišêºZ¤VmsáÜ!pQ ~Pòª©N-+hŒ`IšX£å«
-u­ËA­”VJi­Ôž$ -y_*¨îNc8Ù¼ê¬M¡šFz÷{l+±wÒ™¥PùÂFgʹäcß÷ý®¿µócH1%F­´1Êè²R‰µuݲ{Ç;Y,—¦r>Å×®_æéôt3ûÔ¶-37MCDÞ{4°:X¤TÂäK,À€ öªhšæ‘GyßûÞÇÌO<ñÄË/<{õêÕgŸ}6Æh­}ûÓȋ×^×Õ«ßò‘æ2”Óqûò믝o*ԍ¶Ο?¼xá÷?÷Äk¯¼²lÚ˗¯„àoݺuõêÕår§éҥ˟øÄ'^»ñÆéæìÕ×^cïùÆoÆq¦ßüÌï>ñ̓fÑܺñƇ?ðÁÚUŸý½ÇEÔ#ï~×s/½ÌÀÎáÕû¼qýúÙé©kšÃ‹çÏ-V7^z…ˆºúv¬ëzÇÕzýÌË//þÓ_û"°v»ǔ}Œ>Ÿâ4MÃ8î†~†aœ*W]¾|B3MóÉÙÉgÿÌÓO?­µN)m6@¥´ÖûLŒýŠ:¦¤kçœÛW€µmÛ÷}NåÂÑÅE[/k %λSgteÕ²­ÛÚAXBe@eÀ6ƵbkÖš”ujÿ\¼ý¢[äý7ú¶¥tŠe˜oߧ'Ç?ú>g’½»4aÚë#b¦RˆIX
-Ñ<MÃ8 SžfßOã8ã< -û‹jWû•
-K»lÛ®»ïÞ{¾úöåryº9{æù®]¿qtx´^¯ËÅ4NÛív;„0Ž£A£DÃ<ÎÊ(ç3¯×ëx@kýÒK/í¶'9gX.û s×uÃnüÐ×Ãßókt,ቧ>ÿ¹§ž¤H…´èº@¥êš’‹džçùʕ+§''TJ»XhfkL×uSðËõjáðèpuÝ4/¼öŠR]ÅVŸmN»U“·ÓÅՑ{Öï¢Bpêà £ÑóAÄ-»lLf?ÏÌg¿/gµÎvGë+ÝÿëÿëÿñE¦°”’Kñ)ùè§|ðý8ã°íûqƒOã4‡Tˆ$§2ûéììlžç}ñ8ŽUU-‹ižSJÖÚý£/ꪺµ9;wî\ÎÙ9·^¯ëºæËçÏ%Ž3Ó´jeÕh«Ðªb ´eã”5dÛJlF3PJ,ïõ•ÖJ©½)Üçš+­õþkZ[kÄVÔ¶ÍP£ÖÑÙªm -jŸLÆD€¨”á»*«”¢m[wçJÎ)MÞOó´íwǧ§›íf7g*D¨Ik´VÈ~ž‚Ÿâ4‘äÃo{ç£ëvIüY­õ}÷\yà¶ÛíµW^ñ¯Æ)%$æ¢ÓÎZ¢ßï¡Ý¼yóääd¯×«J·]ç½÷!Ló¼^¯A)ÕµÏ>÷ì Ï<cµjWmTäêzL“Óúðüù³ÓSp­‘BژåjÕ±TMKÄh”}6ìcðÑûãt#Šuî¬ß®Ž¬¶$p¸>êÓnµèÞùÐÛßÿèûžù¥'žnã{«UæÞû.7®ŠžxñY0fYwyöuÝ"h`Q
-0„Ø÷ýWpÞ÷õ™>üÿË֛Yv•w‚ç;ë]ޞùr«ÌÊÚ7 í¢$V ±Áj3 Œm<Ø`›žŽw8Æa;¢;fbzbºgbº{¼LÝÃ`ÀÝl‡QÆFبÁ!´«JURíU¹oïåÛîzÖùãdf•$nTdÜxùÞ«›÷~ç[~ßïü¾,ÏÒ,M²4ÍÒ<χ£´ßëeY1&E^–e‘¦ !d8*¥c¡^¿/„ ”ú~"”eI)Š„þ­fCC™'ÌÉJˆcÂ96ÔZÐH…§axdE˜cBcp#‡‘£Ø BȎ -aL0Á(BÆVǔpe‘&c\ðÀ!°ˆäÒ2Æ¥„ûG18g´1Fi¥”ÖJcP™¨²¨Ä¡ÔÕñ±æÄÄx’$+á`8èF…T€%` µªt֕yvùâ…l4šÝ·/®Õg§§‹¢èw»ép¨”ÚÜÜôú$
-[ÍÖT{Ê(%£tm}%˳ jµš”RJEQ^$€ ®µA€´ÑÂX•…ѐꢐŠq®¥2ÖXçjµj¡”TºVýn(ceœRÈÜT"gt‰ «FYžGqT*MÃÐ:$¨àœ­omð˜S©E -Ýyìd¥ÙúÁ‹ÏäÃQ‹£söMM_\Y0EIbj²² £˜
-¤²B)C)!”óQT©²”¥ÔR™4É£QVäE©´¶iVôûýQ’ÊRæy6 -“Q‚cBüí‚@㜓Rú%xSí©"k(c‚Ѐ2„ ívõ`¹‰z(Bd©Ò9ËÄ0¢ s¡u3Œ1BØ9F©ßÀÁ¡xý§­
-¹¬(B¹(c!«±THe‰"Bhç£^{¼ -qÁ1ÆÃáÐÙ#ŽS+‡´6Ji+Y`´2KÒ(vQTÍ+ùäXžæùÊÚÆêúæÖvßmю’4(Ïóþ(¹±²2>ޞÝ`ßԔTòҕ+›€1Å`¥¬×›wßvrj|"¥çΞÛX[¤¬UœÅÈ@ÄY-Ë0Ä(!È9)eˆl”
-ÊhX­ ©ƒ Òeâ”Áˆ(m+µš‘&`Té¼È³R–•¸àdYˆ@P ÖYYäÒh¿õÙY£TA0 8oÖœÂH¦ÉºL -+Ë++kß"”N­±ÈÑ^Qþã‹/A˜ki5ÄÀ­ÔeQypA±@‚°@„Ñ[DAr%‹²(²¢(Ë,ÏÓ,Ïó<ͳ,˳,ÏóBJ™y^dƃZúý9ÆZmŒ1†RjŒñËŇ$À`ªWkq”‚–Z*S&ís‚„³Ø`çˆAH!!iŒ F”8J8g‘³^¯c‚À€1AÂÈ:gÊ9ßÉÙç„RÆ)E8 *”‡ížqŠ‰€3Ò0ªR‰¬µ„€R²ßß6V·›œ΁1Vë‚1Õ&Š"”f<‡””Zéb´V …`´=>¾¶ÙÙêöÖ6;FKJ)PF(‹’<Wëe¡ò4Û`þðÁƒ(IS0¬4fccíé§~Ðnaën\¿®µ Ïó¼,s_Ü` ž’ëõ½RˆQšb¢• D ‘ X@±ÒÄA˜…±ÖDŽ8Ž¡E‘sÎ)%ÆDP‘çʔQœƒÁyY–• P…N“Q„ãc­©‰vÀÄÔx{m)-µJt±õ¶·»a³Õ*ØÙH’eŒRd@fE‡‘ºÝn£Ù4Æ0Æ -e-çoVâ¤yžçy‘¤iVäIšfY6HFÃÑ0IÓÑh”ç¹Ö:I’Á`à±#_
-!!>7/Š‚1橾ȏI\©6ZÍ8(½¢×«…l¬)"ŒŒAÚ! x„!Ê !{2‰àË=‹Æ^ !Dñ&‹1„&V{“6RJŒq¥Ri6›àÅČ6Qq\”ʘ5Îy%+k-¥4 ò,“d”QFÅ`0 µjq‘eiX‰½ÆšÕF+G¤ -«5­aL"n¬®cV”¶FKc·6×{ýn^¦ÇOœ8vôÈÚúêÒV‡R2 -/^»²°¼pž&)åÂK/yàÃW"aú”ÔËüEQ”çy½û•F-d‘Ù<gBT  -kÕjos£R«UÂ@kÝïv‚ PJ@EEYhkc“Qš#@< Y–¯Ÿíõ³çµ¦¤HF­J -œMGC=FS!g¥”VËHð4I9
-ȝŽ†Œ1dÍ ÛqÕëõj½¢KF£ŸlXY‘’d˜Œ†i2LFƒÑ(Ͳa’¤I¤ÖYQ8ä8á^ŠÎ»
-ßò)”×}óON1њÀFŽºªò¦À­GÄ8­œÅˆR$BT f€1AÈyy €1ÆÈy‰»;¸KkMÑhY°y¤Ã#066æ±’rsm½5Öª·ZãQ2rÎaŒ aþÄû×$Iò¢ØÜÜ’“'oBDQ†¡¢j…Û[­L­ZU¥”¢Ž–´,Âp8=Áæf÷µÆZ뛝¬,A¨CØkV]¹xAÊòØñcӓ D/Ë·»Û€1ÖRBB‘g…pŽ1æ·Ý:çò<o4~Ã#Bȋ—8c¸3oﻃ@divcaauei~ÿþV­±´´”g gÀž8yœ¼pc! ‚ûï»gnnn0èŸ?~amµZ¯Ýwï½F­ôX­Q¯ÕE_¹|y0˜›GÎœGqÜrs[+ëP¨ûî¾[i}mi¬ -sR!çZÕÚ©S'û۽ͭn¿Fá‰ûîÝ·o8.-/K«SU¾uª -v$I†Þ¶F£,Ï Y¦yšd;¬)¨(KPðû›½aÙ]7èœ ÃÐ9A¥R¯…ݍžÉ†ÍJÐ®Ä ³l”PÎaÀÄE¨Bˆ8K£]íT´;r×"»'üïu=ù“1r€•R¾VÀE῁Rš%i¯×«Õë„ÀØþK|yQ–åæææÙ³g«µxs]¿¶°oßÜì윒Ë\„¡”jyu•bR­Ö(çš8Ž £Š1RJkLEµZmb||©¾²º¾Ñë¤RÁÄ:k¬]¸~­,‹ƒ‡NO"ËC©Ô`4TZ—e©”ŠÂcìk(‹Â/ŒÁ`àóÔ$Iî¹ûîÏ|úS·ßþ6­¥ô駟þwÿîߟ¾ÿþÏ|êW>ÿùÏ?ùä“õjuvvö·~ë·þæoþF•å§?ýéÓ§OûGðòË/ÿþÿûǓ33¿ò«¿
-ÖÕ¢J£Vëw{©Ñ_ýêW·;Ýßùíߎ£(KRŒñF1üêŸý9ÕöŸýÆo´ÆZñø㹒„ÅŅ×ΝÿØ÷ÑÇ>úÑååå?ÿòŸŸ9wöãìxÄ{Ùõõõ?ý/ÿùåó¯NLM½%yOÓ,/¼£ò¬âþpP*Y;ñ‘(i­‚ck­–Ú»(¯ë;žÑl69çQQBòؚͅ V³Z**–ˆRǘlœ¶Èa„bÞ®º¹ƒÑx¼Ó²ÖA µÎË 9çb´§´æ½·ïÌʲ4ÆpÎcBð"/ŒÑ”Rkʽ¾¡^­ÅÝn×Çn\8‡BHáP\©
-Æ)〳ç™,2ã
-!AIGÈ9Áh†ÕJeaqy}cSj²Za¨”¼~õrž%·Ývg½Ö:2³}k´¦£’PĐô¾|ö…—ƒCyÙjµú裏¾ãí§¿üÕ¯\¾|ù§úƒþéŸùîßÿývg«V­<øÀéüþ÷ŒVï~×;§&'—ßóîw}ô#ù¾ðê™3¼óþЇÏ]¿òý§žúŸ~¡Q©~äg=0³ïñ¯üå•õÕs¯¾zôð‘ãǎýýßyùŗ8çe€¶ÖWÎ˜žh·Ûí>ò¿ûÎÖU`Í{ßó®±FM9§Ôé{ïý…Ç{öÙçžxâ‰|òé½ï|ç…Ë—ÞªÝM‹¢È²l8%YšæY’¦£$QZeE‘æY)wUD00ÁÁa)¥ŸøàcJyž{t2ŽcŸ"l÷{#‰ âÕ¥2”`*"Ë+@Àb§AÈ
-F°ÅVÛðvvÃrJ&¾aî÷ïsÎc9BJkg­Ú}ûÜjy÷5„·6Ƙ±ÆGY(oX¾CàE¶Š¢˜™™ñù™CŽx,µ
-£øȑc”-rŽA8̲¼‡³ss ’…Ö†RJ ‹ãj­V£xmks˜$c£ÁXpÖïu_yþ…ãGN=v̔2äÂ*¹Ôk<ùëñ·Ž Q…Ÿ£aŒ‡qßqÇÝ­­o~ó7nÜȲôÓŒµ~ðýï¿üÒK÷Ý{×ÖÖ>øS?õ쏟¹qýÚÏü1¥äW¾òå¥ÅÅ4Ïî½ûîÉ©É4Mo¤×:¢Š2¥g_9óò¥ JëÛNž€žþ™§¤µÆ`{}óøþƒƒþ`iqiöðÁ—_ziiii0èŸ:qrvzæÉxò¾{ïéw:'Ž?ØûÆã?ýôÓ333§Ž¯×j”ÒŸ
-³"Ïó¼ÌËd˜Ã</­qE^–y)ˆV&£$g8p”h
-
-£¡Ì±Â¥,§„«Qbãr9è× ®ÒY‚œZpK¨C90Pp4`À^LÜúÖ2dÎ­ôy_ÖY–…aØl6ûýþh4jy ¶®ÄÀ΋ýi£•Îg)†F`Â$UŽ1ô:ØIçŠ<O|Pˆš¶(2NÌ1Æ\¥iY"‡´ÑXÃÍ - 8œ˜Ä„rÎÍ(aºT¡átÆT8«….¿>L´v€H RÊdpùÆ%ÉôÌl,UVI–;n”ÖÎAVŒ2e*æšØ\–œ i4°@lt¶ßu×é{OWhØ køtæüë›Iö§Ÿyûén;røØþ¹Jµöµ¿{b•ÝN¯ŏ¼ï‘¯üÕ_]\ZúçÿÓ¿äX¤½üÝï|ðm·ÝÞl·AP$HcÅÚ4jÕã§NTµ¥Õ•Í•u - þwßý‡ÿáÈ?}õÒíÜéw¼Ãa8wþüÛï»aº¸²–òý?õÓ?~þÅÅåÕ?ü,Iò”ÆÁ› -k4¥ižŒ’$I²4%£RÉ</ƒÁÞCõq'Ïóf³ŠÕëŒsº[¬ ÕF=®‡YÚW£¤òÈú¡€1XB¡SdgvBs~ƒóó|ÅçUé­³hWe™1æ«?/—…a2JŠ¢ ‚ ßïqJ©,Kó<gT0ÆÃ(´ÎXkå7¯ÁYëv6´•e™&¤J IDAT£0Yšp΍¦ÖÖ [ç¬VGÃ!#˜Rª•|úGO©,¿ãÎ;£j¥Þl -‡©2Žñ°ÑÀJJ¥JÎc4Ã@0.è…ËW–ÖÖ­A4 µ¡4O¯\¾¤­9vüTµv‡Öv©Ó¢ÁXg4
-œµÆ¡ ”:甔aåiöŸ¿ôgþåÌïþÎï\½péÚõë—®7šæ õÜ />÷ ìコgŸ}öüÅK˜³'¾÷ä¡£G~ïwïþò_ÿÕ¥×(F›gŸ}îêå+ŒÀäÄ8— cJ(rî¡÷¾÷£iÀ/_½º¾¾îRZ½~፠ïø}_ÿö߶[c÷¿ýí?þÑ3ÃáЧ§ßûþ÷oûë¯}ⱏaø¹Ï}nkk ( bñVå:Ó$ FÃá(KÓÁp¨–Jù’ÕGw«˜¶sk@BXçXTêÁ–È2ÄdœÜZí4‚ A„ì]pÈù"ðæÁ½pvsšsÀçCžX’e™OãªÕj2¥iÒ¨7¼ì-c””þ
-+•ŠÁ^òç¥=.ìCg’$£dT‰ãÑh4>ޞ˜h{˜ƒ‚€X FkB@©’|åê¥çž{îðþùWϞŸœ8|ô8••5]µ8ŠE5Ž"ƨ·zG@90¾ÙÝÖÎ
- ÚY«e·»%µn6Æö˜?x`N9×ÙÞÖ ƒ àŒ”eYJGdIB†³ö̙3ÿößü›O|ì±Gzˆ ñÔ³Ï\½r•Á ?øñ³?þÐïþ.#øsÿå˪,ãV}m»ó•¿úK+õϼÿ‘#‡áϾôÔs/@·Óéoo÷kíh4rÖæyN)!&&ڙ,c½ññ( BQQJøÃ~øÑGï¾ýŽÉ‰‰}“S_ûê_ÆQèBollüɟüÉÖÖÖ'éo;uêñÇÿΓßMµ4Zÿ„ä=I³Ñh”eiQ–eQhc´5ތ|=¿‡)XcŠ¢ ”ªReQ‰ã0 ãjXäIÑïUmryŽÓ@„%@(ÂØ9ì[¿;CFö4'½áúÄÈ>`{ÀŒ1&„ð¹Ñp8œœœ¬T«Eš:çâ(΋!Ê9”繧."C»IL­^"°Öë¤I"K)ZÍÞhûèÔd£Ñ4|÷Ð!ŒEÆ9gýþK/½EA¯½öÚCÓSqQR.¯¬4ªÕj­æ8JET œ;tèhT©_¸tiayQM „(F£~ïüùWµQcã탳³`,ãüÐÑ#ýÁàÒÕËëkëÎÚfkl~ÿ~Œq–eN—`üú… ÿößþï/<óÜ/}ò—þég?{c}õêâb†Þ…ôºýÍÍJ­&µnOMNMO_¹|Y§ù±ãÇÿÇßüôÿûÓ'¾û$‚`†¡‡ñ8ù`(¥,
-ùÕ¯þåwžü{ˆRÊÍ­­#‡y2Ï /¼ðéÏ|æŸýÚo0Ɯ±W¯\¹çž{†0
-›­V–eŸÿüç/\¸ð ŸøħõWE|ó¾CÞ2z繧³gE^H)µÆîˆ2xbŒ/͊¢PJi¥U!ÒN§ §¬Yk i§ƒ³´Š€h‰Œ´H+Š5ÁcØ!켣ڙ7q“ -½ç´ì-êHÞ¦õneŽ1Ã!4”RzZEE¾í]E)%c<‚jµºof_E> 5Í0 0x¸ÕB’4Å;ë¬ucããƒsΫ•]5çÔYC)¾~ýêöööá#777§gfŽ=*„À0ÆkO0.&Â0Šƒ¨DÕ0ªNOO;rhßD›ƒÅβ X2ì-\¿6ì÷ZµÚ¡¹¹GßuÇíGªÕ*ˆ"#u»ÕºÿÞûÞ~ïýãͱf½þ ÿùN?¦é_í¯¿ø¥/ÍÏÏ¿ï}SBŠ<ïm÷úýÞõ7Ö×× @@èƒ÷Ýúžûdš÷»ßýãÿôŸ²ï~Ï»cmñhÙn£‚`L„‹‹‹—.]^\XØØÜôëÜ×I‹‹‹K7ÌÌÎÏÌ^zýÂúúz^äA¥Z}ä‘G>ö±Åqü /üÁüÁÕk×Þ÷ðÃSZ©7V–eišùñy–yõ<Ï}õça·‹æYcsÎX‚q­ZmÔêQ&›$ÏÇy#„µ!£17@q`rvLÊ7ÿÞH´ß;$»û}JäeÇιá`À9ã(Ë2C„/)¡µ@í‰öØØ£ÔƒòŒqB‰w¢ŒeYÊk)­ !1Æ!‡‚;°kk«çοZ«Wü­xÇ;lµZžû%„Ø7»¯ÞlaÊDsE ˜ÆÕZ­ÖŒâJ(¢}ÓÓ·8¾f&
-˜µÚÍ£ÃAïúÕ+ùh0^¯úýþàôÌÓ[Û[q5²Ö úƒ…ë7®\¾ÜítãŸøùO¼ï}—E‘§é…¢,i–YçF£Q–eI’ † 8æÁƒwÜslÿo~ýëßþö·Ïžus0 ”ùŒÅ_¶WoÑFSεVÞÇSƲÑHkí9>2t»Ý_|±WBÆ/_¸˜¥YžÆÙþpp÷ÝwÿÚ¯ý¥4I’­N§»½Mõ*o…eYyžE^¥’VÊCŽQy?á‘$„5Öû³3ÆÒ4M·»û[cUB@„aiµ2Ȳx7w~f8ðg·÷òVå;ŒØ ƒ1ñd˜½¦‡¢V«Y>%ã­±(Š†ƒ¡R2ŽãZ­^«Õ ”!çŒÆ„E Á„%µÑ†`W9¥$Ëó¨5›MOXÃÚZd0%œÒ¥âÜùsW¯^¾í¶S/¿üÒCï|ߝwÞ%æ„…bŒZ‹*•j‚'¤ÛݼtõÚüì¾F«%Ôæ¬G0£(8x”–eRt1`UËI–å*“§O?
-qíÊÅ•Í -K1á´È‹•••Õµµ"Ï˲´Jݸ~ý]ïxǯö7:«ëúð϶õoýíßfY&Xà3N@yQô†K—®¾ïS~ö×?ûú•‹w>øöƒ'ýÝÿó¹ín×hÉ*ËÒZ#„ˆ£XAa­8}útu¬Y*©¬=÷ê«>€pΕR/¿ôÒg~ñ—W××®^¹jwᛲ”¯¾úêGýÙßüÍß|öÙgOŸ>ýðCïýηŸØît'ٰ̾EÏAQ…Dõz#ív í8 r”rÎUšW«UlQQ$Š ÀF—µfußd{ØëæY²¿]‹ë€’’aI0Óà ~Hš¯œÃa‡ Á€1„¬CÚ`J1c-GCy*½§NXçj­fž$½á QoÌ:H0®Dq­VóI˜µv4:ëJ´©)’¢•[Ë+­VgXåpmõú‰·ßvò.bFꂇJ¦ŒRÆXY–œÒÚNgãÕWžŸßêÜhó·¿û¡DYQέµœSYZF™s.͋ñ©©æÔ$ÌIXʬQofœ †hjnÿ;ƒø…‹¯^UF#L -2JË͵¥‹ç·ßqû±B„Ýî0M2‡œuº,(eV!ÿÛ¿ÿ¿ó/~ó—þû_ŒôúƒßûWÿók¯œ (p¹C¯otz£|˜•”ÒÜýù—zÈüüG~îøCýþà‹ÿñsßþú×vŒ3„a0v¶ÚaZ:«Vfayég~öÃÿ„þe\¯Ûùý?ü¿Mi–—V8Ós/}㟔R¾tñu…10¾¸².¥þöF•_þå_þ™þTž—ÿõßúò_ÿÅÊ C†•7|öwÿUo0HÒtaaÁ÷L”Riš–y†¬aŒ -‡C')¥ ¡A §íf½‰Îújˆ6%Ô8l1ŒÎ4Ãغ½„éæAnviö?¸Ñû-ßøÛíî¯rAǔsÎ9ˆ‚0
-CŒ€Q¡¯þöܸ5®Uo8œ"„Ö–“óç®>ðàµz…à€P»ÕYþ‡ï~ç=ï~øöÛîæ"
-£˜Rêë_Ï-Ëó¢R‰¿öø_^¹zajº½¼|ýλÞöþ÷ÿ"öuŒ'å9‡´tŒÑ•Õ¥sçΞ<yb¼=†,*“ÀZ§Ê2Žú£Ñ`4v¶:¯œ;wùêU"D¨qŽ(ˆÂèè‰SûÌoõú—®]“Æ,®mÄq¼‹î‚sÖhݬĵZ -c\E¯ßOÓ´1ÖF³4m·ÛVéÕ¥åf³©¬é -ú•(ž™šÂ0ÀúêZ©•\˜çy«Õª×ëÛÛÛe–k­ÆäÄd’$>'„loo˲Ü7;»°°PEÇ" 0@še”Òd8<täÈÊʊֺR©„ah”Š*•Á`ê ²oÿÜ«ß|â -kn~ÿDQv66LQr΄ãííÞÕëW·۔áÌð›Ê-r˜àV£ VŒF倂0BÖx†€C€Foåv’«›3ÀœsÖÙ½~Ž‹>Íô×[Ø.#3J΄Š g;òÉ;¿eŒsŽ1©UëÊ ‚I‡Éf£911I. #Ýîõ8­±1Ê(ìÑÈ<f1朾öúùóç_›˜K“¬^¿ÿ¾ýo÷0J©5Ö½¶ºøƒïo«³Á’åÜD{"h¿?bŒPʝ!"¨8tüðÑ4Ï·º=m,`  -“áµk—Y(*µÆôD»74êµ¢(5„p‚±µÈ"”¤ép4²ÎY^«×Â(ocÆV¥\\XˆÃh~~¾Ùl@háFgs“267³o¬Ù £hu}-Ësk,¦D½¾¹á¬ã(G2+Ëë 7œsI‘úý½ùhmap n§ãœ ÂÐÏÖ[\\dœ,,• ‡ªÈ©8ça#Æ¡ðÕÕ­™>|tyyyc}ͽoß¾æÃ0Èó¼ÓëöFC„¡,K„6ȉ0¨V¢F­Jê4«
-Ν£`‹±%ÔŠ0~ *¼q’ÅŽŒé-©:Ú¥Ìã[fÍ{[ñ¿eŒ…aìšŸVê1Û,#„øñIADQT‰«Œ¥2ÆØæú@It×Ý·sN­A„¢K—^p'ŽŸTÊPʃ Ü!í"v„Âæ榵6KÓµµ‡zøè±ãJaƘwicÎ9£t»³ùÝï~§ÛÝ<tèÀ¹ógûýíÇȲ\\Z€z½n¬#˜"k¬Ra3!zý~2J1`Æ(!$/ò²(ÚãíƒTãJW†Ã¡*ËF£~èÀýs³adEfBxTªÕ¬ÌOÝ~ûô¾™~¯Õkõûî¹÷h·Ö·6G£¤R©œ8yâ®;ïäœoúÛýžEŽrAY…”Q)­)¥åLJɁ…qä*dY©V¥ÒžÌsò,&@œq–2F/eéâa@«Ök¿þØ'Þà±——:Ý-­Ê²(֖â8J³¬,
- ¢0§<
-=˧Z­Œ7&ËT–EŒD„ ¥°u–bC°¥0ÁÎǞmy±-Ÿ’ïÙÍÞ¨ç[QçœoÍúÃ?xg­vŽ¶Ö*+ué”Rþ¾}ë%½`JGˆ TْR’é`8¬×ëιÞvÏZL(óh -ZkÀöر£ss³/¾øbµZ?pਖØ!ä¯Á·öcÝNç©ïÿ·«—/ž<y|yé§À¼øÂsûff£(ˆã<¤˜ck±³8ËggfzýÑ(ɤÖÖYB vv4äÉpß䝷Ÿ8ùÌùsëë+E6Š?uòØÄÄę3g¶û=©‡ªÔq[䔔Ú%•/ž´Ö¾ˆ»²p½ÛïQÎJ)—–ª•êúÚZQ–Rëjµê5Ã@\‰ó¢ˆâØST€¶†NœC˜¼(Š²dœ‘(¹ËŒÀÄ9WJé{š!ã,`àœ ñ¢ßØD[Z…9¤iª¤”à ƒ8®‹
-Òlw ÄN -XCÐé÷9 ˆq¢u±°F#Ä&  7Z•^{¾ÚqW·Hb|³íC›¯–ý¬s˜ǘRÊÃ)ó•¿RÊ7<2¢”´cËRyø-IÓR&ZÙ^o;IFss3”±j•eYfìV½^÷j`8§F㡇J’ŒQÎY¨åN)îÿ¢•••ïý·'_|þ™'Nlm¬¥Ùèرcׯ_ÍÓôÔ©“íñ BøhY‹ id6Æ:‹êǏɊâÚÂB©
-ë ¶Ö,/-^¹ðú]wÞUä)%8Ž¢4]¿vu4,/-ù'êYCYžkkΜ9#•ÔRqÆ´TO=õ”5&Ӓ„‚‡A™¯¿þúúúº5Vã—Äp8B„QDÙn" ”RçhÜô덆߸Uâ$Kƒ ”€ÅžV–%çÜ9'ËÒâÀ0„:´vg(éOà¼+)KYZ‡ ¸°VÅcÎÊ¢ÀFGaÄ9 „(‹;ת×µJwc -¬‰ÃIé§Z; À:d-´Ã#ö³Ówf¹»QøÝÙêàv:„;cэ1;ÌvÓ)B<Üï‘'ŸÖ8çœuFk­´sÎGÇ0³,óô
-Ÿœc)ÃHQH„0 „ ¡Îé,ϬƒJ¥@*Õ
-J*Sî`ÂVáãœ"ÀyQ2ƚ͖s ”æ\8g}y¿½ÝýáS?xþ¹gï¾ãmeYdYvûío»xñõ4Ï~öç>²þ ,•”Z„¡BIm A@‚0B„:„O;6ì–·Ö|Þ&µ\^^.²2I²”‚à¼9ÖÚÜÚzúÙg㠒R†a^Zë¸ZÍËÂhMSL‡N§C9#°Öim‚0aDy=ä˜P©d5¨zqÁe–sƜ±iš6 -çÜh4€jµš%iQ–QaB¡J¥šçYY¨Rë 
-Y:„ rˆ`‡œ5V–oÒDªãZ«\ª4ɵÒÉ(1Ú‡#™•H»~wM¬ueYT9Üؤ¥ªî,’ec@„"â÷[k¥0B!Œ€8„ÑÎLt #ç»Ã8â_÷½ßE¿—¹#„ÅDJ©µ‚€ a¬AÖíЬB0Æ# Hk—er0ì2›³Ni—½ræL2Êï¸ã^JÎðRÉÊ"+r/ó‡)Á”:D1æ„r‡°TZjm‘+”¶ÖXg’Qÿß{ò¹gŸ9qüȨ×éõzsûç¯/,!Ì?ú±_˜?ªÃ,Ú:gúƒîÚÆJW˜ˆµqÎ8âPH ÖjmsÓ:@;L¡Ã²Á÷OLÁ½"O-Ò@+q#Ž±•¥¤„ZmT)¥Qi­±EÄXØ ‚‰0ƒ8¡lvvÿñ'jf2 k1£”Q*ÿ’¨gZJ£µ®ÔX»[­—yN+òœ(SZBc-•3N–¥$ B­5<Ïs‹\”QðÏ?ù©7x¬~¿OŒ]©¤ÒÎ9 P kÑv¹Ή™É´,!i’$}™ -G܂$
-‚ínvîéÅÞ+ù9Íè–ÐG=´Kæ»"w£áÍ4ºµåsóu?²ÑcžžZÇ18ð„É¢(ƒÁØØ¥ÌïïðlgÖrI’ô¶· ¡ApÆöÍišöz=çÜÎGìÍæÒ-|/§µ–²|þ¹çΜ={ìØ1%Ë^¿?½oßòòŠÒæя|ôä©S£´ðS}¢(,R³±±1ÇÇځƒ0@£dfÙäÔÔüüüՅ%ÆÄ8‹ÞX[;uàÐd³•+ -·mUÛ[ÝËK÷øٜs?ãJ…s!8wÛ] ¶Åã1Ãï<uÛäÄdÐßÞ\W²ôÁÔRbÀ9£µCˆX·orúm'N½¶puqqcƱgJ¶ÆƓ$µÆhc‘µ­Fóη½íâ•ËK뫾ÉF1Ás.´Ö¥”µ·i*Ë2ŽâãGOÔjÕ8Ž¥Tׯ_;{öl^J„ Æ~–
-¸(‹Â”9,õù6"`á&QÁÝba·Ê-Çšƒ·V‚o0£7ŽìñOÚˍ„aèi¢J)ç\-ˆBAÝiœsc,ޝíÝ^QªN§3 Z­6ñ”RF×66ʲtέ­­ù€ ˆ¼ÑʝsA ”Œ¢x~~¾ÛédY:¿ÿ@¯ß«µw¿ç½§n»=ÍKʘE9«µbŒíß¿!T©ÔŒ2¥Âi–u»ÝííN½Z9yüØ(KÖFçIrãê•Ûî¼ëøÜ|«:Üàp%®­7×7oìŒéðTf¥ÔÑ£GO>:ÕßX_ÿþÓ?Ô2?4à»ï/Šâå—^~핳gµÖZ’žos!„ön5g4Ïrì‚b0<|ààïüöoýÑ¿°²²â­OÕÓ41Z2ŠU)‘ss³ÓŸúÔ'¿ù­o­|㛜2ÊÙh8„(!J*Â(coIÞw–©R ì2ÆjÃ0IµF…B¨RÖ+Õz­:ô‰E•0b±nðçÀÛÖN#v?I‰!|‹ay—»ð­†å¬»kùUèWí^õw«ÁyÕóîÓ4B`LŒ5>ý÷`U¿ß[]]õ†%¥¤„æy¾µ²|ùê•V«577çõŒ1¾Ãè»=WÁ(ÅZ­Ö»Þõ®(àO<ñÄÜÜ\·Û)‹òÑþ̱ã'¥6"K©³ˆ‘’eQÚheÌV§síڕÁö6B&-òúXkÿìÌÆښ4š2á,²a%
-ëͱQoxñÕW;ýa§ßKŠd/ÑÜÉ;•VZaÀZë~¿ßëõH$Æyš¥iÚÛÞÞÜÜôgË\©¥¿ >§”ÚRɲ ŒRY¥§&¦}#د՝%Z–#«£„S
-Ύµš¡~§"Žã¼(œ¶žþV‹RJGÉè™ÿXk=J¯¾åon%Šf¦&9œmkt‘¦€a‚¤6Æ @Ú:Ë ØÜ»¶µWúÝ
-eYg÷š€»/Y„ñžC;¸ÃNò¯ìîÚ0į[é»Ë»z -doC‡WŒã
-ìb¥¶úýþ`0ôÚ'AxF¹'0ÎÏÏ{~ÄÄÄDš¦ý~¬ÕF·ÀoþDM K’„|çwŽ=ñÄRé=ús‡³€BE)1¡Œ!øh4xúé§_={æðáÃwÞs/ƒ0Š¦gf&&ÚqÈ˲ØìnMO¶g¦'WV×0F@‰6zm{ëâՋǏÇà:[ËÝîöhÄAí1—(¥RÉK—._>9ˆã(ÏsdÕËg^9wö<p9F‚Cdv€@ßËG>˜"ˆÂ°°F0vÇ=÷ž>}9411177·ººêazÐzþð¡ZYÞÛÞÞX[ãœSŒ àcGJW×Ö, F)ìÒÁµ~3»J)±†B.µB6B"Džç“JÕ«µF£Ê)ÙÚèsÎ+8 Ú(0˜PK°6ÊZDA€È®[‚[Bár¬½l̹=ƒÛÃ|oM§ü©{ãaµÄîy»R -ÙaƒxܼR© J)F¹åç9`‚ó<Œƒ pÎåE¡•³È9sFqûí·GQä©5oʱBA–e”`¥”àôàÁƒ÷ß?çüäÉSˆ© ¬”ÆVk¥^~é…K¯¿&Ë¢V«õû}cÝòÚÊôÄd ˜,²µõ5YäÓ“Gê÷Ã$£œ[cBg.œÃ˜ŒMŽMŒçœtdæMʻϢ(â8æŒF PК3†¡&ÈœE¥ÏÏpÎI)sYZ«)ޑ[÷8ñ ɒ¡,Êv»}êäÉf=n·ÛιZ­V–eQïyÿû?ù‹Ÿ˜j%£Q»÷ûÿáÿêv6’|àýïx×»'¦&_~å•/|éK+ë«!Ž…ÖVýDvƒÂ)`ċ☋€&©U¦Ð*—eEýîV¿Û Gœ[äFØap;ssy{¦ñ^ßfÇÎx>²sE»² ŒÑ-ôQoC¾Yfó‘ÐZ¤•ƒ$Þ3í¹½d4bŒA¥‚(cœ έuZkJý‰UJ Ae™'£!8k” -Î:gQb»ßO’Q«Õäœk­Ò4á<à"Ø©@€µ†bA %kµ³oàYZj‹0ÂþÚ)ÁÎÖÅ ¯]¿vuksSp…õn·såÒåæاÜY7&£A_k7>>GÑܾýëë[/_±Æ`ÂØh0ÜÚܜ™;8¿ŸÖâÅÕegœW+‹ÒiË0µÎi0ŽJ9„¬±ã@pJÈÔd»ÝžÖèÍÍõ²,uÖ:J(cœbR˜YÀË¢¸ôúë/½üÒCïyçâÂÂÕ+W<×HpþÈûßOéOÿtfjúSŸú•‡zèGO?…!Âä[_ý‹Jµúé_ûÌõ…ë_üâ«õ:ç¢tá7 §RJ!¸.KF ‚ `B˜çœÃP–e{[í¤MdÁ·)²˜`†ܬ r»=BB|n׏sÈYoÈZ„‘·0çސHì@Ö"laì,RÖ0
-;õ¥{¸¼ËJUʑú=gÎXJ)&”`f- G!ÖÉõõ¥"IFµ,¶·6Á$DՉ‰ñýûg+•Šb4RÆè4Kkõº±Ác§„)5Æa>,•sH ç¢(ÖF•eqùòÅ=ýÔêòõñññ}Óׯ_眏/-, wÝuäy^‰ª³³ÀšÎÖf«Ù>zôD§ÛÛêt0Ò(À,&¦”ó‡fƒ8ZÝ·tcuÃhc‘Ã8¦ÔaÆs„Pª­É•2q.b."!0ƽ -Pj8‚’”±\J£”*ˆC[ Dð´¿æ IDATÊòâÙó¯J«Ód„•EÞjµ†ƒþË/¿ôŠ³£Œ`Çq„E^üð™g¾ö_¿Fûð£>zä0#$ä\–’p
-o5,Œ1ò̅B–R²R2Q*m 9—ç¹’%Ç9!ŒX„ÀX‡Þü­»Ù•{#ŸÝ"€ØÁ³”w Ô[ߏòÉìòþ`‡i(È.Ü»4ÀJµ²Súqê0(g”2 Uš–aPõ2–+++ £4" ”"!‚F£Ñh·£jÅZg­ñN¶(JB_îýG»ýI¸µ‹`µÖ‚¥’Ýî֏ü£ ^³FÕëõ²,Ó4õ^–eÈáÁ`0§¦¦üq)¥‘E†¥V­V³Ýno÷z@j -GËËˍññ²(ªÕj½ž­­¬:ʵ£´EB@ ­1Îƽá€2vpÿü‘C‡0ÆÏ?ÿü~ô#ßÐ *‘1¦Ÿç€\½Vkc‡[ŒQ«Q
-ŒåŒ‹çãã"BqN¶Û<òÑ4IÆh4ò -Y pÛm·—eÙïõg÷Í<x0MSBˆ¢þ¾Ñ°(¥A$ƒ~V”˜RŒU¦Ýž8tàÐx³q¶²p-ív¨3BØ!ì:övÖü„ãͶ…CœÛÁEÁC¨·¤VþÄX‹oæì7wÙc¼£áy2”ÒSJ `R(ä=­”µ~©…ÕªÊò¬(‹‹—//.¯X+…²@Y{jº^kDa ”PB5e,pgiêIϞƒw70îYó^‚„ÜZ»´´øõ¯?Þl<x`ksmey©Ùl>|xeeåƍûöí ÃðƍBˆ±±1_óSJ‘!AÈTW*•™™™åÕÕÁ`Àãŀ777××72g˲lT+e£&8oÔq
-.œµÖš0Š[ãcVsemuqi)͒íAŸ2ÊRmm‡Áh%n6ª!¦&&õºT
-0PJ‹,ç˜Ô+Õ©É)Np½R½ûλöïß¿°¸0?ü¡÷{ÛÿëÿùÎÿõÿò¯çææz.c¬W&Ûmk]œ‹£‡mÍJw3K~ÒX¹"/@$„l´‚7*ՙÉÉöØx™%Vi
-˜‚#€ `„°EØx C,؟è±öý®…ùHˆ;¼ëœ,´ hÝ4,cüGöNBZ+Ï7÷e³/îr©UšyÎ;A 8'€’\®omw;Û¥Ñí~©5lœ£\0¡Òg\HhFçœ5n4J‚0Ø3å[°Ù\Þÿ-Î9k]ž&„àZ½ròÔ±+W.mmmôz½ÉÉÉjµzéÒ¥$IŽ9b­ív·£¨Òn·àâŋeYÎÏÏSB<(E žžÞ733 ¬µ¥.yćÃáÆúzsf:Žãl»33=Å)sƀ³Î¨²(Á1G14õµµÕkׯ{í5̈́Rí¬)eÖKÚíñƒóûeŒ2£¤)KD¨  ;䌇\€ƒ€ñ8³QB„LLŽóñÇ_={ö=ïzW«Ù¬V«¾²™ÝWæ…à|fjúêÕ«JÊñVKÁH©|sK‡r΋,õzm8 -G‰Vöêå+ýno¬Ùrªì®¯… 3Á|*tÓª;ð>l—Íþ˺ùln>ßÕq€œÏè1Dêr;Ÿ¸ rbŒ½XƒÇu¼~Ä “@0ᜋ@XÊnc½»²¼Þï+ÕPÊ´(ˀq‡°”zqi™&”2*D€1„a(„hµÆؽmû{&µ§°p‹aYB€FÑ}÷ݳ´tcyeißôôö֖7¯V«µ¼¼Üjµ~øáƒ×ëõ~¿? ¼|&e!Ä9sªÕêìììòÊÊvš˜Bb‡2 ¼Q¯U«E‘W+xØïk¥¨W—#D+¹º²²¹µÉ¸ˆÃpnv¶Óë'IâKÂ,Ëc„àj7ëuU*«5ˆÂÐÇ)Ӕ:c àPFðÝwÝÙjµœ³ý^ÿëßøÆ¥K—{ì±0‡ª×ë~ Ǐ?öя58ŒÎ¾r&£~ðƒŒóþ7Ó«kKozþ$k!g)BBJiJi¥ZwÎ1ÆCYZfI#Ž9%Èh Ôbì ÀÎÿC?ÉctÓcíþƒv†€ý „áÖ÷x›th—•µ÷%€œïäøîÍÖÖÖææf?+”ÑcL å<Šã 0re¡”2EQ¶Ûc"dZ+„€ ±ov?c¼”
-0!”à­³(eÖZçL­VÛKïöÕ­—·³lœ# -½n§µZ-O¸¸ãŽ;yä‘C‡Žxª^¯·Ûí0 1BJIƹCÎ÷úý~2d˜bÀÈ¡Rªj«Ùj3F0rV+i‰„hÔk33ÓõF0H)³,Tˆ¬,ó¢R–RúëmÖ«³3Óa ´–ÔÇt/ºjŒ’’SF0f”µ+õêììì¾é™8ŽÎ½zîå—_ž™™™››ÕJw»ÝÅ¥¥A¯_­T××7DÆaðâ‹/½ôÒKŒÐóóJ«ÕuQ‰>ùèϽÁca‡y#3)ÑJaˆ×j5FÁ”®Y BF0–Qå!8äq…½vÎOH±ô¬|Syçý¾«ˆÀoz¶ÎbŒ€ß÷çÏ1äQڟmcI‘õ†ã,"aƒBˆf³9==ÕnOÄqŒ!%ÌÚ<ÿÿ){Ó-IŽãLÔÌÜ=<–\«²Ö^Ð -ˆiHŠ$F"ÅQþ̣݇˜s_áÎm££s¥{ÏAj(‘¢7 ÷ªÊ=3ßìþðÈèì®&©‰Ô©®%*3ÜÜÜì³Ï>³î?X®æi6ÒR˜ºIóìôìääøŒúƒa¢” ŠmwHT×õj³TJ€Rª;;{Úgõ "e­ -tªß}ïk_=~2Ÿ­âÒݹs÷;ßùÎÙٙÖÚ:n¬ˆP1€³6iêêZIH7,†§‡'÷>$3
-¬›j=½ü胯e.泺©ƒ"Ë. Ëx~û®µ6ÏC]5•«¼”8îììóíF€ç|?ïé$eF!`nŒYÌ˲ö!H¢³£ã~ž}õìñÿ?ÿ»Öé;wHŠ'ϟMó/_>ü?¾:;:Šâ±!xdøë¿ÿŸ_=}º)«ª*Mcnœßúów“ Û“7 @&R9ëLðˆ˜·Ui½ÓZ“ I¬´ Þ *ä½ú^äé]Ï Îèĉâ
-ÐN±â)‰<ïnéîv»”„BB`Œ«ê¦¬() BLÆ£;wîܽ{7²>Œ1„8î{Öpµ)/^<Ët‘& 2ƒñx49š4Ö1¢gOÎ"K2­Uš&ñ¨íLêÊAgaà™£Ü¼s¡×¾ÿþGWW¶.¿õ­o}ôÑGÃᰭӑŠœsÀÌDÎ9•¦¤ÔÚù‘„ÄŸNŽs7¦‰01³¯6kÅAªd%•I‚EWm«Çϟ?{vñübFÈ£á@'R’ˆÖ{-Ež$"¢€LZ§yVx‚` ÌUÝ̗ËiY{R%³,˲T%j¶˜'B…jg¿|úxºX£aY×eYåyá}+fë/ž¼x~1ŸoÖ%eÖëé,…`ºq¿§¯g…Ƙª©PRäˆn6›~¿ppp0KBޚºÙV ‚øºªÈï»øuºßÄkÀÝסCS»ø,bWËåz:ŸyïIIçBQÿéƒ?ú³o'B1ðê÷ûyži)½Cï0ÍsÇÁ«$aæ^¯‡DuÓÈDÇò‹Ú±¾ªªZ­V/^¼˜L&´”Û7/Ø{I‘ÔÖµnÇžžžþàÿeØËNOO1‹Å"jïØQPkµ.//§ÓËÓ“B
-qrrrzzòðÑ£ˆç!bY–ëõúp4ÖZk„Mc®®®æ‹…±Ülø捳Û7o¨D†à˜G ÄYDyžçY_s|8ëõz:¡„÷aµZ‹üèð Y¾|ñl¾^>}ñbUm
-è G“É$MÓ°›Þµ^¯W˕÷^'Iáêêª_ãá(n³ëÛOƸS#´ˆI’ ƒÙ”Á9èˆ~ǸÿÚÓþ bǐyݶZp+02`äc Âø~ººÞjµz9Zç¼÷Ê'·oÝúøOþä›ßúZ³Z­Œ1ý~ÿðð0Ë2æ`MC@B©$Ռ •ŠèÛd2AÄét::8‹DÈØòkˆý~ÿüü<ÊRtøB—œvïö<n[ë -!„çù»w•À²®Mc„P.0{Ç( ÆìñúüóÏg³«¯øáx0”BJ!-Ñh4ºuûöWÇ¿kvÓ«éÑá$I7u$"‘: Î5Ö¸àن¼HT’$iª“$±¶$Ė=B,†FU°º®“aî¼3ƗˆBÈóósáÙô
-´äT-êreëUµ=>>î
-eÉóÞWuå˜S:kçóùáøà`4FŽCñša !Œ3̇%÷ûýBÓ4ÓË«zµÔYbœõ¶õ,×E¶~yµ+´g—Ýš… #ÄX¸ŽÄÀV“8nßÕj5ŸÏ¦…JÞ¹}ûßÿþûïଝ.½^ïää$Òi¼÷ñãyw #ažç‡‡ÃÁ i‡pyy™&Iš$цbWqô+Ïè®.3…]ãZ´§¨ƒ>þEk3&Yµ1€ Æ‹-t‹Åâìììììäh2ÁÀÎZí -OON‹¢X­V•õÞÏfÓ(š%¥ŒNa“êTé„=ÇF!j‘«èn£ü3a,TÄ~n­u¯ß¯ëÚ5Gãq–èÒÚÍvë9yÞ+
-Ï¡ßëÁ.)Ž÷tÎqà8üJJ¹-«²,s2‘ô¶€A‘s^ç:r}², Ãá0TMh+`©$‰]Dû2©}̽5§kÖ°Ã*Z<0€9tšq«Q/·Á¿ÿîÿðGï¾sÇÔMµÙž¥i9}¶•à€àƒsµ5Æ;<x_Y’$*Iúý¹\­#ñ-òIb¾»}ºvntaûkŒÖ]÷z‡·‘Lì˜*ÑqzO<¬§Óé¯ýëû÷ïôÑGï½w—šªŽ6¤”*Ër4ƒHŽz±\.—ËÞä Mu÷­µÒ{•HãlV2qŒµ ‘R!Muš¦Õ1 "5I’  !¥`çËœ'O²D›M)gBö‡MUUÆÐnÑ⣈JÁ„±1­1Î9-´àW|¯W†eŒ ¡ -ʲd惃¥TS6Z)%bX…ž9ÿñãðZäÛ1_}÷­½÷9W±,£µ®9|ó¾ùþç7oÜ*ËÒÕͰ׏4 Ž±Ç,¢ÀÈZo¬v †ÃaÔ ""¥õáabªz>›¾|ùr4 -‡Ãxu³{ûb㼑‹ j­a·­ãïú(­ÀŒ™H¶Ÿ~ú駟~ºÝn[çŠÛ_ É[…03‚^¯;!„¨ÊjµZ‡ˆ-ÏGI•å¨śí6Š1xgLt$Ñ}î4Ì!úª=Ÿ
-Ƙ¦nØ9 \WՋç/`·nßÎýéjá­»œ^±q>õûu!Ñ ØÆÄÞ|!"/ášË‘eY«DZÇc£"
-µ›ÊlVh+©o‚G)3¾µ,øŠä·g6Й0¶±¥,Gÿ÷#†Ø€È ‘=âr»Ý4.Šív{÷üæûÑ_¾óÎíõjÌi‘%i"¥ŒpÌ%‡“$qÎ``bðƲs©L8ØÁ`PEt3DT7õrµÇñ迸¸ˆ°Et“boœXgî=qÇx~=¨ Ñï½ÏÒ ®®.þ¯?ý_?ûé³gÏÎÏÏÿòÏðõ¯]km=7$Œñ…ðBh”7NϾø⋦i„L¸5õ²ÚžpÀÀèC¯(jc2…ÀÌB$ ÖBpA2£sž¬³ ^%$ Ðyo90¡H”³Œ!8Ó8ÓXd\Ti‡LL«åŠëU¹Ùø²B;JZ•×€b% °õÞY‡ ®1J)ã\míIfÏשÉiš’$ãBòÎYc¥yš’II@*ïØCWï㷁 oý
-¿fU­ îútÚEzÅÒzU?Á£¤( î¼wUuxtôÃÿú_oœyë€9˳xî¼qà‘āØGtcÄÕ+zãñ¸1&B÷SA¤µöÎ/‹“““Åb‘eÙ.öUØÏLcœ´oXÑMî¿øèf¤”UY~ùèу>ýôÓËÏÇÃýÅ?øàƒ<ÏgÓ«²,=‹Ë«i¿ß?>>fĺi<30ƒ^¯·X,â
-–«UUÖ €Ù9ë9x瀄@òƙº­¥ RB 3Æ£3á­õΣ ­µ"º g€YU]͖sË¡4ÍÅŅ'PZåyî¼o¬‰“
-æ‹ùzµ‰Ób¢’s ѺøšÇ’ŠA¢$ĺtι<Ëó<G×HE"P,^ûµÿÈõBŠðÊavñ
-ì…\¯Ì‹9Äié»F€oûÛßýîwÑz½ÖZG èêÄ~7 £õùCà]¯%'JMŽ&Ãáp[–JëD)ǐ$É­[·œ51‘ŽÑn÷ÂZm€ˆ1±êx­]ØN»¦mÞUŸ¼÷=úôÓO˲ì÷ûïÝùÓóӓ££‰RÉz½Ùn·!ø2ê™o·[ï}Y–eYj%´ÖÃÁ`¹\:ïBXÍëå2ë÷”¦i‚ó‰Þ;/ ÄQ¸X* u]3s¿ßÏ"Làƒ±ÞsPDÎXkŒJ’¦ª”R’Te³6xÏ>Ô¾ª›Ú#˜¦nš&ë½¢UûýÚ×U|@€8e-²bá(v^Ä1joV–„ŒÒû „R4MÓÔ5°;ړìĺfUÐÆæ×2ˆýh&.’˜WÒí~øá·¿ýí¨Ôílÿ·âZvC ¼w»û´§Õ`0˜L&Zk"Zë˜H
-©µFàõzñåˆÙ@wv¥;õâçíMcÞ0¬.‡üq\EÈÈÁ9ï#=L43;Ï*ÑP×u üs¦.™9¥ñÎEð¹©êÍj¥´FöA
-‘¤ÚZÛ4•e‰À;cLp-&w29JoÜDĪ®MÝb@pÎXdˆ£b©”@[WÞÚ¦®Áï=
-JÓÔO ì=ø€!°5¦)+NTBXFRIס·wʲû†eŒÑ)Jk]äxï—Ë¥Ùl@¢dÆðÌá­ ûï0¬×m‹™ß‚¤]ÿIf¿ÝncˆÓëõ¾ùÍožŸŸ7ÆÄi%‘dó)ØÁHÝ҆À ì}hLE¤²<ôI’(­k7ÛMÑë#âv³^]J)ûý~¯×‹¾=V »vxUØ]‘G.¼±=âãÆ]'w̤‚÷ÑU·Í܈­X—÷C馉ÆÚT[ç]ך#¡³v9_(­­1XI!ItÞ: ÌÞ9kMÓ8$"’Ri•¤Zc›ªr@‘–Þpc€ÞÚ4IR•(%L¢ÙÔ -0;ëPP`¶Öç«myùâ¥k’b[UÆ;"ÂÀìƒ콯ªŠwú€ùO×á!P) D±é9R1=Øö¨òÀ!€ ×:¼þÃ×ë öcÞÓòÛÿID´ÆZk£×½qãÆ»ï¾+„pÎfY&v| ª<D?ÌÓ4õz¹\­Ê²4Ëå2â7ÖYcLÑëQU6ÆÚÚØíj]UÕÑÑQ§ûÐy©7Bõ(ۍ išªª¢pW̕öÙZÝ}ºö‡.öïîÉÌ^}+ö°3s]n¬³Ý›rÁ ¦®§Ó)JYm¶Bpì+‚öÀXW%„ÀÞ#Éø‹Qè°e!Y(Èz×Tu„Wt¦œµY yç«Í’·¡njã}Á{uuՄD(˜0oV+`Èów)m„^1RÒ[ k2™¤Y¾.+èD©<M{½^šh§(aj¼Õ<Â=fËÿ¦mµŸ¼Ù¯÷J¯aÿrÞGǙ¦é;wF£QgL1¨ŠÉ`œÇ »q&qù7›Íý÷§WKӄétZ–ÛõjµX,\cT’è<oWUÕ|±dç&“<ϵÖι¸ÿº½‹ÿ:ÊêŒÑª"Ã"Á©vŒÓΤ"°é£øޙOÀÁûªªÂnú†1ÆÛ¦Ù -7hŒiœUR‹åb™è´*+ï¼ã`½Šâß«ÊÒ6MšhfgBl7›Õz]äùp8d! Æïœ5¨©«Ú§‰5 -¬×k`H¤„g®­«ª1ÍF(­ú¾ªA(¬µB*¥”1&fßm?Y×tä¦ÆMµa6 -»Ú5§ÇG¬¼­
-éµ÷F±A4!¸`Eã컙·Y[ëHÚQ¦»He¯Á+ª*D\, F“çVÍ3y„@£bø‡|” ´Îi•#Hi¥HJ’`]YÕ -©$]m«él6ÍÏ+ã‚öÙòjíÌƹʣ©Ls18 -ëåb<eyžèTJigƪ6̜e:¶—Å·Ï)Øª¦ÓiÓ4‹Å‚™ãSî0Õ" ¼oÃ5`lšvö,3Džѩ¼ºº¼ÿ~–e·n݊hS´àÅbå\0µÅ(ÁŠ‚K3›-³à=8§8$ÈÞôÁm·Bkë½ç`#H+ðà '¥´ër|@jnj¹Æ°5ÖÕ̼*ÛΔíf¥T‚ í¦Œ¡–VXßøͪhó\ᤳ–|p¶j¼À:QÖÔiš$Z&©’òaÿMÃê -2g a‚¶¶Á†c­ôÅæ2ŠP¹¶²" ÅPí -tç·»1ÜËó"%FÄ󸵬6à/w‡‘õ†ÁêTß}÷Öd2
-ÖÖJå@ž¡=h!1ç…Ï~¹š?{ùòååÕr¹.K“(YÖuµÝ¢·v6›i­Ë²,²|Ðëõz½¢(²¼€ŽÈBL*«²ìpü؎=J<¸«ªZ.—ëõz½^¯V«ý£°›ïÖõ3£5.Ñ:xo­“R m8örE•Xkm< -™y»ÝFì’1Íf½vBÖö.¸¶|O¢^Á®ÀŠˆDM òâk‹&ßQ·6{Ùtƒ ]”-f„,K•RÑÖ)ò
-½·Îzfä}‚P*ÚA8Á^SM–iªjï$
-”‡ „tÖÛÚZÌHL#/‘HF{‰½Q1ðjá×ׯBÛ- -͔v3(Z‰¿Àb4ƒÞ³s Êx»óÇE/a¶R1 a)€Ý©Ì¬µT‰¨SÎÖW—/¯®®Ê²ö -Àìêª\¯µ \nÖ±;숨Èò4ÕÌ!¾6±'nà ±|×#bîÑJ"èǀǣp6›Eƒˆ‘ß?ˆ»5F$ï_cq”u¯*ŒËå2Þ?®ML"HFDŽ º`}ð!x!´1I´ŠÀ2D6|è¢i$ÑåL1Gf @¥{šÀ†LðÌ!t4'I`gÙ‹Á9R² D€’P’u–˜ƒ ò¾µJX 2®×ÛB$R(‰@€“$8•@lÒ–°'®»¬˜ÚQ‡2Ī0bK!m=0 T‚B $§d"…ÐZÇȺªê.ˆ€.¹efç< Yã¶Û²ª`R2k7ë±?”À³£ã$MƒEQ ‡Ãè"“•vÞ(Æ
-B­UG
-ˆ‹·Ýnct_|tfMÓl6›ËËËä´õo!xڝòÑ0·»(&›°;µE`+—Ýöe)ÛwëbF -Àˆ´Îº°MvßbDˆ­Ðoœ'í ‚ ÁyD°{ßiµ<1HoÕ}™¼$%APpÖ9v¶aöÁû$IH\«®W%@­©+[¥Jso="N”`ŽŒ<Ž´vcî"Ö·^ûF°;1aKµ ~vö×þWU6Mð`<Ž¥È8ØKA­# q(3"9K!ðfcÊ­sbd[zcúy¶çŒ!yš•äy^–åÓ««ƒñÁÉñI¯×»l6›M§Ó4MgÓ˦i†Ãáx<®ª*΀˜ÍfϞ=»¸¸€ù|þøñãív3ÄXGÚ>ð+•€Îl)†\ØV¯ vþ©#3µŽ‡[NUçð8x@’\)4e£
-î@¿«/ŇûÊ®÷–[v×r(Bà RÆÖ/ã9
-ÌaçÀ
-=°pŽ«ÚéܽÅce遭+ÓÔÆX[7~蚦©·¥NJ‰Ÿ‘Ö+$Þw©8D’Õ[c,"ü¶ê~ÀöŠ<íVŽ(yDz„€ xâ ¥,ªÒ/æeÝ8BªÊ­‘±i›¦ … º2Æúùr¹\oUðP×õfµ°MI2U%«í:-r@2Æ̧³Ç_~y<Y†Ãêً“ÉÄ{ÿþýÓÓÓÉdrqqÙ4õh4Ún·?ÿùÏ£@RQËåòêê*_,B´*Þûñxüãÿøæ͛e¹Yo–Î9æ$IÔ@ìõúÌüøñãétöòåˋ‹ $!`YVŸ ¢¯D§(vS¥”J‚ÒIÑëYï·UÙëõ>þîÇ·o¼³¯Ž ;ZH·Ï»Ø—wÝÀ¯fÏþº/ù`«ª¬ªJ
-9"3[JÕނ ‘=R€(”DA:ˆ£a@üÍýûkS½iXç'7.ž?]-WZ'ÆÖ̰ݔ۲L\b·ka‰J‡@ vÖ.Ôðm®·[d~EiÚÙ}°Öíïؽ­øy|”MÓ¸ºY“X¯)þZIiŒ‰°x’$Z벪6ë -sH´žOySVÖº€äB¨ÊU
-ëà}ªÕj¹xçæ-[׶1:ë'Ig¤}Pó IDAT“€à‚{ùò¹ÖÉG}´Ù¬ÏÏÏÇ㑱4™6M3›M#íäìì,V~ò<¿¸¸(Ër2™D^$½üO¿÷'~øÁ|1kLåBE1 tªs³Ù¬èå³Ù|r4Q¿Q›Í˜„1ö€È’ˆU#Ú €1³dLŁ‰Dë$ÕãñøÃ?üÑ_üx0H!iGD¢6nEnÝPÏvϹEÒbô±ïÍ1@X.æ³ù÷{ƒýx£;—cÿLc­‚¤ð¬s Õj½ž?zð¦aiv¡*ÁY+<IÈD2Hó&/¤ÒÌÑ¡°(< ÙC§k°ûè¼{e,]Ê·ËØß&Þ8=¡M0#î¿Z­V‹EªõíwnþèÇßÏ´&âÉáam,Çãù|~yy‰ˆumàñ“'«õÚ±Ÿ¯–OÖª©kL"ziŠÎÖÞÛ€HÈ$ËOoÝ}õàž¤ðâù—ïÜ:…ДÛû¡RˆˆËÕÌ{r:™Ïç—/^ó~«°ÈBè÷ûBc} AeµÚ”ÓÅúEí™ê,Éb$·Ø.Ö/×e¹>½÷èѓwn¿û­¿û«_~öòéó]úF°½uþfw”)¬We<"gÍì¯ÿúï8Óþƒÿ’ë”+ `Ï!ƵƘ®l
-×.ÞE&{FƒRR ·ØÌ( $°Do¬]wëø68ÓÖHçw$ó=ÃúìÁoLU)-ƒÅ°tr|4Ϫ&#їÒZ †É¹,î2áî.´äþ¯[ÕõïB]܅±r>³4í÷û'§§Ã~o»Y@’$1¬ÑZŸœœÄÍ]×µó>MShœY—Û¦iR•Ï!p6ʓ$ -€J%‘ƒ§óósD<999?;©«Z*uz~ž$‰óa29ªªÊ—åÙ;·ß¹yãæùٍ¢(š¦9<<ôÞgY–ç¹16â#˜ˆƒÁx<ÆÕÒ¸¶ò3Ng³€ù|>_,’$ùì³ÏÆ£ƒ³³³rµY/W]²É»v´†°“YÛ_Ñ°›üâùóøû¿×B~ÿOþtÔxc ر÷>–¤:˜÷z¼oU¯¾S[ÛÏÆ6ZÑ^SËïBÅ}RÊmY¾iXƒì¥‰•+“~¦òDj%”ÄÀ¸kž »Œ¡•Ú·•º¾qu_|«…uïYPLh°c·i­µRÉNT=Ïrkêà\D}─¸ÒÖڃƒ¨¹¸¼\^¬¯®®f³ù»7ŽOÏnnÖëTë^š÷{=¥Ó˜”E+ÛGýwzy¾^¯‘Pg…sξsç=Ó4BH­%S)Ådr²Ý–!„Á`‡tL&“ù|±-«ø0¤”EQ¤©Þ>Ûþú‹{Ƙ÷ß¿(Š~¿ˆBùà³Ïî=zôe¿7ô®­àÆçÐ7­†ïnlBWëí,,„LøÍgŸ/¯æ³‹Ëÿè/ÏNOƒ>j|†‰È~7ýæ·ÙD„Aä[βÂǪeS+©$%¯<çÛ¼C»¾DBŠõvó¦aMNêª´‡dyM0L¢T ‚ˆ*ÈáU­ûè÷H5ûâ-/b÷[{d_¤:þŠRŠ¥8p‡ B)eTSŽéz\QD¡’dõüù³gÏ>¿ÿÅý‡Ö«eszüÎ{_“$´JêªrƒTûÂñ!„<Ï `¹Ù´âð‚œóQw.ÚL$¢žïÈÁBˆÌÒ®Ë`µZ½xñr:®V«¦iñøøx׿°eæõzÓ+†?üá?ùÉ'?ÿù/`WԎÈ0ïʦû¨{’Ý&lŸ'¶öâùóÿñý/}ùƒüà¾ñŸ&ñ7¶óvÝF}‹aí¾´o[€t’‡k·²¶öAÈß» ñá-Ö«èž_3¬ÞïË'_-šuªûù¸OB JˆG`‰Úؐw Þëïs‡Œ¼ñW¯¿%ܕý÷ƒ0Bh«Èq§j­mÓ‘¾®*f$¬õÎ;)Ûi(ÒDDk›ÙlöàÁƒÏ?ÿüÞÃû/./ƒJ *I´c˜-6ÃÁ ?{Dç\l1€PÎ Z§Ì\Wµ”ÂËÖfÃQ|Áiš{ïëÚÄàvHi"ç–ê¦yùò% ®ªª×띞žžŸŸ+¥6›Íjµªêm€¿¸÷E’䇇“4MËfÓ­S|=Ä;Lcùv¼6fb–€D´Y¯?ûì3”‚%ýñ}c\ô1Ö(ߨ‹¿¶.׬Š™‘0éT cŒ¥55)}ýD¾~‘ ÅjUÛkÚ -Ï¿|ll¹¢TðP”Š »“0æÀäZ1í×Ïï.¿Ø?ã®ûOܓêº GDl²­©ÕËÕÊ{/„¨*W/W:Mc¥"&D´^oýùçOž>mLã³DëÑÁQ’æBJÛ@&)®×ë¸BËår<+¥¤P‡¦q›Í&¦œ/_¾4Û*ÜÜ%ꈫÕêñãÇ:J©étzuuU×õt:¿‹Rˆ`­MÓl87ÎÇrçÅÅE” -Áê´xï½÷>üê“O~zqq¹Ùl¨…îà•¹ì¼Tlèè(]ÆÀ;ŠlÔS$,<üÕ¯?¾÷ÇßÍó¼óX¿û|öãƒI–æeS7¶&ÈcûÝou~ñ>uSǍ÷šaÍ×KÊU’¥BUUH‚³ !PHB ÀŽƒ‡ø•aÁ®¦œ8Ê«™mT€-Š¸+3Å/wð 2‹hjB4¶Õ¶iª§OŸžŸœ zE¹)+k»6.9\\\Ü¿÷EÝԉ£A¿®¶y’ {=…D€¶m1PιífíœK¤X.æ:QiªY¥„ÀÞo7kï|š¦åfcëj³]Õuµ\®Á;¿^/Ê
-ò¼0¦vÎ:gŒ©×›UU™à="*™L&Ç7Îo‘¤ÕfÕÔÍv½ŽÂ‚Þ‡¢èFýùl©“´©~ùðށ‚ùu–N|2€pxrtttôèáCϞ™Ûj${„BãÁÁØ:3Ÿ-˜¡Z¯ÞûâäÆéÍããmUé,c±Ç=¼n¸WÀU6À¨|Fq“(©—ú`7$€:e¼·Vð¡ns]ƒ´d×ËzR·.x¯3¥E)—Ö;LH @öˆ,(0ÆIô…êD¨×·x2²BB`ÂNõ€ bµ0D,M‡¶M
-øÊUiš\\\<{úlôÁ‡‰H¶uBˆû8deY~ùè¾i¶x¯ ÆE~ûöí›G§
-…ªf€™ÖyžVeÖ4ÍhÐïùp8BɑÈÂj1÷E‘H¡
-¥SÌòžµ1FH,úí¸ò,×E/ôƒa¯¬¶ue@ràAo˜Èl:»¨Í‘”Jtšã¼÷½bH(­sÞ7‰‰àLˆ¥½7V E"oÿÁݓóÓ¯^>í \͖±C>@à¸Þ`üßxWeêù£—Oï=©·U9ŸÚ±&á)‘,fü-ñ´ð4Ân[ŒD HADXH“µMc7B°‹„‘~ø&„ADJJk®Öz½ž®Ç"yïëªÊ… )ŽÀ£6˜ÇáwaÓ[ßÃk à~ºÿOA½­qO2i%Ó4ÑÛíöòêŠ?€¼×ۘŠˆò<oš&Ò>§Óév»å=Núd2ù裏ÎÏÏcÎô´ÖY–Ÿ{ï‡Ãa4Šxpôz=DLÓÔ{oMÙ+úyž÷{cLYUiš@Ó4Ö¸ºn8@“›A¿¶†7›•÷!:§ˆ—E€Rª,-U×µq!XKDÖØBš¦Óæëë˜F£áååe–e“ãÓ¯¬_,¶ž= î÷‹ÁAÿäôèäôd0|íö¿}þÿþßÿ÷þüƍç7âëÌ<í1÷¯_ûQ
-ì ÿý,2ž'¡ÒBܯJ½fXˆ©Ö‚®ué(ÙöXv¿B@c¬^M$(vfÅ&å’ŝíá5t ZÙQD ÂXi‚]µ4ê§!²@IJ A*צγÜZ[7uešÑp8ðƒÈ;ˆíêÓéô«¯¾ŠñGœƒ"¥<==}çwúý~ŒØ"í¿×ëEÈ•RDhŒ%A‚D<Ucí¥ -ò ¯uŒDRk¡”ÎÒ|>Ÿs@¥ÒD¥B"E$»ÐG)Õëõ†Ã!
-v¾ººš"R‘÷­µÆØ8d/MõF
-ï}”ò²Ö^W ÞEaŒùÅ/~‘&z4Ý·Vjé­ïõzï}íÝ»ð
-HÒ$Ïó›Ç·ú“§_>¹œ½¼{çÎíwމ(ƒ‚(Ê #·“·XU¼öcßî»ñŸ2Ș?yï˜$Š-æס%ì7¯µ@&:±ÖÊD`Þ:áf@2¡dò°kl š­ß¢kÏhgw;ç Û1¾ˆ1þGmøNJP*ñ“BˆÀÏMpN'Éj³yðå£?üP*ËsZëívûèÑ£Ùl¶Y/ãÓ ý~ÿk_ûÚdrè=w-J¼Ó`FŒ"zì\ð>¶=µ3§ã’Ä‹a¬A9çšÆ´û‡„¬uñ¿ny¢DV]UËõôáÇUUÅ Ks!(æÓÓ³ƒÑpúrvÿ‹¯Bo -ƒC‹ù|µZE¿¼¸œÏçIQôÅÁѨ7ìÉDnʕ]ÚñxœeéùûgßûÞ÷~}ïӃÃC­“È¡…À]iä-^ñµzõÝëṐq{k­V'mÿ–û˜ª~‹Td¯×WJŔØ{¼g¥”R*ÐǸ»µ—Ý!¸{it½¬ €Ñ?¦8÷±•R&"ˆŒ7)âp$)!2AHJ%ý¼·)·,D@x~ùòèÆéÑpÄ!ÄCg:>þ<„%\ò</Š¢(Š““ØSv4ÆD½
-)b¤i@„¦0v,Å7ÑÍÂB(©Ø9À"¬«˜‘&$¢މÎÚ(ý°X,['I²Z­­1ãC!¤gŠPèŠ0Ïsh“phêë֕fÙz³€?þøþoî]¾¼LS
-ûãþÁÑáp<̊t¶ºš¯æ½¢Ð;<¸}ðWõWßýÓo§µÙl³dˆˆÖ[ ,®‹ÿvÛzk¤Á¦•72Rñ®_2¶&úk¢ ·nݚW«e]‘”R¶TC!„PJ#I!‘‰BkP]Qsÿ£ˆÂÚo¾jÆMÛ©_݁ñˆ‚â(0„(ÅF”ÉÁ6ΪD-×믞<f92{ï///ïÝ»‰.wïÞí&eFºUÜ¢•Êoˆ’Åvœ>ï]ŒCŒ1°C’¼ ¥‚ƒoùBž#Ñ»à£X±$ASzæ][‡ÖZ&¦Ùáá$Ž@W*±>€àÍvñôÙÓ(?,¥Äæ-ëÙ|~|vZUeL{Q`¢“^¿7>ݼ}+ë§óù,QêÞ÷¸äÿü™Ü§÷µÝšoþ‘Šú¹R„#òw:­îöÁØÖÈâKuŽ#o‹‚–B^?´äv»f𠜤ZqÒl›ª±ŠTåüŠ›ƒŒÐ1¡P"5 ¸3Ž}ӊRîÝ{h?!äÀm]ˆARdÌ·Ýp„RäXI¡„ˆ
-@“Y±®ª@dB¸|~y9<<šÔuýðÑýç/÷é͛7½a’$BHã\¯×'¥­u E JBŒ`Q ¾B†¢´.ƒç¶æˆÄì¼ ì}ð­ê6{¼uÖyë¼eñ[!´” ʲ,˲Ñè€Á'‰–R ÷Áû`­Ñ©ÏYRŸœß\=zøeY‡Ð!Fúó‡_nçËùlÆޓ ‹ -“Gb%“^Ú/N‹”ò^‘-gëËÙź\s€zm./ž¾8>ô%¦B(ë\(q¯ÿeßz~¯©Å‘¦J
-˜½BÀ~VØe`,Ð!ãõàýáýûƒ£§ÀÀ$e€„ Ú{tõ M%{,-c,x¶7îÄ÷"“š»W…1.ǀ E `E‚Z{°2"’B+‘¡‚FH)ϼ÷[k `³XÝ¿÷ WäOÕëåç7Nûýbܟ©˜a¹Ù‚Æ@˜¡õ>Ò;½÷Á;xÕßÜ)¡FN,3 †VÁ2Xg¤”$Ð9vÎ:ïB`ÏÀûà|ðÐÎ\$"MS­užñy !꺎R+Rgœ"]äýÑèàûö½^¿÷Éÿ÷¿œ¯ eðÞZKB(%…Dï½oìå³û¼‘:Ž¥Ä——«ç_>À^Ñ’Š|pûüŽ±›‹«¯Ng§‡wƒg’à-9Õï÷aÐú-@Ñ‰Ç¡8|­²ÙÚ+!H‚ë-ö1ô Ý (N̂ëÆ5ÖÉHGæ ‰<r'ÕÙ†oϲ:ÐO ÉxrBëG8rc‘ƒN¤Ìt"%!1KD„ò4uÀv½¶¦Q’–«ùO~ò/«Õr<>8¿qÖëeJ©A€·ei­c4ÆØ4Í"n7ÛÕj•H©¤bºö@q—2un €=ì¥ßÝ£Œ¹wè:cCˆ!턽Qðºž…6½’˜&MÓÙlV½ápø³ŸýkYUž AŠ (Ú2o³PBfY¯×FãÑ(ÏrŒ€¿ùÍY–ÿÉþ^¿ß‡@§gg†7Ÿ?øìÁýû§“[ BH”òþMZòÖó;Œl?üŠÄÃØ͋×:h|Jªëq½T‰hóh ùe¹-²Ao8ô„NS¤à`Pȝêîù§è :É>ÄøpgR’D °:üŠ‘Q2j!´<¸ i)” lL‰¨çs”òÅ˗ÿòé§wîÜùþ÷¿7…ZkoAš§y1Œ²4óÁÕu½Z­¶›Mïø8ÑÉuâl»%àÍÇë€҃{ -†­Q`nšz7ÊÀÇÁ{ 5Ê¢(BqXµ”IUUUՌLJ<¸wïJ¤Î´w¾iç!3…¶Ì±«I€ÎÒÁ¤wûöí[·nŽÇ1Sùèÿðød2ßÿƒ÷¥ÔθAt~vûjquyyqqñìdrB°†~GßYÕïv`Ý{ïãHÇ=<2R0Ó$iú¦aA" Xßx‘$$$cEOŒÆ‡[ç¥RJ
-_Ռ,[¨öõׄ-Ü°³'l͔¨¢ˆØóÚIŒHR Ü±CD"S©¹Ü¬«ífS–B''7o£Qã‹ç//ž?zxx0V«Í`p0•e¼­kCBfE‘å}AÒïÍgYš¦i›H_÷Xaù*þØ{Ö¸«ij­csf¼[ìÒéªéÝåCˆ’Q«Õj<GPJ靑Bõ{ƒ'Ÿþò¿
-žûÃþh<îõ{ëõz±XÔU½Ùl@Rì…B"0ë, ‡'''ÃáZëó³ó““ã,̓‘© -҉êÛ7ïTåçOž>šJ•z ‘7~ݤÞøø;Œ¯{Û»i¯L ®ê,Ëß4,ìkJí:¸”R¦jÖëµj¹©h[êB«H¡Œ§~Ô mƒvD±¿í B’‚ÚÚ#±@"D‰ª;‘2!’D((Q¼_¯W³éåf³rÞ{ÂM]Ý¾„Øn—Ãá`8gYV×f¹X#$išIæFÊ$ª´;¼€^1Ùy)×\Œéùu.¶Z-*þdôRñiF傪ª¢æ‡sQ
-@ !цpuuõ³Ÿýìôôô[ßú–”2Ëòí¦ÜnË{÷îÿÃ?üÏ/^23 H‹ìÎѝ¯ôõ<ϧÓé?ÿó?+™–ei¬enõÃÒ4†iš‘R`QJòŽ¥LbåLˆäð`2?šn·Ëårz0:"p oiR~êð÷U¬;Ï´OˁJ €¨ÕóšaQOK¥Biœ³ˆ”§™©Ýf³‘EŸ‘Œk|P
-€D˜é;ìÎÐ×E@PB† ìÆVÄ( ;I%8x”’¼1MµÙ4UÅÁK °˜_­«mÿ`|498Q©±^IM(–˵÷¢È­’ι0Js¤6´='ÎZçœR²Wôª²d~‹»‚»Ú/~!¶ò7¼Qnð;a¤o))ºgr·`™N§EQāÂI¢“qú“Ÿüäoÿöïž={=úǏ€÷þã?þàƒ˜ùé“çWWÓÍfÛ¯#G-=Æ4Š$"Öu½˜-ñèè80+!¬uÆ[&HÓìääøÙÓêêêe–Œò4¿»Ã5/õ»Ö~"ÙÙVt۝ž$Z÷zś†•¥ýªi@©"Ë«õ¶ª×¡´eyÚÏ·+ǹPä}•(`¯=«@ÂSL1I0zl;rڒ"`T¨–ˆ’! š$‚j.ÀÞÕ -/j‘'*¯êz]¯,yÔÒÏ Þùz³F¢~Þ;:™¬7U`(Mpf³±Í•Öio8TiF Øc°>˜óòž5uÝ4¤" ±±§ÓVèfÇí?bÂ×ÎÇ´Zg€!8oªj«A‘9… VœÞÿý[·ni­•RÀø䫧ŸþòWóٌ•”Þ{AiðÕã  ¬qôÎÝ;ÿ‡úgŸH©ž<y‚ ]`ë•Lc(ՅçPÕõb±l6u®ò~ÚcÌ%JoÓÃÞ¹ñÅŋT?»yC Ë ]™XûðZµ8¾ÓèÔ»”^2a\úÐÌæ——‰N‡ý‘T*QI¢u¦õÁøàMÒA¤R;Û$L(X»Y®›m•)=й P5v˜¦€€ZäH(L0'ä8ÊKÄÎ!8/””J¢ dïÆZbIJ ÷Ö90ˆèQpž€¶›í—ɼwçÝ?HtV7~[5Ö9$®Mm¬Í§Þ³:Ï{q9›)­µN]Qò‰¢Ô¥@Š¸¿N°nŸ&bt$Þ{ç\´˜<×uõôéÓØTÈišn·ï=ýŠqÁŸÅšRUU¿ùõÿþo¿¸ÿ~ð!øÐ5=gEá|˜Í‡“ãO>ù×Õ¦ú³ï|K'ɳ§OÜ¿Œãñôê*Ü ˆâ½»ï&GI¬„<<œ¨1õò{ïv…W™¢€DWýíl:-ËMU¯SÝG”bŽûÄ ùGyrû.ª{,¼w•åöùó§/_¾œLŽ&GyÞC¤PÇF£× k»XJš1T•0žkÛ`\½®2LPˆùv=,T&%¡#Dì‰bO"´ìŒ$ˆ‘&€’ŠIyð!
-I„D’(j¹ !Œµ±F M‚g"¼ ÎÙÍf{ÿÞ½ÉÑÑáäD% Hα\,«r!抭75í,c¹X.–K¤Ýpò= -­}GõÆÓ´Ö$Jᮼ^Z¿sîôôt:>~üD‰ý±ä‹¢ðRê4]­VDâêòêŸþéŸþíçÿ^×u—9J)µVU¹Mól¹œo7«“³Ó_üÛ¿¦àß}÷7/^¾¬·år¹,úE"51ŽRÎ§ó£Éñ³óLêN6"bÞ"IDy^L&“ÆTe¹•"ˆ9@
->ÐÛ¢©ý­µ¿ÙxWhßyq išFc"ŒqN¸®š\ÏV®1IÀà}SÕì<{¯]¯ËF¥R&«ÕfÓ­´ˆ€$€$£¤E`ˆCcAáeï¡RB²5F „ ¥$@òÁ[ke¢TÔ$B$)Q -ì "Q
-q6½œM§EÖÓy1‚ÇmYrÞ«Ëf1Ÿ%JND’DÜ¥¬ªõf¶-ËñÁ±í¶ëR›.UÞߎñiò[$kCÔ
-dæ²,cy>oQ+Oª”R*RI)çóùÅËË¢(^¼¸¸¼¼Z¯×û€5ï²@H•¼ÿ ª¾þá'?ýd³YߺuË5æ§ÿò|¿ß?žœxŠ£ƒ£\EÖk'‘îÁ]ØÇDནRŽ^¾|vyy)DÚï -ã@÷”Ä·„óû}AûdA¶/;Ï{‰¾ ŒZ§DÂ;&"oÑâéW%{ï°+›8MS¥´i¬³~|p°ñMÍ!´l$µ*!’Qpû9
-@ë€ ì¬dD‰
-‚cïiGmhÙôD(È5Î{Ÿyâ“ !I¸|ðÐâãìØApƚZ§i¢4H8ÍÔ1¸¸xùòųr»ÒZ AØzï&ZG½nï¼Ø -MÝo[¸¿GL!º–Xp”RÎÓº®G£ÑÁÁÁÓ§O«ª:<œlVkˆ‚q˜êÕÕL%iUU10 Ÿ~úë«Ë+nÇеJeÞûÈ騷›þh$õà‹{ï½ûîÇßýî¯~õ«?þøßøÆÃ{÷‹EU–?ýÉOïÞz÷ý»ïY¯ÈŠD&̾kƒæœ‹ˆÎyD,ò<I’Ùìªß_y!郏ñ%FHýÚQعÞÎ1óŽMÙ9ï]ÆÎyk}ðQ!†Bpo)!ý¶VRJï½ڑ7. õI'é[·–¹¤r…$‰‚§8Í«=
-c„×…­ÔUðRˆ$‘‰’ØYBЉTJÆ%Aÿw»%ç8!RUƒ÷@38ëœ÷§Çǃ^!%!pðIi)•Òâ˜x±œ.f—Ûr#¥ -&ižç½A¿?ˆcëáu ½3¬ý0b—Åö©H_qÎÝ¿±XL&“ãããív MÓ´…³8÷g?ûÙ¿ü䓪²u]Ïf³¢(ŽŽŽ–Ëåf»8jDŽC!+ro›á°Ç¨¯.^üÅÄÌïݽûñÇÿã?þcUÕC]֋Ù›ëÄ5N¡ò•(\4‹¢”‚r4WÕv»ÝlòõX©ÈAXË IDATîô -®c »ó´=^÷žÆ«~*@%"6uÎ+%cYNì†k¼fX©”€¤uºÙn„R!PU•¨UO¥y–ŸÝ¸Ùï%³¯²ŽbÕÆX»ÞÕØÝùð„€*IP R¬& ¥U ùFæ
-Šô=ç\cš–Þ‰„$ˆ[ë Ëóã£I¯(¤ AÄÌAdÏZéÉááhÔ«ªMUo”Tމ,/t^(•xï¥Tb‡w«»Z›Þ›ã*£mUU%@Ò4Ýn·óù¼ªªº®{½^Y–Þ»(]ä½øðÑ¿ÿû¿}òÉτH¥”ˆtyqõèáWBˆN¦ë´‰)±”¢.K‘¨ÙtÚ -… 'Ož|ýë_ÿå/¹^­ÿøÛ¼Ýnÿæoÿ&fÖØÕb¹]—ä… ‘´§V¾&¢Ì(¥’RXç‚E‘F£¯¾z,„èõ
-Â(¬J°#‚¾qÅ2”ߍPÐZÓN¡dC†àE¼ÏN—Ú‘hG½i¬ÅÁ¡Ê8kÝÿÏ؛5Iš×bîáñ­¹UUVU¯Óݳ÷`°ò‚Øš—0#ïå¥ìJfzÓ/қL¿B÷‰&M&Ҍ¤¡ b#H3ƒž­÷Ú+³rÏo‹Åõ™ÙÕË@ȗήÊÊíóˆp?~üÓ4µ"²e™& 8¨J3›MSMGê\Äi’K']¡$j”Âc$c…Jy¯5€BÐÀš½VÌYƒ7]©$‰)
-$jҊ”bÔ¨b]4ÕÅdì<
-'±$µ·»ÛÎÚy’½qýÆN?kw⬤ 4>蘡Œ´Ž’4k·;;Y¾•·{i֊ãT)-•"ÁŒì7üBÀ!è)8O²'DdOBcÚ¾\.<x°³³³e/˲€/´Z­ÙlÆ̳éÜZc­Cä÷ßïììl4i¥˜]]•$€m¼óBÈu]°Ò{"ŠStÆ ¦Ùdæcyûí7¯ß¸>™NËÅroïãßüV(©çcw¯[ˆBgZ
--” sÎZD$ž"Â;!)9>}øäÙçÛÛÝ­­­°!XËᴀµ:\Ì ºQ„5Ýh³êÂÚ`ïع­~,ž]Ì'ÿã_þç+ímúÛfWtÌq{ÇUYåB ³7Õb¡eR 3IMB"£äálD 0ă(hÅ=f!P’Rü½@*)c -AMQ(ÁˆEY•e§iÞjÅY§±’Qdy¾³ÓßÙÞÉ;E€Ä ˆ(µŽâ˜??ÀĊ|h¨b—¾x ×¢.›Q>^³þ™™Ë² bÝççg'''­V+ f-—ËÉx2 š¦F„$ïÝûQžç?AŠË«ì'@äx)©y^s­ûE¡ê†y½¼qýúµ+ךªœŸ{猵Ãá nš­í­k7®9v,ØÔ&¢8Š"‚mˆ—áù7<OD,ÊéááµÛ=)u0Ñ "€qÞpâ‡äD¬§6©ÛK›Ðº¬yᇈâÑÓ§ÃWKj­ó¼–ŒÖZoooK)›Ê„‹b<çY^–Å¢6uª„"Lk1úœ@*°@D‚Ù*%„@Ff`@Rº1 9ύ© kçY«éx¼œ5¶‰’„ˆúý}%µÒ:Šc’RhM¤™Ù1[kéE{ßðïånæ*©ZC/Ÿa`ß³qÛ"†Áù(Šž<yÂ0‚¨,Ë@auÞi­›¦fï}Y–×®]ë÷ûG‡'!ßßÀô—£êrx…Ã1ԛj.¾ü싷oÝyëÍ7›²Z.—ùWÿy¶œœž\¿vm1Ÿÿýßÿnݹùf÷k½V«.õªõôâ¼rˆ’+û×>½ÿðàøêþqÔò`šº(Ë*|Ò\©ðn/§›—Ãèµož_°Aç<¿Bˆ•Zë¦1eU„¿ét:wïލ¢¨XÌа/' uÔꖍ]«cM€Â³ ðƒÁ !œ2¡ÃC„ž¤´:‚W<eF®MÝX' J±,KcŠã¸•ÇIJR5‹¦öžÓ4ËÚ­ÁùHî'üÛ;„ðõÁ iøúÎó¥v\ØÄSøÕ%acŽ¢È{? æóy¿ß9ݸq£Óé4¦
-äcïý|>?;;‹tEqYÖÚ ÎöÖ[o}÷?|÷ÿü}Q-¤µïáWÝüÚ¯€ƒH®ä/?ÿüw{û?ºwï÷ÞýüË/®Ü¼þõ¯½1&˳£££Ï>û,íd·oÜÙ\]ç]°BK…¬Y qœ_½zÓ;pƒa0Š£L)ºbí·‰’ð]m¼×FÕåDpÞ½ú`ÞGh©ìíííV«Äqæuqÿ‹Eí9IۓÅùp^fª““uè%€B6°Â®×h†) !€äj2‡C¿Z€qMc -’ -Œ3eUFIšµZ(PH%µÞÉúµm¦Ó¹Ž"kmY•qœÌfÓ,oÅR!" B©ü+ÌÕW>üóóoÇðZC¬ØC¶1 6³Ú!òâ8€ù‚˲ â“ÉäììŒH²ó¡Ü‹¢¨ªêápøλïüö·=~ü8ÔVAQü’©Åk¢Ê¯E¿š¦Q€çǧ?ùçŸt{½üð‡ó²˜/—Wö÷Ó4œΆç{»»»»»ôŒ+¬‚íà«×Hè[·Þi·ZA~â8Ö*‚6Õæ¯6ߛxΈ|
-Ò¥Gnv,¿úz9°Â²ËÑÑh­Ó8®›
-#5˜Œ"¥¯î좊/“^¤z ‡„Ö;„•@àCT NtLöd Œdh¼w!ª’<„¢,1É2éÆZ©¤T
-5¡&c:½žw~6›9çG“YY5i–m÷w“4%|ž`^^s¯@—1åÍV–%,—Ë£££pܽ{7ˆy´ÛmXKÍn”ˆ¨×ëíííY³ú61Q¤?ùä“o|ý›yž‡c¨iš¯Zô›wv‹$Iò<_,¦©LUü◿|óÝ·¯½qãè𨷵¥µzúô©Ewíæõv»¦i˜gGD¯GB^ºäÌì"‚\Û²”Ä^n¶m±v¢³—üQù•N×K¿ºüBv,÷šÕ³ªöIˆ À`0xòôÉùàüôìlxqÑ4Íðb<šÌ<ÉEe&ËÂZ‡ì€-؆¸š†i’@/aÈáÆåÙg»(Ž²<³ÞÕ¦ÖqN"¨£HQ×5 è÷ûívGu{½eQxZ1¢¼iŒ1+)ª¦1á“zïCâ=¯R¾‚•À.0ƒµ.ì4ÇÇÇ¿úÕ/?ýô¾w®©ëÑè¢,‹ûŸÞÿä“OfóYG$ ¶Z­ Ç6°n·»··wãÆ -­C‚BƘëׯ/‹gÏBraïýFû¥¿¹B¶ÕjÅq¨S’è‹/>ÿÉO~2N·w¶ÛíV«Ý$ú;;q))³4(Ø{b¥­ðJ„ÀRJK©wÉ{®ëƘ& EáBí²I+ñéêµÛÕK·Ijûû¥Sÿú -©¬E¹$­¢8òȨ¥NRg]1_֋B¢ÈҬ樲˜Eª -M$0’’V‡ @I¤”")IøðfIRI2c÷>ÒQœ&Ö¹ù|Á€­N‡¤ÒQ§)
-¡”TJi-·[!ÈZ×ÞÚ)ª&J’«W¯7Æ5uëtx~ñåƒÛÛ;KÓévË¢
-bhÀP% ""Ïl7Ɩeùùç_ C"™Är<:+—ó÷ß'àØ7o\óÌ»{»×¯_cöa‰/‹°0ÆÖU3O‹¥³¾,+!i±œIñÿé/º­Utrr‚k·_k­R:Ô}!§ ´“°€ƒ¥÷þÚµkY– -†çaóޝŸ›ª~ÿwâ\Ö¦X,gI¬v¶Ú_ÿà½ë{û©Ì¥ )ž×¼¯îŽ¸ê™Z”¤„ ­"ïá…m¾:Im`…ô+œàá”Ò¿ü·_ŸŽ†ÿËÿô?_~°lµZeU³… ¡µ,îr•eQe ¹}óV¯ÓÌFƒå¢«R’"'– -9D´¢Ô·Ì@mBDøܘ˜¤”‘À¦i‰<K²,A ÐZKR)­¼Àªi¼­âlooË(qÎ/—…iœ÷ žŽGçƒÁÉ`¸½˜/”R»û½§Ïo½õÖÙéÙb¹"€yÞÒQ2ŸÏÒ$ýü‹ûoÞ¹“¦ºÛmݺuçó/>¿ºÝ-L’d§¿T¸µ!øœÇÑښU)Üx3‡*ÒZÇìoݺõäñÓ “PPcÌƨlS!n&‰Ã.(„¨ªêɓ'ûûûqWumLÃeY~üÉ'ïß½sçΛeY.‹9‘ˆt”$ÙFÅi‘¼¶ö 'Ý&Œ6ïäÕdô¿mJNõ -„ûÒ#¥ ¾FÔQá݈°+rÇíVËTMSUeYnïïöw:fx|aÝV»M€‰ç…gƍA¬TˆÅjv"0ä=" ¥¤RÖ»Ê4Rë4ː(H
-Hdœ›Lfq’Ø¢˜†ú+Š" êt:Q ”qœÑ|¶Ÿõ¶['§Ï–‹Åo¼q>8MΈèË/ëÉdzûÎíùÜ<<9å¼ÕuÖÞýà.IŽbr\×M´µÝï÷§ÎƒÒqšµ¤Òa º,ËóósfnµZMÓ”›
-.\ŒÍze檪ÏNÏî~p÷÷ŸÜuÒjµF£QÇA¿$8¾„­…Ú6eA¸NA†yooo2N¦ShšæÙ³g¿úÕ¯®\ݾ~ý&3?xðeY.Ð+ԆU±2žxM'ƒœÉK¨Ç+IÒ^›8B„RFk-„r΅N× %IJ’yžWM-˜„$@l¬)‹"Š’kW¯îïí!Ãxx1ê²Üí_Wó£áY73I¤5{bdÈ^¬b ‰ƒw¢`(ˆ¤TŠêÆxæ(Ž¤RÆ;DÁ€JÅÖ»‹Ñ°¬ë7ºÝÁàâìtÐëmµZí^o ‘”R’¤÷ µ"’]½ºEÑx<ÎóÔØæ“O>RJcŸ<%"fÇì:Ý6
-B -£Hïìl -/€|õêÍ­­·nQc-r̶®ƒPÖ?üÃ?яüã|£[;ŠoΑÀu–Ÿ>{úíï|ÛZc…ºuëÖp8Ü\ÔËGU¸®ÍæWÁ]g<giÇqÒ4µm¬µeYŽ.FŸö@J½³³;NŸ5 ݗ -žyùöÚÀzé”|)È.׆dlø4­ˆ˜¦óÙüåÀJ³”Áz˜Í2ªª’$‹ãX)©¢(ªëÚŸ&(8‰Æ^<Û»Ûä­˜mp‡†ÕF!ž‚éÊ
-.$Yï,;¥•Š"¤UC›a6ŸŸœžîîícŽëÚÔu3ó¼ÅŽµŽ¢(F!¨ifÜêõ¥”Û[»u]Ïçó8ÊC#o6›Eñé§_Ë¢Ûíìlííôw[y·•w¿ñõoyÏyž«(ñ(â$åPÙ%)xÓ8綶¶ööö~ñ‹_(¥~ô£m"¤JÞûªªÂå‘RAX»vçàÙQ¿ßoµZÁŒžW'bƒk„;Q…gظÌK)'“‰Ž"ðγ÷骮<x`Œùæ·¾qçÎ[MÓ8ëÅfm“®ÁëR¥ð€°$‚êóæ@ܤáüÔùÿskçÙ!_RJ óÙìåÀ"AJ*©Dc- ¨›Æ:Ã ¢/%Q]”ιÊãÒ´ß¼­öÙüâÉd¬Úñ>Fèy=,Iøu«A!$!‰UÛAg -¢ˆ³IXö(€ÆƘñlÊq’Eqõêõ³ÓsDlšˆ•ÒeY,E’äR*I:ɶà ,ø*Ún'×k­Vª1Ƴ,
-"ÑÊ[ èöv¯7M“g:ŽcD"cmY•«Æ¾fà ×ëýõ_ÿ5"þìg?›L&?øÁò,Wkà*PÖݏ$‰³,€Ý½½ùéÏ{½Þw¿ûݟüä'¿ðÞ~é¦ -—øO›ÿFÒ:0@`IôzÓÓ³ßrÿ»ú'ßøÆ·NN몆øeªçk#cÃO¿\â½6Çÿ#+,­Ð'2Á°Ñ·¯h7ä­\HєuœÄÖ»¢ª‚;¬ËÒ;Ÿ¥);üƒKoPJ7év‚  -ÇZöwòT‚`Àƒb™z!Ð#†D³gÌI(Jiá ¶2ÁÞ7uÝÊsx~>ÈóVš¤ÌÐét•ÔBj8:<zðàA·ÛÛÝÝÕ:γNÇZi(ˊˆŒ­…ŠÒí$·ÎVuMDÆÙÆADR.ŠÂ9»X,–Ų×ÛÂÀRbDBˆ(ҋÅ"I’¿ø‹¿ðÞÿÓ?ýS·Ó½{÷®R’™Ù{")I"€@ Þ+Û[;À˜¥™µv6›Ý»wïéÓ§Ož<‘RZë€YëP0xfk¬R+âW¸öÆ€ZGÖùÚ4ì|S5Ëq f¼ýö[ßøÆ×Bµ¬áÅ|ü«"cpaÓº Šn6ª¯N°pÑðJ£ -ÀXÓÔUc ‘dö‚ˆ=›¦fï€^– ‘YžÂ XÍç¡öÖ)A$u{«MDóù¼µ·7™L–Å’ÑÖÃó¬Ìúýþ¬¿›àUÍ{1ÄX_“O¬W£XJ@d!; (4€%•T
-‘…` D”DeY¢wY¬—‹…spãÆÍÑŸª¥""‚¼õÓÉxp~2ŸF£“ù|¶½3Ï[o¿õ.‘LÓÌy@vÖԛï®iš<o10 še]ŸŸ}ôÑGÓÑÅb>ÿó?ÿñ7™1֚™a¨æœsI’üð‡?lšæW¿ük«ë×n†’Æ˞Ù;à d¢ß~󽝭½³“A–e<¸}ûöÝ»w=zÔ4 -Iå<3€cŸÅyÓ4ÈB*¹>(Åó݋¹iŒRJK퍥6ãÙîíí -χO>iå©^Á ¾ª*ôk3öð¡ÄZþ«ÚÌ/=k 6SUËÆTZÇY¡`çŒ@’l ˜W÷VžIÏhš†½WR¦IR23Ãv¿ÿÞ{ï%IR–%"~öÙg?ªª*Š¢ù|6ÃÅbñû£©¸±ÝdìDô¾ŽbM©†Ð‘`$A(X IH„bÕáwkòÉdz¢gƒQ¿ßÏóüÁ—‚Ÿ@˜33ÆÌçsiçÜh4*Šei›ºÉ³ö•+W­ud­ýÕ/1L¬µíNg±X|ï{ßët»Œ&H`8~òÉ'[öÅÅðg?û—ÿú_·³¬}y móÕommÝ»wo:~üÑGÃÁè­·ÞLÇãÉ
-EŒãxgg§×ëåyž¦ét:ýéOúçþçwîÜyðàz/¥tÞj­ú»;çççh!L;^.þy=P~¸IÌ«eQGÑñёwV*ñáw;½®Dyy»úª]góۗp9¿*(/…,„ão>ŸWUE:Žb)•sA”$„óž_•leYš$iKP‘Œu”D±>jÐU_K¬4þ˲‡Î¹V«õtQ|z>^p$TŒˆ,$Æ
-[XE‘#!HJ¥‚¿#8fë½unƒ%-õù|îœÛÙÙiš¦,‹v»– QÅd2ÕJ#bUUqwZíb¹DÀ,Ie¨C™ÏNŽ?ûôþ'ôôñ£Ï?½_.Z’$’‚””­,ßêö´Tiš\¹ºÿðá—GG‡q¬¼·Î™ -D2ôº®“$¹wïޕ+Wž={öÑG-—…”j±\ºµ_WÈG‰¥”³Ùììììììloo/p†Ó4vÎJ)nÝz£ßßöޅÑÊË\Íp1xöB-i]µ,烣££g‡Ór¡’À%üJùڗëuÈü xí“lž<‹EQÎ{)•R{®dÂå¥?I]b¥I¦Q\é̔¤ZÚé|þ›ßü&„W8¤T¼aºRvóöÁà4.£ýíLÑԊ½—N‰” aA0
-RP0¢ãPú’”:VJÇcÓë[;{Nûä䔙»Ýî*b4Íçó(V¡qýú5¢ÔÆ~I Q{/…`"ètZMS–ÅB+)UÄ̱Ò̼³µµ³µµXÌ~ðƒïÍç³ßüæß>øàƒN·[× -B°1¤P²1søì÷þìÏþõWÿöÙgŸ[ë"Òº“}¢Üßßû«¿ú«,Ë>ûì³û÷ïÿèG?zÿý÷ÏÎO÷¯ì;g¼÷7n\cupð”P¬‡2üæBPû…¨&@SÖK1·Ö4®Ù¹ÒßÞÚMQÁ¥ó—uFüå`
-·?œfʨs«F{{£(bFc]h©xÌV)ùªvƒH’$Ž¢8Žó,Ëó<I’HG±Öq‡­bCÙafæ xÊDΣñx,³í…Ì~{<üh8žÕ…fhJ_-]]²³ À‚#2 DÁÅt“$I²µµ<m•ÒívK)ÅuUœœx者 Ëz_IBŠP(©´ÔR{'عD«÷Þ~{:{k‘9]·Ý¹uóùlº·×ÿñÿãÑñáÇd­‘’<¯Ì™$ŒÖuÝjµÞÿý÷Þ{¯Óé ¢Rz³g„¯(Š¢n·{íÚµo~ó›wîÜ©ªj0|ÿûßëí·²<MÒ¸(—$Å·¿ó­7¯Gq¤µÞWx=‘¶A%V¨&ËÞ;kåòøôä|<b~úká«Ë»Î姅y›=éeX3a¤¬ßïommEQ̘‘HPXø:-]‘¥i;oµò<MÓ,M[yž& 9g‰(MÓ@ª Š±º
-ïÀ,—˃ãsˆ[&ï~1š|1V
-,yôÆ5U]MS¯òD!<{&2ˆ‚-­lÐ]·ÛmµZyž÷ûý4M˲ªëºÓi‡þ4Í‹óóó8NP`pÜßß÷k ¼sÁ«]
-¡ˆœ1ðî;ïÔeÉÞ# ”Ò+‰Ò$¹}ë¶Öúððàk_û`k«û/?ûé“'‚ÚEþ¼zJÓt¹\âÊA(%é¾Pç\UUÌ<™Lþîïþîÿñ1J©?þøË/¿¼zõê›o¾ùÖ[o„}ÿúõëaѾX/]éÖR[W%0’ãñøôüÜ]¢©ü3ñrw9€þp!ì¦B¥$‘§–µ.D•Ö‘Ò;BH©Øó«žÐ¢•¦Vžgi’D­VîıneٕþîÖVk«¿½Ýëv»ÝÎN¿ßív%
-°N I…©§ƒ¡³.ï÷Ë(ùôdüð¼Z¸¶@pԔ¢œaS2³ô¸ž†&Q”b¤€¬wŽ™”²tœf­¢œL¦UÕt:="å¬GÀù|TV³4ÕsÞÞÞi·ºÎ9ï€'Bï÷Öy[›ÊxcÙÔ¦Ú»²»,‹bnlÝ4ucë€ØÞéçyûÑÃǒÔûïÝ=;=ýò‹/¼3›ä=4ÚVô@ˆÂ{^.—Ãá`±˜Ï“ÆԌ’G½˜}ôÉ£GŽg³Ùb±øå/ùåœåïï‡ßþ֟(ŠØ¡ºÝîQžçᐢµóå&6[‘
-i¨©d˜&ƒ“Së,‡ØwÁÖõ«iBð"ñ^F]ß,sx$8ç½wD’H[ƒ¦¡ºÄÉxY×Á³¼7ˆ^FBTôª+¸Ì¢ˆ+ë:KöÎ:g”$o½·\T•SÒZëØk­{!„bäÆxÀª®¡®«ùd,VIV4öÑÈ To_Rp 8aJ»œ9R”¤‚Ø pÞyd¯™H €(Œsž!ŽR¥!¤Vº×íµZm!p2æ­HiEºªªÝþž÷`$P98À$ %‘$!¥q6måãéäéÁ³v·ç¼W*vì­ç¼ÕÙÛ½òøñ—'ǧÜýàÑÃGŸ}öé»ï¾sûöÛ¼¶ˆ6Æ\\\‘Jâ̵øæ͛ˆ8›Í˜½RÒû•oă¿øüÁÿûßÿy4…>®I)ŸÞÿìèðäÞ½{oܸýÎÛï¥IΊ4M«ªJ’$l?â/8f¶Îo­wZkg,“$FëœTj%/ÐlzÎYØs—됿šõ‡‡‘D"Á±Î…Q,X¹˜0(©e±¬ƒažÇûû¢`vHèÙ[×"i/V–9æ$€¢k§ç\UÖuÕX`>Ì# [U¦©3vYW¦ª”5†Ër8´­N¶½Õ]Õ¯ž@Ò{c»+¤©¨.¢97…yS¢lã¼%Y"RXUyž+µ<jµZÌahØ)%«ª:99‹£´,«(Ò¦qÝnÏÛ4͆_+Ċ«ÈžPI€ì¹ªêÃÃÃ?üFȗÂkµZï½÷Þ§Ÿ~|ppðýïÿÏþìÏþæoþæç?ÿùNÿ
-¢H’Ä{¿\.ÿõ_ÿ5I’÷ß}/‰µ\.•R䄈Ìî׿þÕãǏ‡ÃsçsNIhBJ=ŸÏÿîïþ®ÓéTU%¥ÜÞÞ>99ÙÝÝýýïßn·1‹ÅbÓX|uË úiˆ¼N7$‚Þ{N¼njôœz—¡Š0Êæ=#¶K3E,PGgg'³éRʽРÚЗ±išWeëåÖÖVœ¦2If³YÈ[CÒ0 IR«ÒÔeUÙºN³ =G ²$YT•ž•¶b!Ec̬,)Òq¬q§÷‹'§Sƒïïövu&}ͳ‚°…Ë©ÛŠ“´VPÖµ0Fs˜)E­f.ËRÉÈ{þlIœ`]×Wö¯4¦ †eÑX념qœY¦¡òZ8…q¢ªšÑh‚HÁ©ÛíE­µD´··ïœ¿ÿ³?üú;ï¼û§ú½ápxtttûö -e4tZ6)gäýÓ IDATV‚1¦ª*)•÷¬µdh¤â»¼ÓétÃLp¢+˲®ŒµÞsvvö·û·¿ýíowww½÷;;;yž—e™¦é¦¡ûêµÁa‡™™¹×ëµZ­p@‡1›À¯÷>”F¯©ò.'ø—·±K1ÇU¹¼”Ô[[;ZIf/I9ÎÕ¶ªFã³ßüöJãí[wwww74²׃^£ÝÐëõrçd’¬Œ™N§±¤4–¥/¼D‚H+ÕÎòëý}b8Y‚³ñ…’ oÜx<Ͳtw»_ÖõýÑ©ù›7÷û#Ѥ$çMi§V°Ó "ÉPb˜  h!bƒtqDB@‹ -¬ž4MoÞ|c<™ìö¯L§óªª£(QJ‡ePו±”RU]K©˜!0K… V«ýðÑ£§OŸîììjísÎ6ˆDBÞz㢘M—’¢ÿð'ß;;;ýâ‹/¯]»¶­õw¾ó!DSÕ!⏎Ž‰*Ï[MmÃ¥™/fO»½öù/ÿé;ßùnQÓéäøøäáǏ=<<8©ëe(Aš¦yúôé³gÏÚíöþþþ7þýßÿ½ÕjEQt9ù½|Nyv(˜…vgoook{;°¬ìÚêAðœm¼ÙŠ6ÏsùˆÜœ³—«QçMSWJ*¥È³ñã8ãfó…1åd2š/æo¾ùÆí[·Ò¸x6Œ?Ax¹þ<°¢(ÎÅƤiVj€©<`Y5Æ;_,¬s%1pG½­x.MÓj·+oKSWU-˜„Cklåê"ª³|‡eu<­àéÅû7{W{[µ«ÀוZWZÑ3:MXiÞ¢óB`à@Èm£(jËÞ%I2MªºzëÍ·÷÷¯9ç#,eÇ·nÝ"’ÆIè½öEqS7ZGÀ¸³ÓúìÙ|>7¦ Öu];ç•ÒßþöŸ!ÚíNUÕqœôzÛÕgŸEÑn·7'²÷¾©êÊ”e¹\.sIGQ2™N|Y–'§‡w?ø×oìø8ÖD="am³\Îçó¢ª 37M†½§þñãÇ~øáÖÖÖl6  F€Ý_º<ô›eæV»%¥DX̓a•™ ÚDË«çéåMksÃ0óì‹b':oeZ+çØZWVÅl6³¶Éó–ŽnK©¯^½’g[¦q›" ”ó(èµ#BÝ&é‚L[žçŒÂø¹TŠÖ¼?ç¬Öq]׏=*ˆ]˜ê•s>"À@$%””Èò-8_ŒÇŸ?{÷ö›W·Z¶Ž¸j\9ijC;]ê(«ŠÈ¯•3Â; “ÖAxïÛínæ¬s^)¥d”$éï~÷ñ•+W>øàtÖzÔ`Ô׿þwªwƒš£µîÝwÞÛÚÚ¾ruÿâ⢪L¯×Õ(<{v¦ÙíÛwŒqMcºÝÞðà ÷ªý`öt2úý~Ó4“ÉÄé6ç…fèõ:~ýƒ^¯Ó˜Úk•Š:Ýöövo0ÍgEY–pi‡Ã¡ÖúîÝ»?ÿùÏ{¹K³¹ÃÞ㪿Ëy–{ï­5¬žO­6*| -¼þêÅ~ýO˜›¦év{i3{"
-žiw»4͊etýZÚjušÚ#BHݚƒˆ¦iì«ì%¥÷>‘£¨AÄv[, f_šZ”¤‘ã”4Íçށµà.ŠÉ¢X
-ãg‰‚•’¬k’4ÎsM`PãV¯§¢þà´þݳ¦b÷A©Š¬kj¬&p65ót¯Fíd¹G žµX±SÐ9Ȉž™{[[Bc¬s†£ñd:Û»òV§»]WµTêøøäþýûúÝ?ýðÃCîrpppÿþýo}ë[W®\D<|òäé½{÷Ò$6¦Ñ$÷vv­µÎº$I˜YéhÿJ ‘
-D"%%×U(„ŠtÖÊÓ<GãÉx:#²g„Ûo½wý·vQÌ˲`öe5“´:i2ŠÊj!8ãWƒëº~øða°ä¬ªj#”â8ÀiÎ9&,êJÆ*înõ®Ý¼$9k­@Ð2*KÛ4ŽµQZíV»i¬$éü>xŽ£nK: î|p®‚Þ)f?™ŒóE'y«+I6Æ9ïÉpX‡ìƒì»@ÏÞ5 ¤æúj²$É
-Ò8êVÈ ÎykBfMQ,­3 PÖÒ9S¥"RIã­sN¡dYJc­|˜HÂjÆŠºð#×Î[ý«7ËÅò‹'ÃJ-o߸²ÓÉ0× i7ܔ†ŠN´»—uw ”¯-£RJ%Á{¶×¶š/A!Hk(Þ~û$I¬õ‚¤”*I’,Ëx±XÄq콪“ɤÛí¥*ÚêmUei­”D„Všóëß0Æ䝶6ֆ)¥4Óc%ÉV«ôæ‹ùl6;???=;›Œ'ì\½t¬Þ}ÿîöÎ~]Þ6Ëb9NÙ±Sš½óÆy'XXð€ P`S7ƒÁ `ÂËuç1D@ØÂ6™D±Ž5 Dqűuîðè¨Ì;ý~_JÕË ÖzÖ¸j±(’4õÞecç™ùá«`f#„0MžÝxrqzz²ÕÛ1n6›9k[íN’¤UÕ9ĕÁCPf!„ó.”VZkg¹,ªW›Ð+ùT†$¤`´¶¡:²¦1‚H’,”òαçM­€‰8ŽGËÂXk­ÓR.,T¦Iâx¾XÌg³þN?Ï҅m¾Çίo·nö;½¸ã\%L%še±<ŽâN¿ÓÛïtv(îºÕð…"R¡Ani‘dd{{[ª>ÂÌý~?xÇÛ&´â«N§sïÞ=(˂Hîïïïîînr¸¢(¥Rq–:`c¬Ä´–5 ݅F„цû÷ïþùçÇÇÇË刈„<o½ûNç¬*=‚qn¾\VuI˦®MíH‘·>8œ
-¡”šN§“ɤÓé„Sòèè(Œ'l& ”VÆÏ^HêAc 3Αs\• -±WËb9¼8žNg{{WHHcÄÕ Xy̬X_ˆÇQ¨“f³ùd<îtÚ»»»‚èâ⢮ë~¿Ÿ$IÓØÍÐDx3aç z»P–eQ̼˜“éäU„V*¥P¬Ô¸ÃŠ ORVÖ6u½Þ<)”!:Šqó½7MÇ1˜¦ qŠ!=òÂ8W™º\ιý½ý¤Ó£´3¾,.–ÅÕN²·•o©HÕUäëeuîÌl±ÈIw?Ê»qšGi†$õ>V¤@1³$HA¬6d­u»ÝŽãèh8F½^/À•»»»D²,Ë8ŽÃ’X©ŸjY諸öÀ$€„aô>à ƒÁàäää÷÷?~öìÙÁÁÁl6 lOӘG˜C†D$¼CfDË岪 çŒ Ñêæžíb²`tŽQ€°µ‰âx±XœœœÜ¸qãêÕ«aß
-̎ -&.¥dDç\’%ýÝ~p–ÜÝÛS¬«¦Ñ*ÎÛ=f6Ɲýþ÷¿wŽ¿ño§IìÍÄڒfÓ¡
-™tUՀÌ̋ެª<υÒDÞîæ€8[E! \®ªªºQÅ`08??Çÿ=›.ø蕪ˆÁós`,&* –¬¼ö½D€`­ -Y¬$‰Q‰èŒ -ÒWÞùƚf¹lêZJR.Ë¢¶NeVϕÉÑàøxxqcÙ³Ÿí¨˜˜ yh–óårîƒ(iõvö:;ûI«‡*AM픒a»
-m`tÞ®¬×Z ‘Ö£Ñh2™Ü¾}ûÁƒ÷îÝëõ¶¼¯.ÖñBcokãØë$RڀZ眛L&Ÿ|òÉÇóÅ‡¥o­õìÙs¸tÞ¹º®‰H-ÊbQ Ð#̖ ­(ʒ —EŠ;ŽäêdÇÞûápØjµB.,VÚ|Ö{ï¼#)A)DZuöøøx>µ³ŽV‘Vq§ÓãTE2k¥aÒ?¬1"DØpÓ,Â5IßyG$'“ñãǏNNø¸r9öìÁ9[%0xã–Ëåt:Çãñx±X‘° Ø"ç µlš4é¾Xa»“ò9±âcÕÆxç WiBje½ %@ ÍYk+fç9Žc53{öu]Of3­2BB‘u®jfÊÖ­4•J&ÝíÙT|z:9Ïov³½Vk;I$8ï+džͲ\LÊÉàüø él%íí8m%N·Û“J:ëCÛYÎîÍ*gæÍH®÷¾(ŠgϞ -‡Ã^o+ÀE¼žÁ""@€‚= Œ’¸¬ëÅb1¿/F'''ÇÇÇGGGMÓX·ò ì4ˆtdØxvž½µn4yï‰Ú4EYÖuˆÎûªq΁ŠTœF2’Ö:Î[šaq£Ã`7 ¡­¤"É5‡…°aŒ.†¦®´Žœõvw{»åÊÕN+ïv»ÏžZkIX\É¢ãŽßœEEQ´Ú­ÙlòÑGýâ?^œ3sÒÞyóÎ’r6Î‹ñhT•¥­Íx<¾¸¸˜N§
-l%¾4m†ˆ+ pz EDH@/– ¬1á¾g–J¢¶~%“¿9¹ç(•R,جmšHÉpT8f ŒàÉ.«em={2ïú(•åä¸èâòf;½½×É2%ف1lmU-çÓÉùى£HëÎÎîþ•½½ý^w«Óé‘5^G:€›åND7oތã8lÔ×®]Ûß¿’†Ml9ÏRGƚñlztvúäɓÇOŸ>=/‚°Œ[“q-l!„ÐZ{ïuJ)cÙ;_ÕÕÉÉIQEœ$ p±\6¦qÞ-3ç!M[B’RjÁCÌy^33C$ÈqÓÔ ˆ—sÎ׫=<:|røä?úþ;ï¼å]U•USÅóå(žÈþvÇ{? êºVR—e‰(´RJª -m׃Fpÿþýÿþßúôécç÷î¿ýÿíΝ;0NCÏÀ4 -8¶¥ð ›mO¬guVÇ«wDôO蕆©µ~í„J(¬s(ê,K=
-R¨BӜp °qÉXƒÚK%Ó<3Aˆh¨ê’P`–„ˆ¥r ‚k°ìàb4@Iy»‰H¶ZE]|r1?m\¿×jçI u¤<HƪĦ¶°Ö\ N&O¿x’¤QÚj÷ú[;»y»w¶‰„RZk¥µV(¼qZë›7o6Móµ¯}íʕ+{{{iž¦ŽŒ1MSc˪,Šr¹,çƒÃ£Ã³³³‹‹‹ÅrIì|¨pQŽ›Ö‘ -]í4É$Ž­1uݔeÈ)É;_•UY–­V¯cL§ê4aÁŽXÅ©ŠbŠ£vUÔÃӉášY"¬.Ø|ºÌòƒµ› 5npv‘¥™±æŸþï~üæ³o~û[·nÝi·ÛíNg<>yz’µ{Ýíñ|抲h·Ú¥W¾âHGyž¼¨§¦ôsøÙÏ~ñӟþôÑ£g¡y`Œg(?ûøþMA=†ˆÂx;3³c€k®£¤Ê4¯:Ø=7s „$
-¥£V*Ž"ï= ‰Š cm]×À¬¥,ËR
-êšO§°sˆb!­4ÓZ"x&!ÀÏ/æЋ\ÍèN«—Dqkw:Ÿœ™–¦D©XS¬QÊh- nS•uU -‡?ö PÈÒ£’rãޛ$‰Ò:‰’° -„p>Ÿúùç³bZU“ɤ(Šåri­c†PÕú€r΂VZÑ 锐‘RJ+ëH+].–ÖxÆ9ÇÈW®íßýàn»Ý6Y.ç‘Ö[[ÛóùT’Ò³4Ó±² -KŠ¼÷l½"åÁ¯mŸâ/¡—›t¬±UUyïëªþÝï>ú×û÷^¯wãƍþð‡{{{eYi-«ºžÍç_~ùežçƒÁ`±X GD±³³³½½MDEQEñùïF#cÌz—ι•A†/n¢ֈ¾¼¶§|ñÆpÖ~XáŸçGææ¿W/%VT]Bi]Uu¥t¤õBiÂh½Ílk£V2Î
-I)bàsRÇRp¾1&°äŒ1X×ÞÕ¶¶I¬w{´Õ2ŠØÙژ²¶¾¬ª8ÒJx#00dô–gŒ¢ªÝræΟwк•Ÿ{Àˆ›¦qìA®L÷6Œ^ç6*°&”öÞ3
-ˆ¤’(QRfÝ.!5u-Ù²oŒu«$Á#¢iÌx<N’”¹1ƚš‡çãó³Ñx4õ$©•wˆeÅÕ¢6MõU6¸¯\29®÷¾®ëUœ$ççÃáùÙYw7˲½ÝÅröìÙ³‹áŸž]\\xÀ$Iƒh÷~¹\4Mcµiš@ÖÝäõ_Ù¼&¾Ú,ºü0±RÎ}%°6ºÙœŸÇì%,DiT*AVGœ7²)=7í: óe)%¶³|UÚHł²4Ýîvcóóù<”Wá=I)ÙÛÉdIàÓ$Q:ӊ< u¼\ÎG£ ·\(IÈ~+d'eðŒ‡(ÐðŽïE8þ1ø›·Ö+;­_K„v)â†ô›8(3si")¥l·[JiÅeQ,–E]TÀZ&© ®ÃözˆÖZ%ÅéÉÁ¯ýë³Ó³ápXVe]׎Pô:ÍÞÎ^+ÍMe—~a_±æþªÐ
-—Ö¯}(C&…@AƘÃgOŸÅqœeI]WÖ­¦ëªöÞ )Ëe1äA¹X:ï—Ëe]×äå:q=›‹þR ]~ÀWŖs6؂¾X/=i8D‚> ®Ä/@ ()%Õ„d­ -hnY–•ßñÞ¹))°Þy/Zí²©‘YÄ12ÄJ! w^K ˆ>h;)E‘`´uÍΕU½¨ê8ŽRE2BŠ­¯ÊÂyç­.w6֘¥
-™¼ó$H±Þyr.°a‡RÈx0èM*ã½Çà‡à}€å²,#¢$˴֝N7äÎDTUÕp8*Šbx1vÆ&Q$¤Š$•B@.Šb413€_œ>yøèìtä,£`$5֍‡Wy­µ©jo›K)ʺ…~ó梀”IÓ4¦nÒ4a†¦¬lӏï<H!…1f>›Ycˆ(Œ7·ãuCúÛ7a´ †Ë—´Þ¤@×ø×ô
-_xÐzß ‰a*Ìp…V¼RJI) -Ba­‘(„óUUY¥Qpž‘Â$mU c#­Ë¢ðÞGq$¼ÔQ„γ1iI¥¢$Ëò–u—EY–K¤ 0KŽeYT}M䛪©kBôÖxc™YH)‰4¡7›EÒ,ã,H
-xúÇ
-*#!þÚíööövEY«€RªÉtrqq¾X.†ƒÁ¢® išXGQ;ç¼µ:Š–å2´"ö÷÷÷ööêjî\mšÒ$-˅÷ŽHˆ¬oóe¬8ÿh—MŸ`s*%I|óÆͪªŽÃ" ‡¸¶Æ€–S”õ`±Ö;G(@€àÕ!΢_Þ¢^>µ^Ô[{9°.EÞWÖåØ
-#äÂ{@ç°t$@h©5ɊÊH*%=ÆP9#"³ŸÏæƚ¤MF“¦iØ9‰B VP1sÀúk|Uc")“$öž¥RÛÛÛW®]wÞ[S?yúøøpà­SRDŠZ­¨LfQ–DÝ<×ÔÅØ/–‹Æ®*g-1I Š"ˆÆÏ,µ@É%Q’¤Q¤QI¥£HG10kò,ït;RÊÆòl>/Šâôôô|0@€ÅbR
-
-KJ‘V ‡èRJ5¦©ë¦,«Å|ÑԋýÝÝXǦžKdg|”hc=Æ:µ¶6֒ç, Úؾ_>høpÌvÞ¬ï}S׃!I2uÃkíg@‚HFg¬”Òz¸bÍӄ5À 5%ç,âªÊ¹|d1û Ì̛xXYÕû—Ú‚ˆ$åkà†W#qõˆ="H” ¢"éœÓRZk#‰º®%°„Ž×¤"ªMS[µ“d™窪¢X–e¹Á™âڈÂJ¥£‹ÊÛ‘H¦¬b­½u£óticL½X´ãt:Ž'S­õrQsb{;•Ûqwwvœs~ÐF€$I‚ -²m¬•R–uåVUå›)-•j·ÚQ¤…”äIÖ͝ÍæÅÂøᢐRÚ:ð^œcX֕Š"™gf¾D’H*¦m“8BoíhÄ—Óòû_ÿ÷ÿóöÿÕnåÓñÅáё5FªQèq¡Ò–R%‰@ PJ
-ĺnš¦A„«³{uˆ3WÍjxy}’0OÆ#@Ɓ¸¢0{ör8灐”fk]@øœ³èXJU75H¥B)¬©PÂ?—@F
-QUÕIš\½vSFéùÅÐcœ%%‘Hz¶ŽµzÕú«o4Œ×sþzmmÐá0OY’åyU׍1Y™fij¬5Î6MSEUU€˜Ä±âyí¢4qö‚A‰bi4M3™LœsuUm:Ù~m=åœ 
-áՃštȍB;<ônó<ˆ¼qVi-K]šÚZ+”–J1³ÎSAb6›5sSÕMQÕ'''“É$Ïóv»çy¬4¬›k!?óë~Q˜~ tx)„t”ÄUY!QQ÷?ýTjÉàm0åöÎ tΑµ"” D…pÆTÆ-Ë®Z.hT*ô§Ù{ï1Ø;ÖXöì™b'i•}°óÜø-‚„ $ë=8ög½±5¬'ʄøÿÚ»¶æ6®äÜ}®s@”hɖwµãT’ÿÿòd«¶R›ÝTù¶²E"qË¹ôé<4K+×®í*å%쁃™ž>}º¿þ>e) ŒEÄRf¢£Îçs‚uŒQ1j­÷‘Q窺FÄ\(Q.œsQGößëXçØxi¥ÅJcNÀ’låÃA²ÚL102„C¯ŒÅªÖŒ€0ŸÍWMº_o6Zëù|>æ8Æ ¡mÀ(í­«¼×§Â‡ÖZž$g䅔*¤fRêû^[,ËåÒhm£ÖÆÚûõÃêþÍ8ŽÖ{ùŸŒ½ŒÂ2ǐ¤>D'8e¯Öš¦i çlœ“© -y–ˆH!Ô]»¼¾ÚívÆØ¡?pa´šµò¨P$ƒrNµ«Úº‘Œgyy9ŸÍbŠ÷«»»»»qô ýg­¹¾º–“ìg‰Ê~¿ËP´ÒTˆ 7M³¼\6uS2ňÊz½îûƒTõg³®ëf2‡ˆ1¦ín›(mX`ûWWWõ Ã0®×ë£uN8Ê{úróùüâ₨h­›®#€D9 ÃJ&Òå ù ÞÅPqž\ðĔ"Ÿ];ídЌƒÒ@%¥„ÄÊ13C¦TQI9£RUUÍf3—+΄Ä\
-2+PxÊ%ōªª$‰ Á¸
-(Oê:ÌÜ÷½t-÷û}]×uUMÃX55 R¦c{ ‘ªªŠ9'"böÞOý4 ƒÌ#œ܄pr,W×ͦXŠ3FI›åxÑK©g]f”•RŽ éÊ# ²ÆkÎë梛IÂþôéÓår9cÊe?ŽÈHäàb­»¼z
-•¨+ŽãbfJÆ ¬”êÝü¢ò•V*¦cìCcRJ)kªn~ýÑ -¢J)CL)#Žãh­EÀ)LUU-¯ž4uCOº»{s˜&´N)ÌÆZD”¥ÙKD¨ÔÕӏn>º!¢œÉ;™¨hkµÑ‘ˆJÑJUû~®cÁ[ """©è—·”òjë-j£”QÊëuÆxc¦qªŒ˜^Ή@å=1‡œë¦q\J"U€R"cKÊÖZý#ú@I€•È/0è³0•,ÇçY¼s}Öu%kfÎ)9ï‹•BDu]_ÌÞؔPáLÖuSëÓ ‰lY„m £sŸ§i2æ¸è«ÓkÎ 4FÊS Jk팓 3€ÖÆ9Dž§IÇGh×4M»Ý®ïûÛÛÛC?C. „À)—˜§!„¦nXèË -BJÆû0R¦ ¼¯›¦3ÆDeÏ… +]sá\˜Q+¥
-(¥°nÜl¶˜¦¸ÛŒÑÎù®›Ïf   -`¦2†˜ (csJ…Ùx­´NãTJÑÖ”rD?*ÔÊ(£Â"ˆZ¡Â AfåÜßßþ -ߒR™:E²·¼M±s&£töTyïŒ5ÚTÖ ë¤tsSʃ³zè'J`UÈ)OQN!@á4…¦i¼s}ßK=°ë:ɮ伅ÓA•èÀäœÛ¶`¤¬1ź©1¦dY,»ýžbjsŒ¹µR–X§€Ã0 û}UUhÛ¶q2MUŒ6UU×1fCܶíYÀ{Ÿ)÷aâ” jNûž *¯ -hàœ¡”œ3(4֚BŒ(÷ã°0ÊûætUKŒq½Ù,s`æ¦iš¦yùê‡ívk­/uÓçŒrޏ”RÀ” -tFWÎ{Ÿ P)¾®®ž>ÉDQƊf³‹å²ªë¢¬€Ãz=æV3"¢Ñˆ`uA«5S{Uì4MŨŒÇþ (F+­˜˜„C)­š•äg9œË¢T¯e'Éj0ÖXkR¡:'o¬¯\NGÕ²C¡BDZ™ºu6ª¢9å:禙¦‰bžÜÐÔuåýUÒum]W¢VÅ ¢L$ȍcc¶Þëœs9¥œ30Îi¥6 /——¹‰—í §)ØÊmµ6%R±B|ëg"mM)%)¥…Ãb1Ÿç1Tþ¤r€(4¤ë‡uˆÉUøªVFã,”\´ÒušWEkƒJ£Ò 4Þym¬µ€cL)&kínì实cˆã8 {"[  WIDATÑm×þ¶rëõÆhÝv¬8Zkmt]×µó@e»Ý†ú0)k³ùr¾xPfLµº\\|úü“Ý~7ôƒ1ÚZg­­Ú¦jêÃá0 -£wžrVZf£µPYZçXTÙ´–ڐµ&§,ÒmˆÈTŠC ÌFëÊÙòSˆæm¿ùûq D¡0¥µUb)Å¢A:¥Œ`µQ9goMålJ•À6µµ1F¬ñR: ÑÅàlpvGï´ÖÚ{g­.Dr ?ùø"ö}¿ÝbLÎ9Ñüˆ1¾zõ* ®r¾˜ÍçÝ,§´º}ZÍ®¯=êyÕB)÷û -£.…–Ý•Úl6©PŠ¡h½ÐîŸ綇ýÝúÁ¶­­ªfÞÝÜ|”BØn·Ò¡»¾X.‹£Ü?fnÛVŸ‡¾'FTà*ÿ鳏=èïøa7¨•º¹~2kÛû»7Ê(ëk¥Ô‹§c¶Ûía˜èáAkýüù󋋋iš¾ýöÛRÊ.MŨ/^è¯n_M%çR../¿øòK­µ sêº*‰ÆðüÙ³ùâŸV«×www~õ6êÉÅå—Ï?Ý.®¶¿Y¯rÿõ‹/ç‹Åý›{Q:ô‡Ënþù?~q?«›®mÿûOB­r)‚€ª®û¾1
-Ï㔡’¼5Œ¨µvÖƼ6Ã0 ³õõ>é½&ÕύXï¸×»2ÝREê%ÆÖJòn}ÖB.E;ctÖc¬1!„˜RJ)Ä¿`öM+­†®ënnnªª†áÕíªïa jšæp8ÄõRŒÿð›ß>½¾æÂw­nW¯}]]´Ýož}Œ óõ}þö«Ãþpss#÷›õêþMÊùæÙó'—Wßß¾:üþ÷E#)¾þèæ“O>Ѩöû}ß÷›Íf¾X¼øôÓRÊjµÚn6ã45MsuuõäéӘҫû»ûý¶éÚÏ>ûìæâry¹üúûï§a$¢Ÿ¾øü³ßýðòåv¿-\J)ϟ?ŸÏç/_¾Ül6BÖ4͋/f³ÙÓ§OW«Õ}ý?ˆXUՓ‹Ë¦mï÷Û7÷Ì|yy9ŸÏEc,„°Ýn¶Ãa»Ûm†Ãï>ÿœ­Þ ‡Cß3Â7ß}Û)k#U°À4M?ÜÞƜµÑ®ò‰ò0Ž1„¯¾úêaýЏc˜BÎy짦mNg”³<WÀœb¢“Øq)$€lÙëè“nÀO°Íü2Çz;°ýØ[TÇÈó8ÖDÙë¬Ë9e*\åcªœ÷ÖUօ3嘳èGȈmŒQÒjéa;ÖWWWÖ:©/țóù|‚mŒãþ°õV×U=_tSvÓ¦0MSí«ªªJáÝ~¿Z­ÔIù²ïûÍv{èwO®}ßS¬\¦qõænáê®nd/9Ž£Rj»Ý6Mc­­êzœ¦û‡*EàóM]¯ûý~¿ùýË2ق -ÜÃðõW_SÌF)kl.™™ʲÝneúcš¦ï¾û.¥ôìÙ³ív»Z­J)¯^½úÃþð鳏}割ô¤^¿~-Û^¥Tß÷›í«×·ýÐÿp·z¹º­«úööUÈIkóÇ?þñõ7ñuÕ\]´WKx½Zݾ¾˜aŒQiý§?ÿy½Ýl¶iÈ‘V:Œ“RX
-#¢mo€Â Ò¡/åHYXŽX1!y”B@kø½Õð—ñÇ¿mç?$>ê#œQ—R‰)"‰žr¦L9S)1QÊI¥B1§)„‚œ±øÖq†ˆ'´nˆy'8•ZÊy(qFι²N˜Œ ð˜²lŒ»¾¼JPþí÷ÿ¾^o–Ý •ÚívÛÃ~ S.E{çj_J™¦i>›ç”b‹ºuÆ€ðÚ;ç.BËÁ¥<<¬Ö”³lbtåú‡i¬´]6³q)m¬1J@u±¼hºF™y³Ùô}/Å^Dìº.„ððæ -·^Ì}ÝXoí./ÚùL
-rU¼ê͛7Ûýî0MÓÈb]×1FÑѵ ¬R™¨j››ŸÀ¶n¬µ’•Ê…ýËW_'§CPÖk•V›ûuå=†º®C¨5)@€«åòæê ­aß÷«Õj°ÖŽãH)×]»¸Z~ûÿù¶{üâ¥ðG—<wàXG=ï•RF*C†Žƒ1¥CDÎ眫|•)g¢”SŠ)ÆS$¢B4¥OØꔒ€ÁÀLnR¡ifF›aШ(§’õN…ˆ™Â0…çÕjµÛí8¦œó8M„l¬ÅRåÝ.hÀÊúeݶ—M¿?l»Ýn7M“¨âh­×»í0 ÖZ`î‡A)å¬UZPÚZÅÇ2Û4G²Ö’€yÖ´Z©õ›ûa”VZë3Û¢TAe{;HKÞûv6‹Z&ºó>D"z8쪶É!úª’N³÷>çlµ¹š/q"NTòr `”Fk•5…Ëv»Ýí÷gš‚3P½”R×ÍÜ»ãaè§CŒuÛ8k«ª’8}\ˆ
-å°~X§)¤˜€9B­ëº¾¾¾†ÓÜpèA¸I~½c£ÔÛk¢B<÷**BRJ1þƌÖY"2†‰È[9],¥HWV¨išäd.S ò»Ä0D¬]<”ù÷âQ+]{g¤õA…]H˜©Ô±mZ]²1všÂhFç}Û¶¬° „‘²[R6…=êÖxßÀö°2µ˜ó8 *•âÍ1„ååeݶZ©Z[Ò¸î÷! Š™¤! âŒ‘^…¸Žd$²#M‡s Aî(ÔVDVY˜¦)ä”Æi¶XH K:V,%§}œÆép8(4Úsˆ¡EÊpÿð •jÚÆûª®«®ëè0çbJó‹Å~ÞÜ¿¡L
-‘Ë‘–)Řb4Î)£´R…Š¬0ÀÌuÛ
-94žFjS‘Hh›~½c+üæëˆå@ÐJ1¢bf.(<M¥¨B\ ‘¡BÎY*”sN9KF坕ðNÀ>º˜"paÁ—‚½Råe¡L¹NH…Èji PI)7uÙƒÖz®pÑ4C×µm{œ©¢Ni§´Rj*ã°?|óÕב g£
-S!N¢a]röÆ**Üøª2 …)E&1C"ßTÄSÌ\œsZÙB¡l¼uóNJe璲TéÚ¶µÖî÷{YY8$Ð &*!gm5tÝl¹XXk°PÑFk……¡nëë©öŒz¦Â¬0§$i“ÕÚûŠ*ïçó¹HH ¢F…ÐJ)µ¼X pLéaQÄZ °2† ‘$¢ ±
- mº'W×]Û Œ)%asùkÈïÛþõ;p¦X<NžvŽ"q ;I$Ióu)%-\$2Bj´òΓ3„L$+ ÈÌ$3ä||“O`½TˆÞÒN’,óÄ¯Æ¯UeCë2 RR€J)ÊÔ -\«RÊéŠrÎ1ÊßJEÞra§ôl6«}Å̍¯¦iJ1©\lAgÌ0M l”BYF
-5]×u]Û´Z))ážÁr&Î9av•Õ97ŽcˆÑZ›J®”­½Ÿ5í¼›ÃöÑç5'Èh¿´Wü€ã0ŘSJµ1Òó¥ àb6_Ìғ@Ä$’àÌclÛöúòj‡ínZ•BVäì!"K‘$—”ÖmÛ¶uÌ)FYЭ6ƒbÄþ—:Ößp¸wÃØ[Ð.é-ËÈȞâÜ«9cˆåe"’éÅóD”ó‘*ø] ¼ oíà-%Y¡â¦ íŽ3¬ôü¯ä˜º®Q–¤üVh‘tû<E}†n øìüÅѝµF듚œòÞw]§På”díÆÓìx9qC2³vNí©!çvyu¥ùH"tg9gã à±¥&€‹ÅbŒ1î%o¦¤œó|qqæ‹;‚ËOB½rNºiI0Ž3g§ -¾´Þåß6M³X,d+pÞT‰KåœÊ{[À_¿+üö“ŸõWoòQððôãÇßO«í{/ßyó=Ǒr†SŸà§¿¯èŶó„F:?#ü6¨ò<©‚ïLœ‘DAðxBP1%«Þ~‰ˆò›<RçKq<IÄ÷iòÎ-ç|úD\|.¾G‹…€|¢P8^)|粋Àýû__Îô!~‹s›OW p91L^-—ïœãÿ¥c=ÚÿûÛ2=öh¿ÒëÑ>ˆ=:Ö£}{t¬Gû öèXöAìѱíƒØ£c=Ú±GÇz´bŽõhÄëÑ>ˆý/”Au•ËF¶•IEND®B`‚
\ No newline at end of file
Index: rel_1_2/mesaref/mesaref.c
===================================================================
--- rel_1_2/mesaref/mesaref.c (revision 1198)
+++ rel_1_2/mesaref/mesaref.c (nonexistent)
@@ -1,524 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Giacomo Guidi <giacomo@gandalf.sssup.it>
- *
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-#include <drivers/vga.h>
-#include <drivers/keyb.h>
-
-#include <GL/osmesa.h>
-#include <GL/glut.h>
-#include <png.h>
-
-#include <math.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <kernel/log.h>
-#include <kernel/kern.h>
-
-#include <stdio.h>
-
-#ifndef M_PI
-#define M_PI 3.14159265
-#endif
-
-#define WIDTH 640
-#define HEIGHT 480
-#define BYTES_PP 2 //BytesPerPixel
-#define INITSTR G640x480x64K //SVGAlib standard mode definitions
-#define CARD VESA //Video driver
-
-#define DEG2RAD (3.14159/180.0)
-
-static GLint ImgWidth = 0, ImgHeight = 0;
-static GLenum ImgFormat = 0;
-static GLubyte *Image = NULL;
-
-#define MAX_OBJECTS 2
-static GLint table_list;
-static GLint objects_list[MAX_OBJECTS];
-
-static GLfloat xrot, yrot;
-static GLfloat spin;
-
-OSMesaContext ctx;
-
-unsigned char *rgb_565_buf = NULL; //RGB 16 bpp Buffer
-unsigned char *video_buf = NULL; //Video Buffer
-
-unsigned long int VMEMLONG = WIDTH * HEIGHT * BYTES_PP / 4; // Used by copy_videomem_16to16
-unsigned long int RGB565MEM = WIDTH * HEIGHT * BYTES_PP; // Total video mem
-
-unsigned long int PERIOD_REFRESH = 150000;
-unsigned long int PERIOD_DISEGNA = 150000;
-
-unsigned long int WCET_REFRESH, WCET_DISEGNA;
-
-TASK refesh(void);
-TASK disegna(void);
-
-PID refresh_PID, disegna_PID;
-
-void read_png_file(char *file_name, GLubyte **buffer, GLint *width, GLint *height, png_byte *color_type)
-{
-
- int y;
- png_byte bit_depth;
-
- png_structp png_ptr;
- png_infop info_ptr;
- int number_of_passes;
- png_bytep * row_pointers;
-
- char header[8]; // 8 is the maximum size that can be checked
-
- /* open file and test for it being a png */
- FILE *fp = fopen(file_name, "rb");
- if (!fp) {
- cprintf("[read_png_file] File %s could not be opened for reading\n", file_name);
- sys_end();
- }
- fread(header, 1, 8, fp);
-
- if (png_sig_cmp(header, 0, 8))
- cprintf("[read_png_file] File %s is not recognized as a PNG file\n", file_name);
-
- /* initialize stuff */
-
- png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
-
- if (!png_ptr)
- cprintf("[read_png_file] png_create_read_struct failed\n");
-
- info_ptr = png_create_info_struct(png_ptr);
- if (!info_ptr)
- cprintf("[read_png_file] png_create_info_struct failed\n");
-
- png_init_io(png_ptr, fp);
- png_set_sig_bytes(png_ptr, 8);
-
- png_read_info(png_ptr, info_ptr);
-
- *width = info_ptr->width;
- *height = info_ptr->height;
- *color_type = info_ptr->color_type;
- bit_depth = info_ptr->bit_depth;
-
- number_of_passes = png_set_interlace_handling(png_ptr);
-
- cprintf("Open PNG W: %d H: %d CT: %d BD: %d\n",*width,*height,*color_type,bit_depth);
-
- png_read_update_info(png_ptr, info_ptr);
-
- row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * info_ptr->height);
- for (y=0; y<info_ptr->height; y++)
- row_pointers[y] = (png_byte*) malloc(info_ptr->rowbytes);
-
- png_read_image(png_ptr, row_pointers);
-
- if(info_ptr->color_type == PNG_COLOR_TYPE_RGB) {
- *buffer = malloc(info_ptr->height * info_ptr->rowbytes);
- for(y=0; y<info_ptr->height; y++)
- memcpy(*buffer+y*info_ptr->rowbytes,row_pointers[y],info_ptr->rowbytes);
- }
-
- fclose(fp);
-
-}
-
-static void make_table( void )
-{
- static GLfloat table_mat[] = { 1.0, 1.0, 1.0, 0.6 };
- static GLfloat gray[] = { 0.4, 0.4, 0.4, 1.0 };
-
- table_list = glGenLists(1);
- glNewList( table_list, GL_COMPILE );
-
- /* load table's texture */
- glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, table_mat );
-/* glMaterialfv( GL_FRONT, GL_EMISSION, gray );*/
- glMaterialfv( GL_FRONT, GL_DIFFUSE, table_mat );
- glMaterialfv( GL_FRONT, GL_AMBIENT, gray );
-
- /* draw textured square for the table */
- glPushMatrix();
- glScalef( 4.0, 4.0, 4.0 );
- glBegin( GL_POLYGON );
- glNormal3f( 0.0, 1.0, 0.0 );
- glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, 0.0, -1.0 );
- glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 1.0 );
- glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0, 0.0, 1.0 );
- glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0, 0.0, -1.0 );
- glEnd();
- glPopMatrix();
-
- glDisable( GL_TEXTURE_2D );
-
- glEndList();
-}
-
-
-static void make_objects( void )
-{
- GLUquadricObj *q;
-
- static GLfloat cyan[] = { 0.0, 1.0, 1.0, 1.0 };
- static GLfloat green[] = { 0.2, 1.0, 0.2, 1.0 };
- static GLfloat black[] = { 0.0, 0.0, 0.0, 0.0 };
-
- q = gluNewQuadric();
- gluQuadricDrawStyle( q, GLU_FILL );
- gluQuadricNormals( q, GLU_SMOOTH );
-
- objects_list[0] = glGenLists(1);
- glNewList( objects_list[0], GL_COMPILE );
- glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cyan );
- glMaterialfv( GL_FRONT, GL_EMISSION, black );
- gluCylinder( q, 0.5, 0.5, 1.0, 15, 1 );
- glEndList();
-
- objects_list[1] = glGenLists(1);
- glNewList( objects_list[1], GL_COMPILE );
- glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green );
- glMaterialfv( GL_FRONT, GL_EMISSION, black );
- gluCylinder( q, 1.5, 0.0, 2.5, 15, 1 );
- glEndList();
-}
-
-static void gl_init( void )
-{
- png_byte img_color;
-
- GLfloat yAspect = 2.5;
- GLfloat xAspect = yAspect * (float) WIDTH / (float) HEIGHT;
-
- //Create the OSMesa Context
- ctx = OSMesaCreateContext(OSMESA_RGB_565, NULL);
-
- //Make Current Context
- OSMesaMakeCurrent(ctx, rgb_565_buf, GL_UNSIGNED_SHORT_5_6_5, WIDTH, HEIGHT);
-
- read_png_file("test.png",&Image,&ImgWidth,&ImgHeight,&img_color);
- if (img_color == PNG_COLOR_TYPE_RGB && Image != NULL)
- ImgFormat = GL_RGB;
- else {
- cprintf("Texture Load Falied !!\n");
- sys_end();
- }
-
- make_table();
- make_objects();
-
- gluBuild2DMipmaps(GL_TEXTURE_2D, 3, ImgWidth, ImgHeight,
- ImgFormat, GL_UNSIGNED_BYTE, Image);
-
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
-
- xrot = 30.0;
- yrot = 50.0;
- spin = 0.0;
-
- glShadeModel( GL_FLAT );
-
- glEnable( GL_LIGHT0 );
- glEnable( GL_LIGHTING );
-
- glClearColor( 0.5, 0.5, 0.9, 0.0 );
-
- glEnable( GL_NORMALIZE );
-
- glViewport(0, 0, WIDTH, HEIGHT);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glFrustum( -xAspect, xAspect, yAspect, -yAspect, 10.0, 30.0 );
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
-}
-
-static void draw_objects( GLfloat eyex, GLfloat eyey, GLfloat eyez )
-{
- (void) eyex;
- (void) eyey;
- (void) eyez;
-#ifndef USE_ZBUFFER
- if (eyex<0.5) {
-#endif
- glPushMatrix();
- glTranslatef( 1.0, 1.5, 0.0 );
- glRotatef( spin, 1.0, 0.5, 0.0 );
- glRotatef( 0.5*spin, 0.0, 0.5, 1.0 );
- glCallList( objects_list[0] );
- glPopMatrix();
-
- glPushMatrix();
- glTranslatef( -1.0, 0.85+3.0*fabs( cos(0.01*spin) ), 0.0 );
- glRotatef( 0.5*spin, 0.0, 0.5, 1.0 );
- glRotatef( spin, 1.0, 0.5, 0.0 );
- glScalef( 0.5, 0.5, 0.5 );
- glCallList( objects_list[1] );
- glPopMatrix();
-#ifndef USE_ZBUFFER
- }
- else {
- glPushMatrix();
- glTranslatef( -1.0, 0.85+3.0*fabs( cos(0.01*spin) ), 0.0 );
- glRotatef( 0.5*spin, 0.0, 0.5, 1.0 );
- glRotatef( spin, 1.0, 0.5, 0.0 );
- glScalef( 0.5, 0.5, 0.5 );
- glCallList( objects_list[1] );
- glPopMatrix();
-
- glPushMatrix();
- glTranslatef( 1.0, 1.5, 0.0 );
- glRotatef( spin, 1.0, 0.5, 0.0 );
- glRotatef( 0.5*spin, 0.0, 0.5, 1.0 );
- glCallList( objects_list[0] );
- glPopMatrix();
- }
-#endif
-
-}
-
-static void draw_table( void )
-{
- glCallList( table_list );
-}
-
-static void draw( void )
-{
- static GLfloat light_pos[] = { 0.0, 20.0, 0.0, 1.0 };
- GLfloat dist = 20.0;
- GLfloat eyex, eyey, eyez;
-
- glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
-
-
- eyex = dist * cos(yrot*DEG2RAD) * cos(xrot*DEG2RAD);
- eyez = dist * sin(yrot*DEG2RAD) * cos(xrot*DEG2RAD);
- eyey = dist * sin(xrot*DEG2RAD);
-
- /* view from top */
- glPushMatrix();
- gluLookAt( eyex, eyey, eyez, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 );
-
- glLightfv( GL_LIGHT0, GL_POSITION, light_pos );
-
- /* draw table into stencil planes */
- glDisable( GL_DEPTH_TEST );
- glEnable( GL_STENCIL_TEST );
- glStencilFunc( GL_ALWAYS, 1, 0xffffffff );
- glStencilOp( GL_REPLACE, GL_REPLACE, GL_REPLACE );
- glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
- draw_table();
- glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
-
- glEnable( GL_DEPTH_TEST );
-
- /* render view from below (reflected viewport) */
- /* only draw where stencil==1 */
- if (eyey>0.0) {
- glPushMatrix();
-
- glStencilFunc( GL_EQUAL, 1, 0xffffffff ); /* draw if ==1 */
- glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
- glScalef( 1.0, -1.0, 1.0 );
-
- /* Reposition light in reflected space. */
- glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
-
- draw_objects(eyex, eyey, eyez);
- glPopMatrix();
-
- /* Restore light's original unreflected position. */
- glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
- }
-
- glDisable( GL_STENCIL_TEST );
-
- glEnable( GL_BLEND );
- glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
-
- glEnable( GL_TEXTURE_2D );
- draw_table();
- glDisable( GL_TEXTURE_2D );
- glDisable( GL_BLEND );
-
- /* view from top */
- glPushMatrix();
-
- draw_objects(eyex, eyey, eyez);
-
- glPopMatrix();
-
- glPopMatrix();
-
- glFinish();
-
-}
-
-static int screen(int mode)
-{
-
- vga_modeinfo *minf;
-
- vga_setmode(mode,CARD);
- minf = vga_getmodeinfo(mode);
- if(! (minf->flags & CAPABLE_LINEAR)){
- vga_setmode(TEXT,CARD);
- printk(KERN_INFO "The mode %d is not capable of linear\n",mode);
- return 1;
- }
- vga_setpage(0);
- if(vga_setlinearaddressing() == -1) {
- vga_setmode(TEXT,CARD);
- printk(KERN_INFO "Could not set linear addressing for mode %d\n",mode);
- return 1;
- }
-
- video_buf = vga_getgraphmem();
-
- grx_setbuffer(rgb_565_buf, WIDTH, HEIGHT); //Init of RGB16 version of grx functions
- //created to work with Mesa buffer
- return 0;
-
-}
-
-void program_end(void *arg)
-{
-
- OSMesaDestroyContext(ctx);
- free(rgb_565_buf);
-
- vga_setmode(TEXT,CARD);
-
- sys_end();
-
-}
-
-void program_key_end(KEY_EVT *k)
-{
-
- sys_end();
-
-}
-
-TASK refresh(void)
-{
-
- while(1) {
-
- copy_videomem_16to16(rgb_565_buf, video_buf, VMEMLONG);
- task_endcycle();
-
- }
-
- sys_end();
-
-}
-
-
-TASK disegna(void)
-{
-
- char text[100];
- TIME disegna_TIME, refresh_TIME;
-
- while(1) {
-
- jet_gettable(refresh_PID, &refresh_TIME, 1);
- jet_gettable(disegna_PID, &disegna_TIME, 1);
-
- spin += 2.0;
- yrot += 3.0;
-
- draw();
-
- sprintf(text,"Hard Task Refresh PER:%6d us EX:%6d us",(int)PERIOD_REFRESH,(int)refresh_TIME);
- grx_text(text,10,5,rgb16(0,0,255),0);
- sprintf(text,"Hard Task Draw PER:%6d us EX:%6d us",(int)PERIOD_DISEGNA,(int)disegna_TIME);
- grx_text(text,10,15,rgb16(0,0,255),0);
-
- task_endcycle();
-
- }
-
- sys_end();
-
-}
-
-int main (int argc, char *argv[])
-{
-
- HARD_TASK_MODEL ht_refresh, ht_disegna;
-
- sys_atrunlevel(program_end,NULL, RUNLEVEL_BEFORE_EXIT);
-
- WCET_REFRESH =((long int) PERIOD_REFRESH * (0.2));
- WCET_DISEGNA =((long int) PERIOD_DISEGNA * (0.7));
-
- hard_task_default_model(ht_refresh);
- hard_task_def_wcet(ht_refresh,WCET_REFRESH);
- hard_task_def_mit(ht_refresh,PERIOD_REFRESH);
- hard_task_def_usemath(ht_refresh);
- hard_task_def_group(ht_refresh,1);
- hard_task_def_ctrl_jet(ht_refresh);
-
- refresh_PID = task_create("refresh", refresh, &ht_refresh, NULL);
- if (refresh_PID == -1) {
- sys_end();
- exit(4);
- }
-
- hard_task_default_model(ht_disegna);
- hard_task_def_mit(ht_disegna,PERIOD_DISEGNA);
- hard_task_def_wcet(ht_disegna,WCET_DISEGNA);
- hard_task_def_group(ht_disegna,1);
- hard_task_def_ctrl_jet(ht_disegna);
- hard_task_def_usemath(ht_disegna);
- hard_task_def_stack(ht_disegna, 30000);
-
- disegna_PID = task_create("disegna", disegna, &ht_disegna, NULL);
- if (disegna_PID == -1) {
- sys_end();
- exit(4);
- }
-
- {
- KEY_EVT k;
- k.flag = ALTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,program_key_end);
- }
-
- rgb_565_buf = malloc(RGB565MEM);
-
- gl_init();
-
- if (screen(INITSTR)) {
- printk(KERN_INFO "Graphical initialization failed !!\n");
- sys_end();
- }
-
- group_activate(1);
-
- return 0;
-
-}
Index: rel_1_2/mesaref/initfile.c
===================================================================
--- rel_1_2/mesaref/initfile.c (revision 1198)
+++ rel_1_2/mesaref/initfile.c (nonexistent)
@@ -1,182 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: initfile.c,v 1.2 2003-03-20 13:34:37 giacomo Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.2 $
- * Last update: $Date: 2003-03-20 13:34:37 $
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/cbs.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-#include "modules/nopm.h"
-
-#include "fs/bdevinit.h"
-#include "fs/fsinit.h"
-#include "fs/bdev.h"
-
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-dev_t root_device=-1;
-dev_t temp_device=-1;
-
-int __register_sub_init(void)
-{
-#if defined(EDFSCHED)
- extern void BD_EDF_register_module(void);
- BD_EDF_register_module();
-#elif defined(PSCANSCHED)
- extern void BD_PSCAN_register_module(void);
- BD_PSCAN_register_module();
-#endif
- return 0;
-}
-
-int choose_root_callback(dev_t dev,u_int8_t fs)
-{
- if (fs==FS_MSDOS) return dev;
- return -1;
-}
-
-int choose_temp_callback(__dev_t dev,__uint8_t fs)
-{
- static int flag=0;
- if (fs==FS_MSDOS) {
- if (flag) return dev;
- flag=1;
- }
- return -1;
-}
-
-int __bdev_sub_init(void)
-{
- BDEV_PARMS bdev=BASE_BDEV;
-
- bdev_def_showinfo(bdev,FALSE);
- bdev_init(&bdev);
-
- root_device=bdev_scan_devices(choose_root_callback);
- if (root_device<0) {
- cprintf("can't find root device to mount on /!!!\n");
- sys_end();
- return -1;
- }
-
- return 0;
-
-}
-
-int __fs_sub_init(void)
-{
- extern int libc_initialize(void);
- FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
-
- filesystem_def_rootdevice(fs,root_device);
- filesystem_def_fs(fs,FS_MSDOS);
- filesystem_def_showinfo(fs,FALSE);
- filesystem_init(&fs);
-
- libc_initialize();
-
- return 0;
-}
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- extern int __register_sub_init(void);
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- PC_register_module();
- NPP_register_module();
- SRP_register_module();
- NOP_register_module();
- NOPM_register_module();
-
- __register_sub_init();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- KEYB_PARMS keyb = BASE_KEYB;
- extern int __bdev_sub_init(void);
- extern int __fs_sub_init(void);
-
- HARTPORT_init();
-
- KEYB_init(&keyb);
-
- __bdev_sub_init();
- __fs_sub_init();
-
- __call_main__(mb);
-
- return (void *)0;
-}
-