packet/0040755000076400007640000000000010176102740010765 5ustar iankiankpacket/.cmake.state0100644000076400007640000000002007450377671013174 0ustar iankiankÿÿÿÿpacket/data/0040755000076400007640000000000007525024672011711 5ustar iankiankpacket/data/equities/0040755000076400007640000000000007525024672013541 5ustar iankiankpacket/data/equities/aa0100644000076400007640000005573207525024672014056 0ustar iankiankDate,Open,High,Low,Close,Volume 2-Aug-02,26.31,26.39,25.30,25.50,3302800 1-Aug-02,26.95,27.20,25.95,26.29,4413400 31-Jul-02,26.00,27.37,25.11,27.05,6023600 30-Jul-02,26.75,27.04,25.72,25.98,4218500 29-Jul-02,25.80,27.44,25.74,27.19,4925200 26-Jul-02,24.51,25.52,24.38,25.45,4601600 25-Jul-02,24.56,25.68,23.76,24.06,6471900 24-Jul-02,22.77,24.97,22.62,24.80,8155200 23-Jul-02,24.96,25.70,23.56,23.66,6252900 22-Jul-02,26.05,26.25,24.36,24.71,8373400 19-Jul-02,28.07,28.07,26.25,26.84,5986600 18-Jul-02,28.73,29.31,28.06,28.07,2946100 17-Jul-02,29.43,29.77,28.43,28.69,2974700 16-Jul-02,28.60,29.42,28.04,28.59,4713000 15-Jul-02,29.53,29.55,27.62,29.03,4861000 12-Jul-02,30.37,30.82,29.44,29.95,2992700 11-Jul-02,30.32,31.07,29.75,30.19,4592000 10-Jul-02,32.02,32.02,30.05,30.23,6384700 9-Jul-02,32.31,32.71,31.78,31.78,3329600 8-Jul-02,32.56,33.06,32.31,32.31,4074800 5-Jul-02,32.46,33.33,32.41,33.19,2181400 3-Jul-02,32.31,32.41,31.62,32.26,4184900 2-Jul-02,32.81,32.90,32.07,32.07,5021300 1-Jul-02,33.21,33.61,32.71,32.81,5783300 28-Jun-02,31.80,33.11,31.80,32.96,5775000 27-Jun-02,31.57,31.81,30.96,31.80,4252200 26-Jun-02,30.42,31.37,30.28,31.17,4300000 25-Jun-02,31.32,31.70,30.87,30.96,4439300 24-Jun-02,30.32,31.04,30.24,30.62,4074800 21-Jun-02,30.37,30.91,30.00,30.37,4701600 20-Jun-02,31.32,31.52,30.97,31.02,4063600 19-Jun-02,31.67,32.54,31.12,31.13,3616000 18-Jun-02,31.32,31.86,31.30,31.82,3335700 17-Jun-02,30.83,31.54,30.23,31.40,5114400 14-Jun-02,31.57,31.67,30.83,31.19,3029600 13-Jun-02,31.82,32.21,31.62,31.74,3202400 12-Jun-02,31.02,31.94,30.92,31.87,3852400 11-Jun-02,32.06,32.29,31.17,31.20,4550400 10-Jun-02,31.77,32.19,31.41,31.77,3647400 7-Jun-02,31.32,31.91,31.32,31.62,5177600 6-Jun-02,32.96,33.15,31.85,31.92,4926900 5-Jun-02,33.41,33.52,32.66,33.21,3638200 4-Jun-02,33.79,33.79,32.31,33.23,4645000 3-Jun-02,34.93,35.08,33.78,33.79,3130000 31-May-02,35.10,35.23,34.52,34.78,2957700 30-May-02,34.90,35.30,34.29,34.95,3238300 29-May-02,35.20,35.40,34.72,35.10,1943000 28-May-02,35.73,35.73,34.90,35.20,1801600 24-May-02,35.74,35.78,35.35,35.38,1666600 23-May-02,35.50,35.88,35.26,35.69,2253200 22-May-02,35.40,35.40,34.85,35.25,2122700 21-May-02,35.19,35.58,35.04,35.40,3058700 20-May-02,35.30,35.30,34.90,35.18,3033500 17-May-02,35.64,35.64,34.99,35.46,3267000 16-May-02,36.02,36.29,35.57,35.64,2583000 15-May-02,36.04,36.64,35.75,35.86,3368300 14-May-02,35.54,36.19,35.40,36.04,2571400 13-May-02,34.94,35.24,34.40,35.15,2113700 10-May-02,34.85,35.03,34.64,34.79,1960400 9-May-02,34.80,35.15,34.61,34.70,2148300 8-May-02,35.15,35.35,34.72,34.80,3636900 7-May-02,33.90,34.53,33.83,34.23,3360900 6-May-02,34.48,34.55,33.68,33.90,2800400 3-May-02,34.23,34.65,33.99,34.47,3289100 2-May-02,33.80,34.25,33.51,34.23,2765500 1-May-02,33.80,34.45,33.02,33.80,3938600 30-Apr-02,32.86,33.89,32.86,33.69,5374100 29-Apr-02,34.20,34.29,33.04,33.56,4048000 26-Apr-02,34.65,34.95,34.10,34.29,2850300 25-Apr-02,33.93,34.60,33.68,34.57,4697600 24-Apr-02,35.34,35.54,34.29,34.64,3682000 23-Apr-02,35.35,35.60,35.01,35.32,3680900 22-Apr-02,37.02,37.03,35.19,35.35,3829000 19-Apr-02,37.32,37.40,36.83,37.10,2743200 18-Apr-02,37.17,37.40,36.74,37.06,3176200 17-Apr-02,37.62,37.62,36.92,37.28,3357800 16-Apr-02,37.12,37.36,36.80,37.20,3657500 15-Apr-02,36.74,36.78,36.34,36.34,4362000 12-Apr-02,37.66,37.90,36.88,36.95,2510600 11-Apr-02,37.96,38.69,36.97,37.62,3435100 10-Apr-02,37.06,38.16,37.03,37.96,3347700 9-Apr-02,37.47,37.50,36.73,37.00,2915300 8-Apr-02,36.79,37.56,36.50,37.48,3091100 5-Apr-02,36.92,37.71,36.91,37.62,4784600 4-Apr-02,36.25,36.62,35.69,36.51,4196000 3-Apr-02,37.62,37.77,36.58,36.87,3714100 2-Apr-02,37.15,37.63,36.80,37.53,3212700 1-Apr-02,37.36,37.43,36.53,37.26,2135800 28-Mar-02,37.59,37.73,37.36,37.36,2689900 27-Mar-02,37.57,37.71,37.21,37.41,3065800 26-Mar-02,36.38,37.57,36.33,37.46,3807100 25-Mar-02,36.92,37.21,36.33,36.38,2645700 22-Mar-02,37.36,37.43,36.23,36.68,4372900 21-Mar-02,37.81,37.86,36.92,37.36,3037600 20-Mar-02,38.36,38.37,37.81,37.86,2493300 19-Mar-02,38.80,38.90,38.11,38.40,3275700 18-Mar-02,38.88,39.10,38.12,38.60,2435100 15-Mar-02,38.26,38.68,37.94,38.63,4394800 14-Mar-02,37.91,38.51,37.72,38.10,2650700 13-Mar-02,38.11,38.46,37.86,37.96,3241400 12-Mar-02,37.62,38.85,37.40,38.53,3316700 11-Mar-02,38.06,38.10,37.47,37.86,4195800 8-Mar-02,39.10,39.35,37.42,37.89,6247500 7-Mar-02,39.20,39.23,38.23,38.88,3847800 6-Mar-02,37.92,39.30,37.92,39.04,3435000 5-Mar-02,39.15,39.15,37.96,38.04,4101000 4-Mar-02,37.61,39.30,37.58,39.16,5196400 1-Mar-02,36.94,37.54,36.21,37.54,4788700 28-Feb-02,37.57,37.91,37.18,37.19,5268800 27-Feb-02,37.32,38.12,37.21,37.47,4593900 26-Feb-02,37.65,37.71,36.79,37.12,3716200 25-Feb-02,37.42,37.98,37.18,37.65,4639500 22-Feb-02,37.11,38.11,36.71,37.42,4461600 21-Feb-02,36.58,37.62,36.43,37.10,5444800 20-Feb-02,35.54,36.51,35.49,36.24,3639500 19-Feb-02,36.18,36.24,34.89,34.89,2822700 15-Feb-02,36.23,37.08,35.91,36.03,3438000 14-Feb-02,36.47,36.49,35.54,35.87,3522600 13-Feb-02,35.54,36.32,35.29,35.92,2998400 12-Feb-02,35.15,35.71,34.75,35.15,2548800 11-Feb-02,33.80,35.64,33.71,35.37,3249000 8-Feb-02,33.46,34.13,33.32,34.07,3294900 7-Feb-02,33.68,34.05,33.19,33.21,2780500 6-Feb-02,33.41,34.35,33.11,33.35,3981100 5-Feb-02,33.49,34.24,32.90,32.95,3614100 4-Feb-02,34.64,34.64,33.15,33.32,4350000 1-Feb-02,35.33,35.38,34.45,34.64,3443800 31-Jan-02,34.11,35.48,33.77,35.33,4882700 30-Jan-02,34.39,34.64,33.26,33.75,5174700 29-Jan-02,35.08,35.79,34.24,34.25,3004400 28-Jan-02,35.38,35.92,35.26,35.28,2705900 25-Jan-02,34.49,35.63,34.40,35.01,3088700 24-Jan-02,34.98,35.28,34.49,34.71,4615900 23-Jan-02,34.15,34.84,34.10,34.49,6378600 22-Jan-02,33.51,33.85,33.34,33.46,4333500 18-Jan-02,33.49,33.52,33.11,33.21,3810400 17-Jan-02,33.58,33.69,32.85,33.28,3494100 16-Jan-02,34.12,34.34,33.11,33.11,3273800 15-Jan-02,34.29,35.23,34.02,34.02,4125600 14-Jan-02,34.50,35.01,34.40,34.49,3671100 11-Jan-02,35.46,35.94,35.08,35.13,3997800 10-Jan-02,36.21,36.21,35.38,35.38,3474500 9-Jan-02,36.75,37.52,35.76,35.97,3876700 8-Jan-02,37.94,37.94,36.56,36.80,3986300 7-Jan-02,37.25,38.02,37.22,37.60,4685700 4-Jan-02,36.21,37.29,35.97,36.76,4356500 3-Jan-02,35.41,35.91,35.23,35.61,3440500 2-Jan-02,35.38,35.39,34.84,35.16,2593500 31-Dec-01,35.67,35.77,35.03,35.03,2018900 28-Dec-01,35.38,35.92,35.24,35.62,2347400 27-Dec-01,34.65,35.33,34.64,34.93,2472500 26-Dec-01,33.94,34.96,33.94,34.64,2395200 24-Dec-01,33.81,34.46,33.60,33.94,1344800 21-Dec-01,34.49,34.55,33.50,33.71,6273500 20-Dec-01,34.86,35.13,34.02,34.41,4141200 19-Dec-01,33.80,36.06,33.75,34.86,12518100 18-Dec-01,36.41,37.15,36.31,37.11,3449500 17-Dec-01,36.64,37.02,35.72,35.98,3454700 14-Dec-01,35.87,36.71,35.04,36.48,3015300 13-Dec-01,37.28,37.28,35.55,35.74,3686300 12-Dec-01,38.33,38.34,36.57,37.27,3209500 11-Dec-01,37.70,38.21,37.20,37.97,2494500 10-Dec-01,38.38,38.50,37.48,37.95,1890700 7-Dec-01,38.98,38.98,38.02,38.28,2395200 6-Dec-01,39.42,39.48,38.70,38.97,4231700 5-Dec-01,38.04,39.91,37.87,39.37,5308100 4-Dec-01,37.35,37.58,36.76,37.55,3131300 3-Dec-01,38.04,38.05,36.71,37.30,2687300 30-Nov-01,37.45,38.23,37.35,38.04,2909700 29-Nov-01,37.30,38.04,36.95,37.45,2818700 28-Nov-01,37.46,37.69,37.15,37.38,2062300 27-Nov-01,37.70,38.18,37.35,37.72,2716700 26-Nov-01,38.09,38.21,37.30,37.70,3116900 23-Nov-01,37.40,38.23,37.30,38.23,1798500 21-Nov-01,37.29,38.32,37.05,37.24,2626500 20-Nov-01,37.64,37.68,36.91,37.29,3406900 19-Nov-01,37.15,38.04,36.96,37.93,3618500 16-Nov-01,37.35,37.40,36.45,36.58,3999900 15-Nov-01,37.25,37.42,36.68,36.95,4068900 14-Nov-01,36.59,37.24,36.46,37.05,3462600 13-Nov-01,34.48,35.93,34.48,35.77,3327500 12-Nov-01,34.40,34.57,33.60,34.18,2319900 9-Nov-01,34.12,34.49,33.60,34.48,1795100 8-Nov-01,34.14,34.72,33.91,34.12,2609000 7-Nov-01,33.11,34.29,33.11,33.89,2525000 6-Nov-01,32.91,33.59,32.53,33.51,2150400 5-Nov-01,33.09,33.36,32.57,32.73,2797400 2-Nov-01,32.47,32.87,32.03,32.78,2104500 1-Nov-01,32.27,32.41,30.89,32.25,3661700 31-Oct-01,32.52,32.67,31.73,31.80,3578200 30-Oct-01,32.86,32.87,32.28,32.54,2681100 29-Oct-01,33.97,34.19,33.17,33.40,2811100 26-Oct-01,33.40,34.57,33.40,34.22,2147000 25-Oct-01,33.16,34.19,32.47,34.15,3161100 24-Oct-01,33.21,33.68,32.93,33.32,2296400 23-Oct-01,32.23,33.58,32.18,33.11,2762600 22-Oct-01,31.06,32.32,30.93,32.21,2591800 19-Oct-01,31.41,31.53,30.70,31.07,2984200 18-Oct-01,31.20,31.58,31.02,31.29,3259600 17-Oct-01,32.81,32.82,31.39,31.42,4098900 16-Oct-01,31.39,32.33,31.16,32.19,2600300 15-Oct-01,30.66,31.69,30.56,31.39,2864000 12-Oct-01,31.59,32.54,31.00,31.71,3386800 11-Oct-01,31.44,32.63,31.39,32.10,5885900 10-Oct-01,31.15,31.84,31.01,31.20,5543400 9-Oct-01,30.02,31.57,29.82,31.01,3168300 8-Oct-01,30.93,31.15,29.25,29.49,3130800 5-Oct-01,30.51,31.14,30.26,30.94,2898800 4-Oct-01,32.27,32.27,30.06,30.23,4893000 3-Oct-01,30.70,31.76,30.21,31.48,4858100 2-Oct-01,30.58,31.34,29.87,31.34,3713500 1-Oct-01,30.42,30.42,29.43,30.34,3028600 28-Sep-01,29.67,30.46,28.64,30.42,3877900 27-Sep-01,28.69,29.67,28.16,29.67,4266800 26-Sep-01,29.71,29.88,27.71,28.49,5185200 25-Sep-01,29.43,30.02,28.55,29.47,3703200 24-Sep-01,27.76,29.63,27.76,29.63,5251600 21-Sep-01,27.52,28.20,26.84,27.76,8672600 20-Sep-01,29.38,29.38,27.48,28.07,6878600 19-Sep-01,29.64,30.05,28.45,29.92,5654900 18-Sep-01,30.31,30.84,29.23,29.63,8292600 17-Sep-01,31.78,31.88,29.25,29.51,8813400 10-Sep-01,34.09,34.24,32.62,33.16,7821900 7-Sep-01,35.51,35.91,34.59,34.78,3867600 6-Sep-01,37.02,37.28,36.22,36.32,3063700 5-Sep-01,37.56,38.06,36.85,37.27,3003200 4-Sep-01,36.79,38.27,36.54,37.81,3470800 31-Aug-01,36.64,37.67,36.50,37.40,2231100 30-Aug-01,37.38,37.38,36.30,36.78,2953500 29-Aug-01,38.26,38.59,37.08,37.28,2550300 28-Aug-01,38.33,38.43,37.58,38.04,2078100 27-Aug-01,38.90,38.90,38.28,38.33,1939300 24-Aug-01,37.52,38.80,37.41,38.50,2659600 23-Aug-01,37.03,37.73,37.03,37.31,1959700 22-Aug-01,36.73,37.88,36.64,37.43,2322100 21-Aug-01,37.28,37.77,36.61,36.69,3344600 20-Aug-01,36.20,37.08,35.87,37.08,3695300 17-Aug-01,35.66,36.22,35.56,35.99,3992400 16-Aug-01,35.39,35.87,35.16,35.60,2312100 15-Aug-01,36.26,36.72,35.36,35.39,2338000 14-Aug-01,36.42,36.44,35.80,36.21,2688400 13-Aug-01,36.30,36.76,35.83,36.42,2114800 10-Aug-01,35.40,36.63,34.50,36.31,2577500 9-Aug-01,35.41,35.46,34.82,35.21,3040300 8-Aug-01,36.25,36.59,35.32,35.33,2389500 7-Aug-01,36.44,36.59,35.81,36.30,2582400 6-Aug-01,36.86,36.88,36.00,36.33,3120100 3-Aug-01,37.13,37.22,36.32,37.05,2906900 2-Aug-01,38.15,38.16,36.27,37.13,4674600 1-Aug-01,38.34,38.55,37.54,37.68,1921500 31-Jul-01,38.31,39.09,38.11,38.34,3188800 30-Jul-01,37.38,38.45,37.20,38.16,3266000 27-Jul-01,38.45,38.70,37.42,37.71,2619200 26-Jul-01,37.48,38.66,37.24,38.64,2764300 25-Jul-01,36.30,38.18,36.16,38.17,3662100 24-Jul-01,38.21,38.22,35.77,36.38,4222100 23-Jul-01,39.58,39.58,38.46,38.65,1874700 20-Jul-01,39.68,40.01,38.90,39.17,2673700 19-Jul-01,39.97,41.04,39.09,39.58,3176900 18-Jul-01,37.48,40.21,37.48,39.97,4237800 17-Jul-01,38.45,38.85,37.89,38.49,4258100 16-Jul-01,39.97,40.07,38.54,38.77,4287800 13-Jul-01,39.80,40.90,39.77,40.52,3662200 12-Jul-01,38.70,39.82,38.08,39.80,2941700 11-Jul-01,38.60,38.94,37.58,38.03,4869800 10-Jul-01,39.45,39.57,38.38,38.60,2561400 9-Jul-01,38.84,39.53,38.41,39.45,3364200 6-Jul-01,40.56,40.85,38.70,38.89,4447200 5-Jul-01,39.33,40.07,38.94,39.85,3091300 3-Jul-01,39.56,39.67,39.10,39.33,1256600 2-Jul-01,38.80,39.94,38.75,39.56,2449300 29-Jun-01,39.24,39.68,38.50,39.09,2916100 28-Jun-01,38.55,39.58,38.43,39.09,3951300 27-Jun-01,37.13,38.23,36.96,37.58,2766200 26-Jun-01,36.26,37.78,35.67,37.24,5180600 25-Jun-01,37.48,38.06,36.99,37.13,3003500 22-Jun-01,39.04,39.04,37.99,38.21,2479000 21-Jun-01,38.50,39.14,37.76,38.78,4831100 20-Jun-01,36.74,37.47,36.56,37.21,4069500 19-Jun-01,37.18,37.61,36.35,36.74,4433500 18-Jun-01,38.10,38.35,37.09,37.13,4534400 15-Jun-01,38.94,38.94,37.98,38.08,5317600 14-Jun-01,40.36,40.37,38.11,38.33,2962500 13-Jun-01,39.77,40.44,39.09,39.39,3995600 12-Jun-01,39.58,40.07,38.86,39.58,5904700 11-Jun-01,42.05,42.05,40.60,41.18,2115900 8-Jun-01,42.49,42.49,41.25,42.05,1475200 7-Jun-01,42.22,43.43,42.21,42.54,3380300 6-Jun-01,43.95,43.96,42.52,42.99,2830900 5-Jun-01,43.00,43.96,42.42,43.82,3647300 4-Jun-01,42.70,42.96,42.31,42.75,2423800 1-Jun-01,42.51,43.11,41.69,42.53,3424900 31-May-01,41.40,42.59,41.39,42.17,2776500 30-May-01,42.50,42.62,41.16,41.40,2937400 29-May-01,42.85,43.00,42.12,42.47,3184000 25-May-01,41.89,42.39,41.54,42.18,2571800 24-May-01,42.75,42.80,41.42,41.54,3511500 23-May-01,42.70,43.05,42.44,42.59,3688500 22-May-01,44.37,44.37,42.51,42.61,4113300 21-May-01,43.63,44.60,42.96,44.33,4080700 18-May-01,43.88,44.24,42.90,43.93,4180400 17-May-01,43.58,44.67,43.49,43.74,8758900 16-May-01,41.13,43.53,40.85,43.50,8372000 15-May-01,40.36,41.26,40.12,41.04,4125800 14-May-01,39.35,40.36,39.10,40.36,3181400 11-May-01,40.60,40.60,38.95,39.35,3830800 10-May-01,40.57,41.04,40.55,40.96,3791900 9-May-01,39.46,40.54,39.33,40.44,2684700 8-May-01,40.21,40.26,39.18,39.42,2468800 7-May-01,40.95,40.95,39.58,40.07,2264100 4-May-01,39.77,40.95,39.33,40.95,2387300 3-May-01,40.62,40.62,39.36,39.96,2738600 2-May-01,40.95,40.95,39.71,40.39,2928700 1-May-01,40.17,40.55,39.92,40.41,2771700 30-Apr-01,40.90,41.28,39.87,40.31,3381900 27-Apr-01,41.38,41.38,40.41,40.89,3417400 26-Apr-01,39.24,41.18,39.20,40.97,5195500 25-Apr-01,38.95,39.43,38.22,39.42,3707600 24-Apr-01,39.34,39.61,38.54,38.91,3698100 23-Apr-01,39.78,39.80,38.85,39.36,4651200 20-Apr-01,38.46,40.31,38.36,39.29,8667700 19-Apr-01,38.51,38.70,37.73,38.40,3938100 18-Apr-01,37.39,38.69,37.24,38.56,8348800 17-Apr-01,37.97,37.97,36.76,37.18,3923200 16-Apr-01,38.22,38.56,37.69,37.97,3436000 12-Apr-01,38.02,38.12,37.62,37.96,4375600 11-Apr-01,38.51,38.65,37.73,37.98,6328000 10-Apr-01,37.97,38.93,37.73,38.22,11089300 9-Apr-01,35.78,36.96,35.66,36.51,3585900 6-Apr-01,36.51,36.51,34.94,35.44,4030200 5-Apr-01,35.35,36.51,35.24,36.51,5175800 4-Apr-01,33.35,35.00,32.92,34.61,3386500 3-Apr-01,34.38,34.38,32.86,33.54,2757800 2-Apr-01,34.66,35.44,33.88,34.38,4365500 30-Mar-01,34.81,35.00,33.88,35.00,3375000 29-Mar-01,33.84,34.72,33.59,34.13,2108800 28-Mar-01,34.87,34.87,32.91,34.13,2841800 27-Mar-01,34.06,34.98,33.35,34.87,4017000 26-Mar-01,33.01,33.49,32.51,33.11,3307000 23-Mar-01,32.86,33.25,32.20,32.74,3572800 22-Mar-01,33.11,33.35,31.18,32.46,5622900 21-Mar-01,34.71,34.81,33.57,33.73,4496200 20-Mar-01,35.44,36.51,35.05,35.33,4007400 19-Mar-01,34.27,35.14,34.13,34.98,3123300 16-Mar-01,34.11,34.31,33.37,34.07,6487700 15-Mar-01,35.54,35.69,34.57,34.83,5082400 14-Mar-01,34.66,35.32,34.26,34.61,4297500 13-Mar-01,35.61,36.61,34.44,36.08,3871800 12-Mar-01,35.53,36.12,34.96,35.04,4094800 9-Mar-01,38.07,38.16,35.96,36.03,4616400 8-Mar-01,37.98,38.54,37.51,37.97,4695900 7-Mar-01,37.34,38.36,36.82,38.26,4454100 6-Mar-01,36.66,37.27,36.61,36.99,3832400 5-Mar-01,36.76,37.44,36.40,37.08,4182600 2-Mar-01,35.54,36.79,35.30,36.03,3281000 1-Mar-01,34.90,35.52,34.40,35.52,2886500 28-Feb-01,35.49,35.52,34.40,34.82,2312900 27-Feb-01,35.46,35.53,34.27,35.30,5194000 26-Feb-01,33.97,35.05,33.85,35.05,3724600 23-Feb-01,34.08,34.52,33.35,33.78,2910000 22-Feb-01,33.59,34.53,33.25,34.42,3564800 21-Feb-01,34.37,34.43,33.17,33.42,2854000 20-Feb-01,34.71,35.20,33.74,34.27,3570200 16-Feb-01,35.20,35.36,33.79,34.08,4718900 15-Feb-01,34.57,35.64,34.57,35.42,4543000 14-Feb-01,34.71,34.98,34.36,34.56,3154100 13-Feb-01,35.38,35.59,34.50,34.76,2843500 12-Feb-01,36.06,36.06,34.96,35.53,3017300 9-Feb-01,36.03,36.37,35.30,36.12,3180800 8-Feb-01,36.01,36.21,35.56,36.03,3252500 7-Feb-01,36.50,36.76,35.51,35.83,2885700 6-Feb-01,36.15,36.53,35.93,36.26,3158400 5-Feb-01,36.42,36.50,35.44,35.91,3397700 2-Feb-01,37.00,37.44,36.33,36.56,6616500 1-Feb-01,36.07,37.20,36.03,37.00,7087200 31-Jan-01,34.54,35.78,34.43,35.77,5611300 30-Jan-01,33.05,34.42,32.78,34.34,3445300 29-Jan-01,33.26,33.32,32.48,32.98,3297500 26-Jan-01,34.42,34.54,33.33,33.51,2930100 25-Jan-01,33.33,34.48,33.33,34.36,3290700 24-Jan-01,33.21,33.69,32.97,33.51,2813300 23-Jan-01,32.54,33.15,32.36,32.90,3472300 22-Jan-01,31.69,32.54,30.84,32.54,2404500 19-Jan-01,32.78,33.03,31.39,31.69,2609800 18-Jan-01,32.97,33.75,32.30,33.39,3190800 17-Jan-01,33.15,33.15,31.81,32.54,3380300 16-Jan-01,31.09,32.54,30.36,32.54,2731000 12-Jan-01,30.91,31.33,29.69,30.84,3560700 11-Jan-01,32.18,32.18,30.30,30.54,3490000 10-Jan-01,31.81,32.12,31.09,31.75,4097200 9-Jan-01,32.72,33.09,31.03,31.39,5313400 8-Jan-01,33.21,34.66,31.87,32.60,7385900 5-Jan-01,32.84,32.97,31.81,32.12,3902100 4-Jan-01,31.51,32.78,31.33,32.72,4787900 3-Jan-01,31.21,32.48,30.36,31.69,4834800 2-Jan-01,32.00,32.66,30.91,31.27,3825600 29-Dec-00,33.15,33.45,32.36,32.48,2479900 28-Dec-00,33.39,33.69,32.36,33.57,2695300 27-Dec-00,33.45,33.63,32.60,33.15,3147000 26-Dec-00,33.75,33.75,32.72,33.51,2474400 22-Dec-00,31.51,33.94,31.09,33.75,4193700 21-Dec-00,30.42,30.91,30.06,30.78,3471000 20-Dec-00,32.00,32.06,30.06,30.48,4410000 19-Dec-00,31.27,33.03,31.21,32.48,4977000 18-Dec-00,30.78,31.69,30.06,31.33,3011400 15-Dec-00,30.24,30.66,29.21,30.00,4674900 14-Dec-00,30.84,31.27,30.30,30.78,2588800 13-Dec-00,30.60,31.75,30.36,31.69,3862900 12-Dec-00,31.03,31.39,29.63,30.66,5017800 11-Dec-00,30.42,31.33,29.33,31.21,3979600 8-Dec-00,28.54,29.69,28.12,29.63,3485900 7-Dec-00,29.69,29.75,27.88,28.30,4313000 6-Dec-00,30.54,30.72,29.81,30.36,3917500 5-Dec-00,29.57,30.60,28.78,30.54,6373800 4-Dec-00,28.54,30.30,28.24,30.06,6693600 1-Dec-00,27.63,28.30,27.45,28.12,3083900 30-Nov-00,26.42,27.33,26.24,27.33,3898200 29-Nov-00,26.42,27.09,26.36,27.03,2525300 28-Nov-00,26.30,27.15,26.00,26.97,2668900 27-Nov-00,25.51,26.78,25.45,26.06,4346600 24-Nov-00,25.75,25.75,25.09,25.33,810500 22-Nov-00,25.45,25.63,25.09,25.33,1757300 21-Nov-00,25.63,25.75,25.09,25.45,2432500 20-Nov-00,26.42,26.54,25.39,25.39,3036800 17-Nov-00,27.15,27.75,26.12,26.18,2298100 16-Nov-00,28.36,28.36,26.72,27.09,2088200 15-Nov-00,28.12,28.66,28.00,28.36,3786400 14-Nov-00,27.57,28.06,27.27,28.00,1806300 13-Nov-00,26.78,27.51,26.72,27.33,2795400 10-Nov-00,28.00,28.00,26.97,27.57,1960100 9-Nov-00,27.94,28.54,27.27,27.69,3032500 8-Nov-00,28.18,28.24,27.75,28.06,3300200 7-Nov-00,27.57,28.24,27.45,28.12,2623000 6-Nov-00,27.03,28.24,26.85,27.94,2466700 3-Nov-00,26.66,26.78,25.88,26.78,2191000 2-Nov-00,28.12,28.12,26.54,26.91,3371900 1-Nov-00,27.94,28.42,27.69,28.18,4193200 31-Oct-00,27.51,28.06,27.09,27.69,5926100 30-Oct-00,24.13,27.57,24.13,27.27,6866400 27-Oct-00,23.89,24.13,23.35,24.13,4008100 26-Oct-00,23.95,24.31,23.59,23.89,4206700 25-Oct-00,23.23,24.38,23.23,24.07,6333500 24-Oct-00,23.65,24.62,23.29,24.07,4130200 23-Oct-00,22.99,23.65,22.87,23.17,4056100 20-Oct-00,23.29,23.77,22.32,22.75,4542100 19-Oct-00,23.47,24.13,23.29,23.47,3867600 18-Oct-00,24.13,24.74,23.47,23.83,3840900 17-Oct-00,24.50,25.40,24.50,25.10,3550700 16-Oct-00,25.22,25.22,24.19,24.38,3163300 13-Oct-00,25.04,25.34,24.31,24.92,2911500 12-Oct-00,26.43,26.55,24.86,25.04,2914100 11-Oct-00,28.00,28.42,26.00,26.25,4524200 10-Oct-00,27.51,28.60,27.15,28.60,5068500 9-Oct-00,26.37,27.69,26.37,27.63,2839000 6-Oct-00,25.58,26.67,25.58,26.61,4484500 5-Oct-00,26.43,26.61,25.34,26.19,3803200 4-Oct-00,26.00,26.73,25.34,26.31,7096900 3-Oct-00,23.89,26.00,23.71,26.00,5312300 2-Oct-00,24.31,24.68,23.41,23.65,3354900 29-Sep-00,23.47,24.62,22.50,24.44,4435500 28-Sep-00,22.81,23.71,22.75,23.53,5581100 27-Sep-00,23.17,23.47,22.44,22.69,6941500 26-Sep-00,23.17,23.53,22.93,23.05,6498500 25-Sep-00,23.05,23.59,22.75,22.93,7164600 22-Sep-00,23.53,24.13,22.69,24.13,9012500 21-Sep-00,24.31,24.56,23.29,23.41,6317100 20-Sep-00,25.04,25.58,23.95,24.31,9768200 19-Sep-00,25.94,25.94,24.38,24.92,12114900 18-Sep-00,27.87,28.12,24.62,26.06,3524900 15-Sep-00,28.36,28.36,27.39,27.60,3678500 14-Sep-00,29.32,29.32,28.18,28.54,2636100 13-Sep-00,28.96,29.38,28.42,29.38,4860400 12-Sep-00,30.29,30.35,28.96,29.20,4388700 11-Sep-00,31.80,31.98,30.29,31.06,2775300 8-Sep-00,31.43,32.16,31.19,32.10,1872100 7-Sep-00,32.58,32.58,31.55,31.62,2215400 6-Sep-00,32.64,32.94,32.16,32.52,2640900 5-Sep-00,31.86,33.30,31.86,32.64,2178400 1-Sep-00,32.70,32.76,31.74,32.04,1439400 31-Aug-00,31.74,32.64,31.68,32.11,2460300 30-Aug-00,31.62,32.16,31.37,31.55,1662200 29-Aug-00,32.82,32.82,31.37,31.49,1989100 28-Aug-00,32.52,32.94,32.10,32.88,2451200 25-Aug-00,32.40,32.46,31.92,32.22,1324000 24-Aug-00,32.40,33.00,31.98,32.04,2911900 23-Aug-00,32.10,32.34,31.62,32.28,2097100 22-Aug-00,31.13,31.86,31.07,31.62,2606800 21-Aug-00,32.82,32.88,31.92,31.92,2004700 18-Aug-00,33.12,33.12,32.52,33.06,2456800 17-Aug-00,33.24,33.36,32.70,33.36,2449000 16-Aug-00,33.18,33.79,32.88,33.24,3771200 15-Aug-00,33.00,33.24,32.58,33.06,2685200 14-Aug-00,31.49,33.00,31.49,32.94,2056300 11-Aug-00,31.86,32.28,30.89,32.16,2279100 10-Aug-00,32.70,32.82,31.86,32.40,2059200 9-Aug-00,33.36,33.73,32.28,32.34,3980900 8-Aug-00,31.37,33.67,31.25,33.43,4225300 7-Aug-00,29.99,31.43,29.99,31.25,1711800 4-Aug-00,29.99,30.65,29.74,30.11,1615700 3-Aug-00,29.87,31.13,29.87,30.17,1875300 2-Aug-00,29.93,30.77,29.62,30.71,2189000 1-Aug-00,29.38,30.23,29.38,29.87,2233200 31-Jul-00,29.26,30.35,28.90,29.08,2588800 28-Jul-00,30.59,30.89,28.42,29.81,3548600 27-Jul-00,29.69,30.47,29.50,30.29,1359500 26-Jul-00,30.11,30.65,29.20,29.44,2597400 25-Jul-00,31.01,31.07,29.81,30.11,1720200 24-Jul-00,30.29,31.01,29.69,30.47,1696900 21-Jul-00,29.44,30.65,29.20,30.53,2766200 20-Jul-00,29.69,29.93,29.14,29.32,2238500 19-Jul-00,29.50,29.75,29.02,29.44,3257900 18-Jul-00,30.71,30.71,29.14,29.14,4684700 17-Jul-00,31.55,31.73,29.57,29.57,2862800 14-Jul-00,31.31,31.67,30.59,31.67,2711600 13-Jul-00,30.77,31.49,30.53,31.31,2287300 12-Jul-00,31.19,31.85,30.35,30.89,4463400 11-Jul-00,28.72,31.31,28.54,31.25,5927100 10-Jul-00,27.82,28.96,27.82,28.84,6390300 7-Jul-00,27.82,27.88,26.20,26.56,5901400 6-Jul-00,28.54,28.66,27.70,27.82,1463500 5-Jul-00,29.20,29.20,28.12,28.36,1906100 3-Jul-00,28.00,29.02,28.00,28.60,1170700 30-Jun-00,27.64,28.60,27.52,27.88,4676100 29-Jun-00,28.00,28.72,27.52,27.88,4156800 28-Jun-00,28.54,29.02,27.76,28.51,3348400 27-Jun-00,28.00,29.57,27.94,28.78,3844900 26-Jun-00,28.90,29.08,27.52,27.76,2920700 23-Jun-00,27.94,29.50,27.64,29.08,3479300 22-Jun-00,28.72,28.84,27.46,28.00,3555700 21-Jun-00,28.18,28.54,27.40,27.60,3871500 20-Jun-00,29.08,29.38,28.60,28.90,2895800 19-Jun-00,30.53,30.59,28.84,28.90,3853300 16-Jun-00,29.44,30.83,28.90,29.87,5523400 15-Jun-00,29.20,29.69,28.66,29.44,4383800 14-Jun-00,27.40,29.32,27.34,28.78,4936600 13-Jun-00,27.52,27.70,26.80,27.10,6905800 12-Jun-00,27.64,28.84,27.64,27.76,3386500 9-Jun-00,28.54,28.90,27.76,27.89,3216300 8-Jun-00,28.87,28.90,28.45,28.51,1979600 7-Jun-00,29.50,29.50,28.60,28.96,2186100 6-Jun-00,29.35,29.87,29.20,29.50,1996400 5-Jun-00,29.20,29.41,29.11,29.35,2243000 2-Jun-00,28.48,29.81,28.18,29.81,3689400 1-Jun-00,27.91,28.00,27.55,27.73,2152400 31-May-00,28.00,28.12,27.52,28.09,2098200 30-May-00,27.88,28.15,27.64,27.91,3003000 26-May-00,28.84,28.93,27.40,27.55,3203500 25-May-00,29.81,29.93,28.84,28.93,1505800 24-May-00,29.50,30.17,29.50,29.69,2090800 23-May-00,30.65,30.65,29.75,29.78,2726800 22-May-00,31.34,31.46,30.53,30.62,2272800 19-May-00,31.55,31.91,31.13,31.25,1176300 18-May-00,31.34,31.61,31.10,31.55,918100 17-May-00,31.76,31.91,31.28,31.43,1177800 16-May-00,32.48,32.63,31.91,32.18,1160100 15-May-00,31.46,32.72,31.37,32.63,2426800 12-May-00,31.43,31.58,31.04,31.35,2164100 11-May-00,31.73,31.88,31.16,31.31,1718600 10-May-00,31.82,32.90,31.31,31.34,3436300 9-May-00,31.79,32.27,31.52,31.79,1916900 8-May-00,32.15,32.36,31.67,31.79,1071500 5-May-00,30.65,32.03,30.65,32.03,1543900 4-May-00,31.01,31.70,30.89,31.07,1875000 packet/data/equities/amat0100644000076400007640000005674707525024672014426 0ustar iankiankDate,Open,High,Low,Close,Volume 2-Aug-02,13.85,14.01,13.14,13.70,34426500 1-Aug-02,14.93,15.03,13.90,14.02,32102000 31-Jul-02,15.35,15.50,14.68,14.87,27523300 30-Jul-02,14.84,15.82,14.80,15.70,29819700 29-Jul-02,14.94,15.34,14.46,15.10,37582700 26-Jul-02,15.07,15.08,13.74,14.32,49531400 25-Jul-02,15.39,15.53,13.55,14.23,83413600 24-Jul-02,15.12,16.57,15.04,16.55,42787400 23-Jul-02,16.54,16.94,15.50,15.58,39553200 22-Jul-02,17.00,17.48,16.50,16.83,33317600 19-Jul-02,16.70,17.60,16.64,16.80,27156600 18-Jul-02,17.96,18.29,17.03,17.15,29983200 17-Jul-02,19.36,19.71,17.50,17.99,47450700 16-Jul-02,19.09,19.98,18.25,18.40,35014800 15-Jul-02,18.13,19.45,17.80,19.40,32897400 12-Jul-02,18.88,19.00,17.96,18.48,31867100 11-Jul-02,16.62,18.52,16.33,18.23,46685300 10-Jul-02,18.24,18.25,16.60,16.67,31625000 9-Jul-02,18.10,18.24,17.50,17.72,32862400 8-Jul-02,19.73,20.06,18.55,19.00,27396600 5-Jul-02,18.85,19.95,18.84,19.93,21961900 3-Jul-02,16.72,18.17,16.67,17.99,29506600 2-Jul-02,17.89,17.90,16.92,16.97,46063200 1-Jul-02,18.95,19.20,17.94,18.03,31204900 28-Jun-02,19.60,20.25,18.92,19.02,36771500 27-Jun-02,19.66,20.15,19.03,19.96,38681900 26-Jun-02,18.69,19.47,18.09,18.99,43577600 25-Jun-02,20.38,20.68,19.05,19.80,39955700 24-Jun-02,18.41,20.20,18.41,19.87,33447800 21-Jun-02,18.49,19.44,18.49,18.76,28178300 20-Jun-02,19.85,20.14,18.85,19.19,30253600 19-Jun-02,20.04,20.50,19.51,19.69,27575800 18-Jun-02,20.75,21.73,20.44,20.46,30528000 17-Jun-02,20.31,21.33,20.15,21.04,24591200 14-Jun-02,19.35,20.10,18.94,19.83,29897000 13-Jun-02,20.51,21.25,19.94,20.38,27326700 12-Jun-02,19.56,20.79,19.38,20.70,33568300 11-Jun-02,20.99,21.00,19.54,19.59,21784100 10-Jun-02,20.69,21.16,20.10,20.46,17277100 7-Jun-02,19.36,20.62,19.25,20.62,42218500 6-Jun-02,21.84,22.14,20.70,20.92,31490800 5-Jun-02,22.10,22.62,21.71,22.35,29018600 4-Jun-02,21.32,22.19,20.70,22.00,36390900 3-Jun-02,22.20,22.34,21.30,21.43,25103800 31-May-02,23.00,23.20,22.10,22.18,23504300 30-May-02,22.70,22.70,21.81,22.59,38167000 29-May-02,23.52,23.75,23.10,23.10,23226300 28-May-02,24.14,24.36,23.63,24.12,22581800 24-May-02,23.99,24.16,23.35,23.80,42587100 23-May-02,26.32,26.38,24.76,25.57,30004900 22-May-02,25.98,26.72,25.20,26.16,27992600 21-May-02,27.02,27.35,26.00,26.31,23222200 20-May-02,26.59,27.18,26.50,26.78,19760400 17-May-02,27.15,27.50,26.37,27.31,37679600 16-May-02,26.52,27.19,26.03,27.13,29150000 15-May-02,26.49,27.50,25.70,26.75,52615900 14-May-02,27.00,27.72,26.25,26.64,46340900 13-May-02,24.65,25.70,24.17,25.58,32640000 10-May-02,25.69,25.70,23.44,23.70,30757100 9-May-02,25.14,26.13,25.00,25.26,35306000 8-May-02,23.90,25.77,23.85,25.56,36714100 7-May-02,22.47,22.93,21.81,22.32,24878100 6-May-02,22.12,23.33,22.10,22.12,21825200 3-May-02,22.89,22.90,21.65,22.17,31087500 2-May-02,24.57,25.07,22.75,22.87,34764400 1-May-02,24.25,24.81,23.51,24.40,25109000 30-Apr-02,24.00,25.18,23.80,24.32,24989600 29-Apr-02,24.15,24.50,23.37,23.94,25770600 26-Apr-02,25.53,25.69,23.56,23.77,29180700 25-Apr-02,24.63,25.64,24.37,25.23,28004900 24-Apr-02,26.09,26.47,24.68,25.00,22705100 23-Apr-02,26.49,26.49,25.62,25.90,24110000 22-Apr-02,26.25,26.43,25.50,26.06,16945900 19-Apr-02,27.00,27.09,26.00,26.48,23107600 18-Apr-02,27.08,27.19,25.80,26.71,29809500 17-Apr-02,27.47,27.86,26.86,27.30,22729800 16-Apr-02,26.80,27.17,26.75,27.08,19010900 15-Apr-02,25.42,25.99,25.23,25.72,16934200 12-Apr-02,25.50,25.59,24.77,25.30,16465400 11-Apr-02,25.20,25.89,25.03,25.22,19826600 10-Apr-02,25.86,25.90,24.75,25.50,24172700 9-Apr-02,26.48,26.92,25.50,25.68,17989700 8-Apr-02,25.50,26.55,25.14,26.51,22095400 5-Apr-02,27.39,27.45,26.10,26.20,15820200 4-Apr-02,26.49,27.30,26.31,27.05,17899100 3-Apr-02,26.89,27.27,26.27,26.59,18552400 2-Apr-02,27.27,27.27,26.97,27.01,15998200 1-Apr-02,27.00,27.95,26.64,27.76,17360400 28-Mar-02,26.61,27.20,26.60,27.14,17926400 27-Mar-02,26.09,26.20,25.65,25.99,12670000 26-Mar-02,25.49,26.47,25.18,26.17,18381900 25-Mar-02,26.17,26.49,25.59,25.64,17922400 22-Mar-02,26.50,26.70,25.76,25.76,18087000 21-Mar-02,25.55,26.17,25.33,26.01,12754200 20-Mar-02,25.83,26.04,25.48,25.50,12814500 19-Mar-02,26.16,26.42,25.83,26.28,12869000 18-Mar-02,25.92,26.36,25.55,25.91,21404100 15-Mar-02,25.05,25.38,24.41,25.36,14808800 14-Mar-02,24.85,25.17,24.62,24.65,15433500 13-Mar-02,24.62,25.17,24.36,24.75,20209000 12-Mar-02,24.95,25.41,24.88,25.33,17737600 11-Mar-02,26.28,26.67,25.53,25.90,19642000 8-Mar-02,26.25,27.19,26.20,26.76,24227900 7-Mar-02,25.74,26.02,25.08,25.68,21041300 6-Mar-02,25.20,25.57,24.55,25.27,17657800 5-Mar-02,24.79,25.86,24.76,25.49,22646500 4-Mar-02,23.90,25.28,23.85,25.03,27981100 1-Mar-02,22.28,24.00,22.25,23.99,26547500 28-Feb-02,22.12,22.61,21.69,21.74,19272900 27-Feb-02,22.50,22.99,21.98,22.14,17708300 26-Feb-02,22.48,22.72,21.86,22.28,16094800 25-Feb-02,21.42,22.76,21.40,22.47,20311100 22-Feb-02,21.74,22.10,20.92,21.24,24408200 21-Feb-02,22.97,23.00,21.48,21.64,26926800 20-Feb-02,22.79,23.30,22.50,23.28,20980000 19-Feb-02,23.23,23.39,22.65,22.90,19939400 15-Feb-02,23.52,23.92,23.35,23.60,16509000 14-Feb-02,23.83,24.33,23.39,23.66,23128500 13-Feb-02,22.67,24.01,22.67,23.98,39570500 12-Feb-02,22.45,22.99,22.20,22.35,23523900 11-Feb-02,21.91,22.88,21.86,22.84,20640800 8-Feb-02,21.20,21.63,20.72,21.54,22991300 7-Feb-02,22.15,22.47,20.91,20.91,20522800 6-Feb-02,22.55,22.55,21.63,22.33,16145000 5-Feb-02,21.77,22.60,21.76,22.22,19934600 4-Feb-02,21.92,22.35,21.76,21.99,25229100 1-Feb-02,21.62,22.04,21.13,21.48,16594000 31-Jan-02,21.81,22.00,21.33,21.83,15379900 30-Jan-02,20.75,21.60,20.50,21.58,19585500 29-Jan-02,21.19,21.67,20.47,20.66,15666500 28-Jan-02,21.27,21.75,20.92,21.44,16202400 25-Jan-02,20.09,21.20,20.02,21.07,13068200 24-Jan-02,20.70,20.70,19.99,20.01,18946000 23-Jan-02,20.27,20.86,20.15,20.62,17335200 22-Jan-02,20.42,20.42,19.50,19.75,17259300 18-Jan-02,20.02,20.55,19.96,20.17,15591900 17-Jan-02,21.16,21.19,20.00,20.80,26274200 16-Jan-02,21.27,21.32,20.75,20.77,32402200 15-Jan-02,22.69,23.15,21.41,22.81,20262900 14-Jan-02,22.37,23.34,22.37,22.66,19176100 11-Jan-02,23.10,23.40,22.33,22.50,14658300 10-Jan-02,23.16,23.43,22.65,23.00,13634800 9-Jan-02,23.28,24.00,23.10,23.34,19914100 8-Jan-02,22.48,23.16,22.25,22.89,13158100 7-Jan-02,22.90,23.18,22.31,22.37,12661800 4-Jan-02,22.88,23.11,22.23,22.61,14699200 3-Jan-02,20.92,22.93,20.92,22.75,22333800 2-Jan-02,20.42,20.84,20.11,20.83,9640800 31-Dec-01,20.81,20.97,20.05,20.05,7265900 28-Dec-01,20.72,21.00,20.60,20.91,6321800 27-Dec-01,20.38,20.69,20.34,20.51,5077700 26-Dec-01,20.07,20.75,20.07,20.26,5440700 24-Dec-01,20.00,20.17,20.00,20.06,2553900 21-Dec-01,20.30,20.33,19.92,19.99,14431300 20-Dec-01,20.50,20.60,19.62,19.78,15470300 19-Dec-01,21.00,21.20,20.61,20.68,14294800 18-Dec-01,21.77,21.95,21.22,21.38,12585700 17-Dec-01,21.06,21.89,21.05,21.60,13272100 14-Dec-01,20.58,21.44,20.38,21.16,15430900 13-Dec-01,21.49,21.57,20.53,20.54,19792200 12-Dec-01,22.18,22.53,21.52,22.43,20278500 11-Dec-01,22.10,22.67,21.75,21.97,15901800 10-Dec-01,21.94,22.70,21.66,21.78,15552900 7-Dec-01,22.72,22.98,21.75,22.23,16622400 6-Dec-01,22.88,23.14,22.43,22.74,18637400 5-Dec-01,21.53,23.29,21.50,22.95,28640200 4-Dec-01,20.12,21.25,19.68,21.22,18368100 3-Dec-01,19.68,20.18,19.41,19.64,13448400 30-Nov-01,20.01,20.14,19.70,19.87,18161500 29-Nov-01,20.02,20.83,19.76,20.73,17315500 28-Nov-01,20.75,21.07,20.00,20.02,18269600 27-Nov-01,19.99,21.55,19.81,20.99,28477500 26-Nov-01,19.25,20.26,19.21,20.03,15946000 23-Nov-01,19.00,19.42,18.65,19.38,5185600 21-Nov-01,18.25,19.14,18.23,19.00,13038500 20-Nov-01,19.15,19.16,18.30,18.33,15202700 19-Nov-01,19.83,19.83,18.96,19.42,16584700 16-Nov-01,19.69,19.92,19.50,19.63,14187700 15-Nov-01,19.25,20.08,19.17,19.55,35081800 14-Nov-01,20.68,21.08,19.70,20.35,22021800 13-Nov-01,20.14,20.44,19.86,20.40,17510500 12-Nov-01,19.12,19.78,18.28,19.48,18622600 9-Nov-01,19.17,19.74,19.00,19.28,15285400 8-Nov-01,20.01,20.67,18.98,19.20,23243200 7-Nov-01,19.74,20.45,19.58,19.67,16259700 6-Nov-01,19.10,19.98,18.93,19.96,17087200 5-Nov-01,19.18,19.75,18.98,19.23,14623100 2-Nov-01,18.52,19.12,18.07,18.99,21419700 1-Nov-01,17.50,18.52,16.86,18.50,19246400 31-Oct-01,16.85,17.75,16.75,17.06,15350700 30-Oct-01,17.06,17.33,16.38,16.62,15696500 29-Oct-01,18.40,18.41,17.25,17.25,12692400 26-Oct-01,18.52,19.00,18.11,18.43,18013600 25-Oct-01,17.45,18.95,16.81,18.72,21211700 24-Oct-01,16.90,17.83,16.62,17.67,17224100 23-Oct-01,17.48,17.82,16.76,16.93,20828900 22-Oct-01,15.98,17.40,15.85,17.39,20781600 19-Oct-01,15.60,16.48,15.38,16.27,13629800 18-Oct-01,15.99,16.42,15.50,15.80,15112200 17-Oct-01,17.70,17.73,16.01,16.07,19234700 16-Oct-01,16.53,17.24,16.38,17.23,15760200 15-Oct-01,16.83,17.05,16.37,16.82,15476400 12-Oct-01,17.40,17.83,16.50,17.58,18461700 11-Oct-01,16.41,18.00,16.38,17.93,23550200 10-Oct-01,15.13,16.24,15.00,16.20,18942800 9-Oct-01,16.57,16.65,15.50,15.57,18146900 8-Oct-01,15.59,16.95,15.40,16.93,17939800 5-Oct-01,15.40,16.01,14.70,15.77,15356400 4-Oct-01,15.73,16.35,15.02,15.49,22314500 3-Oct-01,13.60,15.32,13.30,15.17,28252600 2-Oct-01,14.07,14.25,13.51,13.75,17552800 1-Oct-01,14.31,14.53,13.85,14.21,19035200 28-Sep-01,14.19,14.59,13.71,14.22,20230700 27-Sep-01,14.52,14.62,13.52,13.94,17594300 26-Sep-01,15.44,15.61,14.41,14.56,16669300 25-Sep-01,14.70,15.60,14.56,15.27,21793900 24-Sep-01,15.09,15.32,14.47,14.67,23165600 21-Sep-01,13.84,14.77,13.62,14.62,28781500 20-Sep-01,15.10,15.82,14.61,14.74,29010900 19-Sep-01,16.58,16.96,14.20,15.56,39823200 18-Sep-01,18.52,18.54,16.56,16.56,24440600 17-Sep-01,18.51,19.26,18.02,18.33,23074000 10-Sep-01,20.07,20.52,19.74,20.01,20423300 7-Sep-01,19.99,20.93,19.98,20.14,22404900 6-Sep-01,20.50,20.81,19.99,20.10,21316100 5-Sep-01,21.02,21.53,20.15,21.03,22781600 4-Sep-01,21.36,22.23,20.90,20.97,14498400 31-Aug-01,21.10,21.77,20.90,21.55,12489300 30-Aug-01,21.63,22.08,21.12,21.55,11874900 29-Aug-01,22.76,22.83,21.65,21.88,12768100 28-Aug-01,23.58,23.73,22.60,22.61,12487100 27-Aug-01,23.42,24.08,23.25,23.62,10570600 24-Aug-01,22.42,23.64,22.33,23.44,13468800 23-Aug-01,21.83,22.45,21.75,22.07,11572000 22-Aug-01,21.56,22.09,21.10,21.95,14319000 21-Aug-01,21.69,22.02,21.00,21.00,11531100 20-Aug-01,21.40,22.10,21.35,21.62,11132200 17-Aug-01,21.72,22.08,21.25,21.28,11479100 16-Aug-01,21.50,22.37,21.27,22.35,14174000 15-Aug-01,22.30,22.53,21.82,21.87,18733100 14-Aug-01,22.53,22.70,21.80,21.83,13419100 13-Aug-01,22.42,22.61,21.82,22.42,11629200 10-Aug-01,22.43,22.67,21.67,22.24,15208800 9-Aug-01,22.34,22.78,21.86,22.42,13010800 8-Aug-01,23.30,23.82,22.23,22.37,13275600 7-Aug-01,23.68,23.70,23.02,23.40,13636300 6-Aug-01,24.35,24.50,24.10,24.36,7725000 3-Aug-01,24.83,25.00,24.58,24.80,10923900 2-Aug-01,24.59,25.12,24.42,25.00,18983200 1-Aug-01,23.81,24.48,23.58,24.15,19933000 31-Jul-01,23.44,23.74,22.87,22.93,14320400 30-Jul-01,23.40,23.67,22.99,23.30,11473500 27-Jul-01,22.83,23.61,22.73,23.13,15090400 26-Jul-01,21.70,22.99,21.30,22.59,15447400 25-Jul-01,21.58,21.92,21.00,21.89,12700400 24-Jul-01,21.66,22.20,21.04,21.48,11795300 23-Jul-01,22.44,22.53,21.75,21.79,9393500 20-Jul-01,22.25,22.58,21.88,22.52,11975400 19-Jul-01,22.24,23.15,22.14,22.65,16763600 18-Jul-01,21.52,22.32,21.38,21.78,15965800 17-Jul-01,20.25,22.40,19.93,22.28,38277500 16-Jul-01,23.00,23.45,20.83,20.98,27708500 13-Jul-01,23.14,23.83,22.55,23.18,14012200 12-Jul-01,22.85,23.50,22.75,23.22,19096000 11-Jul-01,21.50,22.12,21.08,22.03,15828600 10-Jul-01,22.74,22.84,21.32,21.39,17141900 9-Jul-01,22.83,22.86,21.91,22.41,13636100 6-Jul-01,23.92,23.99,22.59,22.65,15527000 5-Jul-01,24.70,24.75,24.20,24.34,11835800 3-Jul-01,25.09,25.17,24.78,25.11,6576800 2-Jul-01,25.05,25.23,24.77,24.98,16077600 29-Jun-01,25.07,26.48,24.00,24.55,20669800 28-Jun-01,24.75,25.50,24.56,24.78,22581000 27-Jun-01,24.97,24.98,24.11,24.24,17635700 26-Jun-01,24.45,25.28,24.19,25.10,18952000 25-Jun-01,24.77,25.05,24.31,24.93,13060800 22-Jun-01,23.77,24.94,23.77,24.52,20588000 21-Jun-01,23.90,24.51,23.42,23.81,20803700 20-Jun-01,23.56,24.25,22.90,24.18,26786900 19-Jun-01,25.80,25.89,23.62,24.16,23828200 18-Jun-01,25.62,25.75,24.66,24.67,17081300 15-Jun-01,25.10,26.00,24.41,24.95,20582800 14-Jun-01,26.50,26.62,25.42,25.50,19140600 13-Jun-01,27.30,28.24,26.79,26.89,16966900 12-Jun-01,26.05,27.72,25.50,27.25,14671400 11-Jun-01,26.82,26.90,26.61,26.81,9933200 8-Jun-01,28.14,28.14,27.08,27.64,13761000 7-Jun-01,26.12,28.05,26.12,28.01,21210500 6-Jun-01,26.33,26.92,25.60,26.33,16845700 5-Jun-01,25.34,26.85,25.30,26.25,14848400 4-Jun-01,25.77,25.88,24.88,25.03,10448900 1-Jun-01,25.67,26.09,24.66,25.66,17047600 31-May-01,24.25,25.75,24.17,24.97,18348500 30-May-01,25.30,25.35,24.24,24.48,19967800 29-May-01,26.70,26.76,25.71,25.92,12026600 25-May-01,27.50,27.87,26.84,26.85,13956600 24-May-01,26.64,27.25,26.14,27.21,16904900 23-May-01,27.80,27.89,26.35,26.47,17479400 22-May-01,28.75,29.25,28.27,28.30,16253500 21-May-01,27.40,29.00,27.38,28.76,21424000 18-May-01,26.51,27.55,26.50,27.50,13849400 17-May-01,26.90,27.40,26.50,26.95,19854600 16-May-01,24.58,27.14,24.38,27.05,34422400 15-May-01,24.76,25.77,24.51,24.94,22057300 14-May-01,25.76,25.84,24.27,24.84,16694600 11-May-01,25.65,26.35,25.41,25.85,13855900 10-May-01,27.15,27.17,25.50,25.50,26421100 9-May-01,25.42,26.28,24.81,25.52,18273800 8-May-01,25.85,26.33,25.36,26.30,15456800 7-May-01,25.78,26.25,24.88,25.37,17228300 4-May-01,25.25,26.58,25.07,25.76,20159500 3-May-01,26.90,26.90,25.88,26.30,18463600 2-May-01,28.00,28.28,27.05,27.34,20168900 1-May-01,27.41,27.90,26.10,27.52,25978500 30-Apr-01,27.33,28.42,26.58,27.30,23985400 27-Apr-01,26.26,27.08,25.75,26.94,19283100 26-Apr-01,27.23,27.45,24.98,25.42,29077700 25-Apr-01,25.92,27.16,24.62,26.59,33639300 24-Apr-01,26.74,27.85,25.25,25.85,28020200 23-Apr-01,27.25,27.56,26.02,26.36,22083400 20-Apr-01,29.23,29.55,27.62,28.16,27803100 19-Apr-01,26.88,29.52,26.00,29.36,40814300 18-Apr-01,25.45,27.52,25.27,26.51,45868700 17-Apr-01,23.41,25.10,23.07,23.80,27883300 16-Apr-01,24.02,24.88,23.42,23.96,25406800 12-Apr-01,22.67,24.95,22.50,24.74,27665600 11-Apr-01,23.74,24.45,22.50,23.01,38597600 10-Apr-01,19.58,22.00,19.14,21.38,30552500 9-Apr-01,20.00,20.11,18.38,19.41,26704200 6-Apr-01,20.62,21.03,19.50,20.00,28850500 5-Apr-01,19.94,21.44,19.83,21.12,30487800 4-Apr-01,19.97,20.16,18.28,18.91,38840000 3-Apr-01,20.07,20.88,19.51,20.07,35951600 2-Apr-01,21.69,22.07,19.44,20.00,34306100 30-Mar-01,22.28,22.34,21.12,21.75,27594500 29-Mar-01,23.53,24.69,22.07,22.78,34292800 28-Mar-01,24.84,25.75,23.69,23.84,32254700 27-Mar-01,24.25,25.72,23.94,25.44,31000900 26-Mar-01,25.41,25.47,24.22,24.66,19038100 23-Mar-01,25.73,26.20,24.16,25.12,37762200 22-Mar-01,23.00,24.78,23.00,24.72,36076100 21-Mar-01,21.84,23.19,21.53,22.44,27853600 20-Mar-01,23.62,23.75,21.41,21.41,24616200 19-Mar-01,22.16,23.57,21.62,23.32,16898300 16-Mar-01,22.32,22.94,21.78,22.12,24930200 15-Mar-01,24.76,24.91,22.75,23.07,25943300 14-Mar-01,23.07,24.82,23.07,24.09,32963100 13-Mar-01,23.62,24.32,22.50,23.94,29562200 12-Mar-01,22.50,24.62,22.22,23.16,31448600 9-Mar-01,24.44,24.75,23.04,23.38,19580900 8-Mar-01,24.91,25.57,24.59,25.16,19952000 7-Mar-01,24.94,25.07,24.25,24.91,16367300 6-Mar-01,24.62,25.75,24.62,24.91,24890000 5-Mar-01,23.50,24.38,23.25,23.78,15833600 2-Mar-01,21.84,24.32,21.12,22.62,28892200 1-Mar-01,20.19,22.69,19.53,22.67,29994800 28-Feb-01,22.38,22.38,20.50,21.12,27108600 27-Feb-01,24.00,24.09,22.26,22.50,16924800 26-Feb-01,23.75,24.22,22.59,23.91,20532500 23-Feb-01,23.62,24.00,22.03,23.97,21785600 22-Feb-01,23.50,24.88,22.62,23.41,27520600 21-Feb-01,22.25,24.82,22.25,23.32,22018100 20-Feb-01,24.19,24.50,22.94,22.97,15334100 16-Feb-01,23.78,24.36,23.22,24.11,22200600 15-Feb-01,23.88,25.32,23.72,24.72,27809200 14-Feb-01,21.00,23.84,21.00,23.41,47884500 13-Feb-01,22.25,22.50,20.50,20.62,21314700 12-Feb-01,21.41,22.50,21.10,22.00,14227500 9-Feb-01,21.19,22.53,21.00,21.32,16253300 8-Feb-01,21.88,22.91,21.09,21.19,18784100 7-Feb-01,22.82,23.32,21.50,22.38,17033900 6-Feb-01,22.59,23.57,22.41,22.94,12824100 5-Feb-01,23.34,23.38,22.01,22.91,16220500 2-Feb-01,25.47,25.82,23.82,23.88,12099500 1-Feb-01,25.19,25.57,24.78,25.28,12999800 31-Jan-01,25.50,26.41,25.07,25.16,33864700 30-Jan-01,25.32,26.97,25.12,26.22,25792000 29-Jan-01,23.84,25.41,23.72,25.09,11340500 26-Jan-01,23.62,24.19,23.53,23.94,20334700 25-Jan-01,24.50,24.84,24.12,24.38,17390000 24-Jan-01,24.32,25.00,24.07,24.82,21997800 23-Jan-01,23.91,24.32,23.47,24.12,16597500 22-Jan-01,24.91,24.91,24.00,24.47,16383600 19-Jan-01,25.44,25.75,24.44,24.97,24607000 18-Jan-01,24.00,25.12,23.47,25.03,29494700 17-Jan-01,24.44,24.66,23.62,24.09,37646200 16-Jan-01,22.94,22.94,21.57,22.22,21339400 12-Jan-01,23.07,23.94,22.34,23.19,29760800 11-Jan-01,22.16,23.50,21.57,23.19,37800500 10-Jan-01,21.16,22.59,20.88,22.38,28997300 9-Jan-01,23.28,23.32,21.34,21.75,21800000 8-Jan-01,21.22,22.94,20.97,22.88,23777000 5-Jan-01,22.50,23.03,21.22,21.34,22138700 4-Jan-01,23.94,25.07,21.78,22.19,48204500 3-Jan-01,19.53,24.91,19.50,24.82,33802800 2-Jan-01,19.41,20.50,19.00,19.75,19243100 29-Dec-00,19.25,20.19,19.00,19.09,12700900 28-Dec-00,20.00,20.44,19.12,19.72,14995300 27-Dec-00,18.82,19.94,18.62,19.78,18211900 26-Dec-00,19.34,19.66,18.59,19.00,9681700 22-Dec-00,18.32,19.53,17.82,19.32,24762200 21-Dec-00,18.84,20.09,17.07,17.69,25768700 20-Dec-00,19.12,19.32,18.25,18.91,19000300 19-Dec-00,19.94,21.31,19.44,19.50,19521900 18-Dec-00,20.32,20.91,19.59,19.88,14002200 15-Dec-00,20.29,20.38,19.22,19.75,20963100 14-Dec-00,21.22,21.88,20.07,20.19,13613800 13-Dec-00,21.78,22.84,21.03,21.34,25406400 12-Dec-00,24.03,24.22,22.72,22.75,23440900 11-Dec-00,22.00,25.62,21.57,25.47,26635600 8-Dec-00,21.38,22.32,21.34,22.09,17633600 7-Dec-00,19.91,21.00,19.41,20.00,9036300 6-Dec-00,22.07,22.25,20.25,20.28,13645300 5-Dec-00,19.94,22.12,19.94,22.07,18223900 4-Dec-00,19.69,20.09,18.62,19.25,13195500 1-Dec-00,20.57,20.75,19.00,19.28,22786700 30-Nov-00,20.28,21.03,19.47,20.22,21650500 29-Nov-00,20.38,21.84,20.05,21.47,15634400 28-Nov-00,22.00,22.38,20.25,20.53,21047700 27-Nov-00,23.72,24.32,21.75,22.07,16914700 24-Nov-00,22.09,23.47,21.88,23.34,7662200 22-Nov-00,20.94,22.38,20.88,21.12,14475200 21-Nov-00,20.78,21.62,20.00,21.16,15980600 20-Nov-00,20.32,21.50,20.00,20.57,15872500 17-Nov-00,20.62,21.32,19.78,20.57,13782800 16-Nov-00,21.57,22.34,20.54,20.82,28225600 15-Nov-00,21.34,22.00,20.25,21.38,25843900 14-Nov-00,21.12,21.57,20.22,20.72,16291600 13-Nov-00,19.78,21.16,19.25,20.12,21113700 10-Nov-00,21.22,21.32,20.32,20.47,12271400 9-Nov-00,20.47,22.75,20.32,21.69,21611900 8-Nov-00,23.75,23.78,21.66,21.72,13742300 7-Nov-00,24.38,24.57,23.22,23.44,11981400 6-Nov-00,25.19,25.22,24.09,24.66,11472000 3-Nov-00,25.53,25.57,24.57,24.72,11285500 2-Nov-00,25.69,26.38,25.12,26.00,14332300 1-Nov-00,23.94,26.07,23.59,25.62,24304200 31-Oct-00,25.41,27.00,25.19,26.57,14052500 30-Oct-00,24.38,26.00,24.07,24.82,13201300 27-Oct-00,26.75,27.07,23.22,24.07,24180600 26-Oct-00,24.69,26.69,24.12,26.53,17912200 25-Oct-00,24.62,25.72,23.91,24.38,15778800 24-Oct-00,25.88,26.03,24.19,24.72,18062800 23-Oct-00,25.88,27.69,25.69,26.72,15995300 20-Oct-00,24.59,25.97,24.09,25.25,17313100 19-Oct-00,23.00,25.44,22.57,25.25,18483800 18-Oct-00,21.94,22.62,20.25,21.03,31452300 17-Oct-00,24.44,24.50,21.32,22.25,34401900 16-Oct-00,26.62,26.62,24.00,24.38,21681700 13-Oct-00,24.00,27.19,23.88,26.75,21083100 12-Oct-00,27.07,27.57,24.00,24.03,30721400 11-Oct-00,24.38,27.00,24.25,25.78,27683900 10-Oct-00,27.12,27.22,24.32,24.53,31858100 9-Oct-00,26.88,28.59,25.82,27.88,13791700 6-Oct-00,26.50,27.38,26.00,27.09,14903900 5-Oct-00,26.89,27.25,25.88,26.57,15850600 4-Oct-00,25.84,27.50,25.82,27.09,27421200 3-Oct-00,27.82,27.84,25.75,25.82,29033100 2-Oct-00,30.38,30.47,28.25,28.34,16255200 29-Sep-00,31.36,31.62,29.11,29.66,15303100 28-Sep-00,31.50,32.53,31.03,31.94,22973100 27-Sep-00,33.19,33.31,31.19,31.94,15156700 26-Sep-00,33.78,34.31,32.47,32.72,15435800 25-Sep-00,35.78,36.12,33.28,33.72,15745000 22-Sep-00,34.10,35.00,33.56,35.00,28990000 21-Sep-00,37.88,38.12,36.50,36.75,13973000 20-Sep-00,38.53,39.38,37.25,39.00,13372800 19-Sep-00,36.63,38.56,36.12,38.47,9683800 18-Sep-00,36.78,37.85,35.75,36.12,11470500 15-Sep-00,36.97,37.44,35.65,36.56,11594200 14-Sep-00,37.94,38.25,37.00,37.47,8558400 13-Sep-00,35.28,37.50,35.06,37.00,11541600 12-Sep-00,37.56,37.94,35.62,35.85,14527300 11-Sep-00,37.72,39.22,36.88,37.60,14892300 8-Sep-00,39.47,39.56,37.50,37.75,14069700 7-Sep-00,39.90,40.81,38.94,40.19,14620500 6-Sep-00,41.31,42.50,39.50,39.81,13738100 5-Sep-00,41.94,42.75,41.75,42.22,7115000 1-Sep-00,43.85,44.44,41.85,42.40,10071700 31-Aug-00,42.53,43.81,41.60,43.15,10680000 30-Aug-00,42.40,42.81,41.62,42.19,7463300 29-Aug-00,41.72,42.88,41.25,42.53,8202300 28-Aug-00,42.31,42.75,41.15,41.60,8215500 25-Aug-00,42.78,43.15,41.50,42.35,8811700 24-Aug-00,42.62,43.53,42.19,42.78,11265300 23-Aug-00,40.75,42.75,40.62,42.72,11465600 22-Aug-00,41.19,41.94,40.28,41.00,9017700 21-Aug-00,42.38,42.38,40.25,40.72,10528300 18-Aug-00,42.35,43.06,41.50,41.97,12805000 17-Aug-00,40.49,42.12,39.75,42.00,15272700 16-Aug-00,39.56,40.90,39.50,40.47,19555300 15-Aug-00,37.69,39.40,37.65,38.90,18152800 14-Aug-00,34.97,37.53,34.75,37.40,14880300 11-Aug-00,34.40,34.97,33.25,34.60,13423300 10-Aug-00,35.60,36.60,34.22,34.62,29894500 9-Aug-00,36.62,37.25,36.00,36.06,25684200 8-Aug-00,35.56,35.88,34.53,35.28,12790800 7-Aug-00,34.47,35.50,33.89,34.97,17926100 4-Aug-00,35.62,35.75,32.97,33.88,22258300 3-Aug-00,33.12,36.00,32.38,34.50,42791900 2-Aug-00,37.35,38.72,36.22,36.28,12336100 1-Aug-00,38.53,38.62,36.94,37.28,10464100 31-Jul-00,37.53,38.75,36.44,37.94,13680600 28-Jul-00,37.85,38.69,36.00,37.00,22361700 27-Jul-00,39.97,40.22,36.88,37.15,23388300 26-Jul-00,41.38,41.69,39.81,40.94,19505200 25-Jul-00,41.06,42.44,40.53,42.25,11333300 24-Jul-00,39.97,41.12,39.06,40.25,15161300 21-Jul-00,40.90,40.94,38.90,39.06,18865500 20-Jul-00,43.72,44.60,40.69,41.60,18190300 19-Jul-00,44.15,44.25,42.69,43.35,9741700 18-Jul-00,45.94,46.62,44.19,44.44,13117800 17-Jul-00,44.40,47.25,44.35,47.00,13989700 14-Jul-00,44.69,44.97,43.69,44.35,7733900 13-Jul-00,45.06,45.47,43.12,43.88,10253900 12-Jul-00,44.38,45.50,43.88,44.50,10530500 11-Jul-00,44.60,45.50,43.12,43.50,15014200 10-Jul-00,43.72,45.97,42.50,44.31,15684500 7-Jul-00,44.65,45.47,44.25,44.78,10226400 6-Jul-00,42.22,43.75,41.31,43.35,17003300 5-Jul-00,44.75,44.75,41.38,41.72,21005300 3-Jul-00,45.40,46.31,45.31,46.28,2747000 30-Jun-00,44.25,45.94,44.19,45.31,7479500 29-Jun-00,44.75,45.47,43.81,44.53,8888000 28-Jun-00,44.65,46.50,43.81,45.28,9570500 27-Jun-00,45.06,45.62,43.38,44.06,9255900 26-Jun-00,46.19,46.19,44.60,44.75,8267000 23-Jun-00,47.38,47.50,45.12,45.38,8523800 22-Jun-00,48.78,48.90,46.88,46.94,8042700 21-Jun-00,47.29,49.03,47.00,48.97,9546600 20-Jun-00,48.47,49.25,47.25,48.10,12783000 19-Jun-00,46.06,48.31,45.31,48.25,11540200 16-Jun-00,45.10,46.81,43.53,46.53,15228600 15-Jun-00,43.33,44.69,43.06,44.22,12113100 14-Jun-00,46.15,46.25,43.00,43.03,10154500 13-Jun-00,45.50,46.31,44.50,46.06,9917700 12-Jun-00,47.50,47.50,45.25,45.53,5986700 9-Jun-00,47.78,47.81,46.85,47.44,7265000 8-Jun-00,47.44,47.88,45.62,46.35,7424500 7-Jun-00,45.19,46.90,44.72,46.78,10112300 6-Jun-00,46.62,47.53,44.50,44.65,10393100 5-Jun-00,45.75,47.75,45.00,46.81,12125300 2-Jun-00,47.38,47.75,46.19,46.78,14185300 1-Jun-00,43.00,44.62,42.75,43.88,13039400 31-May-00,42.38,43.88,41.53,41.75,16553000 30-May-00,38.88,42.56,38.72,42.47,14219700 26-May-00,38.62,39.50,36.40,37.15,11032300 25-May-00,39.62,42.00,37.50,38.35,20543600 24-May-00,36.06,39.97,34.40,39.22,25956700 23-May-00,39.06,40.15,35.75,35.94,20735300 22-May-00,40.38,40.50,35.81,39.65,24689500 19-May-00,42.25,42.75,39.62,40.10,18504100 18-May-00,45.28,45.38,42.40,42.50,10594500 17-May-00,45.44,47.00,44.75,44.81,13912500 16-May-00,45.92,47.12,44.75,46.47,15221700 15-May-00,42.25,44.50,40.81,44.50,10910600 12-May-00,43.40,44.75,41.88,42.22,14316300 11-May-00,41.50,43.38,39.90,42.62,39859700 10-May-00,44.90,45.12,41.75,42.31,32865600 9-May-00,48.53,48.81,45.12,45.31,17191100 8-May-00,50.28,51.50,47.47,47.85,15309200 5-May-00,50.28,51.44,50.12,50.94,14392700 4-May-00,48.38,49.44,46.88,48.88,15320000 packet/data/equities/ba0100644000076400007640000005575007525024672014057 0ustar iankiankDate,Open,High,Low,Close,Volume 2-Aug-02,40.63,40.86,39.10,39.85,2937200 1-Aug-02,41.00,41.40,40.35,40.63,3374200 31-Jul-02,41.66,41.66,40.35,41.52,4392400 30-Jul-02,41.99,42.00,40.60,41.65,5213200 29-Jul-02,42.94,42.99,41.30,42.03,5596700 26-Jul-02,42.50,42.51,40.14,42.00,3402100 25-Jul-02,41.00,42.94,40.31,42.94,5145300 24-Jul-02,37.50,41.37,37.10,41.19,5581600 23-Jul-02,38.45,39.90,38.10,38.85,5608500 22-Jul-02,39.80,40.15,37.58,38.53,5745600 19-Jul-02,40.89,41.00,39.56,39.92,4261500 18-Jul-02,43.09,43.10,41.23,41.29,3626200 17-Jul-02,42.42,43.19,42.15,42.94,6341000 16-Jul-02,40.05,41.80,40.05,40.87,5454200 15-Jul-02,39.85,39.87,37.20,39.76,5209100 12-Jul-02,41.24,41.49,39.13,40.15,3227900 11-Jul-02,40.80,41.47,39.55,41.17,5696900 10-Jul-02,43.52,43.70,40.46,40.80,6568600 9-Jul-02,43.99,44.69,43.09,43.22,2634600 8-Jul-02,44.72,45.09,43.87,44.10,2690300 5-Jul-02,44.20,45.20,44.05,45.00,1805700 3-Jul-02,44.14,44.45,43.17,43.77,3033300 2-Jul-02,44.40,44.78,43.86,44.54,2878200 1-Jul-02,44.97,45.28,44.56,44.60,3513300 28-Jun-02,44.35,45.09,44.10,45.00,5541300 27-Jun-02,43.00,44.88,42.96,44.80,3375500 26-Jun-02,41.87,43.10,41.87,42.72,3375300 25-Jun-02,43.30,44.12,42.82,42.87,3939000 24-Jun-02,42.92,43.67,41.52,42.74,3751900 21-Jun-02,43.03,43.72,42.74,42.97,3668300 20-Jun-02,43.13,44.49,43.02,43.77,2671600 19-Jun-02,43.47,44.10,43.10,43.13,1965500 18-Jun-02,43.95,44.28,43.40,43.78,1984200 17-Jun-02,42.54,44.35,42.54,44.00,3068400 14-Jun-02,42.75,43.00,41.78,42.53,2537600 13-Jun-02,43.30,43.75,42.39,42.50,2378900 12-Jun-02,42.62,43.99,42.60,43.83,2183000 11-Jun-02,43.10,43.80,42.30,42.50,1819500 10-Jun-02,42.95,43.50,42.83,42.92,1850700 7-Jun-02,41.96,43.25,41.75,42.76,2987600 6-Jun-02,42.54,42.77,41.92,41.96,1764200 5-Jun-02,42.10,42.79,41.87,42.54,1642100 4-Jun-02,41.87,42.40,41.45,41.85,2779900 3-Jun-02,43.40,43.87,41.83,41.86,2926500 31-May-02,43.82,44.09,42.65,42.65,2598400 30-May-02,42.60,44.19,42.46,43.66,3062000 29-May-02,42.70,43.50,42.65,43.00,2925800 28-May-02,43.35,43.35,42.75,43.00,2429500 24-May-02,44.00,44.00,43.05,43.35,2198100 23-May-02,43.83,44.50,43.39,44.15,2628800 22-May-02,44.25,44.59,43.29,44.41,2441000 21-May-02,45.14,45.75,44.11,44.35,2608300 20-May-02,45.64,46.03,44.87,45.13,2440400 17-May-02,45.23,45.61,44.80,45.42,2418300 16-May-02,44.85,45.18,44.52,45.00,2272100 15-May-02,45.38,45.38,44.51,44.55,2210200 14-May-02,45.41,45.57,44.47,45.31,3432200 13-May-02,43.74,44.45,43.60,44.11,2412200 10-May-02,44.23,44.58,43.39,43.47,4264800 9-May-02,44.43,45.07,44.33,44.81,2411800 8-May-02,43.14,44.57,43.14,44.24,2822100 7-May-02,43.44,43.69,42.64,42.98,3633700 6-May-02,44.83,45.04,43.17,43.22,2519200 3-May-02,44.50,44.93,43.69,44.46,2119400 2-May-02,45.32,45.33,44.31,44.70,2616800 1-May-02,44.73,45.33,43.67,45.33,4288900 30-Apr-02,43.64,45.56,43.32,44.43,5521100 29-Apr-02,43.54,43.83,42.94,43.47,6451500 26-Apr-02,41.84,42.30,41.15,41.35,2785300 25-Apr-02,42.09,42.84,40.85,41.74,4308800 24-Apr-02,42.74,43.07,42.19,42.24,3312500 23-Apr-02,43.03,43.61,41.84,42.34,5398100 22-Apr-02,42.64,43.22,42.24,42.98,4359100 19-Apr-02,43.90,44.13,42.58,42.59,8358500 18-Apr-02,45.21,45.21,41.83,43.54,16723200 17-Apr-02,47.37,47.38,44.83,45.20,10684800 16-Apr-02,48.27,48.80,48.01,48.52,2105400 15-Apr-02,48.02,48.27,47.35,47.47,2017800 12-Apr-02,49.07,49.11,48.05,48.37,2058800 11-Apr-02,49.61,49.86,48.42,48.64,3757500 10-Apr-02,48.39,49.54,48.21,49.39,3434200 9-Apr-02,48.82,48.96,48.12,48.39,2183600 8-Apr-02,47.72,48.94,47.41,48.82,2403200 5-Apr-02,49.27,49.49,47.22,48.11,2654500 4-Apr-02,48.55,49.31,48.38,48.90,2660000 3-Apr-02,48.47,49.66,48.38,48.55,4754600 2-Apr-02,47.74,49.36,47.44,48.91,3427600 1-Apr-02,48.07,48.57,47.62,47.74,2996800 28-Mar-02,47.39,48.54,47.32,48.07,4088900 27-Mar-02,45.88,47.58,45.88,47.15,4907800 26-Mar-02,45.68,46.48,45.37,45.62,2276100 25-Mar-02,46.03,46.66,45.08,45.55,2528900 22-Mar-02,46.82,47.07,45.95,46.22,2989000 21-Mar-02,46.56,47.67,46.17,47.49,2708200 20-Mar-02,47.42,47.47,46.72,46.85,2393600 19-Mar-02,47.45,48.07,47.04,47.86,2768800 18-Mar-02,48.09,48.26,46.60,47.45,3092900 15-Mar-02,47.50,47.81,46.24,47.80,6360100 14-Mar-02,49.05,49.05,47.16,47.43,5426700 13-Mar-02,49.99,50.06,48.72,49.04,3415300 12-Mar-02,49.69,50.29,49.27,50.09,4091100 11-Mar-02,49.22,50.88,48.87,50.69,4624300 8-Mar-02,49.31,49.70,48.75,49.22,4340100 7-Mar-02,49.61,49.81,47.32,48.30,3859100 6-Mar-02,48.04,49.67,47.56,49.67,3690700 5-Mar-02,48.92,48.92,47.23,48.03,3606200 4-Mar-02,47.82,49.35,47.72,48.95,3743600 1-Mar-02,46.38,47.66,46.33,47.66,3936800 28-Feb-02,45.84,47.29,45.73,45.79,4099400 27-Feb-02,45.48,46.69,45.25,45.73,4545300 26-Feb-02,44.57,45.29,44.08,44.98,3880300 25-Feb-02,44.58,44.83,43.74,44.77,3310500 22-Feb-02,43.71,44.90,43.21,44.59,4148600 21-Feb-02,43.09,44.93,43.04,44.04,5014600 20-Feb-02,43.64,43.79,42.39,43.15,5053200 19-Feb-02,43.94,43.97,43.24,43.55,5718300 15-Feb-02,44.60,44.84,44.19,44.73,3735900 14-Feb-02,44.53,44.63,43.84,44.60,3145300 13-Feb-02,43.44,44.82,43.36,44.73,5587900 12-Feb-02,42.59,43.19,42.45,42.99,4444100 11-Feb-02,41.74,43.04,41.56,42.84,3976900 8-Feb-02,40.90,41.74,40.66,41.54,2557500 7-Feb-02,41.02,41.31,40.81,40.91,2139500 6-Feb-02,40.58,41.34,40.41,40.83,3395100 5-Feb-02,40.53,41.16,40.18,40.58,3253200 4-Feb-02,41.22,41.48,40.48,40.78,4489400 1-Feb-02,40.68,41.32,40.58,41.13,4728700 31-Jan-02,39.73,40.63,39.56,40.63,4390700 30-Jan-02,39.54,40.12,38.74,39.68,3244300 29-Jan-02,40.85,40.96,39.77,39.91,2640900 28-Jan-02,40.40,40.68,40.02,40.58,2010200 25-Jan-02,39.71,40.16,39.43,40.16,3090800 24-Jan-02,39.29,39.93,39.09,39.68,5671700 23-Jan-02,39.74,40.51,37.70,39.02,8882200 22-Jan-02,39.39,39.62,38.96,39.47,2796100 18-Jan-02,38.03,39.31,37.73,38.84,2805300 17-Jan-02,38.25,38.37,37.35,38.03,3092700 16-Jan-02,38.35,38.79,37.72,37.72,3783300 15-Jan-02,38.30,39.18,38.13,39.04,3246500 14-Jan-02,38.39,38.40,37.77,37.95,2721400 11-Jan-02,39.53,39.64,38.30,38.39,3433400 10-Jan-02,39.78,39.93,39.32,39.53,2722800 9-Jan-02,40.07,40.57,39.19,39.59,4574400 8-Jan-02,41.14,41.37,39.70,40.01,4211000 7-Jan-02,40.68,41.56,40.60,40.68,6111900 4-Jan-02,39.34,40.08,39.11,40.04,4081100 3-Jan-02,38.10,38.69,38.02,38.44,3491900 2-Jan-02,38.24,38.37,37.55,37.80,3545800 31-Dec-01,38.88,39.11,38.47,38.47,2308900 28-Dec-01,38.62,38.81,38.39,38.79,2348000 27-Dec-01,38.42,38.53,38.25,38.39,2171900 26-Dec-01,38.15,38.54,37.86,38.30,1921200 24-Dec-01,38.24,38.59,37.98,38.12,1245800 21-Dec-01,38.10,38.89,37.85,38.34,6929100 20-Dec-01,37.55,38.77,37.16,37.84,4437900 19-Dec-01,36.06,37.58,36.02,37.21,4767700 18-Dec-01,36.31,37.14,35.98,36.96,3166000 17-Dec-01,37.06,37.37,36.70,36.77,2757400 14-Dec-01,36.86,37.35,36.53,37.25,2517000 13-Dec-01,36.16,37.50,35.72,36.71,2712800 12-Dec-01,37.01,37.01,36.37,36.51,3972100 11-Dec-01,36.91,37.35,36.36,36.78,2886500 10-Dec-01,37.03,37.99,36.42,36.61,3852900 7-Dec-01,37.11,37.25,36.31,37.01,4499800 6-Dec-01,35.89,36.91,35.78,36.82,6270700 5-Dec-01,35.22,35.93,35.15,35.61,4650500 4-Dec-01,34.73,35.11,34.53,35.10,3200400 3-Dec-01,34.82,34.82,33.76,34.72,3092700 30-Nov-01,34.67,34.82,34.33,34.82,3630700 29-Nov-01,34.43,34.92,34.04,34.87,3437100 28-Nov-01,34.86,34.86,33.68,33.90,3843000 27-Nov-01,35.87,35.96,34.87,35.22,3347500 26-Nov-01,35.72,35.87,35.32,35.61,3381500 23-Nov-01,34.81,35.37,34.62,35.35,1168100 21-Nov-01,34.69,34.69,34.07,34.43,1957800 20-Nov-01,34.92,34.92,34.59,34.69,3457000 19-Nov-01,34.73,35.17,34.43,34.82,3807800 16-Nov-01,34.53,34.73,34.33,34.71,3909700 15-Nov-01,33.83,34.28,33.81,33.97,2919500 14-Nov-01,33.68,33.98,33.38,33.83,3694600 13-Nov-01,33.51,33.52,32.77,33.18,3117800 12-Nov-01,32.57,32.85,31.17,32.63,6359200 9-Nov-01,34.69,34.77,32.38,32.81,13761900 8-Nov-01,34.55,35.29,34.15,34.45,2847200 7-Nov-01,34.78,35.06,34.32,34.44,2988900 6-Nov-01,34.45,35.28,33.86,35.06,3370700 5-Nov-01,34.55,35.06,34.15,34.60,4373700 2-Nov-01,33.06,34.10,32.78,33.91,4565100 1-Nov-01,32.08,33.07,31.89,32.76,4550500 31-Oct-01,32.62,33.12,32.00,32.18,4590700 30-Oct-01,33.22,33.75,32.60,32.60,5458600 29-Oct-01,35.42,35.44,33.07,33.31,10025200 26-Oct-01,35.63,37.61,35.59,37.19,11519900 25-Oct-01,33.66,35.49,33.20,35.44,5211400 24-Oct-01,34.20,34.51,33.55,33.80,3792900 23-Oct-01,33.58,34.10,33.36,33.45,3913300 22-Oct-01,33.36,34.15,33.11,33.27,3398700 19-Oct-01,32.93,33.31,32.38,33.02,3233100 18-Oct-01,33.51,33.64,32.09,32.44,5471800 17-Oct-01,34.84,34.99,33.08,33.27,4089900 16-Oct-01,34.82,35.09,34.43,34.67,3418500 15-Oct-01,35.14,35.29,34.33,34.82,4322600 12-Oct-01,35.55,35.55,34.45,35.44,5105700 11-Oct-01,35.44,36.22,35.43,35.71,5386900 10-Oct-01,35.59,36.12,34.94,35.30,4520000 9-Oct-01,36.42,36.49,35.16,35.54,3430100 8-Oct-01,35.73,37.15,35.48,36.15,5169600 5-Oct-01,36.03,36.56,34.50,35.79,3972600 4-Oct-01,36.12,36.40,34.80,35.91,6461800 3-Oct-01,34.06,37.04,33.96,36.12,8582000 2-Oct-01,33.05,34.04,32.70,33.81,7077800 1-Oct-01,33.07,33.81,31.64,31.98,6921500 28-Sep-01,33.97,33.97,32.48,33.07,6780600 27-Sep-01,33.46,34.14,31.69,33.96,9015900 26-Sep-01,34.10,34.20,32.92,33.85,6368500 25-Sep-01,32.82,34.04,32.34,33.89,10210700 24-Sep-01,29.70,32.96,29.70,32.38,14101600 21-Sep-01,27.89,29.91,27.24,29.71,13526500 20-Sep-01,31.62,31.82,29.37,29.38,12043800 19-Sep-01,31.59,33.37,31.52,32.19,15145000 18-Sep-01,35.34,35.69,31.59,32.71,16794700 17-Sep-01,35.19,38.20,34.99,35.34,21271400 10-Sep-01,44.32,45.36,42.90,42.90,6618500 7-Sep-01,47.18,47.38,44.21,44.60,8116200 6-Sep-01,49.45,49.80,47.83,48.21,3942700 5-Sep-01,49.55,50.59,49.26,49.96,3355600 4-Sep-01,49.11,51.30,48.81,49.31,3245700 31-Aug-01,49.85,50.54,49.61,50.54,1939700 30-Aug-01,50.05,50.49,49.52,49.85,2545200 29-Aug-01,51.13,51.33,49.86,50.05,3541600 28-Aug-01,52.32,52.52,50.89,50.98,4484400 27-Aug-01,53.21,53.21,52.33,52.38,1694300 24-Aug-01,51.67,53.25,51.63,52.94,2351900 23-Aug-01,51.43,51.82,51.33,51.50,1604200 22-Aug-01,51.27,51.92,51.11,51.63,4197800 21-Aug-01,52.58,52.62,51.27,51.27,3330300 20-Aug-01,53.06,53.11,52.12,52.65,3248000 17-Aug-01,54.29,54.29,52.71,53.30,2413700 16-Aug-01,53.40,54.42,53.10,54.42,2962100 15-Aug-01,54.83,55.38,53.69,53.74,3336500 14-Aug-01,55.55,55.80,54.96,55.00,2119000 13-Aug-01,55.65,56.33,55.26,55.55,1641800 10-Aug-01,55.61,56.02,55.22,55.95,2330500 9-Aug-01,55.61,56.13,54.99,55.46,3755500 8-Aug-01,56.24,56.76,55.42,55.71,2982800 7-Aug-01,56.53,56.81,55.60,56.59,4131900 6-Aug-01,58.06,58.85,57.41,57.47,2732600 3-Aug-01,57.88,58.31,57.63,58.27,1947300 2-Aug-01,58.55,58.80,57.39,57.88,2348200 1-Aug-01,57.72,58.40,57.59,58.06,2175100 31-Jul-01,56.29,57.86,56.21,57.60,2661300 30-Jul-01,57.71,57.96,56.49,56.49,2634300 27-Jul-01,57.03,57.96,57.03,57.22,2612400 26-Jul-01,55.65,57.26,55.62,57.19,2311300 25-Jul-01,55.07,55.95,54.93,55.77,1590500 24-Jul-01,55.70,55.70,54.31,54.38,2178000 23-Jul-01,56.18,56.34,55.16,55.36,2123900 20-Jul-01,55.49,56.24,55.38,55.89,1834100 19-Jul-01,56.50,57.03,54.81,55.49,3427200 18-Jul-01,56.68,56.68,54.17,56.22,5456400 17-Jul-01,54.52,55.82,54.52,55.40,3848400 16-Jul-01,53.75,54.51,53.22,54.40,1950800 13-Jul-01,53.62,54.33,52.92,54.19,1639000 12-Jul-01,52.55,53.92,52.41,53.63,3217800 11-Jul-01,53.14,53.35,52.06,52.06,3300000 10-Jul-01,52.88,53.75,52.34,53.29,4709600 9-Jul-01,52.99,53.16,51.71,51.99,5602100 6-Jul-01,54.17,54.60,52.92,53.44,4111300 5-Jul-01,55.80,55.82,54.27,54.35,3141600 3-Jul-01,55.46,56.15,55.26,55.43,2202600 2-Jul-01,55.70,56.31,55.40,55.46,3333200 29-Jun-01,55.99,56.59,54.70,54.72,4835800 28-Jun-01,56.39,57.45,55.98,56.33,4013500 27-Jun-01,56.11,57.12,55.98,56.78,3117600 26-Jun-01,55.80,56.90,55.16,56.11,4629500 25-Jun-01,56.04,56.86,55.49,56.05,5424700 22-Jun-01,56.83,56.96,54.52,56.09,6131500 21-Jun-01,59.05,59.05,55.80,56.83,9721900 20-Jun-01,60.82,61.85,59.42,60.14,5950700 19-Jun-01,63.67,63.85,60.56,60.82,4464100 18-Jun-01,63.82,63.96,63.39,63.85,2425600 15-Jun-01,62.79,63.48,62.71,63.23,5906700 14-Jun-01,64.45,64.45,62.31,62.55,3756600 13-Jun-01,64.56,65.43,64.36,64.45,2164000 12-Jun-01,63.28,65.09,63.18,64.67,3116800 11-Jun-01,63.56,63.72,62.66,63.47,1662300 8-Jun-01,64.58,64.58,63.08,63.56,2250000 7-Jun-01,64.90,65.01,64.08,64.61,2176200 6-Jun-01,65.10,65.21,64.68,65.05,3493500 5-Jun-01,65.96,66.48,65.64,65.87,3385500 4-Jun-01,63.87,65.64,63.87,64.98,2465900 1-Jun-01,62.00,64.53,61.90,63.97,3301500 31-May-01,62.29,62.39,61.34,61.89,2653000 30-May-01,62.56,62.93,61.80,62.05,3197700 29-May-01,62.49,62.88,62.20,62.52,2271400 25-May-01,63.87,63.87,61.90,62.32,3187800 24-May-01,65.15,66.39,63.03,64.16,4253400 23-May-01,66.33,66.57,64.95,64.95,3687500 22-May-01,67.02,67.85,66.43,66.92,2812700 21-May-01,66.82,67.66,66.79,67.60,1554800 18-May-01,67.70,67.80,66.89,67.26,3360700 17-May-01,65.69,68.74,65.50,67.70,6050600 16-May-01,65.54,65.69,64.61,65.69,3985800 15-May-01,64.97,65.64,64.40,65.53,2684000 14-May-01,64.95,65.69,64.82,65.68,1399700 11-May-01,64.92,65.37,64.26,64.96,1659000 10-May-01,64.51,64.95,64.12,64.90,2441900 9-May-01,63.03,64.47,62.98,63.97,2575400 8-May-01,63.31,63.99,63.11,63.44,2663200 7-May-01,63.50,64.06,63.06,63.49,2149200 4-May-01,61.98,63.80,61.84,63.31,2391200 3-May-01,62.57,63.01,61.55,62.82,2171400 2-May-01,62.50,63.11,62.08,62.82,3346200 1-May-01,61.54,63.29,61.54,62.26,4773800 30-Apr-01,61.25,62.97,60.66,60.66,3112800 27-Apr-01,59.79,60.66,59.72,60.47,2141800 26-Apr-01,58.98,60.07,58.67,59.85,3036600 25-Apr-01,58.84,59.29,58.79,59.22,3228400 24-Apr-01,58.89,60.98,58.89,59.68,3094100 23-Apr-01,59.77,60.15,58.51,59.03,4319900 20-Apr-01,60.76,63.71,59.38,60.56,7352100 19-Apr-01,60.34,60.48,58.45,59.51,3551000 18-Apr-01,59.72,62.55,59.58,60.17,3078200 17-Apr-01,58.65,59.48,57.91,59.48,2258600 16-Apr-01,59.14,59.85,58.09,58.65,2145500 12-Apr-01,57.86,59.38,57.54,59.38,1607300 11-Apr-01,59.45,59.87,57.42,58.03,3980800 10-Apr-01,57.03,59.08,56.76,58.71,4486300 9-Apr-01,55.01,56.67,54.96,55.82,2549800 6-Apr-01,54.96,55.60,54.30,54.94,2785500 5-Apr-01,54.96,56.44,54.81,55.76,2704800 4-Apr-01,53.49,54.18,52.92,53.62,2954700 3-Apr-01,54.42,54.42,53.11,53.60,3337500 2-Apr-01,54.38,55.55,53.52,54.00,3182600 30-Mar-01,54.38,56.21,54.29,54.68,3742700 29-Mar-01,53.54,55.26,53.25,54.92,2814300 28-Mar-01,53.59,54.16,53.00,53.98,2861600 27-Mar-01,54.29,55.20,53.25,54.18,3634800 26-Mar-01,52.56,55.13,52.56,54.42,4780200 23-Mar-01,51.77,52.45,50.65,52.02,4632500 22-Mar-01,52.12,52.36,48.78,51.04,6703700 21-Mar-01,53.59,54.38,52.22,52.85,3758400 20-Mar-01,55.55,56.13,53.75,53.98,4360500 19-Mar-01,53.56,55.21,52.76,54.98,6193500 16-Mar-01,54.60,55.16,51.87,52.76,11244000 15-Mar-01,56.95,56.95,54.48,55.06,5186800 14-Mar-01,58.40,58.41,55.78,56.95,6086000 13-Mar-01,60.86,61.83,58.95,59.45,4802100 12-Mar-01,63.01,63.13,59.83,59.87,4324900 9-Mar-01,63.26,64.39,63.01,64.29,2721500 8-Mar-01,62.82,63.99,62.38,63.55,4227400 7-Mar-01,60.80,63.02,60.73,62.91,3475800 6-Mar-01,60.90,61.43,60.16,60.98,2783400 5-Mar-01,58.79,61.00,58.77,60.77,2814700 2-Mar-01,58.45,60.31,57.22,58.99,3796100 1-Mar-01,60.71,60.72,57.52,58.55,4226100 28-Feb-01,62.62,62.65,60.84,61.05,3053200 27-Feb-01,61.15,62.72,60.85,62.52,2993000 26-Feb-01,60.31,61.81,59.89,61.60,1854600 23-Feb-01,59.85,60.61,59.43,60.47,2267000 22-Feb-01,59.09,61.08,59.09,60.15,2767600 21-Feb-01,60.71,61.23,59.04,59.09,2299500 20-Feb-01,59.23,61.64,59.04,60.71,3144600 16-Feb-01,58.69,59.49,58.53,58.88,2934600 15-Feb-01,59.47,59.64,57.75,59.04,2569700 14-Feb-01,60.58,60.79,59.22,59.47,3697900 13-Feb-01,58.00,60.25,58.00,59.60,4984900 12-Feb-01,57.57,58.01,57.13,57.98,2875500 9-Feb-01,56.63,57.09,55.73,56.28,2017300 8-Feb-01,56.29,57.18,56.06,56.45,2802100 7-Feb-01,55.90,56.82,55.60,56.39,2182900 6-Feb-01,56.64,57.21,55.26,55.51,2367000 5-Feb-01,55.51,56.80,55.21,56.69,2188100 2-Feb-01,55.75,56.27,54.84,55.63,2121700 1-Feb-01,56.76,57.25,54.86,55.31,4105500 31-Jan-01,55.29,57.65,55.29,57.25,3614900 30-Jan-01,55.25,55.38,53.39,54.95,3703800 29-Jan-01,56.46,56.75,55.10,55.25,2364700 26-Jan-01,57.49,58.41,56.27,56.82,2300200 25-Jan-01,55.29,58.41,55.29,57.98,3684000 24-Jan-01,55.66,56.76,55.66,56.21,2998400 23-Jan-01,55.72,56.76,54.98,56.27,4417400 22-Jan-01,55.11,55.66,54.49,54.80,3605600 19-Jan-01,56.15,56.21,54.31,54.49,4295900 18-Jan-01,55.29,56.76,54.43,56.15,6047900 17-Jan-01,61.10,61.34,57.00,57.49,6608400 16-Jan-01,58.65,60.30,58.22,59.69,3274400 12-Jan-01,58.29,59.39,57.31,59.33,3161000 11-Jan-01,58.71,59.45,57.74,57.86,3385300 10-Jan-01,57.12,59.57,57.06,59.08,3674200 9-Jan-01,57.74,57.74,55.96,57.67,4372800 8-Jan-01,57.49,59.20,57.43,57.74,3055100 5-Jan-01,60.06,60.18,56.88,57.49,4012600 4-Jan-01,62.63,62.81,58.96,59.69,3868900 3-Jan-01,59.45,62.38,57.92,61.22,6428600 2-Jan-01,63.48,63.91,59.26,60.67,3762500 29-Dec-00,64.46,65.32,64.22,64.59,2554100 28-Dec-00,62.63,65.56,62.38,64.04,2486100 27-Dec-00,60.92,63.48,60.92,62.69,2725700 26-Dec-00,62.51,63.12,60.92,61.65,2366700 22-Dec-00,62.81,63.61,60.12,62.08,4071700 21-Dec-00,63.36,63.61,61.22,63.24,4725400 20-Dec-00,64.71,65.01,62.69,63.61,4112700 19-Dec-00,66.42,67.15,64.71,64.95,4316400 18-Dec-00,64.59,68.44,64.59,67.03,4230000 15-Dec-00,64.46,65.26,63.36,63.48,6340900 14-Dec-00,65.93,67.46,65.07,65.81,3369700 13-Dec-00,67.28,68.32,66.30,66.42,2366600 12-Dec-00,66.67,68.93,66.67,67.64,3167400 11-Dec-00,68.19,69.11,66.91,66.91,3801300 8-Dec-00,66.11,69.42,65.99,68.44,5179900 7-Dec-00,65.69,66.67,65.38,65.38,2295400 6-Dec-00,67.46,67.95,65.38,65.93,4597700 5-Dec-00,64.52,68.68,63.12,67.46,6336500 4-Dec-00,64.40,64.40,62.32,63.42,5211000 1-Dec-00,67.22,67.22,63.79,64.40,4419900 30-Nov-00,67.95,68.19,66.11,67.58,4248500 29-Nov-00,65.01,68.50,64.77,68.44,6378700 28-Nov-00,65.87,66.73,64.83,66.05,3248900 27-Nov-00,65.56,66.54,65.56,65.93,2781400 24-Nov-00,64.59,65.38,64.16,64.28,1122400 22-Nov-00,66.67,66.97,63.48,63.73,4296000 21-Nov-00,63.91,68.01,63.91,67.15,5734000 20-Nov-00,63.61,65.07,63.61,64.16,2503900 17-Nov-00,64.34,65.38,63.67,63.97,3529100 16-Nov-00,62.20,64.95,62.20,64.40,3557500 15-Nov-00,62.38,62.44,61.34,62.20,3139900 14-Nov-00,61.71,63.42,61.71,63.00,3553800 13-Nov-00,60.79,62.26,60.61,61.47,2943400 10-Nov-00,64.04,64.34,61.89,62.14,2847400 9-Nov-00,63.48,64.52,63.06,64.28,2060100 8-Nov-00,63.79,64.71,63.12,63.61,1600600 7-Nov-00,63.96,64.39,63.53,63.65,3030800 6-Nov-00,62.92,64.81,62.49,64.51,3610300 3-Nov-00,64.63,65.18,63.96,64.51,2743700 2-Nov-00,63.84,65.42,62.31,64.57,5114500 1-Nov-00,65.97,66.22,63.59,64.20,5589600 31-Oct-00,63.17,66.28,62.56,66.22,4700800 30-Oct-00,62.25,63.65,62.19,63.17,4779200 27-Oct-00,61.58,62.31,61.52,62.25,2632700 26-Oct-00,60.54,62.13,60.42,61.58,4459800 25-Oct-00,59.69,62.43,59.69,61.09,5929900 24-Oct-00,59.44,60.48,59.20,59.56,4174700 23-Oct-00,59.08,60.54,58.65,59.81,5692500 20-Oct-00,57.00,58.83,56.45,58.59,3795000 19-Oct-00,59.56,59.75,55.96,57.06,6481600 18-Oct-00,57.12,60.05,57.00,59.32,4731100 17-Oct-00,58.77,59.99,57.25,59.08,2909800 16-Oct-00,58.22,59.63,58.04,58.77,2649100 13-Oct-00,54.68,58.89,54.62,57.37,4701200 12-Oct-00,58.53,58.89,52.73,54.80,8935800 11-Oct-00,57.61,59.81,57.43,58.77,2960800 10-Oct-00,58.22,58.71,57.67,58.16,2501200 9-Oct-00,58.83,59.26,57.86,58.04,2180100 6-Oct-00,59.75,60.72,59.08,59.56,3067100 5-Oct-00,59.63,61.52,58.83,59.63,4121900 4-Oct-00,58.10,60.97,58.10,59.69,5019200 3-Oct-00,57.61,58.89,57.61,58.47,5017300 2-Oct-00,59.56,59.81,55.90,57.06,9280800 29-Sep-00,61.15,62.98,59.20,62.98,5010700 28-Sep-00,62.37,63.84,62.13,62.98,6746600 27-Sep-00,64.20,64.94,61.88,63.04,7540100 26-Sep-00,61.64,65.36,61.33,64.51,7072100 25-Sep-00,62.25,62.80,60.30,62.37,5343300 22-Sep-00,58.34,62.80,57.61,62.01,6837500 21-Sep-00,58.10,59.26,57.86,58.59,6181200 20-Sep-00,55.66,58.65,55.60,57.67,6389400 19-Sep-00,55.29,56.21,54.93,55.41,4221300 18-Sep-00,55.41,57.18,55.29,55.60,3178700 15-Sep-00,56.51,57.79,55.41,55.54,5906200 14-Sep-00,57.49,57.49,56.33,57.00,4277100 13-Sep-00,57.49,58.71,57.37,58.04,4108800 12-Sep-00,57.37,58.65,56.76,57.61,5650100 11-Sep-00,56.51,58.04,56.33,57.25,4335700 8-Sep-00,57.25,57.61,56.27,56.76,6699000 7-Sep-00,55.66,58.53,55.66,57.12,10908200 6-Sep-00,54.32,57.25,54.26,56.45,7974100 5-Sep-00,52.73,54.93,52.73,54.13,3704900 1-Sep-00,52.55,54.93,52.49,53.46,5092500 31-Aug-00,51.02,53.58,51.02,52.38,3762800 30-Aug-00,50.90,51.75,50.72,51.26,3673400 29-Aug-00,51.69,51.87,51.02,51.08,4000400 28-Aug-00,52.12,52.73,51.69,52.00,4972200 25-Aug-00,52.24,53.22,52.12,52.85,7671400 24-Aug-00,49.07,52.73,49.01,52.36,10890300 23-Aug-00,47.72,49.74,47.72,49.37,6971500 22-Aug-00,46.63,48.27,46.50,48.15,4683200 21-Aug-00,44.86,47.11,44.43,46.63,4090800 18-Aug-00,44.86,44.98,44.25,44.61,4070600 17-Aug-00,44.80,45.04,44.67,44.80,2810800 16-Aug-00,45.77,45.77,44.80,45.10,6353200 15-Aug-00,47.42,47.60,46.14,46.14,3963800 14-Aug-00,48.46,48.70,48.15,48.34,2855800 11-Aug-00,47.36,48.76,47.36,48.46,3283700 10-Aug-00,46.44,47.72,46.44,47.72,2544700 9-Aug-00,47.48,47.48,46.02,46.63,4282500 8-Aug-00,47.34,47.89,47.10,47.28,3384000 7-Aug-00,47.65,48.20,47.22,47.77,2113900 4-Aug-00,47.71,47.83,47.04,47.71,2419800 3-Aug-00,48.26,48.62,47.53,47.71,3226900 2-Aug-00,47.59,48.62,47.59,48.56,4383700 1-Aug-00,47.59,48.20,47.40,47.40,3226800 31-Jul-00,47.22,47.95,47.16,47.53,4481100 28-Jul-00,46.92,47.83,46.67,47.53,3930300 27-Jul-00,46.98,48.13,46.92,46.98,3898500 26-Jul-00,47.71,48.13,46.43,46.74,5444400 25-Jul-00,46.74,48.93,46.61,47.34,8836600 24-Jul-00,45.46,46.98,45.46,46.86,5027400 21-Jul-00,44.79,46.07,44.61,45.58,7622000 20-Jul-00,44.79,45.03,44.00,44.85,5034000 19-Jul-00,43.81,44.97,42.90,44.67,7490900 18-Jul-00,42.84,44.06,42.17,43.94,4783100 17-Jul-00,43.27,43.27,42.29,42.81,2497700 14-Jul-00,43.57,43.94,43.15,43.27,3472100 13-Jul-00,42.96,43.81,42.96,43.39,3452700 12-Jul-00,42.78,43.21,42.54,42.72,2228800 11-Jul-00,41.99,43.57,41.93,43.15,3815200 10-Jul-00,42.72,42.84,41.87,41.87,2834200 7-Jul-00,41.99,42.90,41.93,42.60,4256800 6-Jul-00,41.75,42.05,41.44,41.87,3665200 5-Jul-00,41.02,42.23,40.95,41.68,4990900 3-Jul-00,40.53,40.83,40.35,40.59,1232300 30-Jun-00,39.92,41.14,39.92,40.71,4823600 29-Jun-00,39.62,40.41,39.43,39.86,3364100 28-Jun-00,39.31,40.53,39.19,39.46,3847800 27-Jun-00,38.46,39.19,38.28,38.95,2845500 26-Jun-00,38.46,38.95,38.46,38.70,2666600 23-Jun-00,38.46,39.07,38.34,38.82,1984700 22-Jun-00,38.70,38.89,37.73,37.91,2102400 21-Jun-00,38.40,39.07,38.03,38.76,2538000 20-Jun-00,37.85,38.64,37.30,38.28,2827400 19-Jun-00,38.34,38.52,37.55,37.97,3962300 16-Jun-00,39.07,39.31,37.79,38.22,4919000 15-Jun-00,38.46,39.92,38.22,39.31,6346900 14-Jun-00,37.49,38.34,37.36,37.79,2836500 13-Jun-00,37.00,37.85,36.69,37.79,2599400 12-Jun-00,37.61,38.03,37.06,37.12,1553800 9-Jun-00,37.73,38.64,37.61,38.16,2714200 8-Jun-00,37.49,37.61,36.69,37.18,2481700 7-Jun-00,38.64,38.95,37.49,37.55,2843100 6-Jun-00,38.16,39.13,38.03,38.82,2945300 5-Jun-00,38.09,38.40,37.55,37.91,2478000 2-Jun-00,39.01,39.49,38.46,38.82,3449500 1-Jun-00,38.52,39.19,38.28,39.19,2322800 31-May-00,38.52,38.58,37.97,38.03,2198600 30-May-00,37.73,38.64,37.55,38.52,2325300 26-May-00,37.00,37.91,37.00,37.24,2102100 25-May-00,37.61,37.67,36.88,37.36,3027300 24-May-00,36.27,37.97,36.21,37.85,4642600 23-May-00,35.66,36.94,35.66,36.15,2851600 22-May-00,36.39,36.69,35.29,35.60,2984100 19-May-00,36.03,36.39,35.29,35.96,2193900 18-May-00,36.15,36.76,36.15,36.63,2050100 17-May-00,36.03,36.51,35.60,36.39,2739800 16-May-00,36.21,36.88,35.78,36.39,3815700 15-May-00,35.66,36.51,35.48,36.21,2913500 12-May-00,36.63,36.63,36.09,36.21,2455200 11-May-00,36.15,37.18,36.09,36.33,2947200 10-May-00,36.76,36.94,35.60,35.90,4880400 9-May-00,37.35,38.02,36.98,37.17,2567300 8-May-00,37.83,38.32,37.05,37.11,3146400 5-May-00,36.86,38.68,36.80,38.32,2794900 4-May-00,37.11,38.14,36.68,37.05,2981100 packet/data/equities/cof0100644000076400007640000005553107525024672014241 0ustar iankiankDate,Open,High,Low,Close,Volume 2-Aug-02,30.05,30.12,28.02,28.60,3484500 1-Aug-02,31.80,31.80,29.76,30.00,4108500 31-Jul-02,30.13,31.78,30.07,31.70,6900700 30-Jul-02,29.50,30.40,27.55,29.93,11051900 29-Jul-02,30.50,32.35,28.40,29.35,10424700 26-Jul-02,33.75,33.75,30.25,30.50,9583400 25-Jul-02,32.50,34.36,30.99,32.39,7287700 24-Jul-02,28.00,34.00,26.55,33.31,11891400 23-Jul-02,34.31,34.55,30.20,30.99,8538700 22-Jul-02,35.75,37.00,34.10,34.10,9413900 19-Jul-02,33.48,37.20,33.15,35.21,9753600 18-Jul-02,30.40,34.20,29.99,33.31,19137700 17-Jul-02,33.50,41.62,29.99,30.48,42710700 16-Jul-02,50.75,51.91,49.32,50.60,4018300 15-Jul-02,51.10,51.15,48.20,51.11,4137000 12-Jul-02,50.80,52.59,49.55,51.50,4496800 11-Jul-02,51.60,51.62,48.64,50.42,8591300 10-Jul-02,56.04,56.80,51.35,51.41,9166900 9-Jul-02,57.60,58.00,55.45,55.45,3166900 8-Jul-02,59.60,60.65,57.76,58.03,2865100 5-Jul-02,58.10,60.30,57.90,59.95,1062800 3-Jul-02,56.00,57.48,54.91,57.48,2423800 2-Jul-02,58.54,58.54,56.70,56.75,2676200 1-Jul-02,60.80,61.10,58.28,58.53,2861900 28-Jun-02,59.11,61.90,59.00,61.05,3068400 27-Jun-02,57.85,59.25,57.25,59.10,2676800 26-Jun-02,56.45,57.10,55.61,56.80,2648400 25-Jun-02,58.04,59.98,57.50,57.56,2031500 24-Jun-02,56.60,59.00,55.23,58.04,2576000 21-Jun-02,56.80,57.40,56.24,57.35,2135700 20-Jun-02,58.72,58.72,56.95,57.05,2878600 19-Jun-02,59.00,59.35,58.30,58.72,2835800 18-Jun-02,59.00,60.09,58.80,59.79,2655100 17-Jun-02,56.90,59.60,56.80,59.60,3582400 14-Jun-02,54.20,55.74,52.00,55.63,3653300 13-Jun-02,57.10,57.10,54.61,55.27,3994500 12-Jun-02,59.10,59.20,56.38,57.00,4014000 11-Jun-02,60.30,61.24,58.84,58.99,1794600 10-Jun-02,60.10,60.15,58.58,59.80,1666700 7-Jun-02,59.00,60.19,58.27,60.00,1925600 6-Jun-02,60.50,60.63,59.49,59.78,1718300 5-Jun-02,59.25,60.74,59.25,60.45,1777400 4-Jun-02,60.45,60.55,58.55,59.23,3303400 3-Jun-02,62.10,62.85,60.52,60.53,1613600 31-May-02,61.75,63.00,61.70,62.44,1381100 30-May-02,62.00,62.24,61.45,62.07,1539400 29-May-02,61.50,62.90,61.41,62.24,1613200 28-May-02,63.40,63.60,61.53,61.61,1986400 24-May-02,63.09,63.75,62.88,63.45,1053000 23-May-02,62.36,63.35,61.89,63.34,1348700 22-May-02,61.75,62.40,61.24,62.35,1180300 21-May-02,63.60,63.70,61.44,62.00,2021500 20-May-02,64.20,64.43,62.71,62.79,1723600 17-May-02,63.95,64.32,63.10,64.20,1906000 16-May-02,64.30,64.34,62.52,63.95,2755300 15-May-02,64.25,64.47,63.35,64.47,1767400 14-May-02,64.25,64.93,62.95,64.65,2604200 13-May-02,61.25,62.38,60.63,62.02,1961600 10-May-02,60.53,61.99,60.00,60.30,3007200 9-May-02,61.90,62.00,60.50,60.52,1688200 8-May-02,60.00,62.70,59.95,62.51,2957000 7-May-02,58.15,59.27,57.81,58.30,2228600 6-May-02,59.55,60.16,57.40,57.40,2271900 3-May-02,59.97,60.17,59.22,59.71,2376700 2-May-02,59.28,60.67,58.91,60.51,3161700 1-May-02,59.52,59.71,57.17,59.27,3527700 30-Apr-02,59.04,60.27,59.04,59.86,3957300 29-Apr-02,61.97,62.02,58.52,58.72,4859700 26-Apr-02,63.09,63.57,61.87,62.02,2306100 25-Apr-02,64.38,64.38,62.51,62.85,3273000 24-Apr-02,65.42,65.82,63.87,64.37,3392400 23-Apr-02,64.67,66.03,64.53,65.47,2715800 22-Apr-02,64.97,65.81,64.49,64.95,2912800 19-Apr-02,65.37,65.77,64.62,65.72,2677300 18-Apr-02,63.97,65.13,63.77,65.06,6550800 17-Apr-02,63.73,66.47,63.14,63.88,9603900 16-Apr-02,62.47,63.96,62.47,63.73,2077600 15-Apr-02,62.97,63.32,61.72,61.94,1231700 12-Apr-02,62.77,63.40,62.17,62.42,2158700 11-Apr-02,64.37,64.97,61.57,62.25,3164000 10-Apr-02,63.97,64.41,63.14,64.37,2042200 9-Apr-02,63.07,64.36,62.73,62.97,2032100 8-Apr-02,60.97,62.77,60.92,62.73,1936800 5-Apr-02,62.07,63.12,61.22,61.43,2762000 4-Apr-02,60.97,62.07,60.87,61.71,2287800 3-Apr-02,63.86,63.87,61.37,61.92,2868000 2-Apr-02,63.32,64.96,63.12,63.96,2952000 1-Apr-02,63.82,64.97,62.42,63.57,1388900 28-Mar-02,63.89,64.88,62.92,63.82,1734900 27-Mar-02,62.72,63.89,62.49,63.89,1968400 26-Mar-02,60.54,63.00,60.54,62.72,2962800 25-Mar-02,63.22,63.52,60.31,60.51,2874000 22-Mar-02,62.24,63.77,61.78,63.34,2243500 21-Mar-02,62.12,62.34,60.72,62.24,1871100 20-Mar-02,63.27,63.46,61.97,62.12,2061200 19-Mar-02,62.77,64.07,62.62,63.78,2997900 18-Mar-02,62.03,63.27,61.72,62.45,2696100 15-Mar-02,59.97,62.12,59.95,62.02,2054600 14-Mar-02,59.67,60.22,59.16,59.74,2615500 13-Mar-02,60.37,60.57,59.37,59.57,3936400 12-Mar-02,59.87,61.62,59.77,61.01,4910300 11-Mar-02,58.77,61.37,58.77,60.84,5468000 8-Mar-02,59.97,60.17,57.79,58.43,5095100 7-Mar-02,58.17,58.42,57.57,58.16,4739000 6-Mar-02,55.82,57.42,55.74,57.07,3472800 5-Mar-02,54.58,57.67,54.49,56.17,6296800 4-Mar-02,52.48,55.40,52.43,55.18,5637900 1-Mar-02,49.43,50.98,48.83,50.57,2170800 28-Feb-02,49.08,50.28,49.02,49.25,3114700 27-Feb-02,48.23,49.88,48.08,48.88,3261400 26-Feb-02,46.88,47.63,45.73,47.36,2458300 25-Feb-02,44.13,46.98,44.13,46.98,2674100 22-Feb-02,45.03,45.18,43.17,44.07,3494400 21-Feb-02,46.43,46.77,44.52,44.88,2645600 20-Feb-02,45.58,46.82,44.48,46.69,2183600 19-Feb-02,45.33,46.33,44.99,45.36,2430900 15-Feb-02,47.88,47.88,45.34,45.97,4105600 14-Feb-02,48.23,49.11,47.23,47.44,2994500 13-Feb-02,48.28,49.18,48.23,48.73,2658600 12-Feb-02,46.73,48.32,46.48,47.58,4064300 11-Feb-02,46.73,46.74,45.03,45.66,5094500 8-Feb-02,46.14,47.80,46.14,47.50,3133400 7-Feb-02,43.93,47.73,43.48,46.14,4802100 6-Feb-02,44.88,44.98,42.99,44.40,4791500 5-Feb-02,45.55,45.96,43.65,44.50,4410700 4-Feb-02,47.40,47.41,45.00,45.51,4832500 1-Feb-02,49.30,49.35,47.21,48.36,5172500 31-Jan-02,47.97,50.12,47.82,50.12,3481200 30-Jan-02,47.45,49.03,44.81,47.85,8720300 29-Jan-02,51.21,51.21,46.70,47.06,6817300 28-Jan-02,51.53,52.09,50.50,51.21,4242200 25-Jan-02,52.59,53.37,52.59,53.19,1577400 24-Jan-02,51.99,53.44,51.99,52.64,2287900 23-Jan-02,53.10,53.43,51.94,51.94,2612800 22-Jan-02,53.94,54.42,53.04,53.10,2323000 18-Jan-02,54.69,55.29,54.44,54.78,2509500 17-Jan-02,54.69,55.84,54.29,55.34,2818000 16-Jan-02,53.54,55.44,52.80,54.30,4675500 15-Jan-02,52.34,54.43,52.19,53.49,2831500 14-Jan-02,52.16,52.94,51.85,52.24,1801000 11-Jan-02,53.34,53.35,52.14,52.36,2088100 10-Jan-02,54.09,54.89,52.94,53.39,2632200 9-Jan-02,54.59,54.80,53.74,54.14,2122000 8-Jan-02,55.24,55.24,53.75,54.35,3797500 7-Jan-02,55.94,57.74,55.09,55.24,3080400 4-Jan-02,54.94,56.99,54.69,56.84,3416400 3-Jan-02,53.17,53.92,52.64,53.30,1944000 2-Jan-02,54.09,54.09,52.14,53.06,1951800 31-Dec-01,54.67,55.14,53.82,53.89,1836400 28-Dec-01,52.74,55.00,52.74,54.67,2214200 27-Dec-01,51.25,53.23,51.25,52.74,1255400 26-Dec-01,50.30,51.66,50.20,51.29,1385600 24-Dec-01,50.35,50.77,50.25,50.33,376900 21-Dec-01,51.50,51.50,50.17,50.30,2123300 20-Dec-01,51.66,52.44,51.07,51.25,2348000 19-Dec-01,50.04,52.14,49.85,51.65,2115800 18-Dec-01,49.58,50.65,49.43,50.03,1829700 17-Dec-01,47.95,49.78,47.85,48.90,1462000 14-Dec-01,48.35,48.95,46.45,47.84,2486900 13-Dec-01,49.05,49.83,48.20,48.25,2299800 12-Dec-01,50.40,50.50,48.45,49.48,3516000 11-Dec-01,50.95,52.19,50.65,51.03,2622100 10-Dec-01,51.45,51.89,49.95,50.05,1808100 7-Dec-01,52.44,52.79,51.40,52.01,2311000 6-Dec-01,51.45,53.84,51.40,53.45,2081000 5-Dec-01,50.00,52.44,50.00,51.30,1798000 4-Dec-01,49.20,50.20,48.69,50.10,2823100 3-Dec-01,49.35,49.36,48.15,48.50,2979700 30-Nov-01,50.15,51.15,49.95,49.98,3406700 29-Nov-01,51.99,52.44,51.45,51.45,2321600 28-Nov-01,54.14,54.15,51.94,51.99,1778000 27-Nov-01,52.75,54.94,52.75,54.39,2820900 26-Nov-01,52.49,53.14,51.70,53.00,1562200 23-Nov-01,50.36,52.06,50.30,51.99,1016500 21-Nov-01,51.08,51.45,49.61,50.35,2665100 20-Nov-01,51.81,51.81,50.75,51.07,2396900 19-Nov-01,51.85,53.06,50.73,51.80,2905500 16-Nov-01,52.96,53.59,51.05,51.85,4056200 15-Nov-01,53.39,55.54,53.14,54.57,3194500 14-Nov-01,54.14,54.54,53.57,54.44,3344000 13-Nov-01,52.54,54.18,51.85,53.82,3612200 12-Nov-01,50.61,51.94,49.10,51.75,2893700 9-Nov-01,49.95,51.25,48.76,50.60,2696700 8-Nov-01,49.95,53.94,49.61,49.95,4889500 7-Nov-01,46.95,49.96,46.70,49.71,4651500 6-Nov-01,44.90,47.55,44.45,47.08,3503500 5-Nov-01,43.96,45.15,43.96,44.70,1725200 2-Nov-01,43.33,44.47,42.57,43.97,3302100 1-Nov-01,41.73,44.13,41.18,43.38,5986100 31-Oct-01,43.53,43.73,40.93,41.24,5972100 30-Oct-01,44.33,44.42,42.93,43.49,2939600 29-Oct-01,45.52,45.53,44.43,44.44,4057100 26-Oct-01,44.74,46.60,44.35,46.04,3480200 25-Oct-01,45.67,46.27,42.93,44.74,6485600 24-Oct-01,47.53,47.67,45.22,45.77,5314500 23-Oct-01,47.58,48.30,47.02,47.52,2988400 22-Oct-01,47.72,48.97,46.68,47.57,4494800 19-Oct-01,47.67,48.15,45.42,47.59,7443300 18-Oct-01,48.27,49.27,47.64,48.57,3286700 17-Oct-01,48.92,48.92,47.75,47.81,9372400 16-Oct-01,42.68,44.92,42.31,43.06,3909400 15-Oct-01,44.73,44.78,41.99,42.43,5069400 12-Oct-01,47.62,47.62,42.48,44.73,7981100 11-Oct-01,48.72,50.17,46.82,47.62,3238400 10-Oct-01,45.89,48.22,45.42,47.89,1779200 9-Oct-01,45.77,46.72,45.31,45.78,1549600 8-Oct-01,46.93,46.93,44.92,45.31,1455000 5-Oct-01,47.42,47.82,45.79,46.92,2111500 4-Oct-01,49.02,49.68,47.72,47.97,1901600 3-Oct-01,46.65,48.60,46.07,48.43,2024000 2-Oct-01,46.67,47.34,45.92,46.94,2058800 1-Oct-01,46.17,47.17,45.79,46.47,2012700 28-Sep-01,44.53,46.47,44.05,45.95,2851700 27-Sep-01,43.93,44.46,42.43,43.65,2139200 26-Sep-01,43.93,44.51,42.83,43.70,2715600 25-Sep-01,43.13,44.53,41.84,42.73,3087700 24-Sep-01,43.43,44.13,42.43,42.98,4101500 21-Sep-01,38.49,39.93,36.34,39.93,5172000 20-Sep-01,40.01,40.18,38.09,39.88,2922100 19-Sep-01,42.03,42.88,37.51,40.01,3561000 18-Sep-01,45.38,45.42,41.58,41.89,3054200 17-Sep-01,44.92,46.67,43.43,44.85,3914400 10-Sep-01,48.02,51.21,48.02,50.29,3408700 7-Sep-01,48.52,49.77,47.97,48.42,4141400 6-Sep-01,52.01,52.01,49.62,50.16,3108300 5-Sep-01,52.86,53.11,50.67,52.39,3970000 4-Sep-01,53.41,54.48,51.16,52.67,6321700 31-Aug-01,55.16,56.11,54.61,55.52,1915100 30-Aug-01,55.81,56.21,54.26,55.15,3013400 29-Aug-01,57.30,57.65,55.99,56.59,1790300 28-Aug-01,58.85,58.95,56.58,57.30,1986900 27-Aug-01,59.10,59.10,58.18,58.68,1694000 24-Aug-01,60.26,60.39,57.60,59.05,3016700 23-Aug-01,60.15,60.70,59.70,60.11,1001500 22-Aug-01,59.80,60.55,58.52,60.15,2566300 21-Aug-01,61.92,62.39,59.23,59.27,1536000 20-Aug-01,61.05,62.11,60.92,61.74,802800 17-Aug-01,61.70,61.71,60.15,60.91,1274000 16-Aug-01,63.26,63.26,61.10,61.90,1343700 15-Aug-01,64.01,64.56,62.94,63.50,961400 14-Aug-01,62.89,64.29,62.89,64.01,1192700 13-Aug-01,62.25,63.06,60.93,62.78,1281200 10-Aug-01,62.12,62.34,60.70,61.92,1180800 9-Aug-01,62.43,62.44,60.52,62.12,1858400 8-Aug-01,64.09,64.09,62.14,62.43,1606600 7-Aug-01,64.79,65.79,64.11,64.19,871300 6-Aug-01,65.79,66.54,64.68,64.84,657200 3-Aug-01,65.76,65.76,64.68,65.55,659800 2-Aug-01,66.16,66.59,65.51,65.76,1151700 1-Aug-01,64.12,66.60,63.87,65.53,1059800 31-Jul-01,63.04,65.46,63.04,64.14,1488700 30-Jul-01,64.23,64.62,62.37,63.04,958500 27-Jul-01,62.27,64.52,62.27,64.23,918800 25-Jul-01,63.42,63.42,61.17,62.12,1166100 24-Jul-01,63.41,64.34,61.66,62.11,1517100 23-Jul-01,63.47,64.17,63.20,63.40,1429400 20-Jul-01,63.62,63.67,62.32,63.30,2104700 19-Jul-01,65.46,65.56,61.99,63.16,3419400 18-Jul-01,65.56,66.88,64.55,65.34,3023600 17-Jul-01,64.27,67.11,64.27,66.87,2099600 16-Jul-01,65.47,66.26,63.99,64.59,1702300 13-Jul-01,62.97,65.76,62.72,65.47,2919100 12-Jul-01,61.12,63.17,60.62,63.01,2844400 11-Jul-01,58.78,59.03,57.21,58.82,1879300 10-Jul-01,59.48,59.86,58.48,58.88,1888000 9-Jul-01,60.12,60.17,58.54,59.14,1983900 6-Jul-01,61.87,61.92,59.64,59.99,1359000 5-Jul-01,60.90,62.02,60.58,61.87,2139600 3-Jul-01,60.82,61.23,60.55,60.90,924500 2-Jul-01,60.47,61.32,60.07,60.85,1583900 29-Jun-01,60.07,61.28,59.68,60.02,2181100 28-Jun-01,58.23,61.32,58.23,60.37,3213100 27-Jun-01,59.88,60.91,57.88,57.88,3817100 26-Jun-01,58.48,59.63,58.48,59.43,1814000 25-Jun-01,61.90,61.99,59.48,60.28,1263300 22-Jun-01,63.01,63.01,61.22,61.80,1206300 21-Jun-01,60.77,63.27,60.52,62.77,2301000 20-Jun-01,60.17,61.37,59.88,60.38,2012600 19-Jun-01,60.17,60.66,59.48,59.99,1622900 18-Jun-01,59.88,59.97,58.38,59.11,1981900 15-Jun-01,58.88,61.25,58.88,60.12,2943100 14-Jun-01,62.07,62.23,59.68,60.37,2754900 13-Jun-01,64.75,65.31,63.21,63.48,1659000 12-Jun-01,64.09,65.46,63.15,65.35,1504100 11-Jun-01,65.71,66.83,64.87,65.38,1186500 8-Jun-01,65.84,66.10,65.31,65.71,585200 7-Jun-01,65.96,65.97,64.98,65.97,1129000 6-Jun-01,68.21,68.22,66.02,66.11,1417500 5-Jun-01,67.26,68.86,67.17,68.86,1099800 4-Jun-01,66.66,67.36,65.88,67.36,930400 1-Jun-01,65.66,66.91,64.57,66.91,1205400 31-May-01,66.26,66.30,64.80,64.97,1075300 30-May-01,66.31,67.20,64.86,65.50,1392500 29-May-01,68.06,68.16,66.20,66.46,1034300 25-May-01,66.71,67.70,66.71,67.09,785100 24-May-01,69.16,69.56,67.41,67.87,1680800 23-May-01,71.56,71.62,69.01,69.36,3719200 22-May-01,69.85,72.43,69.60,71.91,3476300 21-May-01,66.26,68.86,65.83,68.83,1119700 18-May-01,66.53,66.86,65.26,66.43,826400 17-May-01,66.28,67.11,65.98,66.63,2108700 16-May-01,63.57,66.66,63.08,66.46,1849400 15-May-01,63.27,64.42,62.30,64.20,1406600 14-May-01,63.70,64.33,62.77,63.11,907400 11-May-01,63.67,64.76,63.36,63.85,1575200 10-May-01,64.37,64.91,63.47,63.67,1259200 9-May-01,63.17,63.62,62.67,63.62,1809400 8-May-01,64.37,64.74,63.89,64.07,1582800 7-May-01,65.04,65.40,64.67,65.11,1284400 4-May-01,62.29,65.44,61.50,64.95,1906600 3-May-01,64.04,64.74,62.84,63.26,1273500 2-May-01,63.71,64.73,63.34,64.28,771200 1-May-01,62.45,63.78,61.90,63.71,886700 30-Apr-01,63.94,64.79,62.36,62.70,995300 27-Apr-01,63.54,64.04,63.04,63.83,853400 26-Apr-01,61.75,63.34,61.55,62.61,1020100 25-Apr-01,61.25,62.04,60.38,61.81,1295000 24-Apr-01,62.14,62.69,60.75,61.25,1171100 23-Apr-01,62.84,63.04,61.66,62.20,1223100 20-Apr-01,62.24,63.21,62.14,62.74,2039000 19-Apr-01,64.34,65.40,62.35,63.61,3129500 18-Apr-01,60.50,66.18,60.46,65.84,3652300 17-Apr-01,58.90,60.75,58.24,58.24,1649000 16-Apr-01,59.80,60.55,58.45,58.90,1098700 12-Apr-01,59.25,60.35,58.90,59.60,1873600 11-Apr-01,61.25,61.34,59.50,59.98,3316600 10-Apr-01,55.71,58.75,55.45,58.05,2268300 9-Apr-01,53.66,55.16,53.66,54.86,1536100 6-Apr-01,54.11,55.33,53.46,53.65,1181700 5-Apr-01,53.32,55.15,53.18,54.92,1326100 4-Apr-01,53.72,54.19,51.48,52.22,1308100 3-Apr-01,55.61,56.06,53.71,53.72,1794600 2-Apr-01,53.47,56.38,52.77,56.01,2701800 30-Mar-01,53.47,55.36,53.21,55.36,2463400 29-Mar-01,54.41,54.96,51.97,52.87,3012000 28-Mar-01,53.17,55.36,52.87,54.81,2250300 27-Mar-01,51.07,54.71,50.42,54.34,2060000 26-Mar-01,51.67,52.96,50.33,51.08,1224000 23-Mar-01,48.13,51.37,47.88,50.91,1687000 22-Mar-01,48.33,48.88,46.78,47.72,3464000 21-Mar-01,50.92,51.96,49.08,49.08,2684500 20-Mar-01,53.87,54.41,51.52,51.57,1634500 19-Mar-01,54.49,55.02,52.17,53.81,1508200 16-Mar-01,53.99,54.89,53.27,54.24,1685300 15-Mar-01,54.31,55.26,53.92,53.99,1916400 14-Mar-01,52.97,54.46,51.72,53.37,1570600 13-Mar-01,53.47,55.36,52.62,55.15,1581800 12-Mar-01,55.76,55.76,51.87,52.01,1690900 9-Mar-01,57.32,57.36,55.46,56.52,950500 8-Mar-01,57.21,57.77,56.81,57.32,877700 7-Mar-01,57.36,57.80,55.86,56.88,1496400 6-Mar-01,56.87,58.95,56.38,57.11,783100 5-Mar-01,58.60,58.65,56.01,56.62,1251300 2-Mar-01,55.66,57.86,55.21,57.11,1065400 1-Mar-01,55.66,55.71,54.24,55.66,1200700 28-Feb-01,57.99,58.01,53.97,55.11,1607400 27-Feb-01,55.26,58.15,54.05,57.75,2367500 26-Feb-01,56.34,56.68,53.96,55.36,1928700 23-Feb-01,54.66,56.35,53.06,56.01,1888600 22-Feb-01,55.71,55.71,50.47,54.73,2991100 21-Feb-01,57.71,57.72,55.26,55.71,2049900 20-Feb-01,59.70,60.56,57.41,57.76,1639100 16-Feb-01,60.87,61.82,60.25,60.35,1276500 15-Feb-01,60.20,61.20,58.16,60.87,2432700 14-Feb-01,62.35,62.59,59.85,59.95,1335400 13-Feb-01,63.69,64.14,62.34,62.34,792700 12-Feb-01,61.85,63.59,61.85,63.59,1054400 9-Feb-01,61.51,63.14,61.20,62.08,775900 8-Feb-01,61.40,63.19,61.40,61.56,1192300 7-Feb-01,61.71,63.51,61.37,61.37,953000 6-Feb-01,61.57,62.39,60.41,61.71,1264800 5-Feb-01,61.58,61.82,60.87,61.57,876000 2-Feb-01,62.52,63.80,61.38,61.65,1098900 1-Feb-01,62.92,62.92,61.82,62.35,1502500 31-Jan-01,64.31,64.31,61.85,62.84,2136000 30-Jan-01,67.05,67.20,64.81,64.81,3184500 29-Jan-01,65.43,67.77,65.41,67.05,1592800 26-Jan-01,64.25,65.50,63.13,65.43,893100 25-Jan-01,65.12,65.31,63.69,64.25,1081000 24-Jan-01,63.19,65.50,62.75,65.37,1605100 23-Jan-01,62.44,63.50,62.25,62.82,1393400 22-Jan-01,60.82,63.25,60.38,62.19,2856200 19-Jan-01,61.57,62.07,60.14,61.26,3853800 18-Jan-01,65.00,66.31,61.88,63.31,3926300 17-Jan-01,65.81,67.74,65.43,65.93,2501700 16-Jan-01,64.06,65.93,63.31,64.50,1252200 12-Jan-01,63.56,64.81,62.75,63.38,927100 11-Jan-01,62.75,66.12,62.75,63.44,1208000 10-Jan-01,60.32,62.82,60.01,62.75,1109300 9-Jan-01,63.00,63.63,60.14,60.57,1276400 8-Jan-01,64.31,64.75,61.82,62.50,1577900 5-Jan-01,61.44,64.75,61.44,64.31,2022300 4-Jan-01,66.06,70.23,65.62,66.80,3103600 3-Jan-01,61.07,68.55,60.32,66.80,1958300 2-Jan-01,64.44,64.44,60.88,61.76,1245400 29-Dec-00,67.05,67.80,65.50,65.62,776000 28-Dec-00,63.38,66.24,63.25,65.37,874100 27-Dec-00,63.06,64.06,62.07,63.13,1297900 26-Dec-00,61.57,62.82,61.07,62.82,539900 22-Dec-00,59.95,61.76,59.82,61.51,1065600 21-Dec-00,58.95,59.95,57.52,59.20,1200500 20-Dec-00,57.83,59.01,56.71,58.64,1289800 19-Dec-00,60.14,61.38,58.20,58.45,1354400 18-Dec-00,59.08,61.26,58.83,60.38,1548300 15-Dec-00,57.77,58.33,56.58,57.58,1893200 14-Dec-00,57.95,58.52,56.33,57.77,1711000 13-Dec-00,60.07,60.45,57.89,57.89,1085200 12-Dec-00,60.45,60.51,58.83,59.45,857200 11-Dec-00,59.26,61.26,58.89,60.45,846800 8-Dec-00,59.64,60.01,58.64,59.20,1330100 7-Dec-00,57.83,59.57,57.33,57.83,1553400 6-Dec-00,58.33,62.19,57.71,58.14,2304800 5-Dec-00,54.78,59.64,54.15,59.01,2366000 4-Dec-00,54.59,54.90,52.78,53.97,2186200 1-Dec-00,55.90,57.71,55.84,56.71,1701800 30-Nov-00,55.40,57.08,53.90,55.65,2596500 29-Nov-00,53.47,56.46,53.34,56.21,1779400 28-Nov-00,53.84,54.71,52.91,53.22,1728200 27-Nov-00,51.85,54.46,51.66,53.78,2096100 24-Nov-00,48.36,49.67,48.36,49.48,517300 22-Nov-00,51.35,51.35,48.23,48.30,1790800 21-Nov-00,48.36,51.29,46.43,49.60,3667300 20-Nov-00,51.85,51.91,45.74,49.42,3787900 17-Nov-00,53.72,55.21,51.72,52.35,2747500 16-Nov-00,56.33,57.52,55.15,55.15,1425600 15-Nov-00,56.90,59.20,56.02,56.96,1812100 14-Nov-00,57.77,59.26,55.90,57.71,1693200 13-Nov-00,58.45,59.57,53.90,56.33,2427200 10-Nov-00,61.57,61.57,58.45,59.01,1032200 9-Nov-00,62.32,64.62,60.82,61.82,1461800 8-Nov-00,64.12,64.19,62.13,63.75,860500 7-Nov-00,63.81,65.56,63.38,64.12,976700 6-Nov-00,61.32,64.19,60.01,63.81,924500 3-Nov-00,62.79,62.79,60.23,61.23,638900 2-Nov-00,61.73,63.10,61.17,62.79,808400 1-Nov-00,62.54,62.54,60.55,61.60,860700 31-Oct-00,61.54,63.29,59.67,62.91,1237600 30-Oct-00,60.48,63.41,60.17,62.10,1022600 27-Oct-00,58.68,61.17,56.31,60.36,2582600 26-Oct-00,58.18,58.68,51.64,58.68,5543900 25-Oct-00,61.79,61.79,58.05,60.05,2658600 24-Oct-00,66.03,68.14,63.91,64.03,1976800 23-Oct-00,67.27,67.33,63.60,65.53,1628600 20-Oct-00,68.02,68.39,67.33,68.14,1428500 19-Oct-00,68.39,70.20,67.90,68.52,1494000 18-Oct-00,62.35,68.27,62.35,67.09,1355700 17-Oct-00,70.01,70.51,65.03,65.84,1523200 16-Oct-00,68.27,70.45,68.14,69.51,1345100 13-Oct-00,61.54,67.65,60.92,67.52,1199500 12-Oct-00,66.03,66.77,61.23,61.67,2309700 11-Oct-00,62.79,65.47,61.92,65.15,2046200 10-Oct-00,66.40,66.53,62.54,63.41,1881200 9-Oct-00,66.09,66.84,64.97,66.46,1224900 6-Oct-00,69.64,69.64,63.85,66.09,2270400 5-Oct-00,71.01,72.94,71.01,71.51,1291300 4-Oct-00,70.01,72.38,69.64,71.01,1291600 3-Oct-00,71.13,73.00,69.76,70.76,1763400 2-Oct-00,69.64,70.64,67.83,70.26,835000 29-Sep-00,70.95,71.07,69.33,69.83,1237600 28-Sep-00,69.08,71.51,68.83,71.20,1127200 27-Sep-00,66.90,68.83,66.77,68.33,978200 26-Sep-00,69.76,70.39,66.21,66.62,1514400 25-Sep-00,66.77,69.27,66.28,68.46,2364600 22-Sep-00,63.35,65.28,62.60,65.28,1567800 21-Sep-00,62.04,63.60,60.92,63.60,1127900 20-Sep-00,62.60,62.79,60.55,62.29,752400 19-Sep-00,61.67,63.72,61.29,62.60,1206000 18-Sep-00,64.28,64.47,61.42,61.42,1583300 15-Sep-00,64.16,65.78,63.60,63.78,1349700 14-Sep-00,65.90,66.34,63.91,64.16,1191200 13-Sep-00,65.03,66.46,64.91,65.78,1431300 12-Sep-00,65.03,65.65,64.35,65.53,1147100 11-Sep-00,65.22,65.90,64.59,65.47,1561500 8-Sep-00,64.22,65.65,63.47,64.94,1156300 7-Sep-00,62.29,64.78,61.67,63.78,1982600 6-Sep-00,61.92,63.29,61.54,62.35,1383200 5-Sep-00,59.92,62.23,59.92,60.92,1144300 1-Sep-00,61.36,61.36,59.42,59.92,709600 31-Aug-00,59.49,61.42,59.49,60.12,861200 30-Aug-00,59.55,60.36,58.99,59.49,502700 29-Aug-00,59.86,60.30,58.43,59.92,831800 28-Aug-00,58.12,60.42,58.05,59.61,1158000 25-Aug-00,58.43,58.68,57.87,58.05,412700 24-Aug-00,57.80,58.93,57.74,58.93,828900 23-Aug-00,57.99,58.49,57.12,57.87,811800 22-Aug-00,56.81,58.49,56.68,57.87,1016700 21-Aug-00,54.94,56.62,54.69,56.31,810100 18-Aug-00,55.13,55.19,54.38,54.75,484000 17-Aug-00,54.81,55.56,54.50,55.28,524900 16-Aug-00,54.81,55.38,54.69,54.88,732100 15-Aug-00,56.99,57.06,54.19,54.44,796900 14-Aug-00,56.56,57.49,55.81,57.24,497800 11-Aug-00,55.69,56.81,54.81,56.50,584600 10-Aug-00,56.25,56.81,55.31,55.69,351100 9-Aug-00,57.49,57.49,55.44,56.25,1127300 8-Aug-00,58.12,59.05,57.37,57.56,966800 7-Aug-00,58.43,58.49,57.18,58.18,1064300 4-Aug-00,56.16,58.71,55.97,58.65,2039300 3-Aug-00,55.29,56.66,54.10,56.16,1518900 2-Aug-00,57.34,57.53,54.42,55.35,1176700 1-Aug-00,57.78,57.78,55.54,57.34,2210500 31-Jul-00,56.78,59.02,56.72,58.37,1475100 28-Jul-00,56.41,56.60,55.16,56.60,1465000 27-Jul-00,53.17,56.91,53.05,56.35,1120100 26-Jul-00,54.23,54.42,52.49,53.05,1048100 25-Jul-00,53.73,54.23,53.11,54.10,645900 24-Jul-00,56.41,57.28,53.05,53.73,1593100 21-Jul-00,55.54,56.16,55.16,55.60,1204000 20-Jul-00,53.05,55.79,52.74,55.29,1457400 19-Jul-00,52.30,53.30,52.05,53.05,722000 18-Jul-00,50.56,52.74,50.31,52.24,751600 17-Jul-00,50.56,50.62,49.62,50.03,635400 14-Jul-00,51.05,51.74,50.37,50.80,1026100 13-Jul-00,51.18,52.42,50.68,51.12,1507700 12-Jul-00,49.31,49.93,49.00,49.31,1025600 11-Jul-00,49.06,49.68,48.75,49.25,750300 10-Jul-00,48.81,49.62,48.31,49.31,477600 7-Jul-00,47.82,50.24,47.63,49.06,973900 6-Jul-00,45.26,47.82,45.08,47.82,900800 5-Jul-00,45.20,46.63,44.77,45.39,652900 3-Jul-00,44.83,45.26,44.45,45.20,263800 30-Jun-00,45.70,46.07,44.33,44.45,882300 29-Jun-00,45.58,46.07,44.70,45.82,1436400 28-Jun-00,46.20,47.01,45.58,46.43,996400 27-Jun-00,44.70,46.14,44.52,45.58,1100300 26-Jun-00,44.02,44.95,43.71,44.33,790200 23-Jun-00,44.27,44.77,43.64,43.77,1015500 22-Jun-00,46.20,46.20,43.33,44.27,1735700 21-Jun-00,45.08,46.38,45.01,46.07,1047200 20-Jun-00,47.57,48.31,46.07,46.82,1466600 19-Jun-00,48.19,48.69,46.94,47.44,1050400 16-Jun-00,50.06,50.06,46.32,48.31,1252200 15-Jun-00,52.05,52.05,49.37,50.06,893800 14-Jun-00,50.68,53.54,50.68,52.64,1155700 13-Jun-00,49.62,50.43,49.50,50.24,474100 12-Jun-00,47.82,49.75,47.69,49.56,912600 9-Jun-00,49.62,50.43,48.19,48.50,356100 8-Jun-00,50.06,50.06,48.69,49.25,573500 7-Jun-00,49.50,50.49,49.44,50.12,465000 6-Jun-00,50.31,50.31,49.25,49.50,1304300 5-Jun-00,50.18,50.49,49.37,50.18,1329000 2-Jun-00,50.18,52.17,50.12,51.05,1517000 1-Jun-00,46.82,48.81,46.82,48.47,2195100 31-May-00,46.57,47.26,46.20,47.07,1799800 30-May-00,45.33,47.32,45.08,46.01,1045900 26-May-00,44.83,45.45,44.64,44.77,635600 25-May-00,44.70,45.58,44.45,45.08,912200 24-May-00,45.26,46.76,44.33,44.70,966300 23-May-00,44.21,45.14,43.83,44.64,477100 22-May-00,43.96,44.02,42.71,43.71,448600 19-May-00,44.70,44.89,42.59,43.83,688900 18-May-00,43.83,45.82,43.77,45.58,732500 17-May-00,44.21,44.45,43.52,43.83,398700 16-May-00,45.58,46.14,45.01,45.33,702500 15-May-00,43.58,45.23,43.21,44.55,752100 12-May-00,43.83,44.64,42.65,43.46,743200 11-May-00,42.59,43.89,41.96,43.21,894200 10-May-00,41.78,42.09,40.84,40.91,667300 9-May-00,42.28,43.52,41.15,41.71,718400 8-May-00,39.35,42.96,39.22,41.96,1293300 5-May-00,40.44,40.44,39.51,39.70,1329100 4-May-00,42.25,42.25,40.07,40.63,1004200 packet/data/equities/ge0100644000076400007640000005650007525024672014062 0ustar iankiankDate,Open,High,Low,Close,Volume 2-Aug-02,30.85,31.24,29.09,29.50,38480700 1-Aug-02,32.10,32.29,31.25,31.40,32957900 31-Jul-02,31.60,32.20,30.24,32.20,45183900 30-Jul-02,30.00,31.76,29.64,31.60,43502200 29-Jul-02,28.89,30.45,28.84,30.45,45171800 26-Jul-02,27.05,27.88,26.49,27.80,35789000 25-Jul-02,26.60,27.20,25.85,26.65,39859600 24-Jul-02,24.19,26.75,23.02,26.53,62394500 23-Jul-02,25.98,26.15,24.47,24.80,48600100 22-Jul-02,26.50,26.89,25.34,25.66,44461300 19-Jul-02,27.10,27.70,26.25,26.52,36109200 18-Jul-02,28.05,28.64,27.51,27.70,27972300 17-Jul-02,28.40,28.49,27.45,28.25,38286700 16-Jul-02,27.32,28.15,27.32,27.55,35834900 15-Jul-02,28.48,28.52,25.25,28.25,37506900 12-Jul-02,28.10,29.93,27.15,28.60,48120400 11-Jul-02,26.80,27.85,26.40,27.35,51499200 10-Jul-02,28.40,28.75,27.05,27.05,33494000 9-Jul-02,29.40,29.73,28.24,28.30,24683800 8-Jul-02,29.70,29.92,29.08,29.43,20376200 5-Jul-02,28.75,29.75,28.50,29.69,19258000 3-Jul-02,27.25,27.95,26.90,27.90,30474700 2-Jul-02,28.15,28.51,27.41,28.10,31547900 1-Jul-02,29.06,29.54,28.25,28.45,26966400 28-Jun-02,29.90,30.25,29.02,29.05,32465400 27-Jun-02,29.70,30.00,28.74,29.90,33238500 26-Jun-02,27.50,29.91,27.42,29.50,45000400 25-Jun-02,29.76,30.00,28.52,28.72,29769400 24-Jun-02,28.37,29.81,27.92,29.42,37185500 21-Jun-02,28.97,29.51,28.57,28.77,39211800 20-Jun-02,30.06,30.35,29.42,29.51,20761900 19-Jun-02,30.51,31.16,30.11,30.16,20921100 18-Jun-02,30.21,31.20,30.05,30.96,21798000 17-Jun-02,29.81,30.46,29.69,30.32,21291800 14-Jun-02,29.32,29.61,28.70,29.51,34148300 13-Jun-02,29.81,30.26,29.55,29.66,20831500 12-Jun-02,29.22,30.22,29.17,30.16,28132500 11-Jun-02,29.91,30.26,29.17,29.22,22304000 10-Jun-02,29.96,30.21,29.56,29.76,20841500 7-Jun-02,28.22,30.06,28.22,30.01,31579000 6-Jun-02,30.11,30.11,28.93,29.12,21379200 5-Jun-02,30.06,30.27,29.62,29.96,23873000 4-Jun-02,29.81,30.22,29.60,29.86,33315200 3-Jun-02,30.95,30.96,29.76,29.92,28920400 31-May-02,31.01,31.48,30.81,30.95,19921400 30-May-02,30.71,31.20,30.56,31.01,20828300 29-May-02,31.65,32.09,31.11,31.20,16757300 28-May-02,32.55,32.64,31.66,31.85,14276200 24-May-02,32.74,32.79,32.28,32.40,14183600 23-May-02,31.90,32.74,31.62,32.74,18058500 22-May-02,31.80,31.99,31.30,31.72,18914100 21-May-02,32.70,32.99,31.80,31.95,19864200 20-May-02,32.79,32.80,32.28,32.40,20308400 17-May-02,32.20,33.24,32.05,33.24,32674100 16-May-02,31.15,31.80,30.95,31.80,23497000 15-May-02,31.25,31.50,30.72,30.74,29630700 14-May-02,31.35,31.46,30.71,31.38,29672100 13-May-02,30.36,30.86,30.21,30.66,22533500 10-May-02,31.55,31.55,30.42,30.46,26257300 9-May-02,32.30,32.32,31.14,31.29,32919100 8-May-02,31.15,32.81,31.11,32.65,33876300 7-May-02,30.81,31.16,30.32,30.46,20627000 6-May-02,31.35,31.85,30.70,30.78,23319600 3-May-02,31.11,31.50,30.55,31.50,19807300 2-May-02,31.45,31.65,30.87,31.40,19586900 1-May-02,31.55,31.66,30.56,31.50,25795500 30-Apr-02,30.61,31.70,29.96,31.35,40299800 29-Apr-02,31.55,31.68,30.49,30.66,22623700 26-Apr-02,32.60,32.60,31.28,31.30,23183400 25-Apr-02,32.05,32.98,31.62,31.85,27672200 24-Apr-02,32.65,32.95,32.18,32.30,21743700 23-Apr-02,33.29,33.77,32.45,32.60,19485200 22-Apr-02,33.34,33.34,32.60,32.66,19806100 19-Apr-02,33.94,33.94,33.31,33.49,19681200 18-Apr-02,33.45,33.81,32.79,33.59,27240700 17-Apr-02,33.29,33.77,33.00,33.44,29648900 16-Apr-02,32.30,33.15,31.99,32.89,44634700 15-Apr-02,32.89,33.04,31.44,31.65,68551500 12-Apr-02,34.24,34.24,32.79,33.34,49724200 11-Apr-02,36.47,36.54,33.29,33.54,79873900 10-Apr-02,36.30,37.13,36.17,36.97,22679900 9-Apr-02,36.57,36.72,36.03,36.22,17161100 8-Apr-02,36.27,36.66,36.15,36.63,17163400 5-Apr-02,37.37,37.56,36.54,36.87,14824200 4-Apr-02,36.52,37.12,36.41,37.07,20529600 3-Apr-02,36.87,36.99,35.78,36.52,19117500 2-Apr-02,36.97,36.97,36.47,36.87,17410700 1-Apr-02,36.82,37.22,36.37,37.07,21535700 28-Mar-02,37.47,37.70,37.01,37.17,18709400 27-Mar-02,37.04,37.83,36.82,37.22,19626800 26-Mar-02,36.87,37.58,36.77,37.08,20010500 25-Mar-02,37.88,37.99,36.77,36.81,24599300 22-Mar-02,37.29,37.75,36.80,37.63,30601700 21-Mar-02,38.06,38.36,36.60,37.22,50303300 20-Mar-02,39.49,39.89,38.26,38.56,27496500 19-Mar-02,39.75,39.85,39.34,39.65,17870400 18-Mar-02,40.00,40.30,39.48,39.65,19998400 15-Mar-02,40.30,40.65,39.66,39.94,33098200 14-Mar-02,40.00,40.30,39.75,40.16,14763700 13-Mar-02,40.50,40.51,39.67,39.75,23574800 12-Mar-02,40.25,41.27,40.08,40.84,19767600 11-Mar-02,40.74,41.11,40.61,40.89,23441900 8-Mar-02,41.24,41.58,39.99,40.35,28101500 7-Mar-02,41.49,41.54,40.15,40.69,24434200 6-Mar-02,40.25,41.41,40.15,41.29,24636300 5-Mar-02,39.70,40.55,39.55,40.25,23793500 4-Mar-02,39.55,40.00,39.22,39.95,32281600 1-Mar-02,38.86,39.20,38.46,39.20,20117900 28-Feb-02,39.01,39.40,38.22,38.26,23397500 27-Feb-02,39.01,39.23,38.26,38.51,23093100 26-Feb-02,38.77,38.82,38.08,38.33,18784000 25-Feb-02,37.64,38.85,37.59,38.77,24430700 22-Feb-02,37.11,37.96,36.68,37.68,19559000 21-Feb-02,37.57,38.04,36.97,37.11,27637000 20-Feb-02,36.13,37.34,35.76,37.16,22008100 19-Feb-02,36.50,36.60,35.93,36.01,16948300 15-Feb-02,37.59,37.59,36.62,36.71,22109400 14-Feb-02,37.69,38.43,37.13,37.59,20375100 13-Feb-02,37.29,37.95,37.09,37.69,18759300 12-Feb-02,37.09,37.19,36.55,37.09,16329500 11-Feb-02,36.85,37.49,36.65,37.39,15768700 8-Feb-02,36.99,37.34,35.84,36.85,22713900 7-Feb-02,36.61,37.43,36.15,36.80,23954100 6-Feb-02,35.96,36.69,35.55,36.56,33209100 5-Feb-02,34.72,36.17,34.71,35.82,44376000 4-Feb-02,35.51,35.51,34.34,34.62,39740800 1-Feb-02,36.50,36.60,36.00,36.45,20544800 31-Jan-02,36.60,36.83,35.12,36.75,31013000 30-Jan-02,36.01,36.90,34.12,36.48,62345700 29-Jan-02,37.59,37.81,35.83,36.06,36329300 28-Jan-02,38.18,38.20,37.35,37.74,13962700 25-Jan-02,37.59,37.96,37.20,37.85,15756600 24-Jan-02,37.69,38.17,36.94,37.14,19384700 23-Jan-02,37.88,37.89,37.08,37.24,22501800 22-Jan-02,39.02,39.02,37.82,37.88,17171600 18-Jan-02,38.02,38.48,37.84,38.26,18037200 17-Jan-02,38.48,38.49,37.88,38.33,22560400 16-Jan-02,37.98,38.07,37.30,37.31,22894900 15-Jan-02,37.39,38.57,37.16,38.29,26047300 14-Jan-02,37.79,38.03,37.37,37.49,20832500 11-Jan-02,38.68,38.73,37.75,37.82,16802200 10-Jan-02,38.13,38.48,37.98,38.19,14738000 9-Jan-02,38.28,39.17,37.78,38.13,20192300 8-Jan-02,39.22,39.58,38.18,38.53,24128100 7-Jan-02,40.21,40.41,38.68,38.93,27526900 4-Jan-02,40.36,40.89,39.84,40.51,19853100 3-Jan-02,40.01,40.48,39.71,40.17,17497500 2-Jan-02,39.86,40.51,39.62,40.51,17693300 31-Dec-01,40.11,40.36,39.60,39.65,14030800 28-Dec-01,40.33,40.67,39.98,40.29,13621800 27-Dec-01,40.06,40.51,39.88,40.51,12881700 26-Dec-01,40.28,40.65,39.93,39.93,14955200 24-Dec-01,40.72,40.76,40.38,40.56,5569800 21-Dec-01,40.47,40.76,40.33,40.72,30675500 20-Dec-01,40.18,40.53,40.01,40.22,18656300 19-Dec-01,39.10,40.36,38.90,40.16,27305400 18-Dec-01,39.14,39.49,38.75,39.11,33016300 17-Dec-01,37.22,38.26,37.13,37.72,26715900 14-Dec-01,36.49,37.41,35.89,37.08,26119200 13-Dec-01,36.29,37.32,35.99,36.49,26103100 12-Dec-01,36.88,36.89,35.66,36.49,22629300 11-Dec-01,36.78,36.93,35.88,36.23,20718700 10-Dec-01,36.63,37.57,36.09,36.24,20747000 7-Dec-01,37.18,37.18,36.49,36.58,16374000 6-Dec-01,37.32,37.81,36.98,37.17,19367600 5-Dec-01,37.03,37.68,36.54,36.98,35193500 4-Dec-01,37.17,37.63,36.44,36.78,29176900 3-Dec-01,37.81,37.81,36.05,36.36,33713700 30-Nov-01,39.12,39.27,37.86,37.91,23595000 29-Nov-01,38.75,39.18,38.54,39.12,15390600 28-Nov-01,39.64,40.38,38.54,38.75,23774600 27-Nov-01,40.57,41.14,40.01,40.44,14034700 26-Nov-01,40.82,41.08,40.38,40.69,12607300 23-Nov-01,40.03,40.52,39.93,40.40,5246000 21-Nov-01,40.38,40.57,39.55,39.83,12021900 20-Nov-01,40.57,41.13,40.18,40.47,14338900 19-Nov-01,40.52,40.95,40.08,40.62,14189800 16-Nov-01,40.92,40.92,39.65,40.23,17294300 15-Nov-01,40.26,40.97,40.18,40.92,16943100 14-Nov-01,40.33,40.77,39.89,40.26,14243400 13-Nov-01,39.39,39.97,39.19,39.94,17642100 12-Nov-01,39.29,39.54,38.02,38.83,19891200 9-Nov-01,39.68,39.86,39.23,39.79,11799500 8-Nov-01,38.95,39.85,38.85,39.74,20047500 7-Nov-01,39.05,39.35,38.49,38.75,15283800 6-Nov-01,38.18,39.37,37.86,39.19,16800400 5-Nov-01,38.01,38.50,37.85,38.18,15160800 2-Nov-01,37.03,37.81,36.52,37.38,13969400 1-Nov-01,35.70,37.65,35.50,37.33,18593200 31-Oct-01,36.04,36.58,35.70,35.86,15930400 30-Oct-01,36.19,36.42,35.77,35.79,15276200 29-Oct-01,38.06,38.16,36.78,36.86,14143200 26-Oct-01,37.66,38.39,37.03,38.29,18619100 25-Oct-01,36.29,37.38,35.49,37.29,22510100 24-Oct-01,36.71,37.32,36.34,36.52,16009200 23-Oct-01,37.42,37.47,36.36,36.70,15209800 22-Oct-01,36.58,37.22,36.45,37.04,16272000 19-Oct-01,36.44,36.83,35.98,36.68,16372700 18-Oct-01,36.53,36.93,36.29,36.68,15151800 17-Oct-01,38.16,38.17,36.46,36.58,21689500 16-Oct-01,38.27,38.65,37.52,37.88,16597200 15-Oct-01,37.96,38.48,37.48,38.27,12873500 12-Oct-01,38.35,38.54,36.94,38.41,22116400 11-Oct-01,37.81,38.89,37.72,38.36,24701900 10-Oct-01,36.25,37.56,35.95,37.33,17994100 9-Oct-01,36.24,36.60,35.86,36.26,14174300 8-Oct-01,36.19,36.68,35.70,36.24,15739700 5-Oct-01,36.82,37.12,35.66,36.88,22852300 4-Oct-01,37.86,38.11,36.53,36.82,26630300 3-Oct-01,37.08,37.88,36.83,37.57,25648200 2-Oct-01,36.98,37.53,36.13,37.47,22364300 1-Oct-01,36.73,37.18,36.49,37.07,24724400 28-Sep-01,35.75,36.73,35.47,36.63,32471000 27-Sep-01,35.06,35.45,34.49,35.40,20999900 26-Sep-01,35.45,35.45,34.47,34.94,26488400 25-Sep-01,34.52,35.42,33.99,34.80,44047500 24-Sep-01,33.09,34.77,32.11,34.51,70974400 21-Sep-01,28.43,31.87,27.94,30.68,85888900 20-Sep-01,30.68,30.91,29.77,29.77,46676400 19-Sep-01,33.72,33.97,30.39,31.86,56660800 18-Sep-01,34.51,35.49,32.90,33.18,46110700 17-Sep-01,34.80,36.47,33.82,34.46,71444400 10-Sep-01,38.24,39.37,38.18,38.58,24095000 7-Sep-01,39.21,39.51,38.57,38.88,24183000 6-Sep-01,40.49,40.70,39.62,39.70,18420100 5-Sep-01,40.17,41.16,39.70,40.88,20164500 4-Sep-01,40.10,41.34,39.56,40.03,18486200 31-Aug-01,39.36,40.39,39.28,40.10,17259700 30-Aug-01,39.90,40.68,39.06,39.41,22061700 29-Aug-01,40.83,40.83,39.81,39.81,11899600 28-Aug-01,41.42,41.47,40.34,40.42,12733900 27-Aug-01,41.17,41.72,40.83,41.34,14320300 24-Aug-01,40.29,41.43,40.20,41.16,13596600 23-Aug-01,40.10,40.50,39.81,40.23,10507200 22-Aug-01,39.75,40.49,39.50,40.05,15836100 21-Aug-01,40.70,41.01,39.61,39.67,13918700 20-Aug-01,40.19,41.08,39.62,40.71,12777900 17-Aug-01,40.49,40.59,39.56,40.00,15675600 16-Aug-01,40.71,41.08,40.19,40.78,17082500 15-Aug-01,41.17,41.48,40.89,40.96,14946000 14-Aug-01,41.76,41.91,40.88,41.03,12559800 13-Aug-01,41.66,42.26,41.19,41.40,14195700 10-Aug-01,41.17,41.97,40.58,41.73,13353600 9-Aug-01,40.83,41.42,40.49,41.08,14855000 8-Aug-01,41.52,41.66,40.68,40.83,14592600 7-Aug-01,40.63,42.01,40.45,41.93,23329100 6-Aug-01,41.57,41.67,40.47,40.58,21286300 3-Aug-01,41.47,41.96,41.08,41.91,15274800 2-Aug-01,42.25,42.33,41.27,41.37,24474900 1-Aug-01,42.15,42.67,41.57,41.96,23324700 31-Jul-01,42.50,43.38,42.14,42.64,24761100 30-Jul-01,43.67,44.02,42.55,42.74,16692400 27-Jul-01,43.28,43.97,42.99,43.77,16467200 26-Jul-01,43.09,43.23,42.40,42.89,23613600 25-Jul-01,43.53,44.03,42.30,42.94,25075500 24-Jul-01,44.51,44.65,42.40,43.13,26311300 23-Jul-01,45.59,45.70,44.31,44.41,15203200 20-Jul-01,45.78,46.03,45.27,45.71,11999000 19-Jul-01,45.39,46.52,45.12,45.57,12881000 18-Jul-01,44.70,45.34,44.51,45.24,16952600 17-Jul-01,44.85,45.60,44.51,45.20,18256100 16-Jul-01,46.22,46.57,44.88,45.31,13751800 13-Jul-01,45.68,46.81,45.23,46.52,17619800 12-Jul-01,45.00,46.27,44.02,46.08,21427500 11-Jul-01,44.90,45.04,43.43,43.73,27137600 10-Jul-01,45.83,46.31,44.79,44.86,19023000 9-Jul-01,45.98,46.20,45.39,45.93,16153800 6-Jul-01,47.25,47.28,45.68,45.97,23441500 5-Jul-01,47.84,48.43,47.45,47.52,19462700 3-Jul-01,48.37,48.76,48.13,48.38,17570200 2-Jul-01,47.80,49.05,47.76,49.05,23182900 29-Jun-01,47.88,49.92,47.37,47.88,52690300 28-Jun-01,46.66,48.32,46.31,47.75,23575000 27-Jun-01,47.59,47.98,46.65,47.16,27011000 26-Jun-01,47.88,48.83,47.67,47.68,30804400 25-Jun-01,50.52,51.41,49.00,49.10,27093700 22-Jun-01,49.93,51.23,49.92,50.68,24614400 21-Jun-01,49.25,51.22,49.23,50.08,31969300 20-Jun-01,47.59,49.69,47.46,49.61,30002600 19-Jun-01,48.66,48.84,47.64,47.75,22588200 18-Jun-01,47.88,48.58,47.43,47.88,20103000 15-Jun-01,47.20,48.22,46.90,47.70,43756900 14-Jun-01,47.66,49.06,46.76,47.74,60128100 13-Jun-01,47.00,48.16,46.61,46.76,33105200 12-Jun-01,46.32,48.14,45.20,47.66,37572800 11-Jun-01,46.76,47.83,46.14,46.32,17879500 8-Jun-01,47.72,47.72,46.70,47.04,16805800 7-Jun-01,47.64,47.86,47.07,47.79,11148600 6-Jun-01,47.88,48.16,47.30,47.64,14017700 5-Jun-01,48.08,48.22,47.51,48.06,15232800 4-Jun-01,47.98,48.49,47.79,48.32,13800700 1-Jun-01,47.87,48.28,46.90,47.88,13459400 31-May-01,48.03,48.52,47.64,47.88,13387600 30-May-01,48.54,48.91,47.88,47.90,15599400 29-May-01,49.24,49.40,48.52,48.54,13017600 25-May-01,50.03,50.03,48.42,48.81,15636600 24-May-01,50.08,50.74,49.59,50.23,13074600 23-May-01,51.25,51.62,50.02,50.18,15999000 22-May-01,51.94,52.07,50.52,51.48,17378900 21-May-01,51.78,52.33,51.50,52.18,18244600 18-May-01,50.92,51.78,50.75,51.78,17302000 17-May-01,50.81,51.43,50.52,50.92,19454400 16-May-01,48.85,51.06,48.52,51.02,24480600 15-May-01,48.59,49.21,48.17,49.00,17834400 14-May-01,47.89,48.85,47.68,48.59,10972200 11-May-01,48.70,48.86,47.40,47.89,11873400 10-May-01,49.00,49.05,48.28,48.69,13567900 9-May-01,47.88,49.25,47.65,48.30,23099200 8-May-01,48.82,48.86,47.60,48.35,15135700 7-May-01,48.79,48.86,48.35,48.82,14729900 4-May-01,46.51,48.84,46.42,48.79,18312700 3-May-01,47.98,47.99,46.91,47.39,18467500 2-May-01,47.91,48.31,47.02,47.98,18119600 1-May-01,46.95,47.83,46.71,47.79,13067400 30-Apr-01,48.85,48.87,46.91,47.42,18249000 27-Apr-01,48.17,48.81,47.19,48.81,15681300 26-Apr-01,47.83,48.26,47.38,48.17,21044300 25-Apr-01,45.63,47.37,45.34,46.72,17857800 24-Apr-01,45.93,46.71,44.84,44.94,18614500 23-Apr-01,46.66,46.67,45.81,46.12,16211900 20-Apr-01,47.40,47.40,46.42,47.00,23271000 19-Apr-01,46.42,47.44,46.25,47.40,22062000 18-Apr-01,44.83,46.86,44.48,46.80,36439500 17-Apr-01,43.09,44.45,42.99,44.42,20507400 16-Apr-01,43.51,43.73,42.91,43.63,14130200 12-Apr-01,42.56,43.68,42.23,43.68,17265300 11-Apr-01,43.39,43.48,41.77,42.28,20147900 10-Apr-01,41.77,44.49,41.63,42.83,26111100 9-Apr-01,40.49,41.43,40.28,41.04,17781300 6-Apr-01,40.60,40.75,39.43,40.23,24653200 5-Apr-01,40.06,41.28,39.67,41.14,23794700 4-Apr-01,38.65,39.97,38.15,38.70,26831300 3-Apr-01,40.60,40.64,38.36,38.77,23599300 2-Apr-01,40.57,41.68,39.95,40.85,24248400 30-Mar-01,40.80,40.96,40.28,40.90,29428100 29-Mar-01,40.36,40.53,39.77,40.45,26964700 28-Mar-01,40.31,40.65,39.87,40.60,26863900 27-Mar-01,39.82,41.28,39.62,40.95,36552300 26-Mar-01,39.57,40.06,39.14,39.31,31143900 23-Mar-01,37.86,39.08,37.28,39.08,45736600 22-Mar-01,37.86,37.92,35.59,36.84,55941400 21-Mar-01,39.14,39.67,37.98,38.11,26840800 20-Mar-01,40.55,41.14,39.09,39.14,22324400 19-Mar-01,39.77,40.67,39.23,40.16,20831800 16-Mar-01,39.48,40.80,39.18,39.67,44851000 15-Mar-01,40.55,40.89,39.77,40.14,24847700 14-Mar-01,39.82,41.28,39.18,40.09,35437100 13-Mar-01,40.55,41.53,39.82,41.36,42939700 12-Mar-01,42.02,42.31,37.72,38.70,45708300 9-Mar-01,44.22,44.33,42.46,42.81,19891300 8-Mar-01,45.10,45.30,43.97,44.82,16572100 7-Mar-01,44.43,45.20,44.43,44.93,13889500 6-Mar-01,45.19,45.54,44.28,44.38,15691600 5-Mar-01,43.73,44.32,43.58,44.05,16671900 2-Mar-01,44.15,44.46,43.35,43.40,21981100 1-Mar-01,44.30,44.86,43.73,44.70,23957800 28-Feb-01,46.74,46.97,44.40,45.27,26553400 27-Feb-01,46.23,46.74,45.76,46.74,22578900 26-Feb-01,45.76,46.74,44.98,46.72,21073600 23-Feb-01,45.32,45.76,43.83,44.96,23368500 22-Feb-01,46.10,46.25,44.85,45.86,22901300 21-Feb-01,46.44,47.17,45.98,46.05,18497500 20-Feb-01,45.96,47.04,45.93,46.43,20032300 16-Feb-01,45.27,46.08,45.04,45.76,16917000 15-Feb-01,45.08,46.83,44.93,46.72,24011600 14-Feb-01,45.92,45.95,44.90,45.04,13239700 13-Feb-01,46.40,46.73,45.89,45.92,14322100 12-Feb-01,44.46,46.56,44.46,46.26,17953200 9-Feb-01,45.90,45.91,44.19,44.46,18478700 8-Feb-01,46.49,46.88,45.79,45.90,17708500 7-Feb-01,46.41,46.54,45.39,45.71,13031100 6-Feb-01,46.59,46.82,45.96,46.35,15962600 5-Feb-01,45.16,46.83,44.84,46.59,21847000 2-Feb-01,45.03,45.66,44.64,45.06,16040500 1-Feb-01,45.27,45.50,44.69,45.01,17586900 31-Jan-01,45.52,45.71,44.36,44.77,21346100 30-Jan-01,43.58,45.05,43.25,45.03,19843100 29-Jan-01,43.69,45.03,42.84,43.21,23027200 26-Jan-01,45.21,45.58,43.39,43.45,26858500 25-Jan-01,45.15,45.94,44.61,44.73,20812100 24-Jan-01,45.27,45.94,44.61,45.09,19145100 23-Jan-01,45.27,45.88,44.91,45.46,21121600 22-Jan-01,45.64,46.13,44.24,44.54,20691900 19-Jan-01,46.55,46.86,45.40,45.76,19360100 18-Jan-01,46.13,46.80,45.40,46.37,19290300 17-Jan-01,46.74,47.22,45.21,45.46,24412000 16-Jan-01,44.48,46.31,44.42,46.13,19758500 12-Jan-01,45.58,45.70,43.81,44.48,16802900 11-Jan-01,44.42,45.76,44.06,45.34,23599100 10-Jan-01,42.96,43.94,42.05,43.51,24805300 9-Jan-01,44.73,45.03,42.60,43.45,20066000 8-Jan-01,46.01,46.01,43.45,44.36,23210900 5-Jan-01,46.49,46.55,44.91,46.07,22790400 4-Jan-01,46.07,47.47,45.88,46.80,26926400 3-Jan-01,43.08,46.67,42.66,46.55,39205800 2-Jan-01,45.52,45.64,41.50,42.60,36837700 29-Dec-00,47.22,47.53,46.37,46.67,10983300 28-Dec-00,47.65,47.89,46.37,47.16,12562000 27-Dec-00,47.89,48.44,46.92,46.92,12231700 26-Dec-00,47.19,47.98,46.64,47.86,9113800 22-Dec-00,46.70,47.92,46.46,47.43,11699900 21-Dec-00,46.16,47.07,45.80,46.46,19675700 20-Dec-00,47.13,47.98,46.04,46.04,20264400 19-Dec-00,49.49,49.92,48.65,48.65,15377800 18-Dec-00,49.07,49.92,49.01,49.49,13941300 15-Dec-00,48.89,49.74,47.80,48.34,35899600 14-Dec-00,51.19,51.25,49.92,49.92,15750200 13-Dec-00,51.25,52.04,51.19,51.44,17563400 12-Dec-00,52.29,53.44,50.77,51.25,25319900 11-Dec-00,53.56,54.53,52.77,53.68,16445000 8-Dec-00,52.89,53.92,52.71,53.56,16858500 7-Dec-00,51.56,52.53,51.56,51.92,10359200 6-Dec-00,51.98,52.53,51.31,52.35,15878700 5-Dec-00,50.22,52.89,50.10,52.53,19991000 4-Dec-00,49.49,50.34,49.31,50.10,11993500 1-Dec-00,49.37,49.92,48.83,49.49,18202900 30-Nov-00,47.80,48.59,46.52,48.10,20149100 29-Nov-00,47.80,49.43,47.55,48.22,12740000 28-Nov-00,47.68,48.98,47.31,48.34,14812300 27-Nov-00,48.65,49.31,47.68,47.68,16086000 24-Nov-00,48.04,48.34,47.61,47.92,6303000 22-Nov-00,48.52,48.59,46.95,47.13,22223500 21-Nov-00,48.59,50.04,48.59,49.25,12194000 20-Nov-00,49.74,50.40,48.40,48.59,14794900 17-Nov-00,51.13,51.86,49.68,50.34,11987700 16-Nov-00,50.71,51.98,50.53,51.07,10313200 15-Nov-00,50.83,51.50,50.04,50.95,12136300 14-Nov-00,49.92,51.56,49.74,51.19,14707500 13-Nov-00,50.47,51.68,49.01,49.92,18458500 10-Nov-00,52.16,53.32,51.68,52.29,12252700 9-Nov-00,52.47,53.26,51.56,52.95,12295100 8-Nov-00,53.26,53.62,52.53,52.95,9482600 7-Nov-00,52.89,53.44,52.65,53.32,9680200 6-Nov-00,51.98,52.95,51.74,52.89,11944700 3-Nov-00,52.22,52.29,51.38,51.74,12062500 2-Nov-00,52.65,53.38,51.92,52.10,14338200 1-Nov-00,53.13,53.32,52.29,52.83,15900200 31-Oct-00,52.53,53.32,52.22,53.19,17172100 30-Oct-00,50.89,52.41,50.71,52.41,18234800 27-Oct-00,51.13,51.62,50.28,50.71,15464000 26-Oct-00,51.44,51.80,49.86,50.59,18670400 25-Oct-00,51.80,52.29,50.59,51.38,29252400 24-Oct-00,49.01,51.80,48.59,51.80,45995300 23-Oct-00,50.10,50.47,47.55,48.28,71299300 20-Oct-00,53.13,53.62,50.10,50.59,18000100 19-Oct-00,53.86,54.29,53.13,53.98,13189000 18-Oct-00,52.16,54.17,51.31,53.86,18415100 17-Oct-00,55.99,55.99,53.32,53.98,16856000 16-Oct-00,55.32,56.17,54.95,56.05,12994200 13-Oct-00,53.01,55.92,52.89,55.32,15552900 12-Oct-00,54.89,55.44,52.41,52.89,17409000 11-Oct-00,55.08,55.99,53.68,54.95,18511200 10-Oct-00,57.02,57.44,55.86,56.35,11007800 9-Oct-00,57.38,58.05,56.71,56.77,9687600 6-Oct-00,57.74,58.17,56.11,57.68,14005500 5-Oct-00,57.38,58.17,57.02,57.99,11778600 4-Oct-00,57.14,57.99,56.90,57.14,11419200 3-Oct-00,56.90,58.11,56.77,57.32,12229500 2-Oct-00,56.29,57.14,56.05,56.77,11895100 29-Sep-00,56.65,57.14,55.99,56.11,10709500 28-Sep-00,57.31,57.85,56.76,57.13,11164700 27-Sep-00,56.34,57.61,55.98,57.55,14682200 26-Sep-00,55.25,56.94,55.25,56.16,14044800 25-Sep-00,55.19,56.46,55.07,56.22,11003200 22-Sep-00,56.04,56.16,53.37,55.49,14249900 21-Sep-00,53.86,56.04,53.80,54.46,10721700 20-Sep-00,54.83,55.25,53.25,54.83,14211900 19-Sep-00,55.73,56.10,54.83,55.19,11888400 18-Sep-00,54.89,56.52,54.83,55.67,12821300 15-Sep-00,56.64,56.76,54.58,54.95,20244200 14-Sep-00,57.31,57.49,56.46,57.13,7924800 13-Sep-00,56.94,57.73,56.70,57.19,7604800 12-Sep-00,57.61,57.85,57.07,57.19,10180000 11-Sep-00,57.61,58.15,56.82,57.79,11777500 1-Sep-00,57.37,57.79,55.98,56.64,7741000 31-Aug-00,55.43,57.43,55.37,56.76,11900600 30-Aug-00,57.25,57.43,55.31,55.67,10482400 29-Aug-00,57.67,58.03,57.31,57.97,8230700 28-Aug-00,57.61,58.58,57.55,58.09,12556000 25-Aug-00,57.19,57.67,57.01,57.37,8098400 24-Aug-00,56.22,57.67,55.92,57.07,11981300 23-Aug-00,54.46,56.22,54.34,56.10,11312800 22-Aug-00,54.83,55.13,54.28,54.46,8087500 21-Aug-00,54.89,55.25,54.34,54.77,7814200 18-Aug-00,54.40,54.71,53.98,54.40,8319800 17-Aug-00,54.52,55.43,54.22,54.89,10330000 16-Aug-00,55.43,55.43,54.40,55.01,7451700 15-Aug-00,54.95,55.55,54.40,55.43,10792200 14-Aug-00,54.58,55.37,54.04,55.19,7795000 11-Aug-00,54.34,55.55,53.98,54.77,12111100 10-Aug-00,54.10,55.37,53.74,55.19,18241700 9-Aug-00,52.16,54.40,51.92,54.16,21437700 8-Aug-00,51.38,52.10,50.35,52.04,8808200 7-Aug-00,50.47,51.92,50.47,50.95,7729700 4-Aug-00,50.23,51.80,49.56,51.68,9088500 3-Aug-00,52.16,52.16,50.23,51.20,12935400 2-Aug-00,50.77,51.13,49.86,50.35,15445700 1-Aug-00,50.29,51.20,50.17,51.07,13002900 31-Jul-00,49.99,51.20,49.80,50.05,17194200 28-Jul-00,50.83,50.95,48.78,49.32,13406700 27-Jul-00,50.95,51.38,50.59,50.83,13786600 26-Jul-00,52.22,52.22,50.47,50.47,16765300 25-Jul-00,52.28,52.47,51.80,51.86,8467800 24-Jul-00,52.47,52.89,51.92,52.28,9440000 21-Jul-00,52.89,53.01,51.92,52.41,13019700 20-Jul-00,51.50,53.01,51.13,52.59,11220500 19-Jul-00,51.26,51.62,50.89,51.07,9531300 18-Jul-00,51.92,52.04,50.59,50.59,11987500 17-Jul-00,49.92,52.71,49.92,51.98,18369600 14-Jul-00,50.65,50.83,49.86,49.86,11123900 13-Jul-00,51.56,52.28,50.29,50.83,16100500 12-Jul-00,52.16,52.16,50.59,52.04,10783100 11-Jul-00,50.65,51.68,50.41,50.59,12912600 10-Jul-00,49.68,50.95,49.50,50.77,12246700 7-Jul-00,49.14,49.86,48.71,49.68,9937800 6-Jul-00,48.47,49.38,48.23,48.59,9616500 5-Jul-00,50.59,50.59,47.93,48.35,13558000 3-Jul-00,50.83,50.83,49.74,50.35,6604600 30-Jun-00,47.69,51.42,47.50,51.32,19076300 29-Jun-00,48.90,48.90,47.75,48.17,12893000 28-Jun-00,48.17,49.20,47.99,48.94,13246800 27-Jun-00,48.41,48.71,47.50,47.69,9813100 26-Jun-00,47.81,48.47,47.50,48.35,9103300 23-Jun-00,47.14,48.29,47.02,48.29,10195700 22-Jun-00,47.63,48.41,46.41,47.20,15694200 21-Jun-00,48.47,48.77,47.63,47.87,13845200 20-Jun-00,50.29,50.29,48.53,49.38,11161600 19-Jun-00,49.20,50.11,48.41,48.65,9807400 16-Jun-00,50.35,50.53,49.43,49.50,18995100 15-Jun-00,48.90,50.35,48.41,50.23,11984300 14-Jun-00,49.62,50.17,48.71,49.38,10300100 13-Jun-00,48.41,49.92,48.17,49.56,13406400 12-Jun-00,48.41,48.53,46.90,48.29,12246200 9-Jun-00,49.44,49.62,47.69,48.29,10962800 8-Jun-00,49.86,49.99,48.90,49.26,8691800 7-Jun-00,49.50,50.77,49.38,49.74,9976600 6-Jun-00,49.86,50.17,48.96,49.56,7964800 5-Jun-00,50.35,50.59,49.44,49.92,9592300 2-Jun-00,51.62,52.28,50.11,51.07,12014700 1-Jun-00,50.41,51.68,49.14,50.71,12817600 31-May-00,50.11,51.62,49.86,50.95,14464600 30-May-00,48.23,49.86,47.81,49.62,12945500 26-May-00,48.84,49.32,47.75,47.99,8866300 25-May-00,49.14,50.17,48.17,49.14,11438500 24-May-00,47.44,49.62,47.44,49.14,14942600 23-May-00,47.63,48.41,47.38,48.41,12092000 22-May-00,50.23,50.23,47.20,48.41,16754600 19-May-00,50.47,51.01,49.38,50.23,12893000 18-May-00,51.80,52.65,51.20,51.44,12866900 17-May-00,52.04,52.65,51.44,51.92,11294900 16-May-00,53.07,53.43,52.28,52.53,16931900 15-May-00,50.65,52.71,50.59,52.28,13556300 12-May-00,49.20,50.95,49.08,50.59,10713800 11-May-00,49.86,50.71,49.14,49.32,13437300 10-May-00,49.86,50.41,48.47,49.02,15059400 9-May-00,50.71,51.01,49.26,50.47,13439400 8-May-00,50.47,51.20,49.99,50.77,11676500 5-May-00,49.70,51.64,49.54,50.99,6895300 4-May-00,50.81,50.83,49.30,49.70,5137000 packet/data/equities/gis0100644000076400007640000005532107525024672014251 0ustar iankiankDate,Open,High,Low,Close,Volume 2-Aug-02,41.35,42.00,40.66,41.16,1003100 1-Aug-02,41.44,41.85,41.05,41.15,858500 31-Jul-02,40.64,41.45,40.49,41.45,1315000 30-Jul-02,40.38,40.84,40.04,40.47,1874300 29-Jul-02,40.30,40.37,39.90,40.27,1454200 26-Jul-02,40.00,40.00,39.35,39.85,1380600 25-Jul-02,39.91,40.13,39.21,39.70,2864100 24-Jul-02,38.15,39.97,37.38,39.90,1859800 23-Jul-02,38.21,38.97,37.80,38.53,2094000 22-Jul-02,38.99,39.93,38.08,38.40,2181800 19-Jul-02,40.23,40.55,38.85,38.99,2719500 18-Jul-02,42.45,42.72,40.05,40.23,1890500 17-Jul-02,42.40,43.47,42.27,42.80,1259300 16-Jul-02,42.96,43.10,42.07,42.26,1844900 15-Jul-02,42.07,43.44,41.79,43.36,1961700 12-Jul-02,43.08,43.08,41.95,42.16,873700 11-Jul-02,43.25,43.51,43.00,43.20,1404200 10-Jul-02,43.45,43.85,43.13,43.35,1651000 9-Jul-02,44.33,44.59,43.35,43.54,1331800 8-Jul-02,43.84,44.42,43.81,44.33,1014600 5-Jul-02,43.43,43.97,42.90,43.97,412200 3-Jul-02,43.78,43.90,42.58,43.14,859200 2-Jul-02,43.48,44.02,43.46,43.64,1315300 1-Jul-02,44.17,44.30,43.61,43.78,1628300 28-Jun-02,44.82,44.84,43.81,43.81,2948800 27-Jun-02,44.34,45.01,44.28,44.92,1943500 26-Jun-02,43.08,44.17,42.44,44.08,2158200 25-Jun-02,42.78,43.03,42.00,42.58,2981400 24-Jun-02,42.73,42.92,41.92,42.68,1741200 21-Jun-02,42.83,43.19,42.78,43.01,1711600 20-Jun-02,43.58,43.90,42.98,43.23,2218700 19-Jun-02,43.23,43.72,43.13,43.62,961500 18-Jun-02,43.53,43.63,43.18,43.53,1238000 17-Jun-02,42.73,43.48,42.73,43.33,920800 14-Jun-02,42.68,42.87,42.48,42.64,2027200 13-Jun-02,43.23,43.53,43.08,43.20,1143700 12-Jun-02,43.45,43.66,43.23,43.34,1193300 11-Jun-02,43.82,44.16,43.22,43.45,982200 10-Jun-02,44.09,44.09,43.63,43.82,703200 7-Jun-02,43.88,44.45,43.68,44.04,1604300 6-Jun-02,44.87,44.88,43.89,44.23,680100 5-Jun-02,44.37,44.96,43.97,44.90,636700 4-Jun-02,44.37,44.92,44.03,44.37,1024100 3-Jun-02,45.10,45.35,44.48,44.71,814500 31-May-02,44.47,45.58,44.41,45.22,885500 30-May-02,44.68,44.82,44.23,44.65,705800 29-May-02,44.38,44.72,44.25,44.72,562800 28-May-02,44.67,44.68,44.20,44.37,625500 24-May-02,44.97,45.01,44.56,44.82,901300 23-May-02,44.96,45.01,44.47,44.78,827000 22-May-02,44.22,45.04,44.22,44.96,922700 21-May-02,43.83,44.22,43.83,44.08,820800 20-May-02,44.27,44.27,43.73,43.83,709600 17-May-02,44.40,44.42,43.91,44.22,558000 16-May-02,44.17,44.63,44.08,44.40,654600 15-May-02,44.32,44.49,43.76,43.85,934200 14-May-02,44.62,44.66,44.01,44.32,752600 13-May-02,44.32,44.35,43.71,44.14,823500 10-May-02,44.32,44.73,43.93,44.16,1827500 9-May-02,44.22,44.62,43.91,44.13,844000 8-May-02,44.13,44.13,43.71,44.01,1288500 7-May-02,44.42,44.52,43.73,43.73,2080400 6-May-02,44.89,44.97,44.21,44.35,1685500 3-May-02,45.71,45.81,44.72,44.89,3361600 2-May-02,44.60,45.31,44.32,45.30,1808900 1-May-02,43.97,44.34,43.68,44.27,1894100 30-Apr-02,43.03,44.02,42.90,43.78,3382400 29-Apr-02,43.28,43.58,42.66,42.75,4704600 26-Apr-02,42.04,42.89,41.34,42.66,16472600 25-Apr-02,48.70,48.87,44.56,45.02,8563200 24-Apr-02,49.74,50.00,48.70,48.76,1171800 23-Apr-02,49.79,49.89,49.47,49.72,557700 22-Apr-02,49.24,49.81,49.10,49.59,982300 19-Apr-02,49.16,49.59,48.66,49.49,869900 18-Apr-02,48.35,49.05,47.94,48.99,1144600 17-Apr-02,49.69,49.69,48.49,48.71,1575300 16-Apr-02,49.19,49.83,49.00,49.69,1680000 15-Apr-02,49.99,50.09,48.74,48.85,892400 12-Apr-02,49.59,49.99,49.29,49.87,860800 11-Apr-02,49.45,49.83,49.27,49.49,1135800 10-Apr-02,49.10,49.64,48.99,49.53,927700 9-Apr-02,48.91,49.37,48.30,49.34,1193400 8-Apr-02,48.60,48.94,48.50,48.90,528100 5-Apr-02,48.67,48.77,48.01,48.60,605500 4-Apr-02,47.73,48.67,47.67,48.61,657700 3-Apr-02,47.72,48.34,47.51,47.60,834300 2-Apr-02,47.68,47.99,47.52,47.71,1290300 1-Apr-02,48.28,48.28,47.63,47.68,1313300 28-Mar-02,48.23,48.78,48.04,48.28,691000 27-Mar-02,48.57,48.82,48.08,48.30,781500 26-Mar-02,48.18,48.87,48.18,48.56,1449800 25-Mar-02,47.44,48.41,47.44,47.96,918800 22-Mar-02,47.70,48.02,47.52,47.72,971300 21-Mar-02,46.74,47.66,46.05,47.44,1676600 20-Mar-02,47.14,47.62,46.33,46.67,2213200 19-Mar-02,47.47,48.43,47.23,47.44,1769900 18-Mar-02,47.70,47.70,46.52,47.46,1330200 15-Mar-02,47.34,47.72,46.88,47.70,1536200 14-Mar-02,46.40,47.01,46.40,46.81,802000 13-Mar-02,46.35,46.60,46.10,46.31,1303100 12-Mar-02,46.10,46.28,45.56,46.25,1423600 11-Mar-02,45.85,46.39,45.67,45.73,1637300 8-Mar-02,45.31,45.60,45.01,45.46,2724200 7-Mar-02,44.91,45.03,44.47,44.86,1799200 6-Mar-02,44.77,45.25,44.52,44.91,1282200 5-Mar-02,43.48,44.48,43.48,44.48,2985300 4-Mar-02,45.40,45.40,43.28,43.48,4478900 1-Mar-02,45.69,45.69,44.67,45.40,3314300 28-Feb-02,46.69,46.79,45.65,45.69,3000800 27-Feb-02,46.55,46.94,46.45,46.80,2588300 26-Feb-02,47.39,47.44,46.83,47.20,1655300 25-Feb-02,46.64,47.10,46.53,46.97,1644400 22-Feb-02,45.90,46.89,45.51,46.71,897500 21-Feb-02,46.55,46.82,45.60,45.74,2042100 20-Feb-02,46.05,47.02,45.41,46.94,2239400 19-Feb-02,46.25,46.89,45.95,46.05,1862700 15-Feb-02,46.10,46.92,46.09,46.32,1097400 14-Feb-02,45.61,46.30,45.06,46.30,1227500 13-Feb-02,46.20,46.53,45.25,45.43,1655000 12-Feb-02,45.76,46.20,45.61,46.08,1708300 11-Feb-02,45.51,45.81,45.11,45.67,1845900 8-Feb-02,44.82,45.61,44.17,45.46,2277300 7-Feb-02,43.14,44.70,43.14,44.37,4615600 6-Feb-02,43.98,44.22,42.71,43.04,10876600 5-Feb-02,48.47,48.72,47.85,48.14,722700 4-Feb-02,48.42,48.92,47.87,48.10,997000 1-Feb-02,49.11,49.19,47.92,48.26,1397100 31-Jan-02,48.57,49.21,48.28,48.97,1069600 30-Jan-02,47.48,48.86,47.44,48.79,1569100 29-Jan-02,47.44,47.67,47.07,47.48,1263200 28-Jan-02,47.90,48.03,47.48,47.70,1088300 25-Jan-02,48.11,48.23,47.50,47.89,875700 24-Jan-02,48.72,48.82,47.53,48.11,1750600 23-Jan-02,49.16,49.26,48.62,48.87,661700 22-Jan-02,49.26,49.48,49.08,49.33,729600 18-Jan-02,48.97,49.56,48.74,49.36,1219900 17-Jan-02,48.59,48.90,47.99,48.80,988400 16-Jan-02,48.92,49.23,48.58,48.59,741100 15-Jan-02,48.35,49.02,48.03,48.92,1058100 14-Jan-02,47.91,48.82,47.70,48.35,1232800 11-Jan-02,47.67,48.37,47.56,47.91,765100 10-Jan-02,48.10,48.55,47.81,47.91,1064200 9-Jan-02,48.76,49.13,47.88,48.00,1944100 8-Jan-02,48.69,48.86,48.31,48.76,1103900 7-Jan-02,49.23,49.26,48.37,48.50,1830100 4-Jan-02,50.09,50.09,48.90,49.24,1109000 3-Jan-02,50.08,50.22,49.68,50.09,741100 2-Jan-02,50.84,50.84,49.30,50.07,2340800 31-Dec-01,51.26,51.40,50.88,51.11,743000 28-Dec-01,51.82,51.89,51.25,51.46,861700 27-Dec-01,51.47,51.95,51.01,51.95,1304000 26-Dec-01,50.86,51.58,50.86,51.47,925700 24-Dec-01,50.71,51.10,50.62,50.85,634200 21-Dec-01,50.41,51.00,50.40,51.00,1621000 20-Dec-01,50.12,50.41,49.80,50.40,2402800 19-Dec-01,49.52,50.90,49.05,50.46,2763300 18-Dec-01,49.12,49.52,48.55,49.52,983600 17-Dec-01,48.70,49.07,48.42,48.64,1176600 14-Dec-01,48.10,49.04,48.00,48.69,1188100 13-Dec-01,47.50,48.60,47.49,48.32,1071400 12-Dec-01,47.90,48.04,47.17,47.50,1843400 11-Dec-01,48.03,48.39,47.78,47.91,630000 10-Dec-01,48.15,48.64,47.91,48.03,598300 7-Dec-01,48.25,48.69,48.15,48.24,926300 6-Dec-01,48.86,48.99,48.20,48.21,1020400 5-Dec-01,49.54,49.74,48.85,49.16,1581500 4-Dec-01,49.50,49.63,48.99,49.54,1251900 3-Dec-01,48.50,49.63,48.26,49.50,1789300 30-Nov-01,48.01,48.84,47.98,48.50,1375700 29-Nov-01,47.66,48.10,47.53,48.01,1262900 28-Nov-01,47.07,47.86,46.97,47.68,883800 27-Nov-01,47.66,47.72,47.07,47.07,1197500 26-Nov-01,47.61,47.87,47.49,47.71,872700 23-Nov-01,47.39,47.84,47.18,47.75,381600 21-Nov-01,47.17,47.63,46.93,47.40,1141000 20-Nov-01,47.12,47.47,46.97,47.17,1439100 19-Nov-01,47.63,47.63,47.00,47.16,2505700 16-Nov-01,48.88,49.12,47.50,47.63,1898300 15-Nov-01,48.65,49.43,48.58,48.64,1856700 14-Nov-01,48.71,49.35,48.38,49.15,1638900 13-Nov-01,48.89,48.89,48.16,48.61,1651800 12-Nov-01,47.91,49.14,47.86,48.28,2556400 9-Nov-01,48.46,49.14,47.56,47.91,6473200 8-Nov-01,50.14,50.27,48.65,48.75,4081600 7-Nov-01,49.23,50.28,49.11,49.91,3303400 6-Nov-01,49.17,49.47,48.96,49.37,3893800 5-Nov-01,48.40,49.87,48.30,49.33,7837600 2-Nov-01,46.48,48.44,46.48,48.11,8899800 1-Nov-01,45.13,46.62,45.13,46.19,16511700 31-Oct-01,45.01,45.45,44.52,45.13,4243500 30-Oct-01,44.13,44.49,43.75,44.21,1316900 29-Oct-01,44.17,44.18,43.64,44.13,1605900 26-Oct-01,43.63,44.12,43.22,44.06,1220800 25-Oct-01,42.93,43.63,42.62,43.63,2790900 24-Oct-01,43.53,43.83,42.97,43.10,5019000 23-Oct-01,42.75,42.90,42.18,42.45,2067500 22-Oct-01,42.55,42.80,42.06,42.40,1720400 19-Oct-01,42.14,42.38,42.06,42.25,900800 18-Oct-01,42.11,42.39,42.10,42.24,1592200 17-Oct-01,42.26,42.88,42.06,42.26,1405600 16-Oct-01,42.11,42.27,42.01,42.24,1202400 15-Oct-01,42.01,42.33,41.77,42.21,1416000 12-Oct-01,42.50,42.52,41.86,42.01,1412100 11-Oct-01,42.89,42.94,42.31,42.45,1878900 10-Oct-01,42.36,42.78,42.26,42.65,1522800 9-Oct-01,42.44,42.45,41.94,42.19,966400 8-Oct-01,42.24,42.70,42.11,42.21,2127700 5-Oct-01,42.31,43.14,42.31,42.73,1326700 4-Oct-01,42.57,42.59,41.83,42.15,1880700 3-Oct-01,42.96,43.12,42.18,42.41,2013800 2-Oct-01,43.35,43.55,42.87,43.06,1611300 1-Oct-01,44.19,44.19,43.15,43.55,1179000 28-Sep-01,44.58,44.58,43.83,44.43,1049700 27-Sep-01,43.57,44.18,43.21,44.15,1814400 26-Sep-01,43.99,44.23,43.31,43.57,1257900 25-Sep-01,43.21,43.92,43.16,43.65,1953300 24-Sep-01,42.62,43.68,42.62,43.60,1691600 21-Sep-01,43.50,43.51,42.24,42.38,3304600 20-Sep-01,44.72,44.97,44.14,44.62,1936300 19-Sep-01,45.06,45.25,44.49,44.95,1649800 18-Sep-01,44.33,45.49,43.53,45.31,2436700 17-Sep-01,44.82,44.82,43.60,43.98,2772700 10-Sep-01,44.04,44.66,44.04,44.65,1762200 7-Sep-01,44.38,44.38,44.04,44.18,2058200 6-Sep-01,43.61,44.40,43.36,44.05,910600 5-Sep-01,43.75,44.09,43.27,43.85,750000 4-Sep-01,43.40,43.90,43.26,43.69,731100 31-Aug-01,43.11,43.59,42.67,43.30,580500 30-Aug-01,43.01,43.84,42.82,42.98,671700 29-Aug-01,43.33,43.44,42.97,43.01,343000 28-Aug-01,43.70,43.81,43.39,43.48,1008100 27-Aug-01,43.56,44.17,43.50,43.65,543100 24-Aug-01,43.79,44.18,43.54,43.79,1029300 23-Aug-01,44.23,44.29,43.75,43.99,620400 22-Aug-01,43.77,44.14,43.50,44.01,1467200 21-Aug-01,43.60,44.23,43.54,43.94,1077000 20-Aug-01,43.40,43.60,43.21,43.40,546900 17-Aug-01,42.85,43.35,42.80,43.26,464600 16-Aug-01,43.01,43.26,42.48,43.06,463900 15-Aug-01,43.08,43.40,42.80,43.16,547000 14-Aug-01,42.77,42.94,42.49,42.84,734500 13-Aug-01,43.50,43.70,42.77,42.77,969100 10-Aug-01,42.92,43.56,42.92,43.45,781600 9-Aug-01,41.99,43.45,41.85,43.11,965300 8-Aug-01,41.91,42.33,41.89,41.90,520800 7-Aug-01,41.99,42.33,41.60,42.15,648200 6-Aug-01,42.28,42.52,41.90,41.93,528500 3-Aug-01,43.03,43.21,42.23,42.39,755100 2-Aug-01,42.67,43.03,42.10,43.00,649600 1-Aug-01,43.10,43.12,42.40,42.62,772300 31-Jul-01,42.37,43.16,41.89,42.94,1167200 30-Jul-01,42.67,42.77,42.10,42.37,1019400 27-Jul-01,43.41,43.41,42.48,42.67,924000 26-Jul-01,43.99,43.99,43.31,43.41,873900 25-Jul-01,43.45,44.15,43.11,44.14,1204100 24-Jul-01,43.14,43.58,42.98,43.26,796100 23-Jul-01,43.45,43.68,43.00,43.19,631200 20-Jul-01,43.11,43.50,42.95,43.21,658900 19-Jul-01,42.97,43.31,42.80,42.94,770800 18-Jul-01,42.87,43.29,42.75,43.06,582500 17-Jul-01,42.62,42.99,42.43,42.95,659200 16-Jul-01,42.48,42.67,42.28,42.48,567300 13-Jul-01,42.71,42.73,42.13,42.43,622100 12-Jul-01,42.98,43.01,42.32,42.66,696600 11-Jul-01,42.77,43.12,42.69,43.03,738100 10-Jul-01,42.38,42.86,42.38,42.55,419400 9-Jul-01,42.52,42.85,42.28,42.49,598200 6-Jul-01,42.67,42.84,42.42,42.52,776000 5-Jul-01,42.23,42.60,42.23,42.43,768500 3-Jul-01,42.60,42.62,42.14,42.47,501400 2-Jul-01,42.69,42.74,42.02,42.45,1461900 29-Jun-01,42.11,42.60,41.66,42.48,1372200 28-Jun-01,41.63,42.27,41.38,41.97,1228800 27-Jun-01,41.19,41.68,40.96,41.53,839500 26-Jun-01,41.16,41.46,41.04,41.04,870100 25-Jun-01,41.63,42.01,41.19,41.27,770300 22-Jun-01,41.82,42.11,41.71,41.82,572200 21-Jun-01,41.84,42.21,41.72,41.72,784200 20-Jun-01,41.60,42.11,41.60,41.72,946900 19-Jun-01,41.38,41.66,41.14,41.60,579200 18-Jun-01,41.58,41.78,41.43,41.43,514500 15-Jun-01,41.36,42.09,41.36,41.57,1002700 14-Jun-01,41.48,41.86,41.44,41.55,729500 13-Jun-01,41.97,41.97,41.44,41.44,796800 12-Jun-01,41.77,41.77,41.31,41.57,734000 11-Jun-01,41.45,41.81,41.29,41.53,907400 8-Jun-01,41.72,42.01,41.47,41.65,362600 7-Jun-01,41.68,41.94,41.55,41.83,949300 6-Jun-01,41.92,41.94,41.43,41.64,867300 5-Jun-01,41.68,41.90,41.41,41.68,568500 4-Jun-01,41.48,41.62,41.29,41.53,503000 1-Jun-01,41.23,41.50,41.14,41.38,544700 31-May-01,40.92,41.39,40.92,41.10,889200 30-May-01,41.14,41.77,41.09,41.14,815800 29-May-01,40.80,41.29,40.80,41.29,788200 25-May-01,40.94,41.29,40.88,40.95,1079200 24-May-01,40.75,41.82,40.71,41.18,1333800 23-May-01,40.32,40.85,40.22,40.52,1386600 22-May-01,39.43,40.61,39.07,40.24,1763700 21-May-01,38.86,39.69,38.76,39.68,1534100 18-May-01,38.78,39.01,38.66,38.95,793800 17-May-01,39.44,39.44,38.57,38.76,901100 16-May-01,38.76,39.48,38.72,39.40,1042300 15-May-01,39.06,39.06,38.68,38.79,741600 14-May-01,38.81,38.99,38.70,38.87,1259500 11-May-01,38.96,39.10,38.49,38.65,614700 10-May-01,39.15,39.27,38.70,38.81,1598500 9-May-01,39.64,39.78,38.81,39.40,1485700 8-May-01,39.37,39.88,39.30,39.74,852900 7-May-01,39.23,39.56,38.89,39.34,795900 4-May-01,38.80,39.47,38.72,39.47,1141300 3-May-01,39.06,39.06,38.47,38.79,745500 2-May-01,39.30,39.60,38.81,39.19,2077500 1-May-01,38.57,38.62,38.16,38.61,1582600 30-Apr-01,38.81,38.83,37.94,38.24,2200200 27-Apr-01,37.41,38.23,37.26,37.83,1160600 26-Apr-01,36.71,38.09,36.68,37.65,2067400 25-Apr-01,36.48,37.34,36.39,36.53,2734200 24-Apr-01,36.48,36.85,36.15,36.43,2085700 23-Apr-01,36.78,37.22,36.75,36.85,1633900 20-Apr-01,37.84,37.94,36.78,37.00,2391600 19-Apr-01,38.47,38.79,38.11,38.53,782900 18-Apr-01,39.44,39.44,38.10,38.70,1044500 17-Apr-01,39.01,39.59,38.89,39.20,922900 16-Apr-01,39.01,39.72,38.92,39.11,578300 12-Apr-01,39.06,39.44,38.87,39.30,722000 11-Apr-01,39.55,39.55,38.76,38.96,807000 10-Apr-01,39.40,39.78,39.04,39.31,940100 9-Apr-01,39.88,40.03,39.34,39.64,1074900 6-Apr-01,39.98,40.56,39.30,39.49,1370400 5-Apr-01,40.97,40.97,39.82,40.07,1396100 4-Apr-01,41.10,41.45,40.48,40.97,1431800 3-Apr-01,41.11,41.14,40.44,40.96,709400 2-Apr-01,41.74,41.86,40.96,41.26,849500 30-Mar-01,41.60,41.93,41.31,41.46,1431600 29-Mar-01,41.40,41.77,40.55,41.31,841000 28-Mar-01,41.15,41.88,40.82,41.30,846400 27-Mar-01,40.54,41.35,40.54,41.15,960400 26-Mar-01,40.68,40.68,39.54,40.25,889300 23-Mar-01,40.14,40.87,39.28,40.30,742600 22-Mar-01,41.45,41.46,39.93,40.43,1085100 21-Mar-01,41.50,41.76,40.82,41.45,1065100 20-Mar-01,41.33,41.81,40.86,41.21,889400 19-Mar-01,41.21,41.67,40.99,41.12,645300 16-Mar-01,40.72,41.69,40.72,41.45,1623200 15-Mar-01,41.74,41.74,40.72,41.62,1089600 14-Mar-01,42.26,42.32,41.14,41.74,951300 13-Mar-01,42.63,42.65,42.12,42.55,675100 12-Mar-01,42.65,43.22,42.36,42.87,1022600 9-Mar-01,43.28,43.38,42.91,42.98,631200 8-Mar-01,42.89,43.47,42.66,43.18,887400 7-Mar-01,43.06,43.57,42.61,43.47,889800 6-Mar-01,44.18,44.18,43.25,43.58,885000 5-Mar-01,43.86,44.68,43.28,44.46,1065300 2-Mar-01,43.66,44.17,43.35,43.98,963200 1-Mar-01,43.23,43.47,43.01,43.42,1198100 28-Feb-01,42.49,43.28,42.49,43.23,1212800 27-Feb-01,42.41,42.59,41.64,42.49,1179400 26-Feb-01,41.93,42.60,41.74,42.35,834300 23-Feb-01,41.59,42.18,41.27,41.90,974300 22-Feb-01,42.41,42.69,41.47,41.83,856600 21-Feb-01,43.35,43.36,42.46,42.69,839700 20-Feb-01,42.41,43.76,42.32,43.00,1214500 16-Feb-01,42.39,42.80,42.15,42.63,568800 15-Feb-01,42.04,42.58,41.60,42.36,916000 14-Feb-01,42.33,42.49,41.74,42.16,1201900 13-Feb-01,42.14,43.17,41.65,42.71,1344200 12-Feb-01,41.64,42.03,41.35,41.90,707900 9-Feb-01,42.17,42.85,41.59,41.64,1033400 8-Feb-01,42.65,43.37,42.41,42.61,1351500 7-Feb-01,41.54,43.18,41.47,42.65,1456900 6-Feb-01,40.85,42.36,40.49,41.79,1423100 5-Feb-01,40.34,40.89,40.06,40.61,583900 2-Feb-01,40.47,40.47,39.87,40.01,431200 1-Feb-01,40.63,40.63,40.00,40.45,645000 31-Jan-01,39.28,40.84,39.11,40.39,1374000 30-Jan-01,38.85,39.45,38.55,39.27,1013600 29-Jan-01,38.85,39.29,38.50,38.85,664700 26-Jan-01,39.28,39.70,38.74,39.10,941800 25-Jan-01,38.92,39.40,38.62,39.04,1295200 24-Jan-01,39.28,39.64,38.68,38.92,1500600 23-Jan-01,39.34,39.64,38.86,39.28,1015200 22-Jan-01,38.92,39.28,38.80,39.22,591000 19-Jan-01,39.04,39.10,38.68,39.10,1185200 18-Jan-01,39.64,39.94,39.40,39.64,710700 17-Jan-01,40.00,40.18,39.64,39.76,1052800 16-Jan-01,39.52,40.60,39.52,40.48,1163100 12-Jan-01,39.82,39.94,38.92,39.52,1068100 11-Jan-01,41.15,41.15,40.00,40.00,1294900 10-Jan-01,41.57,41.57,40.79,41.15,634500 9-Jan-01,41.57,41.63,40.72,41.51,852600 8-Jan-01,40.66,41.63,40.66,41.51,741700 5-Jan-01,39.92,41.12,39.69,41.00,1084900 4-Jan-01,41.00,41.06,39.39,40.10,2413100 3-Jan-01,42.38,42.50,40.94,41.36,1537600 2-Jan-01,42.14,42.92,41.96,42.14,763300 29-Dec-00,42.44,43.40,42.38,42.68,970900 28-Dec-00,42.62,42.74,42.08,42.44,557800 27-Dec-00,42.14,42.74,41.90,42.26,1061700 26-Dec-00,40.70,41.96,40.70,41.90,1254200 22-Dec-00,39.98,40.82,39.86,40.70,1278300 21-Dec-00,40.10,40.16,39.33,39.92,1165800 20-Dec-00,39.15,39.92,38.91,39.92,1172400 19-Dec-00,39.74,40.10,39.03,39.15,1147300 18-Dec-00,37.95,39.57,37.95,39.39,1223700 15-Dec-00,37.65,38.73,37.65,37.95,1000000 14-Dec-00,38.55,38.61,38.01,38.25,483100 13-Dec-00,37.65,38.49,37.65,38.01,1844900 12-Dec-00,37.35,37.77,37.11,37.65,981100 11-Dec-00,38.61,38.61,37.17,37.53,2271600 8-Dec-00,38.31,39.27,37.71,39.03,1579300 7-Dec-00,37.59,38.79,37.47,38.31,1667100 6-Dec-00,38.43,38.67,37.71,37.83,898200 5-Dec-00,39.15,39.15,38.43,38.61,599400 4-Dec-00,39.74,39.80,38.79,39.15,1507100 1-Dec-00,39.39,39.39,38.61,39.03,776100 30-Nov-00,39.33,40.52,39.33,39.39,1310300 29-Nov-00,39.33,40.28,38.91,39.92,1257200 28-Nov-00,39.03,39.69,38.79,39.09,1793700 27-Nov-00,39.63,39.98,39.27,39.63,463800 24-Nov-00,40.28,40.40,39.45,39.51,461800 22-Nov-00,40.52,41.60,39.98,40.28,1691500 21-Nov-00,38.73,40.22,38.13,40.16,2070000 20-Nov-00,38.55,39.39,38.49,38.67,589700 17-Nov-00,38.61,38.67,38.01,38.37,690900 16-Nov-00,38.91,39.03,38.43,38.61,780100 15-Nov-00,38.61,38.85,38.13,38.67,974300 14-Nov-00,38.49,38.97,38.43,38.55,740800 13-Nov-00,39.15,39.45,38.79,38.91,802900 10-Nov-00,39.27,39.57,39.03,39.27,1023900 9-Nov-00,39.45,40.04,38.67,39.03,1302600 8-Nov-00,38.37,39.57,38.25,39.21,1201100 7-Nov-00,39.03,39.09,38.61,38.61,532500 6-Nov-00,38.61,39.74,38.25,39.03,1188700 3-Nov-00,39.27,39.74,38.37,38.61,2158000 2-Nov-00,39.74,39.92,38.79,38.79,1933200 1-Nov-00,40.04,40.16,38.97,39.39,2204600 31-Oct-00,38.91,40.16,38.91,39.98,2302600 30-Oct-00,38.19,39.39,38.07,39.27,1532800 27-Oct-00,37.35,37.95,37.35,37.95,506300 26-Oct-00,37.41,38.01,36.45,37.59,2523800 25-Oct-00,37.11,37.71,36.99,37.47,683000 24-Oct-00,36.63,37.11,36.63,36.93,808400 23-Oct-00,35.97,36.87,35.97,36.57,1011600 20-Oct-00,36.21,36.33,35.97,36.09,592500 19-Oct-00,35.20,36.69,35.02,36.21,2010200 18-Oct-00,35.08,35.73,34.96,35.44,1707200 17-Oct-00,35.67,36.03,35.32,35.32,898500 16-Oct-00,35.61,36.21,35.61,35.73,1446000 13-Oct-00,36.03,36.09,35.56,35.73,646700 12-Oct-00,35.91,36.21,35.61,36.03,568700 11-Oct-00,35.73,36.33,35.73,36.09,505400 10-Oct-00,35.79,36.09,35.50,35.97,1655500 9-Oct-00,35.85,36.03,35.50,35.56,713600 6-Oct-00,35.44,36.09,35.44,35.85,1207400 5-Oct-00,34.66,35.67,34.60,35.44,1170300 4-Oct-00,33.86,34.99,33.86,34.57,935500 3-Oct-00,33.92,34.28,33.74,33.98,851100 2-Oct-00,33.62,33.98,33.27,33.86,682500 29-Sep-00,34.22,34.63,33.44,33.74,1074400 28-Sep-00,34.22,34.57,33.98,34.04,827600 27-Sep-00,33.50,33.98,33.15,33.74,1453500 26-Sep-00,32.55,33.15,32.43,33.09,2495300 25-Sep-00,32.97,33.21,32.20,32.32,813700 22-Sep-00,32.26,33.15,32.26,32.73,1513200 21-Sep-00,31.60,32.32,31.60,31.90,1266600 20-Sep-00,31.01,31.48,30.83,31.31,782100 19-Sep-00,30.95,31.25,30.89,31.01,417100 18-Sep-00,31.25,31.31,30.95,30.95,438200 15-Sep-00,30.77,31.66,30.71,31.19,1553200 14-Sep-00,31.19,31.42,30.59,30.83,897500 13-Sep-00,31.13,31.42,30.95,31.19,971700 12-Sep-00,30.53,31.07,30.00,30.89,981100 11-Sep-00,30.71,30.71,29.94,30.18,733000 8-Sep-00,30.36,31.01,30.12,30.59,679500 7-Sep-00,30.30,30.47,30.18,30.42,453700 6-Sep-00,30.24,30.36,29.82,30.30,422300 5-Sep-00,29.94,30.47,29.94,30.12,542700 1-Sep-00,30.47,30.59,30.24,30.30,523200 31-Aug-00,30.30,30.71,30.00,30.55,693000 30-Aug-00,30.65,30.65,30.30,30.47,910700 29-Aug-00,31.48,31.48,30.53,30.65,830300 28-Aug-00,30.77,31.48,30.65,31.13,744600 25-Aug-00,31.19,31.19,30.53,30.71,683000 24-Aug-00,31.48,31.66,31.19,31.19,476300 23-Aug-00,30.65,31.78,30.59,31.54,1182100 22-Aug-00,31.31,31.37,30.83,30.89,866200 21-Aug-00,31.48,31.69,31.31,31.31,335200 18-Aug-00,31.31,31.78,31.31,31.54,1174200 17-Aug-00,32.08,32.32,31.48,31.78,1555600 16-Aug-00,32.91,32.91,32.08,32.20,1038000 15-Aug-00,33.27,33.27,32.73,32.79,706000 14-Aug-00,32.97,33.15,32.79,33.03,342400 11-Aug-00,33.15,33.50,32.97,33.09,784500 10-Aug-00,32.79,33.44,32.73,33.09,1112300 9-Aug-00,32.91,32.97,32.43,32.55,966000 8-Aug-00,32.43,33.03,32.43,32.85,655800 7-Aug-00,32.61,33.12,32.61,33.03,583800 4-Aug-00,33.21,33.21,32.79,33.03,1779900 3-Aug-00,33.21,33.50,33.21,33.44,854200 2-Aug-00,33.03,33.39,32.97,33.15,1219300 1-Aug-00,32.79,33.21,32.79,32.91,1207700 31-Jul-00,33.09,33.15,32.61,32.67,945300 28-Jul-00,32.55,33.21,32.55,33.09,751800 27-Jul-00,33.27,33.44,32.91,33.03,901100 26-Jul-00,33.03,33.21,32.73,32.94,1965000 25-Jul-00,33.21,33.44,32.97,33.27,1571900 24-Jul-00,33.21,33.50,33.09,33.15,1727300 21-Jul-00,33.50,33.74,33.27,33.56,1650300 20-Jul-00,33.39,33.62,33.15,33.50,1517400 19-Jul-00,33.15,33.56,33.03,33.27,2429000 18-Jul-00,31.96,33.56,31.96,33.15,3241900 17-Jul-00,33.68,34.04,31.66,33.27,4629200 14-Jul-00,35.29,35.58,34.40,34.51,1491600 13-Jul-00,34.81,35.58,34.81,35.17,1896800 12-Jul-00,34.75,35.29,34.51,34.93,962600 11-Jul-00,35.23,35.29,34.40,34.99,1482800 10-Jul-00,36.06,36.06,34.99,35.17,1155800 7-Jul-00,36.36,36.36,35.94,36.06,485400 6-Jul-00,36.41,36.77,36.12,36.36,537000 5-Jul-00,36.10,36.80,36.04,36.51,1267000 3-Jul-00,36.27,36.33,35.63,36.04,286400 30-Jun-00,36.22,36.69,36.04,36.10,946500 29-Jun-00,36.45,36.75,36.22,36.45,537000 28-Jun-00,36.16,36.98,35.92,36.48,960800 27-Jun-00,36.57,36.80,36.22,36.45,808100 26-Jun-00,36.10,36.33,35.74,36.16,800400 23-Jun-00,36.04,36.22,35.57,35.74,594100 22-Jun-00,35.74,35.92,34.98,35.80,1044400 21-Jun-00,35.92,36.39,35.57,35.68,674300 20-Jun-00,36.22,36.39,36.04,36.04,802700 19-Jun-00,36.80,36.86,36.39,36.45,953700 16-Jun-00,37.34,37.39,36.33,36.51,1527400 15-Jun-00,37.75,37.93,37.34,37.75,878100 14-Jun-00,38.10,38.28,37.63,37.98,690200 13-Jun-00,37.10,38.46,37.10,37.75,874700 12-Jun-00,36.57,37.69,36.57,37.39,637200 9-Jun-00,36.98,37.34,36.69,36.75,705600 8-Jun-00,37.10,37.22,36.57,37.22,789900 7-Jun-00,37.51,38.16,37.45,37.75,725800 6-Jun-00,36.33,37.63,35.86,37.51,1154000 5-Jun-00,37.10,37.34,36.39,36.57,558300 2-Jun-00,37.51,37.81,37.28,37.34,735300 1-Jun-00,37.75,38.22,37.16,37.39,893500 31-May-00,38.34,38.34,37.10,37.45,828100 30-May-00,38.57,39.40,38.10,38.34,958000 26-May-00,37.28,39.05,37.28,38.69,1268100 25-May-00,37.51,37.98,37.39,37.57,1181000 24-May-00,37.51,37.98,37.45,37.81,1308100 23-May-00,36.80,37.45,36.80,37.39,897500 22-May-00,36.80,37.63,36.39,37.39,1244300 19-May-00,36.33,37.63,36.33,37.57,1091500 18-May-00,36.51,36.98,36.51,36.69,508800 17-May-00,36.57,37.22,36.39,36.86,811900 16-May-00,36.57,36.86,36.16,36.51,886200 15-May-00,35.86,36.69,35.86,36.33,916000 12-May-00,36.33,36.51,35.92,36.27,525100 11-May-00,36.10,36.63,35.98,36.27,456000 10-May-00,35.98,36.45,35.98,36.10,314700 9-May-00,35.68,36.57,35.68,36.10,476300 8-May-00,35.98,36.39,35.86,36.04,866700 5-May-00,35.80,36.22,35.80,35.92,559800 4-May-00,35.51,36.39,35.39,35.92,1136100 packet/data/equities/ibm0100644000076400007640000006104007525024672014231 0ustar iankiankDate,Open,High,Low,Close,Volume 2-Aug-02,68.21,68.23,67.12,67.88,6915000 1-Aug-02,70.40,70.70,67.22,68.25,8832000 31-Jul-02,70.75,71.60,69.11,70.40,12718600 30-Jul-02,70.50,72.70,70.02,71.79,10138600 29-Jul-02,70.37,71.40,68.00,71.18,11919300 26-Jul-02,68.75,69.47,65.76,66.40,11576400 25-Jul-02,68.90,70.00,67.30,69.35,10989800 24-Jul-02,66.00,70.00,65.70,69.54,13804500 23-Jul-02,68.25,70.00,66.66,67.05,12766700 22-Jul-02,71.25,72.19,68.31,68.50,14866900 19-Jul-02,70.96,72.70,70.00,72.00,11612900 18-Jul-02,70.50,74.20,70.00,72.05,15310800 17-Jul-02,71.00,71.60,69.62,70.69,11537300 16-Jul-02,69.51,71.39,68.48,69.01,10486800 15-Jul-02,68.40,71.00,66.60,71.00,10420900 12-Jul-02,70.00,71.74,68.80,69.21,8572200 11-Jul-02,68.00,69.75,67.55,69.41,11026400 10-Jul-02,70.60,71.25,68.53,68.76,10073400 9-Jul-02,71.40,72.25,69.45,69.67,11165600 8-Jul-02,73.00,73.48,71.03,71.30,9488100 5-Jul-02,72.45,73.90,72.00,73.50,5243000 3-Jul-02,67.95,70.71,67.87,70.51,8469900 2-Jul-02,67.85,69.40,67.70,68.58,12012900 1-Jul-02,72.01,72.41,67.16,67.60,12055900 28-Jun-02,71.35,73.62,71.25,72.00,10945600 27-Jun-02,71.20,72.15,69.10,71.90,10610100 26-Jun-02,66.10,70.59,66.10,70.05,11544000 25-Jun-02,70.30,71.45,68.41,68.60,8554800 24-Jun-02,67.25,71.49,67.25,69.70,14687700 21-Jun-02,70.00,70.99,68.19,68.75,15542600 20-Jun-02,74.00,74.09,71.43,71.58,11116900 19-Jun-02,74.20,75.20,73.25,73.35,9455400 18-Jun-02,75.60,76.90,75.47,75.94,7242000 17-Jun-02,76.18,77.75,75.16,77.14,7775800 14-Jun-02,74.20,76.77,73.25,76.17,8592000 13-Jun-02,75.45,77.40,75.30,75.60,8909600 12-Jun-02,75.40,75.95,73.25,74.65,13296100 11-Jun-02,77.85,78.25,75.20,75.49,7953400 10-Jun-02,77.75,78.80,76.60,76.80,7075800 7-Jun-02,78.48,78.85,77.00,78.30,9309400 6-Jun-02,80.55,80.95,78.89,79.66,5540600 5-Jun-02,79.65,80.71,79.11,80.55,7172100 4-Jun-02,78.11,79.65,77.60,79.31,7273200 3-Jun-02,80.75,80.91,78.00,78.11,8383600 31-May-02,82.05,82.05,80.40,80.45,5126200 30-May-02,80.60,82.25,80.22,82.25,7374100 29-May-02,81.50,82.00,81.00,81.60,4519500 28-May-02,82.80,83.11,81.69,82.08,4552100 24-May-02,83.65,83.75,82.62,83.10,4122000 23-May-02,84.25,85.05,82.52,84.35,6865600 22-May-02,83.76,84.39,82.74,84.00,5040700 21-May-02,84.41,85.00,83.30,83.45,4454000 20-May-02,85.45,85.46,83.93,84.45,4530300 17-May-02,86.25,86.40,85.00,85.69,5874800 16-May-02,84.20,86.00,83.40,85.45,6768300 15-May-02,84.60,86.49,84.05,84.50,8552300 14-May-02,84.50,85.48,82.19,85.48,9624700 13-May-02,80.25,82.29,79.50,82.19,6527600 10-May-02,79.95,80.50,79.25,79.68,7386300 9-May-02,81.90,83.00,79.00,79.93,10130100 8-May-02,78.20,82.80,78.20,82.45,12779700 7-May-02,76.89,77.50,75.92,76.50,17418700 6-May-02,81.70,81.87,76.00,76.00,13648400 3-May-02,83.10,83.50,81.11,81.78,8656300 2-May-02,83.75,84.80,83.13,83.86,6582900 1-May-02,83.85,84.65,81.67,84.30,12203800 30-Apr-02,83.91,85.23,83.53,83.76,8883900 29-Apr-02,84.71,85.10,83.55,83.89,6535600 26-Apr-02,86.70,86.96,84.70,84.71,6684200 25-Apr-02,86.05,86.92,85.77,86.71,6870000 24-Apr-02,88.20,88.25,86.27,86.50,6520500 23-Apr-02,88.35,89.08,87.24,87.33,5144100 22-Apr-02,88.95,88.95,87.36,87.93,6757700 19-Apr-02,89.90,90.03,87.60,89.00,9273200 18-Apr-02,86.97,89.10,86.90,88.95,14763500 17-Apr-02,87.05,87.20,84.00,84.81,11019500 16-Apr-02,86.35,86.85,85.58,86.20,7933100 15-Apr-02,86.50,86.60,84.70,85.35,8871600 12-Apr-02,87.56,87.96,84.40,85.60,15819300 11-Apr-02,88.05,88.51,83.34,84.19,23343700 10-Apr-02,88.45,89.95,88.20,89.01,13143900 9-Apr-02,88.50,88.52,87.10,87.74,17383600 8-Apr-02,87.50,88.59,85.35,87.41,41207300 5-Apr-02,100.84,101.25,97.25,97.25,9801800 4-Apr-02,99.96,101.14,99.50,100.84,5928500 3-Apr-02,101.40,101.50,98.90,99.96,7649100 2-Apr-02,102.00,102.01,100.51,100.95,7382200 1-Apr-02,104.00,104.00,102.40,102.86,5587000 28-Mar-02,103.55,105.14,103.39,104.00,5347500 27-Mar-02,103.75,103.79,102.50,103.39,5602400 26-Mar-02,103.57,105.70,102.30,102.90,8144000 25-Mar-02,105.80,106.66,103.50,103.56,6277900 22-Mar-02,106.50,106.70,105.07,105.60,5507900 21-Mar-02,105.70,106.78,104.70,106.78,5113100 20-Mar-02,106.90,106.90,105.49,105.50,4844100 19-Mar-02,106.85,108.05,106.49,107.49,4614800 18-Mar-02,107.10,108.64,106.23,106.35,5301200 15-Mar-02,106.55,107.45,105.59,106.79,10864100 14-Mar-02,107.02,107.95,106.59,106.60,5335500 13-Mar-02,108.30,108.65,106.70,107.18,6409200 12-Mar-02,105.52,108.85,105.51,108.50,11059300 11-Mar-02,104.35,105.97,103.60,105.24,8639100 8-Mar-02,104.82,107.34,104.82,105.09,10726400 7-Mar-02,107.30,107.50,103.24,103.71,10971900 6-Mar-02,105.15,107.09,104.75,106.30,7687400 5-Mar-02,104.25,106.50,104.16,105.67,7562100 4-Mar-02,103.35,106.53,103.13,105.90,10767700 1-Mar-02,98.60,103.10,98.50,103.02,10492900 28-Feb-02,98.49,99.60,97.82,98.12,7939000 27-Feb-02,98.10,100.31,96.70,97.83,11978700 26-Feb-02,99.00,99.19,95.99,97.15,11634500 25-Feb-02,98.45,99.25,97.12,98.30,9902800 22-Feb-02,96.38,99.20,95.76,98.45,10471600 21-Feb-02,98.75,99.70,96.01,96.38,10131700 20-Feb-02,99.54,100.00,97.00,99.31,14525200 19-Feb-02,101.50,101.80,98.86,101.30,13395900 15-Feb-02,104.80,104.80,101.70,102.89,18204600 14-Feb-02,109.00,109.15,107.20,107.89,5816300 13-Feb-02,106.70,108.48,106.12,108.07,5086900 12-Feb-02,106.75,107.89,106.06,106.57,4559800 11-Feb-02,105.00,107.69,104.51,107.38,6271900 8-Feb-02,103.00,105.72,102.61,104.99,8339400 7-Feb-02,106.64,107.00,103.86,103.91,7253800 6-Feb-02,106.70,107.82,105.33,106.63,6669800 5-Feb-02,106.25,108.50,106.00,106.30,6737700 4-Feb-02,108.00,108.00,105.99,106.80,6601900 1-Feb-02,107.64,109.30,106.64,108.00,6799500 31-Jan-02,106.40,107.98,104.46,107.89,9877000 30-Jan-02,104.25,105.75,101.00,105.55,17713300 29-Jan-02,108.15,108.56,102.41,103.00,14509400 28-Jan-02,109.50,110.21,107.06,108.15,7092900 25-Jan-02,108.50,110.69,108.10,109.28,6761800 24-Jan-02,108.80,109.73,107.07,108.72,8581500 23-Jan-02,110.80,111.25,107.00,107.90,12556700 22-Jan-02,114.25,114.26,110.33,110.50,10130400 18-Jan-02,114.25,114.90,112.81,114.25,18440200 17-Jan-02,119.85,120.55,117.26,119.90,11153700 16-Jan-02,118.00,118.75,117.25,117.40,5366300 15-Jan-02,118.05,119.70,117.72,118.85,5647900 14-Jan-02,120.00,120.09,117.10,118.05,10026700 11-Jan-02,121.50,122.18,120.28,120.31,4797800 10-Jan-02,123.75,124.00,121.42,122.14,8926300 9-Jan-02,124.70,126.39,124.15,124.49,6839900 8-Jan-02,124.25,125.20,123.73,124.70,5311800 7-Jan-02,125.00,126.19,123.70,124.05,5939600 4-Jan-02,124.05,125.60,123.98,125.60,8405200 3-Jan-02,121.50,124.22,120.25,123.66,8621700 2-Jan-02,120.60,121.50,119.80,121.50,6862800 31-Dec-01,122.75,123.24,120.95,120.96,3512700 28-Dec-01,123.50,123.88,122.35,122.90,4213900 27-Dec-01,122.75,123.93,122.64,123.50,3826200 26-Dec-01,122.00,123.70,121.81,122.40,3755700 24-Dec-01,122.05,122.48,121.10,121.45,1654400 21-Dec-01,122.70,123.50,121.71,122.00,8659100 20-Dec-01,123.89,124.00,122.15,122.70,6344800 19-Dec-01,121.90,124.70,121.01,123.89,8053900 18-Dec-01,121.51,122.97,121.35,122.20,5596200 17-Dec-01,120.15,122.14,120.15,121.34,6205100 14-Dec-01,120.80,121.48,119.41,121.10,7036000 13-Dec-01,121.55,122.30,120.12,120.25,8061000 12-Dec-01,121.12,123.21,120.06,123.20,7977900 11-Dec-01,120.40,122.74,119.80,121.50,7793200 10-Dec-01,120.00,121.00,119.41,119.66,5570900 7-Dec-01,119.50,121.00,118.75,120.40,6889200 6-Dec-01,120.50,121.70,119.80,120.14,11225700 5-Dec-01,116.85,121.98,116.65,121.40,14646200 4-Dec-01,114.30,116.72,113.38,116.64,6585900 3-Dec-01,114.80,114.85,113.21,114.13,5785800 30-Nov-01,114.43,115.94,113.80,115.59,5597800 29-Nov-01,112.90,114.55,111.81,114.43,6128700 28-Nov-01,114.10,114.38,112.10,112.15,6161200 27-Nov-01,116.25,116.30,114.07,114.20,6894100 26-Nov-01,115.90,116.40,115.20,116.33,4854300 23-Nov-01,114.29,115.37,113.72,115.35,1714000 21-Nov-01,114.95,115.25,113.05,114.34,4184700 20-Nov-01,114.35,116.80,114.25,115.44,6452200 19-Nov-01,114.70,115.80,113.77,115.00,4931300 16-Nov-01,115.00,115.00,112.55,114.50,6661500 15-Nov-01,114.10,116.33,113.84,114.75,7013800 14-Nov-01,116.70,116.85,113.33,114.35,8091700 13-Nov-01,115.70,117.00,115.70,116.70,9216700 12-Nov-01,113.00,114.90,112.05,114.86,5608400 9-Nov-01,113.10,114.90,113.10,114.08,5045900 8-Nov-01,113.96,115.56,113.61,113.81,7991200 7-Nov-01,113.05,115.20,113.03,113.85,10129700 6-Nov-01,109.60,114.80,109.00,113.61,8509700 5-Nov-01,109.95,110.59,109.08,109.97,5708500 2-Nov-01,109.15,110.30,108.77,109.50,6216900 1-Nov-01,107.25,110.17,106.90,109.89,8024000 31-Oct-01,109.60,111.12,108.07,108.07,7177700 30-Oct-01,107.80,109.75,107.76,108.65,8625100 29-Oct-01,110.50,110.70,108.62,108.62,7072800 26-Oct-01,110.00,112.10,109.62,111.16,10142500 25-Oct-01,108.05,110.85,106.75,110.66,9683400 24-Oct-01,106.50,108.75,106.09,108.57,8293200 23-Oct-01,105.75,106.69,104.55,105.81,7429300 22-Oct-01,102.65,105.78,101.90,105.25,7623900 19-Oct-01,101.65,102.74,100.07,102.65,11771900 18-Oct-01,103.05,103.75,100.78,101.26,10694900 17-Oct-01,106.30,106.70,102.90,102.90,18920500 16-Oct-01,101.87,103.00,99.66,101.85,11946000 15-Oct-01,99.85,102.76,99.85,102.00,10204200 12-Oct-01,98.70,101.00,98.00,100.84,11501200 11-Oct-01,97.70,99.40,96.50,99.40,11501600 10-Oct-01,95.00,97.30,94.90,97.25,10636900 9-Oct-01,98.50,98.50,96.76,97.14,7525300 8-Oct-01,98.03,99.00,96.75,98.50,7093400 5-Oct-01,96.65,98.45,95.37,98.02,9708200 4-Oct-01,97.15,98.88,96.80,97.31,9785100 3-Oct-01,92.90,97.62,92.40,96.95,11117000 2-Oct-01,92.30,93.90,92.10,93.77,7221200 1-Oct-01,91.72,93.48,91.34,92.71,8676200 28-Sep-01,90.20,92.71,89.90,91.72,11077200 27-Sep-01,91.30,91.50,87.49,90.00,13172300 26-Sep-01,94.45,94.45,90.30,91.30,13783100 25-Sep-01,94.10,96.00,93.41,94.45,12575100 24-Sep-01,91.80,95.54,91.80,94.80,11201800 21-Sep-01,90.60,93.50,89.50,90.50,18364700 20-Sep-01,94.10,95.75,92.85,93.40,15182900 19-Sep-01,96.40,96.85,92.45,96.00,14883500 18-Sep-01,94.00,96.75,93.68,96.40,12305000 17-Sep-01,93.90,95.86,92.55,93.34,15132800 10-Sep-01,96.00,97.40,95.59,96.47,10311500 7-Sep-01,97.90,98.15,96.00,96.59,10507000 6-Sep-01,100.68,100.68,97.65,98.00,9043100 5-Sep-01,101.50,102.83,99.61,100.35,11880700 4-Sep-01,100.15,103.13,99.29,101.49,9891800 31-Aug-01,101.00,101.36,99.24,99.95,8126600 30-Aug-01,102.75,103.40,98.86,100.36,15015500 29-Aug-01,105.75,105.90,103.82,104.13,4840300 28-Aug-01,106.90,107.17,104.87,104.95,5808100 27-Aug-01,106.99,108.20,106.64,106.86,4540900 24-Aug-01,103.95,107.80,103.41,106.99,7711900 23-Aug-01,104.00,104.70,103.00,103.00,5474300 22-Aug-01,102.50,104.04,101.76,103.96,8029000 21-Aug-01,103.85,104.97,101.40,101.89,6515900 20-Aug-01,104.68,105.00,102.80,104.10,5612700 17-Aug-01,105.49,105.49,103.90,104.59,7006200 16-Aug-01,104.20,106.02,103.66,105.75,6215200 15-Aug-01,106.35,106.59,105.01,105.01,4712900 14-Aug-01,106.50,106.85,105.40,106.20,5730200 13-Aug-01,105.00,106.64,104.65,105.86,6024400 10-Aug-01,103.85,104.95,102.81,104.95,5254800 9-Aug-01,103.70,104.54,102.70,104.08,6763200 8-Aug-01,105.00,106.10,104.10,104.19,6398000 7-Aug-01,105.80,107.37,105.26,106.25,4029300 6-Aug-01,107.25,107.37,105.79,106.51,4176800 3-Aug-01,107.80,110.09,107.10,108.18,3704100 2-Aug-01,108.50,109.47,107.21,108.80,5675100 1-Aug-01,105.35,108.50,105.31,107.06,6036100 31-Jul-01,105.90,107.00,105.15,105.21,5603000 30-Jul-01,104.90,106.25,104.76,105.85,4030800 27-Jul-01,104.75,105.95,104.11,104.70,4346500 26-Jul-01,104.75,106.00,102.93,106.00,8428700 25-Jul-01,104.50,105.70,102.73,104.89,6247600 24-Jul-01,104.85,106.15,103.79,104.51,7299800 23-Jul-01,105.70,106.95,105.30,105.85,6315700 20-Jul-01,103.40,105.70,103.03,105.70,8991700 19-Jul-01,105.60,106.00,103.10,104.00,13644500 18-Jul-01,106.10,107.60,103.20,104.28,11670300 17-Jul-01,106.10,108.58,104.75,108.53,8662400 16-Jul-01,108.53,109.38,107.28,107.82,5330100 13-Jul-01,106.15,109.30,106.11,108.53,7841800 12-Jul-01,105.90,107.80,105.62,107.25,8766400 11-Jul-01,101.60,104.13,101.56,103.85,8895400 10-Jul-01,104.73,105.40,101.60,101.96,10266600 9-Jul-01,106.50,106.95,103.65,104.72,9312600 6-Jul-01,110.90,110.90,105.81,106.50,11704600 5-Jul-01,112.60,113.26,111.79,112.10,4419000 3-Jul-01,114.10,114.19,112.76,112.98,3325800 2-Jul-01,113.50,115.40,112.96,114.35,5913100 29-Jun-01,115.60,116.65,113.00,113.50,9477400 28-Jun-01,113.80,116.95,113.75,115.10,8181000 27-Jun-01,113.10,114.18,112.45,113.52,4814100 26-Jun-01,111.25,114.05,111.10,113.04,7081900 25-Jun-01,113.75,114.90,111.78,112.65,5675900 22-Jun-01,112.60,114.43,112.50,112.87,5607200 21-Jun-01,112.15,114.70,111.36,112.60,8155800 20-Jun-01,113.50,114.99,111.76,113.09,8828300 19-Jun-01,116.26,117.25,114.56,114.84,6152800 18-Jun-01,113.98,115.44,113.31,114.27,5182800 15-Jun-01,115.10,115.45,113.38,113.60,12470100 14-Jun-01,115.60,116.08,113.99,115.75,7502500 13-Jun-01,117.25,118.47,116.53,116.54,5703200 12-Jun-01,116.75,117.80,115.55,117.25,7301500 11-Jun-01,116.30,118.14,116.10,117.36,6542700 8-Jun-01,117.50,117.50,115.60,116.10,3099100 7-Jun-01,117.00,118.25,117.00,117.25,6423700 6-Jun-01,117.60,119.00,116.50,117.50,9624200 5-Jun-01,113.64,117.60,113.56,116.97,6154400 4-Jun-01,113.25,114.75,112.85,113.64,3812200 1-Jun-01,112.50,113.60,111.90,112.89,5138900 31-May-01,112.65,113.86,111.64,111.80,6724100 30-May-01,114.00,114.10,112.00,112.65,9598700 29-May-01,117.35,117.59,115.08,115.27,5818000 25-May-01,119.52,119.90,117.76,117.80,5629100 24-May-01,117.50,119.60,117.50,119.60,7726400 23-May-01,117.80,118.95,117.10,117.40,6402600 22-May-01,119.70,119.70,117.25,118.01,6005300 21-May-01,117.95,119.90,117.55,119.04,8409400 18-May-01,115.07,117.68,114.90,117.44,6714900 17-May-01,115.80,117.09,115.05,115.07,6887700 16-May-01,112.50,115.80,112.20,115.80,7796700 15-May-01,113.50,114.15,112.50,113.58,5873400 14-May-01,111.20,113.18,111.00,112.56,5254800 11-May-01,113.75,114.15,110.96,111.81,8390200 10-May-01,118.50,118.90,115.20,115.20,7993900 9-May-01,116.20,118.18,115.30,116.98,7680200 8-May-01,117.25,117.75,115.50,117.70,7605800 7-May-01,116.20,117.25,115.00,115.90,6088600 4-May-01,112.00,115.86,111.20,115.86,8681400 3-May-01,114.60,115.10,112.35,113.70,6578000 2-May-01,118.30,118.95,113.74,115.40,9706200 1-May-01,115.85,118.65,114.90,118.51,7790800 30-Apr-01,116.40,118.05,114.72,115.14,7357200 27-Apr-01,116.80,116.90,114.55,116.20,7390600 26-Apr-01,114.95,116.70,113.68,113.74,7346100 25-Apr-01,112.00,114.85,111.99,114.85,6858500 24-Apr-01,113.40,114.75,112.30,112.67,8742000 23-Apr-01,114.01,114.05,111.68,112.00,8537500 20-Apr-01,114.35,116.40,113.75,114.83,12759100 19-Apr-01,112.00,115.90,110.45,114.47,25822400 18-Apr-01,103.00,110.00,102.30,106.50,19814300 17-Apr-01,97.00,99.88,97.00,99.70,9957300 16-Apr-01,96.20,99.89,95.20,96.75,9188500 12-Apr-01,96.40,97.50,95.15,96.20,9390100 11-Apr-01,101.50,101.94,95.80,97.43,11498400 10-Apr-01,97.00,99.90,96.56,99.05,10499400 9-Apr-01,98.50,98.74,93.80,96.00,9486600 6-Apr-01,98.00,100.00,96.40,97.95,13424200 5-Apr-01,95.80,100.00,95.53,98.21,12506100 4-Apr-01,90.45,94.05,90.05,92.00,13515600 3-Apr-01,94.60,94.65,90.10,90.39,13330000 2-Apr-01,97.45,98.10,93.58,94.66,8787000 30-Mar-01,96.50,97.56,95.14,96.18,9461300 29-Mar-01,94.46,97.07,94.26,95.04,10553700 28-Mar-01,97.90,98.45,94.25,94.41,11890500 27-Mar-01,94.00,100.00,93.97,99.50,11851200 26-Mar-01,95.25,95.66,93.75,95.40,8581200 23-Mar-01,93.50,94.99,90.29,93.51,12233600 22-Mar-01,89.12,91.00,87.65,89.10,13328200 21-Mar-01,88.45,91.60,87.75,89.08,11013000 20-Mar-01,91.60,92.03,88.10,88.30,10101100 19-Mar-01,91.00,92.80,89.20,92.60,10235500 16-Mar-01,93.90,93.90,88.20,90.10,20029400 15-Mar-01,96.00,97.87,95.17,95.56,8420000 14-Mar-01,95.40,98.90,93.34,94.96,14246600 13-Mar-01,95.10,98.44,94.20,98.39,12127900 12-Mar-01,97.90,98.40,95.02,95.49,14494800 9-Mar-01,105.00,105.01,97.90,99.29,16688100 8-Mar-01,107.17,107.34,105.37,106.47,6793600 7-Mar-01,107.45,108.25,105.66,107.55,7788900 6-Mar-01,106.25,108.40,105.25,106.00,8120000 5-Mar-01,102.81,105.60,102.64,104.91,6743900 2-Mar-01,104.00,107.65,100.94,102.30,14745500 1-Mar-01,99.30,106.40,97.50,106.05,15102000 28-Feb-01,102.95,103.54,99.10,99.90,11933200 27-Feb-01,104.90,106.87,102.56,102.59,9787900 26-Feb-01,105.80,105.80,101.83,105.30,8344100 23-Feb-01,107.50,107.50,100.25,104.00,15276600 22-Feb-01,106.50,110.90,103.38,108.90,11709000 21-Feb-01,109.55,111.50,107.29,107.51,9156900 20-Feb-01,114.55,115.60,110.78,111.50,6748300 16-Feb-01,114.55,115.75,113.94,115.00,7073000 15-Feb-01,116.80,118.64,116.38,116.78,8098700 14-Feb-01,113.75,116.17,112.50,115.10,7032900 13-Feb-01,114.15,117.38,113.07,113.75,7193200 12-Feb-01,110.55,115.72,110.30,114.90,6729300 9-Feb-01,114.03,114.99,111.00,112.00,6318800 8-Feb-01,116.91,118.20,114.03,114.10,8380800 7-Feb-01,113.40,117.60,112.67,116.91,9006900 6-Feb-01,112.23,115.69,111.20,114.19,7526400 5-Feb-01,109.40,112.60,109.30,112.22,5113700 2-Feb-01,112.75,113.99,109.60,110.27,5428400 1-Feb-01,112.40,114.34,111.20,114.05,5580800 31-Jan-01,115.75,116.75,112.00,112.00,8314200 30-Jan-01,115.00,116.75,113.40,116.61,8242000 29-Jan-01,112.50,115.50,112.47,114.98,5125000 26-Jan-01,109.62,115.25,109.19,114.19,9098100 25-Jan-01,110.12,111.12,109.44,110.75,4983300 24-Jan-01,109.06,111.44,108.94,110.44,6761400 23-Jan-01,109.56,109.94,107.62,109.06,9830800 22-Jan-01,109.50,109.94,108.19,108.56,9623300 19-Jan-01,107.50,113.94,107.25,111.25,14763400 18-Jan-01,104.37,110.00,103.50,108.31,25247700 17-Jan-01,95.37,97.75,94.31,96.69,9730900 16-Jan-01,93.75,94.00,91.81,92.75,5673000 12-Jan-01,93.69,96.44,92.37,93.81,6452500 11-Jan-01,92.94,94.25,91.25,93.69,9637800 10-Jan-01,92.50,94.94,91.69,93.44,7659500 9-Jan-01,94.44,95.75,91.44,92.56,7551100 8-Jan-01,93.50,93.94,91.56,93.56,6067500 5-Jan-01,93.94,94.69,91.00,94.00,8045000 4-Jan-01,94.75,99.75,92.69,93.19,15420800 3-Jan-01,83.75,95.00,83.75,94.62,12775500 2-Jan-01,84.50,87.50,84.12,84.81,8011300 29-Dec-00,86.94,86.94,84.25,85.00,6945800 28-Dec-00,83.50,88.19,82.12,85.25,9803400 27-Dec-00,84.75,88.12,83.56,84.69,8248000 26-Dec-00,89.00,89.56,84.25,84.81,6053600 22-Dec-00,84.50,89.37,84.50,89.00,9516300 21-Dec-00,85.50,87.94,80.06,81.56,12728600 20-Dec-00,85.87,88.00,84.81,86.00,12584700 19-Dec-00,90.19,94.44,89.81,90.12,7708300 18-Dec-00,88.37,90.50,88.37,90.50,7695900 15-Dec-00,90.00,90.69,87.31,87.81,14257000 14-Dec-00,92.00,93.69,91.81,92.44,6132200 13-Dec-00,94.87,96.62,90.69,91.25,6994100 12-Dec-00,95.25,96.12,92.50,93.87,7915200 11-Dec-00,96.50,98.25,93.75,95.00,6188800 8-Dec-00,98.00,99.00,95.75,97.00,6140900 7-Dec-00,95.06,95.94,93.12,93.12,7923100 6-Dec-00,101.75,101.81,94.81,96.75,10100800 5-Dec-00,100.44,104.75,99.62,103.37,7806600 4-Dec-00,96.00,99.19,95.75,98.37,5570600 1-Dec-00,94.44,99.31,94.37,95.62,7528000 30-Nov-00,98.00,98.00,92.25,93.50,10652200 29-Nov-00,97.75,99.94,96.69,99.81,5527200 28-Nov-00,98.75,100.75,97.37,97.87,4804200 27-Nov-00,100.44,102.00,98.44,98.44,3869700 24-Nov-00,99.37,101.75,99.25,99.94,2501700 22-Nov-00,98.50,100.81,98.31,98.50,5541100 21-Nov-00,103.25,104.37,98.50,98.50,7181100 20-Nov-00,101.50,103.25,100.87,103.25,7430300 17-Nov-00,98.31,102.50,98.25,101.94,7721600 16-Nov-00,99.25,99.69,98.25,98.25,3745200 15-Nov-00,99.50,100.06,97.62,99.37,4160500 14-Nov-00,99.25,99.87,98.50,99.50,5151400 13-Nov-00,91.81,99.44,91.62,97.44,8687700 10-Nov-00,98.00,98.37,93.00,93.00,6812300 9-Nov-00,96.75,100.00,95.69,99.44,9052300 8-Nov-00,103.62,103.75,99.25,100.00,6991300 7-Nov-00,101.12,103.50,100.69,102.31,5420900 6-Nov-00,99.87,102.37,99.44,100.31,4453300 3-Nov-00,102.50,102.62,99.37,100.12,5853300 2-Nov-00,99.00,102.31,98.50,101.94,7448000 1-Nov-00,98.44,99.87,97.25,98.56,7469700 31-Oct-00,93.75,99.12,93.75,98.50,10904100 30-Oct-00,93.50,93.75,90.31,93.31,8086300 27-Oct-00,93.00,93.69,91.00,93.69,6432200 26-Oct-00,88.00,92.87,87.62,92.75,10138900 25-Oct-00,90.50,90.94,86.94,87.56,14063300 24-Oct-00,93.00,94.37,90.19,91.44,8829700 23-Oct-00,94.75,95.00,91.06,92.87,9343400 20-Oct-00,95.12,96.25,94.19,94.75,9374400 19-Oct-00,98.00,98.50,92.69,96.44,17970800 18-Oct-00,96.75,99.12,90.25,95.44,29782200 17-Oct-00,111.94,113.87,108.56,113.00,8883900 16-Oct-00,111.50,113.12,108.56,111.12,7710600 13-Oct-00,104.19,110.44,104.19,109.06,9094100 12-Oct-00,114.25,114.37,103.12,103.12,9707700 11-Oct-00,111.87,112.94,107.50,112.00,8779100 10-Oct-00,116.62,117.12,112.44,114.87,5616600 9-Oct-00,115.94,119.37,114.31,117.94,4902500 6-Oct-00,114.00,116.12,112.75,116.00,6113100 5-Oct-00,113.81,114.56,111.56,113.19,5550900 4-Oct-00,110.37,114.87,108.56,114.37,11673900 3-Oct-00,118.87,119.37,110.00,110.56,11746600 2-Oct-00,112.62,119.62,112.62,117.81,8873400 29-Sep-00,115.50,116.94,110.25,112.62,9597200 28-Sep-00,117.37,118.87,115.00,115.25,5314200 27-Sep-00,120.06,120.31,115.50,118.00,5953900 26-Sep-00,120.00,121.87,118.37,119.12,6221300 25-Sep-00,124.50,126.62,121.00,123.00,4291600 22-Sep-00,123.00,124.31,121.31,123.87,5930200 21-Sep-00,124.19,126.69,120.00,121.50,4303400 20-Sep-00,124.69,126.56,123.50,124.75,4625300 19-Sep-00,122.75,126.25,122.56,124.94,3341600 18-Sep-00,125.25,126.00,123.06,123.25,3934400 15-Sep-00,126.81,127.25,124.75,125.00,5482700 14-Sep-00,128.00,129.19,126.31,126.87,4428600 13-Sep-00,123.12,128.81,122.75,127.69,5475600 12-Sep-00,124.81,126.87,124.06,125.00,5002700 11-Sep-00,127.87,128.25,123.62,124.50,7622000 8-Sep-00,132.50,132.94,129.38,129.50,4995800 7-Sep-00,131.88,134.50,131.88,133.38,4624400 6-Sep-00,130.88,134.88,130.38,131.44,6474700 5-Sep-00,132.81,133.31,130.81,131.19,4113300 1-Sep-00,133.06,134.94,132.63,133.63,5779800 31-Aug-00,131.88,134.19,131.63,132.02,5474800 30-Aug-00,130.75,131.50,129.56,130.31,4933800 29-Aug-00,131.50,134.25,131.00,132.88,6040000 28-Aug-00,129.88,133.19,129.75,131.50,8540300 25-Aug-00,124.31,129.88,124.25,129.00,8284100 24-Aug-00,123.00,125.44,122.69,124.81,5993000 23-Aug-00,120.31,123.75,119.87,123.25,4251900 22-Aug-00,121.19,122.19,121.00,121.37,2774700 21-Aug-00,121.06,122.19,120.06,121.44,3236600 18-Aug-00,122.37,123.37,120.12,120.44,4131700 17-Aug-00,119.75,122.81,119.50,122.50,4343100 16-Aug-00,121.06,122.94,119.50,122.37,5949400 15-Aug-00,122.06,122.62,120.75,122.00,4382700 14-Aug-00,120.00,123.69,119.31,123.25,4954700 11-Aug-00,119.75,121.81,119.19,120.62,6143800 10-Aug-00,118.75,120.25,117.87,119.75,5486400 9-Aug-00,119.00,120.81,118.75,118.75,6588400 8-Aug-00,115.69,119.62,115.56,118.87,5740500 7-Aug-00,116.62,119.00,115.81,116.31,5911100 4-Aug-00,116.00,116.50,114.31,115.87,4460800 3-Aug-00,113.00,116.50,112.31,116.00,5571600 2-Aug-00,111.00,114.87,110.75,114.25,5882300 1-Aug-00,112.00,112.44,110.25,110.50,3000200 31-Jul-00,110.50,113.69,110.06,112.25,5115500 28-Jul-00,111.12,112.50,108.87,111.81,5358800 27-Jul-00,109.87,111.50,109.31,110.31,4051600 26-Jul-00,111.00,112.37,108.87,109.87,6670600 25-Jul-00,113.25,113.37,110.25,112.00,5570800 24-Jul-00,114.12,115.62,111.62,112.50,6816900 21-Jul-00,117.00,117.00,113.75,114.75,8970000 20-Jul-00,112.00,117.81,111.75,117.25,23053100 19-Jul-00,102.37,109.50,101.00,108.75,7782200 18-Jul-00,104.12,104.81,102.62,103.31,6454200 17-Jul-00,104.44,107.87,104.19,105.50,6634200 14-Jul-00,103.75,104.87,103.12,103.94,4020000 13-Jul-00,105.44,105.94,102.00,104.00,5675200 12-Jul-00,103.19,105.87,102.62,104.62,5550800 11-Jul-00,103.25,104.00,101.00,102.00,5625300 10-Jul-00,104.69,104.94,102.87,103.31,4213400 7-Jul-00,102.69,105.06,101.62,105.06,9032700 6-Jul-00,105.00,105.12,100.00,101.25,12934200 5-Jul-00,105.62,105.62,101.12,105.00,14345000 3-Jul-00,108.75,109.87,108.31,109.50,2306900 30-Jun-00,112.69,113.19,108.62,109.56,8614100 29-Jun-00,111.75,114.37,110.06,114.00,7693300 28-Jun-00,110.00,115.19,109.87,113.78,6440300 27-Jun-00,111.62,112.81,108.75,109.75,6612300 26-Jun-00,113.00,115.75,112.87,114.41,3629200 23-Jun-00,113.50,113.62,110.81,111.87,3361400 22-Jun-00,114.12,114.31,111.25,111.81,4854800 21-Jun-00,115.56,115.94,113.50,114.50,6490900 20-Jun-00,120.00,120.69,115.37,116.37,7105900 19-Jun-00,113.50,120.37,113.25,120.37,6064400 16-Jun-00,116.31,117.69,113.25,113.25,8049700 15-Jun-00,116.00,119.00,115.87,116.81,5389800 14-Jun-00,118.87,120.00,115.50,116.00,5284100 13-Jun-00,118.87,119.94,116.75,119.31,4013400 12-Jun-00,119.12,120.44,118.84,118.84,3640500 9-Jun-00,119.87,120.75,118.87,119.69,4744200 8-Jun-00,119.37,122.31,117.50,119.75,9328800 7-Jun-00,112.50,121.75,111.50,121.00,11118600 6-Jun-00,112.25,114.62,111.25,112.37,5374700 5-Jun-00,108.44,114.19,108.44,112.81,7282200 2-Jun-00,109.00,109.75,107.62,108.81,5475200 1-Jun-00,107.56,108.94,105.50,106.00,5713900 31-May-00,110.50,110.75,107.19,107.31,3733900 30-May-00,107.75,111.00,107.69,110.94,3621700 26-May-00,105.50,107.19,104.56,106.94,4300800 25-May-00,110.50,112.25,106.37,106.50,5971900 24-May-00,106.50,110.00,104.19,109.62,8186600 23-May-00,109.00,110.00,107.12,107.37,5983900 22-May-00,106.00,109.25,103.44,109.25,6774700 19-May-00,106.06,107.50,105.00,106.44,6424400 18-May-00,106.12,107.31,104.69,106.06,4581300 17-May-00,107.50,108.87,106.12,107.87,5527000 16-May-00,105.12,109.25,105.00,109.00,7269100 15-May-00,104.00,104.87,102.00,104.19,5912200 12-May-00,103.75,105.75,103.25,104.44,5605200 11-May-00,104.00,107.50,103.19,104.44,8109700 10-May-00,105.50,105.69,102.06,103.00,10014200 9-May-00,110.50,110.62,108.25,109.00,4867700 8-May-00,108.06,110.37,107.62,109.75,4830800 5-May-00,106.62,109.62,106.50,107.87,4698000 4-May-00,109.12,109.19,107.19,107.62,3632000 packet/data/equities/intc0100644000076400007640000005702107525024672014423 0ustar iankiankDate,Open,High,Low,Close,Volume 2-Aug-02,17.56,17.56,16.52,16.71,55576300 1-Aug-02,18.72,18.85,17.46,17.56,55134100 31-Jul-02,18.92,18.97,18.01,18.79,54030300 30-Jul-02,18.57,19.11,18.25,18.97,60407100 29-Jul-02,18.33,18.90,18.00,18.89,55085100 26-Jul-02,17.68,18.20,17.02,17.81,57020100 25-Jul-02,18.26,18.70,17.10,17.48,80606500 24-Jul-02,17.25,18.72,17.03,18.70,83101300 23-Jul-02,18.40,18.74,17.76,17.81,71030900 22-Jul-02,18.47,19.20,18.25,18.26,77366100 19-Jul-02,18.70,19.46,18.50,18.65,62042100 18-Jul-02,19.26,19.75,19.00,19.19,57109500 17-Jul-02,19.30,19.88,18.81,19.44,96553800 16-Jul-02,18.56,19.45,18.14,18.36,98863000 15-Jul-02,18.04,19.15,17.43,19.12,79892000 12-Jul-02,18.80,18.88,17.71,17.99,74887900 11-Jul-02,16.74,18.30,16.51,18.25,89828400 10-Jul-02,18.26,18.28,16.77,16.81,73848000 9-Jul-02,18.28,18.45,17.75,17.96,53507600 8-Jul-02,19.26,19.58,18.07,18.50,57648600 5-Jul-02,18.70,19.61,18.60,19.54,34149100 3-Jul-02,16.27,17.78,16.26,17.75,63562800 2-Jul-02,17.46,17.81,16.46,16.57,77807700 1-Jul-02,18.35,18.77,17.49,17.54,48681300 28-Jun-02,18.71,19.32,18.11,18.27,63858200 27-Jun-02,18.90,18.96,17.87,18.65,72620200 26-Jun-02,17.50,18.89,17.45,18.61,84988500 25-Jun-02,19.79,19.98,18.30,18.32,68249700 24-Jun-02,18.42,19.96,18.39,19.33,70345000 21-Jun-02,19.08,19.64,18.40,18.73,80815300 20-Jun-02,20.12,20.60,19.22,19.24,76656900 19-Jun-02,20.96,21.21,20.02,20.09,65481800 18-Jun-02,22.14,22.99,22.01,22.02,51943800 17-Jun-02,21.66,22.57,21.35,22.56,53044600 14-Jun-02,20.55,21.38,20.06,21.28,50410100 13-Jun-02,21.61,21.97,21.00,21.11,49372400 12-Jun-02,20.11,21.60,20.00,21.58,76957400 11-Jun-02,21.44,21.89,20.18,20.22,69932400 10-Jun-02,22.28,22.29,20.99,21.07,67962100 7-Jun-02,22.34,22.75,21.70,22.00,151697500 6-Jun-02,27.50,27.58,26.70,27.00,53854700 5-Jun-02,27.60,28.20,26.89,28.18,41646700 4-Jun-02,26.23,27.52,26.22,27.50,49303700 3-Jun-02,27.43,27.72,26.44,26.62,34869600 31-May-02,27.92,28.43,27.41,27.62,38515500 30-May-02,27.01,27.71,26.60,27.42,40982400 29-May-02,27.88,27.99,27.25,27.27,35346600 28-May-02,28.56,28.62,27.67,28.35,42888200 24-May-02,28.79,29.00,28.40,28.66,26029600 23-May-02,29.65,29.80,28.44,29.39,42332100 22-May-02,28.91,29.67,28.71,29.59,41216600 21-May-02,30.20,30.34,28.96,29.07,48063600 20-May-02,30.60,30.80,29.92,30.19,37234800 17-May-02,31.00,31.36,30.59,31.20,53195200 16-May-02,30.22,30.79,29.91,30.77,37284100 15-May-02,29.68,31.00,29.50,30.24,53419600 14-May-02,29.92,30.35,29.37,30.15,57087400 13-May-02,27.20,28.56,27.11,28.52,40695200 10-May-02,28.46,28.61,26.92,27.01,43997500 9-May-02,28.65,28.85,27.80,28.24,41394900 8-May-02,27.24,29.06,27.07,28.98,58152400 7-May-02,26.15,26.98,25.56,26.15,55914400 6-May-02,26.50,27.00,25.75,25.78,44269700 3-May-02,27.85,27.95,26.49,26.56,50945400 2-May-02,28.51,29.22,27.77,27.87,41815600 1-May-02,28.57,29.05,27.54,28.63,46014800 30-Apr-02,28.01,29.25,27.90,28.61,45052800 29-Apr-02,28.17,28.45,27.51,28.04,40652200 26-Apr-02,29.43,29.46,28.10,28.12,39343600 25-Apr-02,28.66,29.48,28.17,29.09,49886000 24-Apr-02,29.66,29.99,28.88,28.91,38224600 23-Apr-02,30.17,30.34,29.36,29.54,42582500 22-Apr-02,29.94,30.22,29.53,30.06,34145800 19-Apr-02,30.82,30.85,30.06,30.10,34806900 18-Apr-02,30.54,30.93,29.86,30.45,45465200 17-Apr-02,31.20,31.28,30.31,30.64,63790400 16-Apr-02,29.08,29.80,28.98,29.51,60448200 15-Apr-02,28.21,28.72,27.76,28.11,42941400 12-Apr-02,29.15,29.15,28.07,28.39,40682600 11-Apr-02,28.83,29.44,28.51,28.94,42024500 10-Apr-02,28.65,29.39,28.01,29.26,60569500 9-Apr-02,29.91,30.24,28.41,28.46,61982800 8-Apr-02,29.04,30.04,28.50,29.93,45247300 5-Apr-02,30.68,30.70,29.80,30.05,32757200 4-Apr-02,30.05,30.68,29.95,30.59,43744800 3-Apr-02,30.08,30.29,29.38,29.87,42763300 2-Apr-02,30.58,30.90,30.02,30.03,37849000 1-Apr-02,30.14,31.45,30.02,31.17,32592200 28-Mar-02,30.81,31.25,30.38,30.41,33005100 27-Mar-02,30.47,30.50,29.95,30.41,38028800 26-Mar-02,30.01,31.04,29.95,30.77,37563100 25-Mar-02,30.70,30.97,29.96,30.00,42929400 22-Mar-02,31.10,31.21,30.46,30.59,33576400 21-Mar-02,30.59,31.49,30.46,31.40,36841700 20-Mar-02,30.58,30.71,30.02,30.53,51105500 19-Mar-02,31.71,32.16,31.26,31.72,33498000 18-Mar-02,31.93,32.25,31.24,31.62,38894600 15-Mar-02,30.87,31.85,30.80,31.74,49693300 14-Mar-02,31.26,31.65,30.80,30.97,39862300 13-Mar-02,32.01,32.06,31.05,31.34,56552400 12-Mar-02,32.47,33.02,32.31,32.99,37674800 11-Mar-02,33.82,34.08,33.16,33.42,40275400 8-Mar-02,33.19,34.25,32.84,34.17,70218400 7-Mar-02,33.51,33.61,32.04,32.98,55171900 6-Mar-02,32.84,33.08,32.13,32.96,44898700 5-Mar-02,32.51,33.29,32.40,32.70,68035700 4-Mar-02,30.95,31.88,29.88,31.85,57664400 1-Mar-02,29.09,31.01,28.99,30.98,58489400 28-Feb-02,30.11,30.11,28.50,28.55,64454700 27-Feb-02,30.55,31.07,29.28,29.89,57714000 26-Feb-02,31.25,31.44,29.75,30.02,61576000 25-Feb-02,29.76,31.51,29.73,31.02,52400300 22-Feb-02,29.51,30.10,29.17,29.53,56059600 21-Feb-02,30.34,30.68,29.48,29.48,76409400 20-Feb-02,31.50,31.59,29.95,31.44,63430900 19-Feb-02,31.74,32.17,31.18,31.34,44224000 15-Feb-02,33.42,33.67,31.95,32.29,47587600 14-Feb-02,33.63,34.35,33.31,33.34,44874100 13-Feb-02,33.20,33.70,33.06,33.38,36786800 12-Feb-02,33.11,33.48,32.64,32.97,37593400 11-Feb-02,32.24,33.63,32.12,33.57,37651700 8-Feb-02,32.51,32.60,31.38,32.52,60722800 7-Feb-02,32.80,33.30,32.10,32.31,46596000 6-Feb-02,33.77,33.80,32.53,32.92,51612200 5-Feb-02,33.80,34.39,33.40,33.80,40974500 4-Feb-02,34.63,34.63,33.66,33.98,38594200 1-Feb-02,34.82,35.07,34.06,34.67,39369800 31-Jan-02,34.61,35.15,34.32,35.04,63035000 30-Jan-02,32.87,33.89,32.46,33.86,47008900 29-Jan-02,33.89,34.30,32.50,32.68,44733000 28-Jan-02,33.83,34.31,33.32,33.92,29919400 25-Jan-02,32.87,34.16,32.75,33.68,35832800 24-Jan-02,32.92,33.60,32.56,33.20,53902500 23-Jan-02,31.66,32.61,31.62,32.45,49429000 22-Jan-02,33.55,33.59,31.56,31.70,52957100 18-Jan-02,33.55,34.30,33.16,33.48,51643600 17-Jan-02,34.05,34.75,33.60,34.53,50498800 16-Jan-02,33.96,34.59,33.68,33.71,76428600 15-Jan-02,34.94,34.98,34.09,34.68,57115500 14-Jan-02,34.30,35.19,34.10,34.84,58696400 11-Jan-02,34.82,35.11,34.26,34.55,39583200 10-Jan-02,35.43,35.47,34.50,34.65,51679400 9-Jan-02,35.96,36.78,35.03,35.36,59083800 8-Jan-02,35.34,35.97,34.95,35.58,35636600 7-Jan-02,36.02,36.25,35.02,35.27,48808800 4-Jan-02,36.20,36.35,35.32,35.79,65032900 3-Jan-02,33.50,35.62,33.40,35.52,91464500 2-Jan-02,31.90,33.00,31.73,33.00,42357300 31-Dec-01,32.15,32.41,31.41,31.45,27975400 28-Dec-01,32.94,33.31,32.12,32.24,27584200 27-Dec-01,32.41,32.98,32.36,32.67,22443900 26-Dec-01,32.05,33.12,32.02,32.29,23231600 24-Dec-01,32.16,32.40,32.00,32.02,8673800 21-Dec-01,32.22,32.74,31.97,32.41,57817500 20-Dec-01,32.85,33.20,31.96,31.98,49423400 19-Dec-01,33.33,33.96,33.04,33.05,39961400 18-Dec-01,34.15,34.33,33.36,33.81,39780800 17-Dec-01,33.10,34.09,33.00,33.97,39108700 14-Dec-01,32.59,33.78,32.27,33.27,46155500 13-Dec-01,33.28,33.72,32.50,32.57,51006500 12-Dec-01,33.29,34.14,33.11,34.08,50047800 11-Dec-01,33.35,34.14,33.05,33.19,46751600 10-Dec-01,32.89,33.62,32.85,32.95,41557600 7-Dec-01,34.16,34.50,32.75,33.24,59279300 6-Dec-01,34.50,34.78,33.75,34.16,58338000 5-Dec-01,33.06,34.85,33.04,34.61,75429600 4-Dec-01,32.20,32.90,31.84,32.86,44357600 3-Dec-01,32.29,32.88,31.97,32.04,43008300 30-Nov-01,32.23,32.91,31.68,32.66,42399600 29-Nov-01,31.99,32.42,31.16,32.32,45961000 28-Nov-01,31.92,32.55,31.61,31.76,61282400 27-Nov-01,31.51,32.99,30.90,32.31,80781000 26-Nov-01,31.43,32.12,31.31,31.87,53246100 23-Nov-01,30.58,31.25,30.32,31.06,17574100 21-Nov-01,29.54,30.84,29.48,30.81,55275700 20-Nov-01,30.71,30.79,29.83,29.95,41297200 19-Nov-01,30.81,31.30,29.91,30.99,47857300 16-Nov-01,30.63,30.95,30.15,30.63,39647000 15-Nov-01,30.82,31.48,30.46,30.78,58207300 14-Nov-01,30.47,31.59,29.90,31.32,78499200 13-Nov-01,29.06,30.06,28.95,30.05,68022300 12-Nov-01,27.61,28.77,26.77,28.38,47878400 9-Nov-01,28.18,28.30,27.60,27.88,40852500 8-Nov-01,28.87,29.40,27.93,28.28,64845900 7-Nov-01,27.91,29.08,27.75,28.29,59713700 6-Nov-01,26.79,28.28,26.70,28.25,63152300 5-Nov-01,26.75,27.28,26.65,26.96,42474800 2-Nov-01,25.95,26.73,25.50,26.30,49877700 1-Nov-01,24.53,25.97,24.25,25.94,54534000 31-Oct-01,23.93,25.29,23.44,24.42,64549300 30-Oct-01,23.77,24.40,23.24,23.54,52532700 29-Oct-01,25.60,25.89,24.17,24.18,46369900 26-Oct-01,26.01,26.50,25.55,25.86,45505200 25-Oct-01,25.00,26.22,24.31,26.10,56318500 24-Oct-01,25.19,25.93,24.92,25.48,41092700 23-Oct-01,25.42,26.00,24.89,25.00,41881700 22-Oct-01,24.12,25.37,23.76,25.30,46022200 19-Oct-01,23.99,24.56,23.61,24.15,42197000 18-Oct-01,24.60,24.61,23.70,24.05,49862900 17-Oct-01,26.14,26.23,24.50,24.57,91448800 16-Oct-01,24.53,25.10,24.17,24.96,53540600 15-Oct-01,24.49,24.52,23.63,24.38,44391600 12-Oct-01,24.31,25.13,24.23,25.02,64736500 11-Oct-01,23.39,24.68,23.35,24.51,76342800 10-Oct-01,21.43,23.20,21.37,23.06,52538600 9-Oct-01,22.04,22.23,21.10,21.45,42528700 8-Oct-01,21.38,22.52,21.27,22.24,36853400 5-Oct-01,21.51,22.05,20.55,21.96,49112300 4-Oct-01,21.73,22.58,21.00,21.55,67181500 3-Oct-01,19.30,21.65,19.08,21.23,75582600 2-Oct-01,20.00,20.08,19.37,19.54,52207600 1-Oct-01,20.21,20.28,19.70,20.01,44631700 28-Sep-01,20.74,20.98,20.10,20.44,72640600 27-Sep-01,20.91,21.36,19.57,20.55,58791700 26-Sep-01,21.72,21.85,20.72,20.90,48082100 25-Sep-01,21.56,21.96,20.79,21.68,65914600 24-Sep-01,20.00,21.72,19.50,21.31,79136200 21-Sep-01,19.01,20.75,18.96,19.30,116397800 20-Sep-01,21.46,22.27,20.50,20.67,70338800 19-Sep-01,23.56,23.69,20.86,22.28,86255200 18-Sep-01,23.88,24.48,23.20,23.47,56115100 17-Sep-01,24.26,25.00,23.50,23.59,81412400 10-Sep-01,25.53,26.10,25.46,26.07,51654400 7-Sep-01,26.16,26.98,25.73,25.89,72749200 6-Sep-01,26.76,27.62,25.80,26.10,81642600 5-Sep-01,26.94,27.69,26.34,27.47,71243200 4-Sep-01,27.56,28.09,26.85,26.85,54390700 31-Aug-01,27.02,28.13,27.01,27.96,38127600 30-Aug-01,27.50,27.83,26.88,27.13,44788800 29-Aug-01,28.86,28.92,27.74,28.10,37922200 28-Aug-01,29.22,29.66,28.43,28.51,54856600 27-Aug-01,29.02,29.89,28.60,29.15,27995600 24-Aug-01,28.05,29.14,27.85,29.08,38858200 23-Aug-01,27.89,28.37,27.62,27.67,32548500 22-Aug-01,27.59,28.00,27.00,27.96,42316100 21-Aug-01,28.33,28.51,27.05,27.07,35088800 20-Aug-01,28.07,28.68,27.90,28.20,36548500 17-Aug-01,29.17,29.38,27.79,28.07,60330900 16-Aug-01,29.41,30.18,29.08,30.16,38692500 15-Aug-01,30.28,30.75,29.70,29.78,33348300 14-Aug-01,30.71,30.85,30.24,30.35,27561900 13-Aug-01,30.67,30.72,30.08,30.56,30830500 10-Aug-01,29.52,30.19,28.99,29.95,33800700 9-Aug-01,29.50,30.03,29.18,29.65,35734300 8-Aug-01,30.39,31.19,29.39,29.61,49096000 7-Aug-01,29.95,31.00,29.77,30.62,44101300 6-Aug-01,30.43,30.68,30.04,30.28,54176800 3-Aug-01,32.05,32.08,31.25,31.68,35671500 2-Aug-01,31.41,32.23,31.33,32.11,74140400 1-Aug-01,30.62,30.98,30.28,30.75,45023900 31-Jul-01,29.16,30.42,29.03,29.81,50354000 30-Jul-01,29.51,29.74,28.80,29.04,30514600 27-Jul-01,29.61,29.85,29.01,29.22,35482900 26-Jul-01,29.10,29.90,28.80,29.78,46221000 25-Jul-01,28.97,29.48,28.19,29.42,35538100 24-Jul-01,28.71,29.59,28.43,28.88,38032700 23-Jul-01,29.97,30.23,28.91,29.00,35057400 20-Jul-01,29.41,30.03,28.93,29.93,50444200 19-Jul-01,29.59,30.22,29.43,29.96,54602300 18-Jul-01,28.87,30.15,28.52,28.89,71663500 17-Jul-01,28.57,29.94,28.08,29.90,104487600 16-Jul-01,30.03,30.75,28.77,29.13,65739200 13-Jul-01,30.01,30.38,29.25,30.19,42796300 12-Jul-01,29.35,30.19,29.05,30.10,49223400 11-Jul-01,27.65,28.50,27.00,28.06,50333800 10-Jul-01,27.79,29.17,27.46,27.79,41241500 9-Jul-01,28.53,29.43,28.11,28.90,30139400 6-Jul-01,29.14,29.85,28.30,28.43,37375700 5-Jul-01,30.08,31.00,29.80,29.84,35630900 3-Jul-01,29.94,30.69,29.65,30.46,22120800 2-Jul-01,29.58,30.54,29.16,30.06,38578300 29-Jun-01,29.81,30.77,28.75,29.25,49436600 28-Jun-01,29.23,30.50,29.20,29.64,54522800 27-Jun-01,29.00,29.21,28.34,28.65,33729600 26-Jun-01,28.09,29.07,28.03,28.97,34780200 25-Jun-01,28.00,28.69,27.47,28.58,28358600 22-Jun-01,27.47,28.30,27.27,27.51,30366800 21-Jun-01,27.35,28.09,26.95,27.27,45895500 20-Jun-01,26.31,27.66,26.26,27.49,43070200 19-Jun-01,28.53,28.79,26.14,26.67,60427600 18-Jun-01,27.87,28.54,27.43,27.55,27854300 15-Jun-01,27.34,28.30,27.11,27.68,54910400 14-Jun-01,28.56,29.10,27.56,27.61,41913100 13-Jun-01,29.88,30.13,29.00,29.06,41032400 12-Jun-01,29.70,30.21,29.00,30.13,54088900 11-Jun-01,30.17,30.51,29.42,30.33,41072800 8-Jun-01,31.89,31.93,30.00,30.67,68334700 7-Jun-01,29.71,31.23,29.67,31.14,75686000 6-Jun-01,29.45,30.69,29.05,29.82,72646300 5-Jun-01,28.86,29.95,28.85,29.73,51625800 4-Jun-01,29.12,29.50,28.06,28.50,37894700 1-Jun-01,27.26,29.07,27.19,28.74,60601900 31-May-01,27.03,27.58,26.84,27.01,38761100 30-May-01,27.34,27.70,26.40,26.60,47272800 29-May-01,28.96,29.02,27.78,27.85,37797600 25-May-01,29.44,29.55,28.68,29.10,29592100 24-May-01,28.84,29.40,28.12,29.21,47217900 23-May-01,29.37,30.25,28.56,28.80,53488500 22-May-01,30.19,30.43,29.40,29.53,39665300 21-May-01,28.37,30.01,28.19,29.90,44417800 18-May-01,28.53,29.14,27.99,28.76,34775000 17-May-01,28.78,29.19,28.00,28.60,56376100 16-May-01,27.00,28.50,26.50,28.36,59906400 15-May-01,27.62,28.10,26.93,27.20,47310800 14-May-01,28.05,28.15,26.71,27.41,41994500 11-May-01,29.03,29.24,27.79,27.94,47531600 10-May-01,30.48,30.54,28.90,29.01,49116200 9-May-01,30.99,30.99,29.30,29.93,61622800 8-May-01,31.49,31.80,30.90,31.48,41514400 7-May-01,31.05,31.68,30.34,31.16,33647800 4-May-01,29.90,31.05,29.30,30.88,35393400 3-May-01,31.14,31.20,30.11,30.40,37080900 2-May-01,31.89,32.50,31.20,31.94,45022200 1-May-01,30.77,31.41,30.12,31.18,37209500 30-Apr-01,30.85,31.65,30.53,30.91,41266300 27-Apr-01,29.60,30.23,29.05,30.18,42007500 26-Apr-01,30.23,30.36,28.60,28.64,53730100 25-Apr-01,29.00,29.36,27.50,29.03,64640600 24-Apr-01,29.94,31.04,28.90,29.14,50134100 23-Apr-01,31.07,31.30,29.65,30.32,58508800 20-Apr-01,31.97,32.57,31.26,32.43,62659300 19-Apr-01,30.79,32.52,30.45,32.49,85981400 18-Apr-01,29.22,32.19,28.60,31.28,49959200 17-Apr-01,25.25,26.73,25.18,26.04,74191900 16-Apr-01,26.77,26.80,25.52,26.30,59342200 12-Apr-01,27.46,28.51,26.31,28.12,54027200 11-Apr-01,27.90,28.29,27.18,27.52,91360800 10-Apr-01,23.48,25.10,23.35,24.77,55847600 9-Apr-01,23.69,24.20,22.25,23.20,60543900 6-Apr-01,25.06,25.23,23.00,23.62,73969200 5-Apr-01,24.25,25.81,24.09,25.62,67717700 4-Apr-01,24.69,25.09,22.44,22.62,84559100 3-Apr-01,25.31,26.37,24.84,25.00,57244800 2-Apr-01,26.06,26.87,25.06,25.80,44928600 30-Mar-01,26.62,26.75,25.31,26.31,47301100 29-Mar-01,26.87,27.56,25.75,26.56,64854100 28-Mar-01,28.69,29.31,26.81,26.94,73000000 27-Mar-01,28.37,29.70,28.06,29.37,72649100 26-Mar-01,29.50,29.56,27.87,28.31,64436100 23-Mar-01,29.69,29.75,27.69,28.81,84799100 22-Mar-01,26.12,28.81,26.06,28.69,94024200 21-Mar-01,24.75,26.75,24.62,25.56,68554800 20-Mar-01,27.37,27.44,24.56,24.62,64431700 19-Mar-01,27.50,27.75,25.37,27.06,76659800 16-Mar-01,28.44,28.81,27.69,27.87,59073400 15-Mar-01,29.75,29.94,28.44,28.50,40753300 14-Mar-01,28.37,29.87,28.00,29.06,57451600 13-Mar-01,28.25,29.62,27.75,29.37,52031200 12-Mar-01,28.50,29.37,27.56,27.75,59601900 9-Mar-01,30.19,30.59,29.00,29.44,95275300 8-Mar-01,32.94,33.69,32.69,33.25,64904800 7-Mar-01,32.75,33.69,31.69,32.94,77834200 6-Mar-01,31.62,32.88,31.44,31.50,59736600 5-Mar-01,29.87,30.75,29.50,30.37,33278900 2-Mar-01,28.50,31.12,28.37,29.31,54629700 1-Mar-01,28.25,29.25,27.06,29.12,56273000 28-Feb-01,29.37,30.19,28.00,28.56,48602200 27-Feb-01,29.50,30.87,29.00,29.00,40791400 26-Feb-01,30.56,30.70,28.44,29.50,60355000 23-Feb-01,30.37,30.75,28.50,29.94,63563000 22-Feb-01,30.94,31.56,29.62,30.00,58521600 21-Feb-01,31.00,32.75,30.50,30.75,51583400 20-Feb-01,34.06,34.13,31.37,31.44,52401400 16-Feb-01,34.75,35.31,33.63,34.38,41546100 15-Feb-01,35.44,36.50,35.13,35.81,58337000 14-Feb-01,32.56,34.55,31.94,34.13,47443600 13-Feb-01,34.13,35.25,32.38,32.44,41911200 12-Feb-01,33.69,35.19,33.63,34.56,30483100 9-Feb-01,34.31,35.56,33.44,33.50,40893300 8-Feb-01,35.38,36.13,34.56,34.63,42904100 7-Feb-01,35.00,36.06,33.88,34.94,53152500 6-Feb-01,34.56,35.94,34.48,35.44,40334400 5-Feb-01,35.06,35.31,33.67,34.69,39188000 2-Feb-01,37.67,38.23,35.50,35.69,47151900 1-Feb-01,37.06,37.94,36.50,37.81,50300900 31-Jan-01,37.31,38.59,36.50,37.00,71896600 30-Jan-01,37.38,38.19,36.81,37.00,60810000 29-Jan-01,35.25,37.38,34.75,37.06,49094400 26-Jan-01,34.13,36.06,33.75,35.88,48065800 25-Jan-01,35.81,36.06,34.31,34.50,45890600 24-Jan-01,35.69,37.06,35.19,36.25,73584200 23-Jan-01,33.44,35.89,32.75,35.38,84556100 22-Jan-01,32.69,33.88,32.50,33.38,45760300 19-Jan-01,33.38,34.63,32.31,33.56,81353900 18-Jan-01,30.94,32.31,30.00,32.19,86635200 17-Jan-01,33.00,33.06,30.12,30.50,7431600 16-Jan-01,32.19,32.38,31.00,31.37,60301700 12-Jan-01,33.56,33.81,31.81,32.13,51377000 11-Jan-01,32.38,34.25,32.00,33.38,64957200 10-Jan-01,31.62,33.38,31.12,33.00,51496700 9-Jan-01,32.53,32.94,31.87,32.25,40816900 8-Jan-01,31.50,32.31,30.62,31.94,45071200 5-Jan-01,34.06,34.63,31.75,32.06,44977300 4-Jan-01,34.00,35.38,32.69,33.80,68774100 3-Jan-01,30.12,34.63,30.12,34.23,78293000 2-Jan-01,30.69,31.87,30.25,31.06,50344500 29-Dec-00,30.94,31.44,29.81,30.06,54055600 28-Dec-00,32.13,32.69,30.06,30.94,49344800 27-Dec-00,32.69,33.69,32.31,32.56,33622300 26-Dec-00,33.13,33.88,32.00,32.88,28439700 22-Dec-00,33.63,35.00,32.00,32.94,45426400 21-Dec-00,32.00,34.45,31.62,33.13,51590000 20-Dec-00,32.94,34.13,31.50,31.94,63151200 19-Dec-00,33.75,36.25,33.31,33.44,54733600 18-Dec-00,34.19,34.50,32.42,33.25,38559500 15-Dec-00,34.56,34.75,32.31,32.44,80846100 14-Dec-00,35.56,36.63,34.50,35.13,33712500 13-Dec-00,37.75,37.88,35.19,35.50,48725300 12-Dec-00,36.94,37.92,36.38,36.50,48171200 11-Dec-00,35.13,38.19,34.31,37.44,73075000 8-Dec-00,34.75,34.88,33.00,34.00,88022200 7-Dec-00,32.44,33.25,31.44,32.31,68265600 6-Dec-00,35.31,35.31,31.25,31.75,102013100 5-Dec-00,34.63,36.50,34.00,36.00,75072200 4-Dec-00,35.13,35.34,32.06,32.94,82759100 1-Dec-00,38.50,38.50,33.81,34.13,1158400 30-Nov-00,38.50,38.94,36.81,38.06,78958300 29-Nov-00,42.38,43.50,40.94,42.75,61412000 28-Nov-00,43.19,44.63,42.00,42.03,49701200 27-Nov-00,45.44,46.75,43.75,43.94,52925200 24-Nov-00,42.81,44.00,42.00,43.94,20686200 22-Nov-00,42.25,43.88,41.06,41.19,36704200 21-Nov-00,42.44,43.38,41.44,42.63,36760500 20-Nov-00,41.00,42.94,40.63,41.13,37499200 17-Nov-00,40.13,41.75,39.50,41.50,40989500 16-Nov-00,41.25,42.94,39.77,40.00,39525800 15-Nov-00,41.69,42.88,40.75,41.50,41962300 14-Nov-00,40.50,41.25,39.44,40.94,48681100 13-Nov-00,37.00,39.75,36.00,38.19,81395200 10-Nov-00,38.00,39.00,37.00,37.00,94080200 9-Nov-00,42.31,42.38,39.94,41.38,48867300 8-Nov-00,46.25,46.31,42.44,42.69,38076400 7-Nov-00,46.75,46.81,45.31,46.19,21045000 6-Nov-00,46.63,47.38,46.38,46.56,24585500 3-Nov-00,47.13,47.25,45.50,45.94,31105600 2-Nov-00,46.50,47.88,46.38,46.69,65512800 1-Nov-00,44.31,46.56,44.19,44.88,47657200 31-Oct-00,45.69,46.94,44.69,45.00,55796100 30-Oct-00,45.95,46.13,43.88,45.00,49111900 27-Oct-00,45.88,47.00,44.84,46.38,50202200 26-Oct-00,42.00,45.00,41.69,44.69,50813000 25-Oct-00,42.00,43.56,41.14,41.31,53229200 24-Oct-00,43.63,44.50,41.63,42.00,46940900 23-Oct-00,43.69,45.00,42.38,43.31,43749700 20-Oct-00,41.63,44.38,41.38,43.06,59905000 19-Oct-00,42.02,42.31,40.88,41.94,64251100 18-Oct-00,36.25,39.81,35.25,38.19,16790000 17-Oct-00,36.38,36.63,35.00,36.19,78643300 16-Oct-00,39.13,39.19,35.38,35.69,92062300 13-Oct-00,37.11,40.75,36.94,40.38,80913700 12-Oct-00,37.13,38.50,35.00,37.13,100214400 11-Oct-00,37.00,38.13,35.00,35.38,122060300 10-Oct-00,39.19,40.19,37.44,37.56,68884400 9-Oct-00,40.44,40.53,38.00,39.06,56547300 6-Oct-00,41.38,42.25,39.25,39.94,69737200 5-Oct-00,42.13,42.38,40.50,41.00,52073700 4-Oct-00,41.00,42.75,40.75,42.00,63729400 3-Oct-00,41.77,42.50,40.13,40.31,81210200 2-Oct-00,42.94,42.94,39.88,40.13,66788900 29-Sep-00,43.81,43.88,41.38,41.56,72988700 28-Sep-00,44.13,44.56,43.48,44.44,66744100 27-Sep-00,44.63,45.69,43.44,43.88,80368000 26-Sep-00,46.44,46.50,42.81,43.31,112682500 25-Sep-00,50.06,50.20,44.75,45.38,130217300 22-Sep-00,46.75,49.50,46.50,47.94,308736900 21-Sep-00,62.06,62.94,60.38,61.48,57113600 20-Sep-00,61.25,63.50,60.44,63.06,70339200 19-Sep-00,57.19,60.50,56.81,60.38,58858000 18-Sep-00,58.38,59.25,55.50,55.81,50771100 15-Sep-00,59.69,59.88,56.63,57.52,75679200 14-Sep-00,62.50,62.88,59.25,59.63,50494400 13-Sep-00,61.69,63.31,60.50,61.25,70073100 12-Sep-00,65.06,66.94,64.56,64.94,29001400 11-Sep-00,65.56,66.87,63.94,64.69,30512200 8-Sep-00,67.19,67.44,64.94,65.37,29682800 7-Sep-00,66.61,68.69,66.25,67.44,34719400 6-Sep-00,68.06,68.50,65.00,65.70,62347700 5-Sep-00,71.06,71.37,68.25,69.25,58399400 1-Sep-00,75.62,75.69,73.44,73.94,18323100 31-Aug-00,73.87,75.62,73.62,74.87,28531100 30-Aug-00,73.75,74.37,72.75,73.50,21770600 29-Aug-00,73.31,74.94,73.12,74.06,23024800 28-Aug-00,73.25,75.81,73.00,73.87,42760800 25-Aug-00,73.87,74.44,72.62,72.94,20846600 24-Aug-00,74.56,75.83,73.00,74.25,23354500 23-Aug-00,71.44,74.87,70.69,74.62,36180900 22-Aug-00,72.47,73.62,72.12,72.12,31695500 21-Aug-00,72.67,74.06,70.56,72.06,46026700 18-Aug-00,71.00,72.94,70.25,70.56,35798700 17-Aug-00,68.50,71.50,68.44,70.06,40499200 16-Aug-00,68.62,69.50,67.56,68.06,24614800 15-Aug-00,66.81,68.75,66.00,67.87,34466700 14-Aug-00,64.44,67.00,63.63,66.94,25667800 11-Aug-00,61.88,64.12,60.81,63.81,22515000 10-Aug-00,63.19,64.81,62.00,62.00,16683100 9-Aug-00,62.88,64.87,62.84,63.56,30073000 8-Aug-00,62.75,63.38,61.50,61.63,24900200 7-Aug-00,62.63,64.37,61.13,62.94,30636900 4-Aug-00,66.22,66.25,61.44,62.56,34945200 3-Aug-00,61.81,65.37,60.44,65.06,34941700 2-Aug-00,65.25,66.12,63.19,63.31,33230600 1-Aug-00,67.06,67.37,64.25,64.62,25001700 31-Jul-00,65.44,67.56,64.50,66.75,30471100 28-Jul-00,69.00,69.69,64.38,64.57,27720800 27-Jul-00,69.25,70.19,68.00,68.50,19613000 26-Jul-00,69.50,70.07,68.28,69.50,23325500 25-Jul-00,69.36,70.97,68.85,70.44,14812500 24-Jul-00,69.10,71.00,68.82,69.00,19922000 21-Jul-00,71.07,71.12,69.03,69.10,16045200 20-Jul-00,69.47,71.62,68.94,71.35,30246600 19-Jul-00,72.47,73.07,69.00,69.07,36096600 18-Jul-00,72.40,72.42,70.72,71.50,25342800 17-Jul-00,73.32,73.75,72.19,73.15,23290000 14-Jul-00,72.00,73.53,71.53,73.35,18739200 13-Jul-00,70.19,72.50,70.12,71.60,22592500 12-Jul-00,70.12,71.12,69.38,70.60,14913300 11-Jul-00,69.12,70.62,68.57,69.40,21391600 10-Jul-00,68.88,70.00,68.50,68.90,15677300 7-Jul-00,68.88,69.94,68.07,69.65,18645300 6-Jul-00,65.75,68.40,65.28,68.32,22454800 5-Jul-00,66.57,67.25,65.69,65.82,21004100 3-Jul-00,67.07,68.44,66.86,68.44,7543000 30-Jun-00,65.44,67.07,64.82,66.85,20718700 29-Jun-00,65.53,67.19,65.25,65.88,23572700 28-Jun-00,65.97,67.85,65.50,66.19,15319200 27-Jun-00,66.97,68.25,65.62,65.69,16688100 26-Jun-00,67.90,68.60,66.32,67.10,14953800 23-Jun-00,67.62,68.75,67.07,67.19,15161300 22-Jun-00,69.00,69.19,67.00,67.03,14852700 21-Jun-00,68.19,69.62,68.00,69.50,16448900 20-Jun-00,67.97,70.12,67.97,69.15,29295200 19-Jun-00,64.22,68.35,64.19,68.25,30610900 16-Jun-00,64.62,64.85,62.94,63.03,22044800 15-Jun-00,63.37,65.03,63.25,64.12,16708600 14-Jun-00,65.44,65.65,63.00,63.22,18506900 13-Jun-00,62.25,65.93,62.06,65.75,19565200 12-Jun-00,63.90,64.00,62.31,62.53,12975500 9-Jun-00,63.97,64.00,62.75,63.53,13765000 8-Jun-00,64.82,65.75,63.00,63.10,17200900 7-Jun-00,64.62,64.69,62.85,64.47,19880500 6-Jun-00,65.65,67.53,64.75,64.78,23714100 5-Jun-00,66.32,67.50,65.60,66.28,19592500 2-Jun-00,66.40,67.28,66.00,67.10,21333600 1-Jun-00,63.10,65.00,63.06,64.85,22994400 31-May-00,63.12,63.97,62.25,62.35,27047500 30-May-00,59.62,62.94,59.56,62.88,20886200 26-May-00,57.50,59.94,57.19,58.78,15428600 25-May-00,59.35,61.12,56.78,57.60,25246900 24-May-00,54.81,59.08,54.75,58.69,37741700 23-May-00,58.88,59.94,54.90,54.94,25194500 22-May-00,58.75,59.28,55.69,59.19,29627500 19-May-00,60.94,61.81,58.15,58.94,35986200 18-May-00,61.94,63.25,61.56,61.97,25071100 17-May-00,61.19,62.72,60.19,61.60,32772500 16-May-00,59.88,61.44,59.35,60.94,22236600 15-May-00,57.28,59.12,56.38,59.06,20554200 12-May-00,58.31,59.75,57.38,57.50,19217300 11-May-00,53.56,58.00,53.19,57.78,35135900 10-May-00,57.25,58.25,52.56,53.03,48614400 9-May-00,59.19,59.62,57.50,58.47,21530900 8-May-00,61.12,61.35,58.75,58.81,20473900 5-May-00,59.50,61.94,59.50,61.69,17113600 4-May-00,59.38,60.31,58.53,59.78,20493700 packet/data/equities/mmm0100644000076400007640000006070207525024672014254 0ustar iankiankDate,Open,High,Low,Close,Volume 2-Aug-02,121.60,122.95,117.89,119.87,3179400 1-Aug-02,125.25,125.55,121.81,122.13,2895100 31-Jul-02,124.45,126.07,122.80,125.83,3712800 30-Jul-02,126.61,127.55,123.50,125.49,3926500 29-Jul-02,121.70,127.00,121.61,126.66,3316400 26-Jul-02,119.95,121.50,119.00,120.85,2894500 25-Jul-02,119.51,121.99,116.50,119.95,5194900 24-Jul-02,111.77,119.95,110.66,119.72,5535500 23-Jul-02,111.00,113.75,110.05,111.76,5067500 22-Jul-02,109.79,113.15,108.20,109.00,6304300 19-Jul-02,116.65,116.66,108.88,108.88,4863500 18-Jul-02,117.35,118.40,115.98,116.65,3162700 17-Jul-02,117.80,118.47,115.60,117.46,2830600 16-Jul-02,117.50,118.86,115.00,115.90,3216000 15-Jul-02,119.90,119.91,114.86,118.89,4928300 12-Jul-02,122.40,123.36,120.10,120.87,3005400 11-Jul-02,122.20,124.02,120.26,121.40,3848300 10-Jul-02,128.00,128.46,123.98,124.00,3105300 9-Jul-02,129.15,130.09,127.68,128.00,2282300 8-Jul-02,129.60,129.95,128.35,129.15,2243800 5-Jul-02,127.50,129.87,126.60,129.87,916500 3-Jul-02,125.77,127.00,123.10,126.10,2238700 2-Jul-02,127.40,127.50,125.36,125.77,2868300 1-Jul-02,125.75,128.72,125.50,127.40,3740400 28-Jun-02,124.15,125.20,123.00,123.00,2007200 27-Jun-02,122.62,125.17,121.90,125.17,1973600 26-Jun-02,120.75,122.87,119.38,122.42,2358700 25-Jun-02,124.98,125.85,122.40,122.61,1752200 24-Jun-02,124.01,124.99,122.22,124.12,2038100 21-Jun-02,125.70,127.00,123.50,124.00,2793700 20-Jun-02,127.35,128.90,126.35,126.81,1582900 19-Jun-02,128.02,129.60,127.29,127.75,1960500 18-Jun-02,127.37,128.50,126.56,128.50,1091300 17-Jun-02,126.00,127.18,125.05,127.10,1454900 14-Jun-02,125.00,126.19,122.90,126.05,2063400 13-Jun-02,127.30,127.50,125.12,125.80,1179400 12-Jun-02,125.25,127.55,124.35,127.55,1715100 11-Jun-02,126.00,127.50,125.32,125.48,1694600 10-Jun-02,124.41,126.35,124.00,126.00,1483700 7-Jun-02,121.90,124.84,121.90,124.44,1480600 6-Jun-02,125.98,126.10,123.33,123.55,1601000 5-Jun-02,125.00,126.70,124.79,125.73,1446400 4-Jun-02,124.45,125.18,123.65,125.08,1614500 3-Jun-02,125.18,126.48,124.03,124.45,1811800 31-May-02,125.60,127.00,125.43,125.43,1480700 30-May-02,125.00,126.39,124.82,125.10,1622800 29-May-02,127.49,127.98,125.00,125.00,2370000 28-May-02,129.00,129.20,126.76,126.78,1357400 24-May-02,129.07,129.39,127.92,127.95,1490300 23-May-02,128.50,129.19,127.82,128.49,3076200 22-May-02,126.95,127.97,126.20,127.54,1044700 21-May-02,127.67,128.56,126.03,126.36,1421700 20-May-02,129.19,129.19,127.16,127.61,1333300 17-May-02,128.34,129.51,127.98,129.43,1466600 16-May-02,128.87,129.96,128.08,128.78,1309400 15-May-02,128.88,129.46,128.17,128.87,1746700 14-May-02,128.52,129.35,127.38,129.35,2358900 13-May-02,126.36,128.12,125.75,127.87,1961400 10-May-02,125.78,127.32,125.78,126.28,2063900 9-May-02,125.32,126.61,125.16,125.68,1502100 8-May-02,124.99,126.58,124.94,125.56,1968000 7-May-02,123.36,125.29,122.69,123.68,2207500 6-May-02,125.48,126.37,123.61,123.61,1608900 3-May-02,125.58,126.38,124.44,126.38,1786100 2-May-02,125.36,126.78,125.36,126.54,1857300 1-May-02,125.19,126.18,122.40,125.39,1937100 30-Apr-02,122.04,125.92,122.04,125.19,1558000 29-Apr-02,123.12,123.74,121.90,122.04,1528200 26-Apr-02,126.33,126.47,123.69,123.79,1833300 25-Apr-02,124.39,126.33,124.30,126.33,1727300 24-Apr-02,123.59,126.23,123.39,124.89,2377900 23-Apr-02,124.15,124.89,122.98,123.67,1891100 22-Apr-02,124.61,127.47,122.80,124.40,3693900 19-Apr-02,123.64,124.34,122.30,124.28,1207600 18-Apr-02,122.80,123.64,121.61,123.08,1165800 17-Apr-02,123.39,124.39,122.10,122.92,1189800 16-Apr-02,121.90,124.24,121.88,123.80,1877000 15-Apr-02,122.20,123.00,120.83,120.96,1464900 12-Apr-02,123.89,123.89,121.35,121.62,1901800 11-Apr-02,124.53,125.19,123.02,123.24,2525800 10-Apr-02,123.50,124.89,122.50,124.53,2591500 9-Apr-02,123.03,124.64,122.30,124.31,2915200 8-Apr-02,120.34,123.38,120.22,123.03,2615800 5-Apr-02,119.81,121.36,118.42,121.33,7618600 4-Apr-02,112.50,114.23,112.11,113.56,1524300 3-Apr-02,112.80,113.64,111.75,112.36,1827000 2-Apr-02,114.71,115.24,113.14,114.43,1204200 1-Apr-02,114.59,114.99,112.75,114.70,1185000 28-Mar-02,115.28,115.83,112.35,114.45,2070500 27-Mar-02,116.28,117.35,115.77,116.39,1220400 26-Mar-02,114.99,116.72,114.99,116.08,1409900 25-Mar-02,116.30,116.53,114.84,115.14,1225000 22-Mar-02,117.37,117.40,115.15,115.82,1884300 21-Mar-02,119.41,119.61,116.43,117.72,1401000 20-Mar-02,121.01,121.02,119.32,119.32,1376300 19-Mar-02,122.00,122.39,120.92,121.11,1903100 18-Mar-02,121.90,122.03,120.82,121.60,1289400 15-Mar-02,120.06,121.01,119.41,120.81,2834100 14-Mar-02,119.56,120.40,118.72,120.00,1516900 13-Mar-02,120.80,121.37,118.92,118.92,1654200 12-Mar-02,118.42,121.90,118.42,120.71,1910600 11-Mar-02,120.41,120.42,119.03,119.91,1593800 8-Mar-02,120.79,122.20,119.81,120.91,1569600 7-Mar-02,120.73,120.77,118.82,120.54,1884800 6-Mar-02,120.31,121.39,120.21,120.98,1873500 5-Mar-02,121.11,123.10,119.21,119.56,2423700 4-Mar-02,119.38,122.89,118.67,122.41,2599800 1-Mar-02,116.63,120.36,116.63,119.73,1925100 28-Feb-02,118.52,119.10,117.22,117.35,1727900 27-Feb-02,118.87,119.80,117.82,118.42,2046700 26-Feb-02,119.32,119.61,117.37,118.72,2552800 25-Feb-02,118.42,120.21,117.60,119.86,2829100 22-Feb-02,115.44,118.75,115.43,118.42,2373600 21-Feb-02,116.68,117.92,115.43,115.43,2267500 20-Feb-02,113.54,117.12,113.00,116.53,1812000 19-Feb-02,114.26,114.55,112.63,112.82,1982200 15-Feb-02,116.15,116.48,113.99,114.33,2243300 14-Feb-02,114.81,115.91,113.84,115.70,1584100 13-Feb-02,113.52,115.79,113.52,114.62,1484000 12-Feb-02,112.83,113.82,112.13,113.00,1353300 11-Feb-02,109.36,113.15,109.31,112.84,2208300 8-Feb-02,107.98,110.35,106.89,110.07,3749200 7-Feb-02,109.11,110.15,107.98,108.38,1299100 6-Feb-02,108.12,109.36,107.48,108.56,1974900 5-Feb-02,108.77,109.70,106.99,107.56,2362900 4-Feb-02,111.44,111.44,108.37,108.37,1681900 1-Feb-02,109.86,112.19,109.36,112.10,2373100 31-Jan-02,108.74,111.80,108.52,109.86,2262800 30-Jan-02,106.79,109.11,104.41,108.74,3826900 29-Jan-02,109.36,110.10,107.17,107.53,1878400 28-Jan-02,109.41,109.81,108.33,109.40,1529900 25-Jan-02,108.18,111.37,107.58,110.08,2719000 24-Jan-02,106.19,108.97,106.19,108.33,2290100 23-Jan-02,105.55,107.13,103.94,106.35,2030400 22-Jan-02,106.54,107.71,104.76,105.32,2346100 18-Jan-02,103.38,106.88,102.48,105.70,4333800 17-Jan-02,103.62,103.81,98.97,103.44,7927000 16-Jan-02,107.38,107.38,99.17,102.63,11389800 15-Jan-02,110.61,111.24,107.98,108.37,2971900 14-Jan-02,112.62,112.93,110.25,110.61,2550900 11-Jan-02,112.04,113.29,111.35,112.62,2095700 10-Jan-02,112.78,113.52,109.97,112.04,3229800 9-Jan-02,114.11,115.88,113.24,113.47,1570400 8-Jan-02,114.71,114.88,113.32,113.87,1532900 7-Jan-02,115.79,116.49,114.31,114.51,1760500 4-Jan-02,115.46,116.76,115.30,115.89,2032700 3-Jan-02,115.70,116.29,115.27,115.55,1847900 2-Jan-02,115.82,116.78,114.95,115.93,2143500 31-Dec-01,118.68,118.68,116.98,116.99,1723900 28-Dec-01,118.76,118.92,118.07,118.68,1022100 27-Dec-01,119.41,119.94,118.41,118.92,826500 26-Dec-01,118.19,120.64,117.98,119.39,1044700 24-Dec-01,117.97,118.66,117.62,118.19,464800 21-Dec-01,117.28,118.12,116.69,117.97,2105000 20-Dec-01,118.47,118.52,116.93,117.26,1651000 19-Dec-01,117.18,118.65,116.83,118.57,1183600 18-Dec-01,116.29,118.68,116.29,118.27,1802800 17-Dec-01,114.11,117.08,114.11,116.09,1732200 14-Dec-01,113.85,114.78,112.78,114.61,1372100 13-Dec-01,114.56,114.66,113.57,113.86,1308700 12-Dec-01,114.68,115.30,113.93,114.81,1522800 11-Dec-01,115.10,115.47,114.06,114.65,1213300 10-Dec-01,116.55,116.78,113.92,114.40,1538000 7-Dec-01,117.08,117.57,116.17,117.08,1204600 6-Dec-01,116.98,118.43,116.79,117.61,1090600 5-Dec-01,115.79,118.25,115.79,117.64,1579000 4-Dec-01,113.32,115.39,112.87,115.23,1270600 3-Dec-01,113.22,113.22,111.54,112.70,1157600 30-Nov-01,114.01,114.42,113.37,113.40,1227900 29-Nov-01,113.41,114.58,112.97,114.04,1353800 28-Nov-01,114.06,114.65,113.09,113.41,1447900 27-Nov-01,115.60,115.69,114.11,115.03,1387100 26-Nov-01,116.03,116.04,114.85,115.75,1210000 23-Nov-01,114.36,116.26,114.24,116.04,589400 21-Nov-01,114.94,115.10,113.67,114.16,1263200 20-Nov-01,114.16,115.79,114.16,114.95,1541800 19-Nov-01,113.97,115.88,113.54,114.93,1604100 16-Nov-01,113.97,114.71,112.25,113.23,2129300 15-Nov-01,113.09,114.20,112.55,112.86,1441000 14-Nov-01,113.21,114.07,111.76,113.09,1825400 13-Nov-01,109.83,112.20,109.79,111.67,1548600 12-Nov-01,109.31,110.48,108.01,109.24,1955000 9-Nov-01,109.44,110.75,108.94,109.82,1297600 8-Nov-01,108.80,111.31,108.80,109.69,1737600 7-Nov-01,107.70,110.46,107.61,108.75,1649500 6-Nov-01,108.80,108.80,105.93,107.70,3142300 5-Nov-01,108.21,109.47,108.01,108.80,1756700 2-Nov-01,104.84,107.62,104.38,106.54,1527300 1-Nov-01,103.02,104.93,101.81,104.64,1644600 31-Oct-01,104.76,105.34,102.72,102.77,1588200 30-Oct-01,104.67,104.75,102.40,103.74,2079000 29-Oct-01,106.93,107.57,104.64,104.89,2094800 26-Oct-01,106.93,108.31,105.94,108.14,1245700 25-Oct-01,104.91,107.21,104.39,107.03,1742900 24-Oct-01,105.16,105.59,104.37,105.06,1560600 23-Oct-01,106.33,106.33,104.22,104.76,2037500 22-Oct-01,99.45,106.34,99.45,105.74,3481100 19-Oct-01,100.85,101.21,99.60,100.60,2257900 18-Oct-01,101.57,102.30,99.84,101.37,2006900 17-Oct-01,105.65,105.94,101.40,101.57,2202300 16-Oct-01,104.18,105.13,103.29,104.57,1718800 15-Oct-01,102.10,104.37,102.03,104.18,1396400 12-Oct-01,103.83,104.86,102.24,102.88,2097600 11-Oct-01,101.81,105.35,101.70,104.51,3124200 10-Oct-01,97.06,101.32,96.49,100.27,2250100 9-Oct-01,96.95,98.26,95.95,96.93,1468200 8-Oct-01,97.87,98.22,96.20,96.94,1825500 5-Oct-01,97.87,98.46,96.14,98.21,1628600 4-Oct-01,98.06,98.95,97.28,98.11,2171300 3-Oct-01,95.41,98.26,94.62,98.06,2298900 2-Oct-01,95.37,96.20,94.82,95.71,2074000 1-Oct-01,96.49,96.62,93.74,95.37,2615300 28-Sep-01,96.49,97.25,95.31,96.89,2447000 27-Sep-01,91.94,95.02,90.29,94.83,2236400 26-Sep-01,92.06,92.49,91.23,91.94,2141400 25-Sep-01,89.60,92.55,89.12,91.70,2584400 24-Sep-01,85.64,91.06,85.64,90.26,3483000 21-Sep-01,88.94,90.58,84.54,85.64,6110300 20-Sep-01,91.03,91.37,88.12,88.93,3208100 19-Sep-01,93.05,93.83,87.14,91.03,3358100 18-Sep-01,94.03,95.70,91.91,92.69,3017400 17-Sep-01,100.01,100.02,92.97,93.98,3552500 10-Sep-01,99.23,102.30,98.87,100.63,2523100 7-Sep-01,101.23,101.71,99.22,99.23,2353800 6-Sep-01,103.39,103.55,101.42,102.30,1636000 5-Sep-01,103.42,104.67,101.87,103.39,2020300 4-Sep-01,102.50,105.93,102.45,102.94,2154700 31-Aug-01,102.84,104.12,102.01,102.50,1176100 30-Aug-01,104.45,105.99,101.51,102.60,1993800 29-Aug-01,107.72,108.31,104.58,105.11,1801100 28-Aug-01,108.36,108.50,106.73,107.62,1219400 27-Aug-01,109.76,109.81,108.70,108.85,900300 24-Aug-01,106.78,110.10,105.86,108.91,1391200 23-Aug-01,108.13,108.13,106.34,106.68,1482400 22-Aug-01,106.83,108.65,105.40,108.12,2040500 21-Aug-01,106.96,109.17,105.31,105.50,1841800 20-Aug-01,106.41,107.20,105.48,106.33,1108200 17-Aug-01,108.59,108.59,106.21,106.41,2072200 16-Aug-01,107.71,107.71,105.26,106.75,1746200 15-Aug-01,107.07,109.17,106.48,107.36,1425800 14-Aug-01,107.96,108.64,106.41,106.82,1159300 13-Aug-01,106.97,108.31,106.65,108.19,1112900 10-Aug-01,105.50,107.68,105.08,107.56,1646100 9-Aug-01,105.42,106.14,104.38,105.28,1557700 8-Aug-01,108.54,108.95,105.36,105.93,1290100 7-Aug-01,107.51,108.57,107.24,108.54,1128500 6-Aug-01,108.78,109.22,106.92,107.09,936100 3-Aug-01,109.21,109.66,107.69,109.40,1120600 2-Aug-01,109.32,110.15,108.83,108.97,1102000 1-Aug-01,109.17,110.15,108.20,108.68,1604600 31-Jul-01,107.85,110.33,107.55,109.55,1635100 30-Jul-01,109.16,109.66,106.73,106.97,1045700 27-Jul-01,109.13,109.85,108.44,109.15,1093100 26-Jul-01,108.10,109.57,106.41,109.13,1503700 25-Jul-01,105.07,108.19,105.05,108.06,1876100 24-Jul-01,109.17,109.17,104.55,104.83,2619100 23-Jul-01,111.87,112.21,108.68,109.00,1381600 20-Jul-01,112.26,112.26,109.87,110.64,1796300 19-Jul-01,112.35,113.58,110.77,112.26,2273700 18-Jul-01,110.50,111.38,109.66,111.38,1883600 17-Jul-01,107.75,111.61,107.75,110.50,2035200 16-Jul-01,109.03,110.13,107.75,107.75,1569400 13-Jul-01,110.64,111.13,109.08,109.89,1395200 12-Jul-01,109.66,111.62,109.32,111.16,1558000 11-Jul-01,108.78,110.13,107.71,109.41,1963100 10-Jul-01,112.21,112.99,109.17,109.32,1917100 9-Jul-01,111.62,112.59,110.40,112.45,1969100 6-Jul-01,113.48,113.77,111.33,112.21,1672800 5-Jul-01,113.73,114.78,112.94,114.01,1238000 3-Jul-01,113.60,115.05,113.10,114.39,1232100 2-Jul-01,106.97,114.95,106.97,114.81,5802800 29-Jun-01,113.44,115.15,111.72,111.72,2038700 28-Jun-01,113.43,115.49,113.14,113.44,1468900 27-Jun-01,113.48,114.46,111.62,111.92,1870500 26-Jun-01,112.60,114.23,112.26,112.60,2300100 25-Jun-01,114.56,116.20,113.28,113.28,1890400 22-Jun-01,114.41,115.52,114.07,114.34,1459200 21-Jun-01,115.24,116.12,113.09,113.91,3914300 20-Jun-01,117.85,117.85,114.57,116.12,3274700 19-Jun-01,119.68,120.43,117.74,117.85,1700200 18-Jun-01,118.47,121.05,118.47,119.68,1630300 15-Jun-01,118.43,120.19,117.25,118.36,2534600 14-Jun-01,119.40,119.85,117.62,118.24,1376400 13-Jun-01,119.85,121.41,119.17,119.40,1408500 12-Jun-01,117.83,119.88,117.40,119.53,2041800 11-Jun-01,117.64,118.35,116.57,117.83,850100 8-Jun-01,118.96,118.96,117.35,117.60,965400 7-Jun-01,118.92,120.52,118.38,119.26,1146900 6-Jun-01,119.40,119.45,118.34,119.05,1503800 5-Jun-01,117.69,119.34,116.60,118.96,1552400 4-Jun-01,116.57,118.52,116.06,117.50,1199000 1-Jun-01,115.59,117.30,113.42,116.92,2136900 31-May-01,114.91,116.91,114.91,116.11,1561400 30-May-01,116.27,117.01,114.28,114.90,1687500 29-May-01,116.52,118.21,115.54,117.25,1555400 25-May-01,116.76,117.59,116.29,116.29,1047500 24-May-01,118.36,118.96,115.55,116.50,2559900 23-May-01,118.08,118.56,117.60,118.12,1402800 22-May-01,120.73,120.83,118.00,118.47,2155800 21-May-01,120.53,121.27,119.71,120.52,1400000 18-May-01,121.25,121.80,119.45,120.48,1966600 17-May-01,122.40,124.35,120.14,121.13,4029400 16-May-01,115.64,122.93,115.10,122.88,3585300 15-May-01,115.24,116.66,114.77,115.10,1421600 14-May-01,114.35,115.34,114.22,115.24,820400 11-May-01,114.99,115.68,113.44,114.35,1129900 10-May-01,114.32,115.89,114.27,114.99,1172000 9-May-01,113.35,115.05,113.29,113.91,1303900 8-May-01,114.83,115.58,112.78,113.35,1805000 7-May-01,116.17,117.58,114.51,114.85,1467100 4-May-01,113.73,116.90,113.10,116.89,2092700 3-May-01,113.73,115.73,112.37,114.71,2008400 2-May-01,115.44,115.44,112.69,113.54,2157900 1-May-01,115.93,115.93,113.37,114.47,1757900 30-Apr-01,115.90,118.77,115.29,115.93,2521700 27-Apr-01,114.46,116.56,114.27,115.91,1585500 26-Apr-01,114.31,115.61,112.52,114.79,1303500 25-Apr-01,113.11,114.37,111.60,114.01,1680100 24-Apr-01,113.20,116.59,112.54,113.11,3150100 23-Apr-01,109.69,113.68,108.15,113.29,2990100 20-Apr-01,111.56,112.13,109.25,109.59,2173000 19-Apr-01,112.76,113.49,111.08,113.49,1924700 18-Apr-01,107.74,114.22,106.09,113.00,3419800 17-Apr-01,106.65,107.79,105.40,106.09,1832200 16-Apr-01,104.94,107.85,104.94,107.62,2045800 12-Apr-01,103.26,105.44,102.68,104.95,1628800 11-Apr-01,108.13,108.33,103.50,104.05,2287200 10-Apr-01,102.77,108.91,102.53,105.76,3887200 9-Apr-01,101.12,102.48,100.40,101.88,1977200 6-Apr-01,99.71,100.24,98.17,99.36,1861300 5-Apr-01,98.39,101.17,98.37,100.56,2960200 4-Apr-01,97.32,99.36,94.65,96.07,4024900 3-Apr-01,98.73,99.36,95.96,97.33,3259000 2-Apr-01,100.92,103.36,98.88,99.41,2320300 30-Mar-01,100.39,102.53,99.41,101.21,1848100 29-Mar-01,101.33,101.33,97.95,100.14,2493500 28-Mar-01,100.97,102.24,99.81,102.12,2235300 27-Mar-01,101.31,103.55,100.11,102.69,3263200 26-Mar-01,98.88,103.75,98.88,101.34,2723700 23-Mar-01,99.61,100.78,96.93,99.12,3910200 22-Mar-01,98.39,100.83,95.96,99.18,6737700 21-Mar-01,102.51,103.07,99.38,100.95,4492800 20-Mar-01,105.19,106.67,102.51,102.52,2752500 19-Mar-01,103.27,105.84,102.51,105.19,2357200 16-Mar-01,107.45,107.45,102.77,103.27,3378400 15-Mar-01,106.57,107.08,105.21,106.42,2110800 14-Mar-01,102.29,107.16,101.81,104.73,5657000 13-Mar-01,109.98,109.98,103.75,104.92,4963000 12-Mar-01,113.00,113.78,108.13,108.91,2749800 9-Mar-01,113.88,116.66,112.08,113.40,3004100 8-Mar-01,110.96,114.46,110.33,114.16,2428400 7-Mar-01,109.40,110.30,109.26,110.01,1460400 6-Mar-01,110.57,110.57,108.99,109.35,1586100 5-Mar-01,109.30,110.18,108.57,109.30,1329500 2-Mar-01,106.72,110.06,105.72,108.45,2667700 1-Mar-01,109.84,110.02,106.48,106.77,2510900 28-Feb-01,110.09,111.12,109.14,109.84,2091600 27-Feb-01,109.40,110.55,107.84,110.08,1907900 26-Feb-01,108.13,109.01,107.23,108.47,1684000 23-Feb-01,108.08,108.52,107.03,107.55,2810200 22-Feb-01,109.45,109.59,105.82,107.40,2174800 21-Feb-01,110.08,111.29,108.38,108.39,1596900 20-Feb-01,109.72,111.19,109.64,110.31,1729700 16-Feb-01,111.20,111.39,108.02,109.71,1754800 15-Feb-01,107.42,111.34,106.64,111.20,1402100 14-Feb-01,110.61,110.61,105.63,107.53,2104000 13-Feb-01,109.00,111.83,108.72,110.61,1688600 12-Feb-01,107.06,109.00,106.96,109.00,1360900 9-Feb-01,108.82,108.83,107.02,107.23,870900 8-Feb-01,109.37,109.45,107.75,108.58,1051200 7-Feb-01,107.66,110.61,107.66,108.42,1401800 6-Feb-01,107.66,109.74,106.81,108.20,1540300 5-Feb-01,104.95,108.18,104.95,106.37,1645300 2-Feb-01,107.37,108.24,104.27,105.36,1662100 1-Feb-01,107.46,109.97,106.12,108.10,1892300 31-Jan-01,107.96,109.40,106.99,107.22,2038900 30-Jan-01,103.44,108.53,103.15,107.95,2312600 29-Jan-01,103.99,104.46,102.59,103.97,1537700 26-Jan-01,106.17,107.14,103.57,103.99,1478000 25-Jan-01,103.69,106.41,100.84,106.11,2112000 24-Jan-01,106.11,107.20,102.47,103.81,1851500 23-Jan-01,105.50,108.23,105.08,107.56,1764400 22-Jan-01,103.26,105.62,102.17,105.50,2026200 19-Jan-01,105.56,105.56,102.90,103.44,2030800 18-Jan-01,106.59,106.59,104.41,105.62,2682900 17-Jan-01,103.20,106.59,102.60,106.59,5776100 16-Jan-01,107.20,109.99,106.65,109.99,2123700 12-Jan-01,108.65,108.71,105.14,106.29,1827900 11-Jan-01,108.89,110.41,106.17,108.65,2095300 10-Jan-01,107.20,109.02,105.62,108.83,2172200 9-Jan-01,111.38,111.62,108.65,109.92,1981400 8-Jan-01,109.50,111.80,106.17,111.68,2743300 5-Jan-01,113.38,113.38,107.14,111.01,4183500 4-Jan-01,114.22,115.80,111.98,115.31,2030200 3-Jan-01,114.35,116.16,112.77,114.16,2377200 2-Jan-01,114.47,117.74,113.86,115.50,2325600 29-Dec-00,118.16,119.13,115.92,116.77,1377100 28-Dec-00,114.83,119.13,112.65,118.16,2143600 27-Dec-00,112.29,115.68,110.83,115.50,1282800 26-Dec-00,109.86,111.44,108.71,111.44,999800 22-Dec-00,108.96,109.92,107.44,109.26,1830000 21-Dec-00,108.05,110.41,106.11,109.20,2405300 20-Dec-00,106.83,110.17,106.83,109.44,1919400 19-Dec-00,111.07,112.41,109.14,110.23,2321000 18-Dec-00,110.35,111.38,109.62,111.07,2010900 15-Dec-00,109.74,110.23,107.80,108.71,2973200 14-Dec-00,109.56,110.83,106.78,107.56,2040600 13-Dec-00,110.47,111.44,109.02,110.29,1426300 12-Dec-00,110.83,111.20,110.11,110.35,2058200 11-Dec-00,112.23,112.71,110.95,111.68,1648300 8-Dec-00,111.32,113.56,110.04,113.32,3179300 7-Dec-00,110.77,111.26,109.02,111.14,3751200 6-Dec-00,111.86,113.13,111.01,111.56,6257600 5-Dec-00,103.93,115.31,103.93,113.01,14558000 4-Dec-00,96.78,103.32,96.36,101.75,6105500 1-Dec-00,96.18,97.21,96.18,96.54,1264300 30-Nov-00,97.02,97.14,95.33,96.78,1468200 29-Nov-00,96.05,97.02,95.99,97.02,1320600 28-Nov-00,95.45,98.11,95.09,95.81,1867900 27-Nov-00,93.09,96.90,92.18,96.18,2326900 24-Nov-00,92.85,93.09,92.18,92.85,495400 22-Nov-00,92.12,94.00,92.12,92.85,1078300 21-Nov-00,91.33,92.91,91.33,92.72,1170200 20-Nov-00,92.88,93.12,90.77,91.13,1527700 17-Nov-00,92.46,93.42,91.67,92.46,1657200 16-Nov-00,93.66,93.78,90.23,91.79,1533800 15-Nov-00,90.59,93.12,90.59,91.85,1475300 14-Nov-00,90.59,91.91,89.33,91.49,1327500 13-Nov-00,90.65,92.22,90.59,91.31,1122700 10-Nov-00,94.02,94.80,91.13,91.49,980000 9-Nov-00,92.82,94.86,91.61,93.78,1102900 8-Nov-00,93.96,96.07,92.22,93.72,1438200 7-Nov-00,94.62,94.62,92.46,93.36,906100 6-Nov-00,91.25,94.62,90.77,93.78,1684000 3-Nov-00,91.19,91.55,90.35,91.37,1251500 2-Nov-00,91.67,92.40,90.95,91.43,1392900 1-Nov-00,92.70,94.32,91.31,91.61,1336600 31-Oct-00,90.77,93.18,89.15,93.06,2084000 30-Oct-00,89.81,92.22,88.66,91.49,1477600 27-Oct-00,88.91,90.05,87.28,90.05,1070400 26-Oct-00,86.62,89.69,86.50,88.78,1132500 25-Oct-00,85.96,86.86,85.78,86.80,1441200 24-Oct-00,87.52,88.60,86.26,86.74,1139700 23-Oct-00,88.60,90.53,85.23,86.50,2847100 20-Oct-00,84.75,85.59,80.84,84.03,5121500 19-Oct-00,87.88,87.88,85.17,85.71,2387700 18-Oct-00,86.92,88.00,86.92,87.76,2106700 17-Oct-00,89.09,89.93,87.58,87.76,2000800 16-Oct-00,88.24,91.37,88.24,88.78,1428500 13-Oct-00,87.28,87.94,87.28,87.64,3113900 12-Oct-00,89.69,89.75,87.16,87.52,2443400 11-Oct-00,91.01,91.91,89.63,89.81,1183600 10-Oct-00,88.78,91.37,88.78,89.69,1164400 9-Oct-00,88.91,90.83,88.36,88.36,894800 6-Oct-00,90.29,91.25,88.78,88.78,1396000 5-Oct-00,91.49,91.49,89.63,89.81,1277600 4-Oct-00,89.87,92.46,89.87,91.97,2022900 3-Oct-00,88.12,91.43,88.12,90.53,1455800 2-Oct-00,88.54,89.27,87.46,88.30,1246700 29-Sep-00,88.00,89.93,87.64,87.76,1629100 28-Sep-00,86.86,89.99,86.74,88.24,1653000 27-Sep-00,86.62,87.88,85.90,86.62,2535800 26-Sep-00,86.68,87.64,85.17,86.56,2932900 25-Sep-00,84.75,86.74,84.51,86.68,2146900 22-Sep-00,84.27,86.20,83.07,84.99,2546200 21-Sep-00,81.50,84.57,81.38,83.25,2910100 20-Sep-00,80.66,81.56,77.53,78.73,2260000 19-Sep-00,81.08,81.56,80.00,80.78,1652700 18-Sep-00,81.26,81.50,78.97,80.12,2110100 15-Sep-00,83.07,83.07,81.02,81.98,2401000 14-Sep-00,83.07,83.25,81.02,81.86,1973800 13-Sep-00,85.35,86.62,83.01,83.31,1322000 12-Sep-00,85.17,86.38,84.75,84.81,1268700 11-Sep-00,87.16,87.22,85.11,85.65,1315400 8-Sep-00,86.92,88.00,85.71,86.62,1863400 7-Sep-00,89.57,89.81,88.24,88.24,1914900 6-Sep-00,90.11,92.40,90.05,90.65,1368900 5-Sep-00,89.03,89.45,88.18,88.84,1135800 1-Sep-00,90.47,91.07,89.09,89.09,1602200 31-Aug-00,89.75,92.04,89.57,89.58,1046600 30-Aug-00,91.13,91.61,89.81,89.93,892200 29-Aug-00,91.85,92.10,91.13,91.13,950300 28-Aug-00,92.46,93.84,91.61,91.61,804000 25-Aug-00,91.55,92.22,91.55,92.22,786400 24-Aug-00,92.16,92.34,91.01,91.31,828300 23-Aug-00,92.64,93.24,91.79,92.40,873600 22-Aug-00,90.82,92.86,90.70,92.20,749400 21-Aug-00,91.30,91.72,90.52,90.88,528600 18-Aug-00,91.42,91.42,90.70,91.06,756500 17-Aug-00,90.76,91.54,90.28,91.18,864100 16-Aug-00,90.94,90.94,89.99,90.52,935500 15-Aug-00,91.72,91.78,90.22,90.82,815400 14-Aug-00,92.14,92.14,89.81,91.60,1146100 11-Aug-00,90.88,93.28,90.88,92.62,1831900 10-Aug-00,88.97,91.42,88.97,90.82,1931000 9-Aug-00,88.31,89.45,87.71,88.55,1570300 8-Aug-00,87.05,88.25,86.34,87.47,1431200 7-Aug-00,86.16,87.05,86.16,86.99,796700 4-Aug-00,86.10,86.81,85.80,86.16,1016400 3-Aug-00,86.81,87.05,86.10,86.10,1046700 2-Aug-00,85.74,86.75,85.08,86.40,1001700 1-Aug-00,86.63,87.29,85.44,85.56,1355700 31-Jul-00,87.05,87.41,86.22,86.22,1120200 28-Jul-00,85.44,87.71,85.08,87.11,1197500 27-Jul-00,85.92,86.51,84.78,85.20,1034700 26-Jul-00,85.14,87.53,84.78,84.78,1980200 25-Jul-00,84.72,85.86,84.42,84.54,1006900 24-Jul-00,82.33,86.51,82.33,85.26,1294900 21-Jul-00,82.63,82.69,81.67,82.69,712900 20-Jul-00,83.04,83.16,82.33,82.81,1113300 19-Jul-00,85.20,85.26,82.57,82.81,1549400 18-Jul-00,83.40,84.78,83.34,84.24,751000 17-Jul-00,83.28,83.76,82.51,83.52,935700 14-Jul-00,85.50,85.50,82.93,84.12,1129500 13-Jul-00,86.99,86.99,85.68,85.74,831200 12-Jul-00,86.40,86.69,85.26,86.22,1561500 11-Jul-00,83.46,86.10,83.04,85.14,1596800 10-Jul-00,81.61,83.88,81.49,83.46,1306900 7-Jul-00,82.93,84.00,82.33,82.45,1324600 6-Jul-00,83.70,84.36,82.81,82.87,1277900 5-Jul-00,82.27,85.56,81.25,84.72,1692700 3-Jul-00,79.45,80.77,79.45,80.47,814700 30-Jun-00,81.67,82.33,78.96,79.45,1801800 29-Jun-00,80.89,83.10,80.59,81.91,1276400 28-Jun-00,82.98,83.16,81.79,82.40,1055200 27-Jun-00,82.81,84.12,82.51,82.93,1536400 26-Jun-00,80.77,82.27,80.71,81.85,1112400 23-Jun-00,81.25,81.25,80.47,80.83,789800 22-Jun-00,82.63,84.00,81.31,82.39,1399100 21-Jun-00,80.89,82.81,80.47,82.57,1636300 20-Jun-00,80.05,81.37,77.60,78.68,1399700 19-Jun-00,81.25,81.85,79.40,79.93,1211700 16-Jun-00,82.75,82.75,80.83,80.83,1921400 15-Jun-00,80.71,83.64,80.65,82.75,2085700 14-Jun-00,80.41,81.31,79.93,80.59,1374300 13-Jun-00,78.14,79.75,78.14,78.38,1075600 12-Jun-00,78.50,80.23,78.38,78.47,1010700 9-Jun-00,78.44,78.68,77.72,78.44,1073100 8-Jun-00,78.44,78.50,77.00,78.26,1241600 7-Jun-00,78.80,79.63,78.02,78.26,1588300 6-Jun-00,81.37,81.37,78.56,78.80,1569600 5-Jun-00,81.01,81.43,80.53,81.43,1352300 2-Jun-00,82.81,83.04,80.41,80.71,1665800 1-Jun-00,82.39,82.39,80.77,81.25,1017000 31-May-00,82.45,83.58,82.09,82.09,1068500 30-May-00,81.01,82.87,80.83,81.49,786600 26-May-00,81.55,82.69,80.41,80.41,892300 25-May-00,83.58,84.48,80.41,81.31,1256400 24-May-00,81.37,84.96,81.37,84.42,1620500 23-May-00,80.59,81.07,79.69,80.53,764200 22-May-00,81.13,81.73,79.81,80.59,1284300 19-May-00,82.51,82.93,80.17,80.89,1374700 18-May-00,84.42,84.84,83.28,83.34,799800 17-May-00,84.60,85.32,83.88,84.24,1096500 16-May-00,81.97,86.85,81.38,85.66,2025700 15-May-00,81.20,82.69,81.14,81.74,1317500 12-May-00,81.08,81.80,80.37,80.73,919200 11-May-00,82.09,82.63,81.38,81.74,1173700 10-May-00,82.03,82.27,80.67,81.74,999200 9-May-00,82.75,83.58,81.32,81.80,974600 8-May-00,83.46,83.46,81.32,83.04,880000 5-May-00,81.02,82.99,80.67,82.45,1188200 4-May-00,81.97,83.40,80.61,81.26,1383100 packet/data/equities/mrk0100644000076400007640000005600507525024672014260 0ustar iankiankDate,Open,High,Low,Close,Volume 2-Aug-02,47.35,49.34,47.23,47.86,6707700 1-Aug-02,49.36,49.36,47.66,47.95,6696100 31-Jul-02,48.30,49.60,47.26,49.60,7176400 30-Jul-02,47.75,49.10,47.50,48.51,7237400 29-Jul-02,47.48,48.57,46.93,48.46,9625400 26-Jul-02,44.22,46.00,43.69,46.00,8441300 25-Jul-02,42.20,45.04,41.86,44.46,11454200 24-Jul-02,39.10,43.01,38.56,42.60,13536100 23-Jul-02,39.66,40.50,38.50,39.05,11469300 22-Jul-02,41.30,42.45,39.00,40.01,12160200 19-Jul-02,42.01,42.66,41.45,41.50,11913800 18-Jul-02,43.63,44.26,42.00,42.00,8580700 17-Jul-02,44.60,45.75,43.51,44.50,9632700 16-Jul-02,44.75,45.70,43.75,44.01,8756300 15-Jul-02,45.00,47.20,42.87,45.70,12589900 12-Jul-02,44.30,45.89,43.30,45.55,11510500 11-Jul-02,42.78,44.91,42.10,44.28,18216600 10-Jul-02,45.50,45.50,43.35,43.57,18987700 9-Jul-02,47.11,47.40,45.26,45.75,14032100 8-Jul-02,46.98,48.30,46.60,47.81,18992100 5-Jul-02,47.50,48.90,47.50,48.86,3902000 3-Jul-02,46.65,47.28,46.57,47.28,10145700 2-Jul-02,48.95,49.00,46.55,46.92,8935000 1-Jul-02,50.89,51.09,48.50,48.75,6479900 28-Jun-02,50.30,51.45,49.86,50.64,7247600 27-Jun-02,50.30,51.00,49.49,50.88,6425100 26-Jun-02,48.00,50.75,47.60,50.33,8971000 25-Jun-02,48.77,50.15,48.67,49.05,8172600 24-Jun-02,49.05,50.00,47.60,49.50,13450800 21-Jun-02,50.25,51.20,49.75,49.98,15282200 20-Jun-02,52.05,52.57,52.00,52.20,4638100 19-Jun-02,52.52,53.50,52.31,52.54,5191300 18-Jun-02,53.27,53.59,52.89,52.96,4115000 17-Jun-02,52.51,53.87,52.11,53.37,5365700 14-Jun-02,52.00,52.69,50.95,52.51,6601000 13-Jun-02,51.80,53.10,51.17,52.03,6977100 12-Jun-02,50.78,52.10,50.78,51.99,7825500 11-Jun-02,53.40,54.00,51.62,51.88,9511300 10-Jun-02,52.67,54.90,52.26,54.30,5665900 7-Jun-02,52.25,53.15,52.01,52.68,9558100 6-Jun-02,54.25,54.26,52.40,53.20,8464800 5-Jun-02,54.95,54.99,54.06,54.95,4583700 4-Jun-02,54.87,54.89,53.89,54.30,5880100 3-Jun-02,56.68,56.82,54.70,54.87,5067500 31-May-02,56.49,56.98,56.17,56.73,6756500 30-May-02,56.04,56.76,55.74,56.03,4323900 29-May-02,55.68,56.83,55.59,56.76,6017100 28-May-02,56.14,56.26,55.59,55.68,4429000 24-May-02,57.08,57.53,55.91,56.13,3936700 23-May-02,56.91,57.18,56.14,57.13,5595500 22-May-02,57.33,57.88,56.65,57.15,4222700 21-May-02,57.84,58.17,57.15,57.43,4971600 20-May-02,57.66,58.47,57.24,57.83,4931000 17-May-02,56.24,57.88,56.19,57.76,6116100 16-May-02,56.54,56.55,55.64,56.24,5740300 15-May-02,56.72,57.07,56.04,56.54,5359500 14-May-02,56.62,57.42,56.52,57.13,5503600 13-May-02,55.63,56.43,55.52,56.28,4184300 10-May-02,55.42,56.61,55.03,55.25,5751800 9-May-02,55.54,56.02,55.40,55.40,4599800 8-May-02,54.90,56.61,54.45,56.27,5349900 7-May-02,55.56,55.71,54.67,55.19,6637300 6-May-02,55.24,55.94,55.15,55.51,6127900 3-May-02,55.49,55.53,54.65,55.14,4888800 2-May-02,54.95,55.44,54.35,55.21,7146900 1-May-02,53.70,55.14,53.66,54.95,6406100 30-Apr-02,54.15,54.34,53.41,53.99,7402700 29-Apr-02,54.12,54.77,53.85,54.32,6495700 26-Apr-02,54.75,54.75,53.43,54.12,4752200 25-Apr-02,54.49,55.34,54.24,54.54,7094200 24-Apr-02,54.95,55.33,54.25,54.49,6466400 23-Apr-02,56.24,56.59,54.91,55.13,7186300 22-Apr-02,56.59,56.62,55.89,56.16,5517000 19-Apr-02,56.77,56.77,56.45,56.58,7916900 18-Apr-02,55.64,56.39,55.44,56.21,9836800 17-Apr-02,55.05,55.07,54.55,54.70,7555700 16-Apr-02,54.60,54.92,54.20,54.67,7290900 15-Apr-02,54.15,54.62,53.73,54.18,6937100 12-Apr-02,52.25,53.85,51.67,53.65,10767400 11-Apr-02,52.66,53.16,50.67,51.82,13920300 10-Apr-02,53.41,53.45,52.56,52.80,10870100 9-Apr-02,53.70,54.55,53.21,53.25,11107900 8-Apr-02,54.73,55.14,53.65,53.81,9355700 5-Apr-02,55.73,55.76,54.66,54.90,7567400 4-Apr-02,55.79,55.89,54.90,55.44,13694400 3-Apr-02,57.30,57.37,56.59,56.92,6824700 2-Apr-02,57.23,57.38,56.44,57.07,7076300 1-Apr-02,57.26,57.43,56.89,57.23,7535500 28-Mar-02,57.04,57.33,56.88,57.21,6310500 27-Mar-02,56.98,57.13,56.62,57.04,5501900 26-Mar-02,57.23,57.63,56.78,57.03,5700900 25-Mar-02,57.51,58.19,57.14,57.14,6734400 22-Mar-02,57.33,58.50,57.33,57.83,5371800 21-Mar-02,57.72,57.81,56.93,57.68,6004300 20-Mar-02,58.05,58.57,57.35,57.71,9603100 19-Mar-02,58.90,58.90,57.88,58.05,8644000 18-Mar-02,58.88,59.32,58.14,58.41,12978300 15-Mar-02,60.51,60.61,59.16,59.37,26943800 14-Mar-02,63.44,63.89,62.92,63.03,3855000 13-Mar-02,62.84,64.09,62.76,63.96,6998400 12-Mar-02,62.12,63.14,61.61,63.08,3960900 11-Mar-02,62.23,62.67,61.64,62.34,3700600 8-Mar-02,62.77,63.08,61.80,62.10,4462200 7-Mar-02,62.27,62.97,61.29,62.77,4651000 6-Mar-02,61.50,62.61,61.45,62.27,4868300 5-Mar-02,62.00,62.21,61.07,61.07,5618700 4-Mar-02,61.99,62.51,61.45,62.25,5688100 1-Mar-02,60.62,62.22,60.57,62.22,4910200 28-Feb-02,59.92,61.00,59.92,60.59,4638000 27-Feb-02,60.38,61.73,59.63,60.15,7073600 26-Feb-02,60.10,60.75,59.53,59.92,5146500 25-Feb-02,60.40,60.66,59.66,60.11,5929600 22-Feb-02,59.87,61.18,59.80,60.76,5869800 21-Feb-02,60.52,61.35,60.25,60.28,7172400 20-Feb-02,58.55,60.74,58.35,60.52,7268900 19-Feb-02,58.42,59.03,58.19,58.54,4057200 15-Feb-02,58.97,59.24,58.56,59.09,7023000 14-Feb-02,59.32,59.43,58.44,58.97,6287900 13-Feb-02,59.57,59.96,59.03,59.85,5497400 12-Feb-02,58.61,59.82,58.50,59.50,5789900 11-Feb-02,58.45,58.86,57.94,58.73,4084300 8-Feb-02,57.36,59.27,57.01,58.44,5002600 7-Feb-02,57.82,58.38,57.36,57.63,4423100 6-Feb-02,58.29,58.59,57.70,57.91,4043900 5-Feb-02,57.30,58.90,57.22,58.69,4500400 4-Feb-02,58.72,58.72,57.42,57.74,4171400 1-Feb-02,58.31,58.88,58.22,58.72,4681700 31-Jan-02,57.85,58.57,57.56,58.47,6520300 30-Jan-02,57.28,58.78,57.03,58.13,9855500 29-Jan-02,57.55,58.14,56.40,56.83,11562900 28-Jan-02,56.60,56.61,56.03,56.31,4960600 25-Jan-02,56.49,56.61,56.12,56.27,6513400 24-Jan-02,57.31,57.48,56.62,56.93,7046900 23-Jan-02,58.75,59.16,57.55,57.55,7133500 22-Jan-02,57.74,58.77,57.74,58.58,5260000 18-Jan-02,57.90,58.19,56.83,57.30,5573200 17-Jan-02,57.47,58.19,57.38,57.90,4192700 16-Jan-02,58.14,58.57,57.48,57.53,4016600 15-Jan-02,58.78,59.13,57.35,57.94,8165100 14-Jan-02,58.39,59.15,58.14,58.14,5061200 11-Jan-02,58.88,59.13,57.83,58.27,5693900 10-Jan-02,57.70,58.28,57.57,58.26,5211700 9-Jan-02,58.02,58.93,57.90,58.11,6553000 8-Jan-02,57.40,58.02,57.36,58.02,7115000 7-Jan-02,57.74,57.94,57.33,57.40,5543300 4-Jan-02,57.85,58.18,57.25,58.18,6530900 3-Jan-02,59.04,59.04,57.70,58.32,7991400 2-Jan-02,58.44,59.13,57.40,59.04,7195100 31-Dec-01,58.83,58.96,58.05,58.09,5405600 28-Dec-01,58.93,59.20,58.68,58.80,3971000 27-Dec-01,58.31,59.06,58.14,59.06,5134200 26-Dec-01,59.31,59.67,58.84,59.23,4528400 24-Dec-01,58.98,59.42,58.93,59.31,2593600 21-Dec-01,59.48,59.51,58.78,58.91,9016700 20-Dec-01,58.62,59.45,57.98,59.03,6881700 19-Dec-01,57.81,59.28,57.70,58.62,10191700 18-Dec-01,57.29,58.17,56.57,57.80,9227600 17-Dec-01,57.88,58.19,56.12,56.48,10765200 14-Dec-01,57.45,57.69,57.08,57.39,7749400 13-Dec-01,57.85,59.13,56.81,57.24,13688100 12-Dec-01,60.02,60.02,56.80,57.82,32864100 11-Dec-01,66.64,66.74,59.09,59.97,20710800 10-Dec-01,65.85,67.08,65.40,66.18,7030900 7-Dec-01,65.35,66.19,65.31,66.19,5059500 6-Dec-01,65.71,66.19,65.26,65.35,5538200 5-Dec-01,66.47,66.47,64.71,65.44,6886400 4-Dec-01,67.33,67.39,65.85,66.47,4453300 3-Dec-01,66.00,67.33,65.70,67.33,5155500 30-Nov-01,65.85,66.96,65.85,66.59,5648700 29-Nov-01,64.97,65.74,64.72,65.70,4825200 28-Nov-01,65.57,65.82,64.13,64.23,4422700 27-Nov-01,65.90,66.72,64.87,65.45,5022400 26-Nov-01,64.72,66.84,64.63,65.90,6192800 23-Nov-01,64.46,65.00,63.89,64.80,2340200 21-Nov-01,63.04,64.50,62.95,64.46,4542700 20-Nov-01,62.90,63.49,62.80,63.04,5477600 19-Nov-01,63.39,63.53,62.66,63.48,6800400 16-Nov-01,64.08,64.27,62.95,63.79,5476800 15-Nov-01,63.86,64.43,63.43,63.55,5175600 14-Nov-01,63.77,64.40,63.21,63.78,4872300 13-Nov-01,63.33,63.94,62.66,63.47,5825200 12-Nov-01,63.00,63.69,62.41,63.28,4320300 9-Nov-01,64.08,64.65,63.35,63.50,3278600 8-Nov-01,63.74,64.66,63.47,64.10,4199700 7-Nov-01,64.32,65.01,63.35,63.63,3906900 6-Nov-01,63.49,64.49,63.01,64.32,4608400 5-Nov-01,64.41,65.07,64.04,64.26,4008600 2-Nov-01,62.90,64.13,62.90,63.92,4158900 1-Nov-01,62.72,63.79,62.33,63.10,5559000 31-Oct-01,63.62,63.85,62.71,62.72,4138100 30-Oct-01,63.91,64.03,62.88,63.64,4014100 29-Oct-01,64.38,64.94,64.03,64.11,3039800 26-Oct-01,65.31,65.32,64.48,64.67,4003700 25-Oct-01,65.26,66.14,64.16,65.35,4636800 24-Oct-01,65.07,66.64,65.03,65.85,3826800 23-Oct-01,67.03,67.03,65.37,65.80,3995700 22-Oct-01,64.27,66.51,64.26,66.11,5894400 19-Oct-01,65.11,65.16,63.64,64.26,6823200 18-Oct-01,66.49,66.79,64.94,65.16,7105100 17-Oct-01,67.63,68.46,67.23,67.87,5127000 16-Oct-01,68.80,69.39,67.52,68.12,4522300 15-Oct-01,67.62,68.80,67.62,68.75,4071300 12-Oct-01,67.08,68.09,66.71,67.97,4826200 11-Oct-01,67.28,67.42,66.38,67.01,5280700 10-Oct-01,66.57,68.01,66.22,67.32,4011800 9-Oct-01,67.13,67.30,65.99,66.77,3557300 8-Oct-01,66.79,67.82,66.62,67.42,3508600 5-Oct-01,65.95,67.23,65.61,67.09,4709200 4-Oct-01,66.57,66.82,65.21,65.95,5397500 3-Oct-01,67.28,67.28,65.14,66.50,5802100 2-Oct-01,67.15,67.30,65.97,67.27,4496700 1-Oct-01,65.70,67.15,65.51,67.15,7876800 28-Sep-01,66.64,66.72,64.04,65.46,7548000 27-Sep-01,62.88,65.79,62.79,65.07,6569800 26-Sep-01,61.37,62.60,61.37,62.26,7702300 25-Sep-01,61.92,62.90,59.81,61.38,11876300 24-Sep-01,64.57,65.51,62.28,62.89,9768600 21-Sep-01,62.90,66.04,62.70,64.57,13284200 20-Sep-01,65.85,66.46,65.46,65.70,8044600 19-Sep-01,67.77,68.05,65.41,66.70,8629400 18-Sep-01,66.00,67.90,65.68,67.14,7291200 17-Sep-01,66.79,66.93,65.02,66.00,9095500 10-Sep-01,62.90,65.36,62.42,64.97,5481000 7-Sep-01,64.23,64.23,63.05,63.20,4841800 6-Sep-01,66.05,66.42,64.39,64.62,5013700 5-Sep-01,64.20,66.74,63.59,66.54,6475000 4-Sep-01,64.08,65.34,63.93,64.18,6248100 31-Aug-01,64.52,65.64,63.65,63.98,3913000 30-Aug-01,65.51,66.53,64.52,64.86,4199300 29-Aug-01,66.39,66.87,65.56,65.64,3191800 28-Aug-01,66.73,67.67,66.40,66.50,3300500 27-Aug-01,67.27,67.87,66.88,67.17,3129000 24-Aug-01,66.49,67.71,66.19,67.48,5270200 23-Aug-01,68.54,68.73,66.53,66.98,9349200 22-Aug-01,68.39,69.65,67.61,69.63,6562900 21-Aug-01,68.72,69.91,68.20,69.17,4364900 20-Aug-01,67.81,69.22,67.81,69.01,4615900 17-Aug-01,68.44,68.68,67.08,67.61,3634000 16-Aug-01,67.46,68.69,66.88,68.43,4797200 15-Aug-01,68.44,69.19,67.14,67.37,4782400 14-Aug-01,68.25,68.46,67.85,68.44,3544200 13-Aug-01,67.93,68.39,67.76,68.10,3561900 10-Aug-01,66.27,67.89,66.22,67.49,4286700 9-Aug-01,66.05,66.46,65.62,66.31,4936100 8-Aug-01,66.26,67.27,66.19,66.34,4171700 7-Aug-01,66.05,66.98,65.86,66.96,2903800 6-Aug-01,66.59,67.00,65.74,65.92,3235800 3-Aug-01,65.75,67.10,65.64,66.59,3390600 2-Aug-01,66.52,66.89,66.16,66.28,3400300 1-Aug-01,66.01,66.97,65.77,66.48,4656400 31-Jul-01,64.97,67.46,64.90,66.47,6632600 30-Jul-01,63.69,65.16,63.36,64.77,4130600 27-Jul-01,63.94,64.37,63.36,63.69,3899100 26-Jul-01,63.55,63.65,62.85,63.32,5494200 25-Jul-01,64.02,64.35,63.36,63.54,5272200 24-Jul-01,64.24,64.38,63.16,63.48,5038700 23-Jul-01,64.97,65.51,64.24,64.24,3993600 20-Jul-01,65.49,66.06,64.77,64.95,6522100 19-Jul-01,66.05,66.28,65.03,65.80,8691100 18-Jul-01,63.54,66.05,63.45,66.05,10954000 17-Jul-01,61.55,63.45,61.55,63.04,7713100 16-Jul-01,60.67,61.59,60.13,61.58,6697700 13-Jul-01,59.89,61.06,59.74,60.13,9289400 12-Jul-01,60.23,60.23,59.01,59.64,11270900 11-Jul-01,61.72,62.04,60.17,60.97,8745100 10-Jul-01,63.04,63.27,62.22,62.30,5490500 9-Jul-01,62.57,63.36,62.35,63.16,6742500 6-Jul-01,62.71,63.00,62.02,62.03,4055700 5-Jul-01,63.26,63.83,62.38,62.71,5762800 3-Jul-01,63.55,63.55,63.09,63.26,4054100 2-Jul-01,62.62,63.28,62.61,62.92,7144500 29-Jun-01,63.94,64.19,62.23,62.49,9993400 28-Jun-01,64.14,64.53,63.53,63.55,8371800 27-Jun-01,64.92,65.21,64.18,64.18,7618000 26-Jun-01,65.41,66.00,64.74,64.75,6711100 25-Jun-01,66.73,67.10,65.31,66.00,6802800 22-Jun-01,68.51,68.51,66.18,66.29,18831000 21-Jun-01,73.48,73.57,72.35,72.81,4115400 20-Jun-01,72.94,74.16,72.71,73.00,4442600 19-Jun-01,72.25,72.94,71.86,72.94,3738200 18-Jun-01,71.55,73.17,71.47,72.60,3745000 15-Jun-01,72.26,72.88,71.57,72.11,8055900 14-Jun-01,71.37,72.37,71.30,72.25,5095100 13-Jun-01,70.35,72.06,69.93,71.50,4806700 12-Jun-01,70.21,71.36,69.52,70.99,4832800 11-Jun-01,71.86,72.05,70.30,70.64,4324000 8-Jun-01,72.94,73.32,72.23,72.57,2120100 7-Jun-01,72.14,73.20,72.13,73.14,4012200 6-Jun-01,73.57,73.62,72.12,72.30,3011800 5-Jun-01,72.82,73.81,72.04,73.65,4177200 4-Jun-01,72.25,72.79,71.77,72.67,2500700 1-Jun-01,70.40,72.85,70.40,72.55,4834400 31-May-01,71.62,71.81,70.49,71.36,3788000 30-May-01,72.40,72.40,71.10,71.32,4971500 29-May-01,71.48,72.64,71.29,72.40,4501400 25-May-01,70.70,71.36,70.15,70.65,3575600 24-May-01,71.63,71.63,69.84,70.56,8571600 23-May-01,73.18,73.44,70.92,72.02,7309300 22-May-01,74.55,74.56,73.00,73.09,6239200 21-May-01,75.57,75.96,74.38,75.33,4978600 18-May-01,76.87,77.04,74.32,75.33,4290300 17-May-01,75.52,77.00,75.47,76.49,5287400 16-May-01,74.30,76.78,74.27,76.01,6170200 15-May-01,73.91,74.11,72.53,73.87,3841200 14-May-01,73.90,74.63,73.04,74.63,2913900 11-May-01,73.18,73.96,73.04,73.90,4981700 10-May-01,75.25,75.67,74.07,74.47,2882700 9-May-01,74.84,75.44,74.74,75.25,4001200 8-May-01,74.06,74.49,73.36,74.39,3072100 7-May-01,74.25,74.94,73.33,74.84,2829100 4-May-01,73.04,74.81,72.81,74.32,3188400 3-May-01,73.04,73.81,72.45,73.25,3755400 2-May-01,73.53,73.57,72.26,72.90,4357000 1-May-01,73.14,73.90,73.04,73.57,4646200 30-Apr-01,74.39,74.60,73.72,73.93,4446800 27-Apr-01,72.99,73.91,72.50,73.62,3980900 26-Apr-01,72.61,73.53,72.13,72.84,4575000 25-Apr-01,71.49,72.97,71.35,72.85,4465800 24-Apr-01,72.26,72.99,71.09,71.49,4865400 23-Apr-01,72.45,72.89,72.01,72.26,5852000 20-Apr-01,73.48,73.87,70.07,71.64,16101300 19-Apr-01,76.62,76.85,75.33,76.17,5396000 18-Apr-01,77.75,78.26,76.10,77.17,7827400 17-Apr-01,76.40,78.68,76.39,78.68,4757100 16-Apr-01,77.37,78.26,76.40,76.98,4368800 12-Apr-01,74.35,77.56,74.35,77.37,4808800 11-Apr-01,75.32,75.45,74.58,75.08,4830300 10-Apr-01,76.40,76.58,75.42,76.29,5908000 9-Apr-01,74.98,75.91,74.55,75.91,4423000 6-Apr-01,72.99,74.49,72.36,74.37,4687900 5-Apr-01,72.48,73.86,72.03,73.75,5105500 4-Apr-01,70.99,73.05,70.12,72.48,5091100 3-Apr-01,72.27,73.72,70.46,70.86,5946800 2-Apr-01,73.38,73.95,71.59,72.26,5063200 30-Mar-01,72.21,74.25,72.00,73.87,4633300 29-Mar-01,72.31,74.60,71.17,72.21,5395900 28-Mar-01,71.53,73.34,71.10,73.14,4856600 27-Mar-01,70.56,72.02,69.97,71.64,5639900 26-Mar-01,68.12,69.97,67.69,69.56,5351100 23-Mar-01,67.00,68.76,65.89,67.13,8551900 22-Mar-01,65.69,68.32,64.23,67.84,7424200 21-Mar-01,67.69,67.98,65.71,66.14,5762500 20-Mar-01,70.55,70.60,68.17,68.37,5297000 19-Mar-01,69.49,70.95,69.28,70.14,4700100 16-Mar-01,71.25,71.53,68.80,69.53,9553500 15-Mar-01,70.00,72.07,69.57,72.07,7524200 14-Mar-01,70.07,70.77,69.21,70.00,5597900 13-Mar-01,71.14,71.68,69.29,70.98,8717800 12-Mar-01,73.48,73.70,71.58,72.16,5024600 9-Mar-01,73.67,74.22,73.08,73.66,5024700 8-Mar-01,73.53,73.53,71.63,72.79,7748000 7-Mar-01,74.07,74.07,71.04,72.41,8060500 6-Mar-01,76.45,76.46,74.39,75.04,5382600 5-Mar-01,77.03,77.42,75.77,77.06,3372100 2-Mar-01,76.98,77.90,76.98,77.66,3483000 1-Mar-01,78.00,78.51,77.18,77.27,4571100 28-Feb-01,77.43,78.89,77.27,77.71,6320100 27-Feb-01,75.58,77.50,75.58,77.43,4129500 26-Feb-01,74.70,77.03,74.32,76.86,4205000 23-Feb-01,74.66,75.51,74.32,74.68,5132000 22-Feb-01,76.26,76.46,74.22,75.29,5187100 21-Feb-01,76.24,77.13,76.04,76.26,4273700 20-Feb-01,74.91,75.98,74.66,75.48,4336100 16-Feb-01,75.09,75.77,74.49,74.89,5762800 15-Feb-01,75.58,75.82,74.03,75.67,7836200 14-Feb-01,77.80,78.22,77.15,77.16,3760500 13-Feb-01,79.69,80.16,77.06,78.24,5801600 12-Feb-01,80.39,80.69,79.50,80.40,3809300 9-Feb-01,80.32,80.39,79.51,80.15,3921000 8-Feb-01,78.34,81.39,77.28,80.39,10004900 7-Feb-01,81.75,82.14,79.06,79.31,7800800 6-Feb-01,81.86,82.24,81.39,81.74,3598400 5-Feb-01,81.36,82.89,81.36,81.85,2997500 2-Feb-01,81.87,82.67,80.95,81.36,4246000 1-Feb-01,80.18,81.85,79.63,81.85,5037500 31-Jan-01,78.29,80.42,77.32,79.63,5963700 30-Jan-01,78.38,78.97,77.52,78.48,3670400 29-Jan-01,79.74,80.86,77.32,77.81,4093500 26-Jan-01,80.18,81.39,79.39,79.69,5292300 25-Jan-01,77.09,79.45,76.97,79.33,7299200 24-Jan-01,77.27,77.51,76.18,76.48,8412000 23-Jan-01,78.36,78.36,76.12,77.09,11432900 22-Jan-01,81.03,81.03,79.57,79.75,4398300 19-Jan-01,79.57,81.09,79.57,79.88,5380400 18-Jan-01,78.97,81.39,78.85,80.30,5191200 17-Jan-01,80.42,80.72,78.48,78.73,6459000 16-Jan-01,78.85,81.81,78.00,80.72,5500900 12-Jan-01,79.33,80.72,78.48,78.91,5038600 11-Jan-01,80.91,81.03,78.36,79.09,6659900 10-Jan-01,81.45,82.18,79.51,80.60,6172900 9-Jan-01,81.33,82.36,80.48,81.39,6097100 8-Jan-01,81.39,81.87,80.12,80.91,4907600 5-Jan-01,82.36,83.15,80.54,80.72,9350500 4-Jan-01,85.69,85.81,81.15,82.36,18325900 3-Jan-01,89.93,90.11,85.39,86.36,9836000 2-Jan-01,90.47,92.29,89.63,90.11,6042900 29-Dec-00,92.05,92.96,90.53,90.72,3737100 28-Dec-00,90.72,91.81,90.53,91.81,3131600 27-Dec-00,89.87,91.75,89.75,89.81,5028300 26-Dec-00,88.05,90.35,87.63,89.81,3636300 22-Dec-00,89.99,89.99,87.45,87.69,4879400 21-Dec-00,90.11,90.72,88.17,89.63,7347300 20-Dec-00,90.11,92.17,89.56,90.47,9651900 19-Dec-00,85.39,89.44,85.39,88.66,5052700 18-Dec-00,87.20,87.63,86.05,86.54,4996300 15-Dec-00,88.17,89.14,87.08,87.57,10666400 14-Dec-00,88.47,88.90,87.87,88.17,3592100 13-Dec-00,88.05,89.38,87.99,89.14,7350100 12-Dec-00,87.87,88.72,87.69,88.54,6060400 11-Dec-00,87.20,88.54,87.02,87.81,4883300 8-Dec-00,87.20,88.41,85.93,86.78,6691800 7-Dec-00,87.69,88.60,86.60,88.23,4312600 6-Dec-00,86.36,87.69,85.75,86.78,5764200 5-Dec-00,89.29,89.29,85.37,86.87,7899400 4-Dec-00,85.43,89.71,85.43,88.74,6137100 1-Dec-00,88.32,88.86,86.03,87.48,7578800 30-Nov-00,92.42,93.33,89.05,89.47,9125500 29-Nov-00,89.77,91.88,89.77,91.58,8328000 28-Nov-00,88.74,89.71,88.14,89.41,5120300 27-Nov-00,86.69,89.11,85.97,88.44,5364400 24-Nov-00,86.75,88.20,86.03,86.33,2006800 22-Nov-00,87.48,88.62,85.67,87.54,6729600 21-Nov-00,87.78,88.99,87.60,88.80,5417200 20-Nov-00,85.00,87.96,84.94,87.24,6155800 17-Nov-00,86.51,87.78,84.34,85.43,7215200 16-Nov-00,88.38,89.17,86.45,87.05,4490200 15-Nov-00,87.60,88.99,87.24,88.44,6268700 14-Nov-00,85.61,88.56,85.24,87.90,7130400 13-Nov-00,87.12,87.78,85.18,86.27,9134800 10-Nov-00,86.81,89.53,86.75,88.32,6673100 9-Nov-00,87.36,87.78,84.94,87.30,8412600 8-Nov-00,85.91,88.50,85.91,87.66,12553800 7-Nov-00,86.39,87.12,83.80,83.86,6510500 6-Nov-00,83.74,87.36,83.74,86.87,7496000 3-Nov-00,84.94,85.31,83.31,84.82,7044500 2-Nov-00,86.09,86.21,84.82,86.03,6408500 1-Nov-00,86.87,87.78,85.73,86.63,9153000 31-Oct-00,85.61,86.87,84.40,86.81,8822300 30-Oct-00,84.58,86.87,84.34,85.61,8892300 27-Oct-00,82.95,84.94,82.65,84.94,8453700 26-Oct-00,83.43,84.46,82.77,83.68,6974000 25-Oct-00,82.05,84.34,81.69,84.28,8382500 24-Oct-00,81.14,82.53,81.08,82.47,6955900 23-Oct-00,80.36,82.53,80.00,81.81,11675400 20-Oct-00,76.80,79.15,75.83,79.03,11682300 19-Oct-00,74.51,75.17,73.60,74.87,5114600 18-Oct-00,75.11,75.65,73.48,75.47,5852600 17-Oct-00,73.30,75.47,73.30,75.47,5348300 16-Oct-00,72.88,74.39,72.70,74.20,4286100 13-Oct-00,74.45,74.45,72.21,73.54,5299300 12-Oct-00,73.84,74.99,72.94,74.51,6409700 11-Oct-00,74.33,75.11,73.42,73.84,5655100 10-Oct-00,72.88,74.99,72.88,74.20,6121300 9-Oct-00,73.60,74.02,71.85,72.70,4131200 6-Oct-00,72.39,73.60,71.07,73.42,4797500 5-Oct-00,71.55,72.76,71.55,72.70,4273600 4-Oct-00,72.27,72.39,70.95,71.01,5067900 3-Oct-00,71.85,71.91,70.34,71.43,4873600 2-Oct-00,71.73,72.03,71.01,71.43,4408700 29-Sep-00,71.43,72.27,71.37,71.85,5181300 28-Sep-00,70.10,71.31,70.10,70.58,5549300 27-Sep-00,68.41,70.46,67.75,70.34,4091000 26-Sep-00,68.90,69.38,67.81,67.81,4353900 25-Sep-00,70.10,70.65,69.56,69.74,3997700 22-Sep-00,69.14,70.83,69.02,70.65,6371400 21-Sep-00,65.64,67.87,65.52,67.69,4322300 20-Sep-00,66.42,66.48,64.55,65.53,3723100 19-Sep-00,65.10,66.48,64.67,65.94,3270300 18-Sep-00,64.85,65.40,64.67,64.79,2419500 15-Sep-00,64.91,65.76,64.43,64.85,5327000 14-Sep-00,65.70,65.88,64.31,65.22,3125900 13-Sep-00,65.76,66.60,65.28,65.95,3446400 12-Sep-00,65.28,65.82,64.79,65.35,2940300 11-Sep-00,65.16,65.94,64.97,65.58,2633100 8-Sep-00,64.91,66.12,64.07,65.19,4810400 7-Sep-00,62.98,65.28,62.74,64.91,5074700 6-Sep-00,65.28,65.70,63.04,63.71,4766500 5-Sep-00,64.67,66.06,63.71,64.81,5885200 1-Sep-00,66.66,67.69,66.66,66.78,3626500 31-Aug-00,68.53,69.62,67.45,67.46,5251100 30-Aug-00,68.11,68.96,67.57,68.65,3018700 29-Aug-00,69.65,69.65,67.91,68.39,2973600 28-Aug-00,70.01,70.79,69.53,69.62,2862000 25-Aug-00,69.65,70.25,69.29,70.07,2468600 24-Aug-00,69.29,70.25,68.51,69.65,2691500 23-Aug-00,69.65,70.43,68.99,69.41,3119100 22-Aug-00,69.17,70.13,68.93,69.65,2758100 21-Aug-00,68.57,70.01,68.57,69.05,2341000 18-Aug-00,70.31,70.43,68.69,69.17,4057600 17-Aug-00,70.61,71.45,70.25,71.03,2645700 16-Aug-00,70.43,71.39,70.37,70.73,2228400 15-Aug-00,70.37,70.73,69.65,70.37,2990400 14-Aug-00,69.53,70.25,69.41,69.98,2343800 11-Aug-00,68.51,70.25,68.51,69.56,2850500 10-Aug-00,68.15,69.23,67.67,68.66,4293200 9-Aug-00,68.57,70.49,67.25,67.79,6206800 8-Aug-00,69.83,70.55,68.87,69.51,4049400 7-Aug-00,70.85,70.85,69.89,70.16,3865100 4-Aug-00,71.21,71.45,70.19,70.91,3145200 3-Aug-00,72.17,72.47,71.57,72.26,4325300 2-Aug-00,71.33,72.29,70.73,72.05,4514400 1-Aug-00,68.33,71.33,68.33,71.18,4608200 31-Jul-00,69.23,69.47,67.55,68.84,3736900 28-Jul-00,70.13,70.25,69.59,69.92,4158900 27-Jul-00,67.97,69.89,67.25,69.50,4029000 26-Jul-00,68.57,68.87,67.01,67.25,5834000 25-Jul-00,66.71,69.05,66.17,68.12,10830900 24-Jul-00,64.12,67.37,63.88,66.83,13724200 21-Jul-00,61.66,62.14,60.52,61.24,7748900 20-Jul-00,62.50,62.56,61.36,61.54,5513400 19-Jul-00,63.58,64.12,62.47,62.68,6582000 18-Jul-00,64.60,64.96,63.46,63.76,6626900 17-Jul-00,64.36,65.80,64.12,64.72,10377900 14-Jul-00,66.35,66.77,63.88,64.60,8261700 13-Jul-00,70.43,70.43,66.29,66.41,8088900 12-Jul-00,71.33,71.45,69.47,70.50,3692500 11-Jul-00,71.93,72.89,70.61,71.75,4470900 10-Jul-00,71.33,71.93,70.97,71.93,3827600 7-Jul-00,72.41,72.53,71.03,71.45,3898600 6-Jul-00,73.49,73.61,71.99,72.41,4545700 5-Jul-00,73.85,74.33,73.31,74.15,4719900 3-Jul-00,73.07,73.67,72.41,73.46,2938400 30-Jun-00,71.21,73.72,70.37,73.61,7208800 29-Jun-00,71.87,72.29,71.09,71.19,5105100 28-Jun-00,71.03,71.45,70.67,71.09,3165400 27-Jun-00,71.69,71.93,70.55,71.33,5985400 26-Jun-00,70.37,71.33,70.07,71.33,5238800 23-Jun-00,69.53,69.77,68.69,69.77,4486300 22-Jun-00,68.81,69.47,68.21,68.45,3637800 21-Jun-00,67.97,69.59,67.55,69.59,3946900 20-Jun-00,69.23,69.23,67.55,68.09,3474700 19-Jun-00,68.69,69.89,68.09,69.23,3294600 16-Jun-00,69.71,70.43,68.21,68.21,10571300 15-Jun-00,70.13,70.85,69.65,69.95,3750800 14-Jun-00,70.79,71.39,69.17,70.07,5639500 13-Jun-00,67.85,70.97,67.73,70.55,4218500 12-Jun-00,67.37,68.93,67.07,67.19,2606800 9-Jun-00,66.59,67.49,66.17,67.13,2714100 8-Jun-00,67.73,67.79,66.41,66.59,2422000 7-Jun-00,67.19,68.69,67.13,67.73,2676800 6-Jun-00,66.65,67.43,66.04,66.86,3271900 5-Jun-00,66.29,67.67,65.98,66.47,4437200 2-Jun-00,69.47,69.47,66.11,66.23,6217900 1-Jun-00,71.15,72.23,69.41,69.59,3847700 31-May-00,71.27,71.99,70.91,71.69,2828500 30-May-00,70.93,71.89,70.51,71.77,4346300 26-May-00,71.41,72.13,70.81,71.35,3418700 25-May-00,70.99,71.83,70.22,71.47,4494300 24-May-00,70.81,71.77,70.16,71.41,7152900 23-May-00,70.33,70.63,69.50,70.63,4847300 22-May-00,68.90,70.45,68.60,69.20,6281600 19-May-00,66.21,69.80,66.21,69.32,7055400 18-May-00,66.75,67.64,66.75,66.93,2850500 17-May-00,67.46,68.30,66.63,66.81,3357300 16-May-00,66.63,68.42,66.03,67.94,5115600 15-May-00,65.31,66.93,64.59,66.63,3196300 12-May-00,65.37,65.97,64.41,65.19,3040900 11-May-00,65.31,65.73,64.17,65.31,4024700 10-May-00,65.73,65.79,63.88,65.07,4246100 9-May-00,66.99,67.05,65.73,65.97,3683400 8-May-00,66.93,67.46,66.03,66.87,4279300 5-May-00,64.00,66.93,63.88,66.27,3657300 4-May-00,65.61,65.67,64.11,64.29,3406500 packet/data/equities/test0100644000076400007640000000131707525024672014442 0ustar iankiankDate,Open,High,Low,Close,Volume 2-Aug-02,26.31,26.39,25.30,25.50,3302800 1-Aug-02,26.95,27.20,25.95,26.29,4413400 31-Jul-02,26.00,27.37,25.11,27.05,6023600 30-Jul-02,26.75,27.04,25.72,25.98,4218500 29-Jul-02,25.80,27.44,25.74,27.19,4925200 26-Jul-02,24.51,25.52,24.38,25.45,4601600 25-Jul-02,24.56,25.68,23.76,24.06,6471900 24-Jul-02,22.77,24.97,22.62,24.80,8155200 23-Jul-02,24.96,25.70,23.56,23.66,6252900 22-Jul-02,26.05,26.25,24.36,24.71,8373400 19-Jul-02,28.07,28.07,26.25,26.84,5986600 18-Jul-02,28.73,29.31,28.06,28.07,2946100 17-Jul-02,29.43,29.77,28.43,28.69,2974700 16-Jul-02,28.60,29.42,28.04,28.59,4713000 15-Jul-02,29.53,29.55,27.62,29.03,4861000 12-Jul-02,30.37,30.82,29.44,29.95,2992700 packet/data/equities/wmt0100644000076400007640000005603107525024672014275 0ustar iankiankDate,Open,High,Low,Close,Volume 2-Aug-02,47.20,47.40,45.19,46.10,9885400 1-Aug-02,49.00,49.17,46.82,47.40,12829500 31-Jul-02,49.30,49.30,47.35,49.18,12722700 30-Jul-02,49.02,49.70,48.50,49.12,10102200 29-Jul-02,48.19,49.65,47.60,49.53,10985500 26-Jul-02,47.00,48.25,46.00,48.18,9082900 25-Jul-02,47.70,48.07,45.00,47.00,14451900 24-Jul-02,44.30,48.12,43.72,47.94,18988100 23-Jul-02,45.00,46.90,44.75,45.10,15287400 22-Jul-02,46.25,47.21,43.99,44.60,16834200 19-Jul-02,47.20,47.70,45.61,46.50,13179300 18-Jul-02,48.40,49.54,47.40,47.41,12019700 17-Jul-02,51.00,51.49,47.50,48.25,18751100 16-Jul-02,52.25,52.57,49.88,49.88,14497700 15-Jul-02,52.40,53.48,50.10,53.44,12703700 12-Jul-02,53.93,54.10,52.59,52.85,8919300 11-Jul-02,53.77,54.99,53.00,54.18,12871600 10-Jul-02,54.75,55.60,53.55,53.76,8964200 9-Jul-02,55.66,56.07,54.48,54.65,8035500 8-Jul-02,56.15,56.70,55.18,55.60,7639800 5-Jul-02,55.45,56.01,55.23,56.00,3217700 3-Jul-02,53.30,55.10,53.30,55.04,7243200 2-Jul-02,54.41,54.93,53.30,53.42,10192500 1-Jul-02,55.30,55.83,54.40,54.40,10183200 28-Jun-02,57.00,57.78,55.01,55.01,15398900 26-Jun-02,54.30,56.50,53.75,55.62,10912100 25-Jun-02,56.00,57.22,55.02,55.10,8646500 24-Jun-02,55.05,56.35,54.23,55.75,10988900 21-Jun-02,55.50,56.50,54.90,54.98,15090200 20-Jun-02,57.35,57.90,56.20,56.50,7163900 19-Jun-02,58.00,58.75,56.98,57.41,7595400 18-Jun-02,58.24,58.80,57.84,58.47,6997100 17-Jun-02,57.03,58.37,56.63,58.24,8631800 14-Jun-02,56.38,56.96,55.18,56.88,10511400 13-Jun-02,57.68,57.69,56.20,56.43,9523000 12-Jun-02,56.48,58.23,56.17,58.23,10561800 11-Jun-02,56.78,57.56,56.31,56.38,11423700 10-Jun-02,55.03,56.51,54.99,56.33,8559100 7-Jun-02,53.78,54.65,53.69,54.36,7928900 6-Jun-02,54.90,54.91,53.93,54.03,7554600 5-Jun-02,54.88,55.70,54.45,54.89,10080900 4-Jun-02,52.93,53.93,51.93,53.93,13781900 3-Jun-02,54.11,54.60,52.88,53.08,8180000 31-May-02,54.83,55.51,53.93,54.03,11707200 30-May-02,54.03,54.78,53.68,53.92,8196300 29-May-02,54.83,55.59,54.46,54.46,5427400 28-May-02,55.33,55.56,53.86,54.72,6920300 24-May-02,56.49,56.87,55.44,55.45,5011100 23-May-02,56.43,56.69,55.72,56.24,5915900 22-May-02,56.63,56.73,55.63,56.73,6026900 21-May-02,57.83,58.05,56.53,56.53,6376800 20-May-02,58.67,58.74,57.63,57.73,5031900 17-May-02,58.28,59.22,57.89,58.26,7547100 16-May-02,57.58,58.61,57.37,58.28,8016000 15-May-02,57.57,58.12,56.57,56.70,10467000 14-May-02,57.43,58.18,56.98,57.32,12505700 13-May-02,53.77,55.21,53.77,54.97,6421700 10-May-02,55.17,55.19,53.54,53.59,7436000 9-May-02,55.58,55.68,53.65,54.92,11840200 8-May-02,56.18,56.42,55.61,56.32,8317600 7-May-02,54.55,55.43,53.93,54.94,8965100 6-May-02,55.54,56.06,53.88,53.92,7980500 3-May-02,56.38,56.41,55.01,55.18,7821600 2-May-02,56.68,57.18,56.11,56.58,7659000 1-May-02,55.53,56.73,54.75,56.73,8589100 30-Apr-02,56.03,56.52,55.39,55.79,10411000 29-Apr-02,55.83,57.33,55.73,56.13,10053400 26-Apr-02,57.18,57.23,55.71,55.73,10036100 25-Apr-02,56.73,57.04,56.16,56.93,7330800 24-Apr-02,57.83,58.56,57.25,57.38,6527500 23-Apr-02,57.78,58.37,57.55,57.98,6917900 22-Apr-02,58.85,59.02,56.93,57.48,6438900 19-Apr-02,58.72,59.02,58.07,58.85,5848200 18-Apr-02,58.47,59.34,56.67,58.08,11727300 17-Apr-02,60.47,60.47,58.57,59.21,9141200 16-Apr-02,60.12,60.63,59.52,59.92,7013800 15-Apr-02,60.97,61.19,59.44,59.85,5770000 12-Apr-02,60.62,61.77,60.21,61.15,6488900 11-Apr-02,60.57,61.73,59.93,60.09,8567000 10-Apr-02,60.17,60.62,59.79,60.49,7116000 9-Apr-02,60.02,60.37,59.82,60.02,6229800 8-Apr-02,58.92,59.87,58.44,59.70,6139300 5-Apr-02,59.15,59.67,58.70,59.06,5321600 4-Apr-02,58.72,59.52,58.64,59.20,6853300 3-Apr-02,59.32,59.72,57.68,58.52,8932800 2-Apr-02,59.42,59.43,58.67,58.85,7788800 1-Apr-02,60.27,60.28,58.54,59.48,13248900 28-Mar-02,61.93,62.09,61.20,61.22,5830000 27-Mar-02,61.97,62.22,61.54,61.92,6930800 26-Mar-02,61.27,62.31,61.27,62.09,6183500 25-Mar-02,61.77,62.10,61.20,61.20,5917900 22-Mar-02,62.12,62.16,61.49,61.97,5499200 21-Mar-02,62.87,63.11,61.87,62.12,5802400 20-Mar-02,62.87,63.36,62.85,63.10,7102100 19-Mar-02,63.54,63.68,62.88,63.30,5544900 18-Mar-02,63.76,63.78,62.55,63.39,6358800 15-Mar-02,62.53,63.59,62.30,63.59,13302500 14-Mar-02,61.80,62.44,61.76,62.12,5020200 13-Mar-02,61.60,61.94,61.15,61.84,6178300 12-Mar-02,61.75,62.25,61.74,62.08,6980900 11-Mar-02,62.66,62.66,61.88,62.38,6698200 8-Mar-02,62.03,62.75,61.85,62.37,10461200 7-Mar-02,61.35,61.80,60.84,61.55,9292400 6-Mar-02,60.82,61.33,60.15,60.75,10196200 5-Mar-02,62.17,62.44,60.40,60.61,12356700 4-Mar-02,62.80,62.92,62.03,62.83,8167600 1-Mar-02,62.05,62.66,61.91,62.66,7519600 28-Feb-02,62.55,62.73,61.39,61.86,11995700 27-Feb-02,62.45,62.70,61.60,62.10,12977300 26-Feb-02,60.65,62.13,60.30,61.95,11650400 25-Feb-02,60.05,60.60,59.91,60.50,8342500 22-Feb-02,59.50,59.80,58.46,59.80,7603200 21-Feb-02,60.00,60.72,59.24,59.40,7339600 20-Feb-02,59.22,60.05,58.66,59.87,8194100 19-Feb-02,59.25,60.03,59.05,59.14,9060600 15-Feb-02,60.34,60.44,59.75,59.88,7257600 14-Feb-02,60.20,60.44,59.78,60.34,5986000 13-Feb-02,60.15,60.57,59.73,59.97,6399600 12-Feb-02,59.70,60.20,59.65,59.95,5323600 11-Feb-02,59.34,60.15,59.23,60.10,8501000 8-Feb-02,58.25,59.00,57.96,59.00,6378800 7-Feb-02,59.00,59.60,58.20,58.25,8419300 6-Feb-02,58.56,59.10,58.27,58.74,6421200 5-Feb-02,58.89,59.35,58.31,58.66,6626800 4-Feb-02,59.43,59.75,58.51,58.76,6514600 1-Feb-02,59.55,59.75,58.61,59.11,6697000 31-Jan-02,59.45,59.83,58.95,59.83,6861200 30-Jan-02,57.66,59.80,57.61,59.60,10006100 29-Jan-02,58.93,59.33,57.77,57.77,7373900 28-Jan-02,58.56,59.03,58.18,58.49,5142700 25-Jan-02,59.21,59.33,57.92,58.26,7322100 24-Jan-02,59.71,59.80,59.15,59.52,7984100 23-Jan-02,58.26,59.80,58.08,59.71,10682200 22-Jan-02,56.98,58.56,56.97,57.87,9990000 18-Jan-02,56.41,56.75,55.83,56.21,7007400 17-Jan-02,55.71,57.08,55.56,56.62,7796500 16-Jan-02,56.73,56.73,55.36,55.85,5506400 15-Jan-02,55.62,56.76,55.17,56.73,8086100 14-Jan-02,55.66,56.76,55.62,55.62,6713800 11-Jan-02,56.51,56.60,55.39,55.66,7271300 10-Jan-02,56.26,57.21,56.12,56.86,6466400 9-Jan-02,57.01,57.39,56.05,56.26,7575800 8-Jan-02,57.55,57.86,57.19,57.70,4370200 7-Jan-02,57.31,57.96,57.07,57.25,5360400 4-Jan-02,57.52,58.12,57.06,57.46,6679700 3-Jan-02,57.81,58.16,57.36,57.84,5957300 2-Jan-02,57.51,58.01,56.85,57.91,6677900 31-Dec-01,57.96,58.34,57.41,57.41,5134700 28-Dec-01,58.21,58.60,58.00,58.21,4343400 27-Dec-01,57.96,58.46,57.63,58.23,4822200 26-Dec-01,57.61,58.43,57.57,58.01,6638900 24-Dec-01,57.38,57.56,56.99,56.99,2031400 21-Dec-01,56.70,57.44,56.39,57.43,13126800 20-Dec-01,56.19,57.00,56.06,56.12,7845000 19-Dec-01,55.54,56.36,55.21,56.14,8212100 18-Dec-01,55.70,55.89,55.21,55.57,8798500 17-Dec-01,53.95,55.64,53.68,55.64,8463200 14-Dec-01,53.50,54.21,52.83,53.86,6015900 13-Dec-01,53.88,53.89,52.90,53.16,7847100 12-Dec-01,53.82,54.50,53.30,54.13,5772300 11-Dec-01,53.92,54.60,53.31,53.88,6097600 10-Dec-01,54.90,55.19,54.07,54.07,5293400 7-Dec-01,55.01,55.39,54.55,55.13,4602400 6-Dec-01,55.74,55.78,55.20,55.41,7044300 5-Dec-01,54.97,56.36,54.74,56.36,9031700 4-Dec-01,54.20,54.97,54.00,54.97,6865500 3-Dec-01,54.86,55.02,53.98,54.38,7615500 30-Nov-01,54.80,55.69,54.70,54.95,8414300 29-Nov-01,54.90,55.08,54.30,54.45,5727700 28-Nov-01,54.70,55.55,54.28,54.80,7469400 27-Nov-01,55.34,55.60,54.63,54.88,9664100 26-Nov-01,55.49,55.81,55.10,55.54,7702400 23-Nov-01,54.87,55.64,54.86,55.59,2307000 21-Nov-01,55.31,55.40,54.64,54.92,4989500 20-Nov-01,55.49,55.77,54.91,55.49,6336400 19-Nov-01,54.40,55.65,54.40,55.54,7963900 16-Nov-01,55.79,55.79,54.45,54.90,10558400 15-Nov-01,55.37,56.03,55.07,55.79,8452000 14-Nov-01,55.39,55.59,54.85,55.07,9589300 13-Nov-01,55.69,55.74,54.05,54.06,10522000 12-Nov-01,54.35,55.47,53.80,55.37,6500700 9-Nov-01,54.35,55.04,53.69,54.90,5045700 8-Nov-01,54.40,55.19,53.79,54.30,8584100 7-Nov-01,54.65,54.79,53.20,53.62,8222400 6-Nov-01,53.85,54.90,53.45,54.74,8781200 5-Nov-01,52.95,54.10,52.20,53.70,6841200 2-Nov-01,51.61,52.98,51.57,52.77,5794300 1-Nov-01,51.01,52.75,50.67,52.05,8601900 31-Oct-01,50.51,52.13,50.46,51.21,7034600 30-Oct-01,51.31,51.56,50.17,50.41,7094900 29-Oct-01,52.70,52.86,51.52,51.71,6024800 26-Oct-01,52.95,53.62,52.31,53.22,5123700 25-Oct-01,51.61,53.10,51.32,53.10,6892800 24-Oct-01,52.77,52.99,52.24,52.29,5230800 23-Oct-01,52.84,53.35,51.96,52.41,6188400 22-Oct-01,52.60,53.40,51.89,52.84,6544200 19-Oct-01,51.96,52.87,51.41,52.81,6044500 18-Oct-01,52.14,52.60,51.23,51.71,7829100 17-Oct-01,53.05,53.54,51.96,52.03,6638500 16-Oct-01,53.28,53.80,52.31,52.94,6767600 15-Oct-01,52.42,53.28,52.22,53.28,6259700 12-Oct-01,52.65,52.80,51.61,52.70,10740100 11-Oct-01,53.75,54.55,52.65,53.29,12260600 10-Oct-01,52.14,53.50,52.01,53.43,9481900 9-Oct-01,51.31,52.01,50.81,51.89,8068400 8-Oct-01,52.22,52.22,50.77,50.92,6702000 5-Oct-01,51.33,52.21,50.81,52.21,9463200 4-Oct-01,52.60,52.75,51.23,51.31,10199000 3-Oct-01,51.70,53.27,51.31,52.53,13951800 2-Oct-01,49.86,51.81,49.62,51.41,11404200 1-Oct-01,49.32,49.86,47.96,49.58,11988600 28-Sep-01,49.27,49.76,48.63,49.32,9560200 27-Sep-01,49.30,49.51,47.93,49.21,9247000 26-Sep-01,49.17,49.30,48.44,49.30,12116300 25-Sep-01,48.02,48.92,47.87,48.22,15973800 24-Sep-01,46.33,47.80,45.84,47.10,13901700 21-Sep-01,43.99,45.78,43.74,44.49,16443600 20-Sep-01,45.18,45.77,44.84,45.14,12656400 19-Sep-01,45.11,45.91,44.03,45.28,11716600 18-Sep-01,44.76,46.11,43.93,45.11,10510300 17-Sep-01,43.77,45.86,41.78,43.77,17501800 10-Sep-01,45.26,46.75,44.80,45.99,6726900 7-Sep-01,46.65,46.65,44.88,45.98,10431700 6-Sep-01,48.69,49.40,46.75,47.12,10383500 5-Sep-01,48.07,49.09,46.75,48.89,9833200 4-Sep-01,47.98,49.62,47.96,48.20,7324700 31-Aug-01,47.45,48.74,47.45,47.80,7555100 30-Aug-01,48.84,49.21,46.99,47.35,9639000 29-Aug-01,49.79,50.16,48.77,48.89,5440500 28-Aug-01,49.64,49.94,49.44,49.84,6149700 27-Aug-01,50.93,51.23,50.13,50.13,4675000 24-Aug-01,49.39,50.73,49.39,50.68,7268400 23-Aug-01,49.79,50.17,49.24,49.48,5545200 22-Aug-01,49.75,50.27,49.25,49.98,5818100 21-Aug-01,51.13,51.35,49.62,49.68,6542700 20-Aug-01,51.03,51.35,50.53,51.32,4349000 17-Aug-01,51.23,51.23,49.84,50.53,5901700 16-Aug-01,51.25,51.93,50.40,51.42,6205200 15-Aug-01,52.05,52.64,51.55,51.73,6033000 14-Aug-01,50.98,52.42,50.86,52.09,10067600 13-Aug-01,53.27,53.49,51.53,51.93,10140400 10-Aug-01,53.67,53.72,52.22,53.32,8245600 9-Aug-01,54.13,54.50,53.02,53.89,8539200 8-Aug-01,54.31,55.58,54.11,54.24,6387000 7-Aug-01,54.39,54.99,53.87,54.79,5155500 6-Aug-01,55.29,55.29,53.78,54.21,5712600 3-Aug-01,55.61,55.68,54.76,55.10,4170000 2-Aug-01,55.15,55.86,54.76,55.70,5746300 1-Aug-01,55.11,56.47,54.66,54.72,6168500 31-Jul-01,55.23,56.20,55.11,55.61,7725600 30-Jul-01,55.71,55.76,53.91,55.59,7168200 27-Jul-01,55.46,55.71,54.72,55.12,5169300 26-Jul-01,54.81,55.22,53.90,55.21,8425900 25-Jul-01,52.82,54.81,52.45,54.81,9512400 24-Jul-01,52.77,52.92,52.22,52.82,6075300 23-Jul-01,53.62,53.99,52.57,52.75,5361100 20-Jul-01,53.72,54.30,53.62,53.99,5894900 19-Jul-01,53.70,54.21,53.53,53.95,8230700 18-Jul-01,52.59,53.70,52.25,53.70,7180300 17-Jul-01,53.56,53.57,52.66,53.07,8785400 16-Jul-01,53.12,53.77,52.83,53.20,11402300 13-Jul-01,51.58,52.95,50.86,52.62,9845500 12-Jul-01,50.28,51.58,49.69,51.58,11705100 11-Jul-01,47.90,49.14,47.37,48.59,7910500 10-Jul-01,48.25,48.41,47.13,47.25,6461600 9-Jul-01,47.23,48.15,46.80,48.00,6081800 6-Jul-01,48.30,48.31,46.46,47.09,6664200 5-Jul-01,49.09,49.12,48.20,48.34,5132100 3-Jul-01,49.44,49.44,48.68,48.96,3803700 2-Jul-01,48.69,49.53,48.39,49.49,5491200 29-Jun-01,48.87,50.22,48.34,48.54,9306500 28-Jun-01,48.69,49.53,48.69,49.11,5013700 27-Jun-01,48.76,49.46,48.15,48.25,5127100 26-Jun-01,48.30,49.54,48.28,48.84,6020100 25-Jun-01,50.28,50.28,48.54,48.74,5707400 22-Jun-01,50.41,50.48,49.19,49.72,4833700 21-Jun-01,49.04,50.90,49.04,50.19,8943800 20-Jun-01,48.94,49.64,48.72,49.54,5913000 19-Jun-01,49.14,49.16,48.31,48.53,5176800 18-Jun-01,48.47,49.26,48.03,48.20,7122900 15-Jun-01,49.07,49.40,47.68,47.83,14394400 14-Jun-01,49.57,50.02,49.07,49.17,4554600 13-Jun-01,50.26,50.26,49.73,49.82,3523500 12-Jun-01,49.69,50.63,49.28,50.23,4469200 11-Jun-01,50.61,50.76,49.83,49.89,3233500 8-Jun-01,50.66,50.93,50.41,50.68,3787500 7-Jun-01,49.74,51.01,49.74,50.76,6110300 6-Jun-01,50.96,51.36,50.36,50.41,4193700 5-Jun-01,50.40,51.30,50.35,50.96,5164000 4-Jun-01,51.21,51.45,50.16,50.65,5619900 1-Jun-01,51.20,52.10,51.11,51.37,4155100 31-May-01,51.75,52.25,50.93,51.40,5880700 30-May-01,50.88,51.85,50.78,51.13,5969800 29-May-01,51.60,51.60,50.69,50.87,5000600 25-May-01,52.63,52.65,50.86,50.86,5176200 24-May-01,52.00,52.88,51.80,52.54,4524500 23-May-01,52.94,53.52,51.86,52.17,5566100 22-May-01,52.85,53.34,52.55,53.16,6793700 21-May-01,51.69,52.94,51.22,52.84,7752900 18-May-01,51.60,51.69,51.07,51.69,5860900 17-May-01,51.60,51.87,50.96,51.41,6539500 16-May-01,50.86,51.77,50.66,51.31,9604400 15-May-01,53.99,53.99,51.65,51.65,13411700 14-May-01,53.74,54.38,53.48,53.99,4800300 11-May-01,53.61,54.10,52.99,53.74,6529600 10-May-01,52.94,53.34,52.85,53.06,8215200 9-May-01,51.70,51.85,50.96,51.25,5444300 8-May-01,51.40,51.64,50.80,51.63,4437600 7-May-01,52.05,52.59,51.50,51.70,4717000 4-May-01,51.95,53.34,51.66,52.67,7445400 3-May-01,51.95,53.09,51.68,52.75,7590700 2-May-01,53.09,53.09,51.93,52.73,7689800 1-May-01,51.37,53.19,51.06,53.14,7619000 30-Apr-01,52.94,52.94,50.88,51.39,6597800 27-Apr-01,51.75,52.84,51.55,52.48,7764200 26-Apr-01,50.66,51.26,50.21,50.90,5189400 25-Apr-01,50.76,50.76,49.70,50.33,5408400 24-Apr-01,50.41,50.75,49.72,49.77,8175500 23-Apr-01,51.70,52.35,51.31,51.69,5482800 20-Apr-01,52.14,52.15,51.06,51.36,7266900 19-Apr-01,51.38,52.37,51.35,52.15,7043000 18-Apr-01,49.62,52.59,49.30,52.38,12996900 17-Apr-01,48.58,49.11,48.19,48.91,6450800 16-Apr-01,49.37,49.88,48.38,48.72,6754500 12-Apr-01,48.42,49.37,47.09,49.37,9872800 11-Apr-01,49.77,50.36,48.93,49.89,6950300 10-Apr-01,50.81,51.30,50.43,50.50,6986500 9-Apr-01,51.21,51.44,49.47,49.96,7287300 6-Apr-01,49.67,50.98,49.18,50.90,7634400 5-Apr-01,50.21,50.35,49.68,50.20,7790000 4-Apr-01,48.39,50.06,48.37,49.54,7962100 3-Apr-01,50.51,50.66,48.44,48.86,8692100 2-Apr-01,49.67,50.64,49.17,50.30,7437900 30-Mar-01,50.76,50.90,49.17,50.16,8308400 29-Mar-01,49.52,50.31,48.10,50.28,7754000 28-Mar-01,49.67,49.80,47.98,49.33,6875900 27-Mar-01,49.27,50.06,48.82,49.95,9784800 26-Mar-01,48.57,49.47,47.98,49.27,6841800 23-Mar-01,45.54,47.59,44.90,47.25,8282000 22-Mar-01,46.93,47.08,45.60,46.60,11913900 21-Mar-01,47.48,49.44,46.96,47.99,8326900 20-Mar-01,46.97,49.08,46.97,47.49,10035600 19-Mar-01,46.61,47.31,46.32,46.99,5855800 16-Mar-01,47.46,47.46,46.18,46.55,13859800 15-Mar-01,46.97,48.10,46.18,47.46,7509700 14-Mar-01,46.72,47.58,46.15,46.82,8548900 13-Mar-01,48.60,48.90,46.63,48.40,7959100 12-Mar-01,49.84,49.84,47.71,47.92,5740200 9-Mar-01,51.38,51.38,49.69,50.37,5566500 8-Mar-01,51.48,51.48,50.37,51.23,6034400 7-Mar-01,49.64,50.54,49.51,50.29,5419900 6-Mar-01,49.10,49.55,48.50,49.15,5096800 5-Mar-01,48.54,49.14,47.61,47.98,4568100 2-Mar-01,47.60,49.29,47.11,48.52,6472400 1-Mar-01,48.85,49.46,47.61,47.95,8692800 28-Feb-01,50.82,50.88,48.64,49.68,7748200 27-Feb-01,51.18,51.43,49.12,50.58,7047400 26-Feb-01,50.52,50.95,50.04,50.65,6060200 23-Feb-01,49.59,50.39,47.66,49.87,8081600 22-Feb-01,50.59,50.59,48.55,49.30,9154300 21-Feb-01,52.12,52.53,49.64,49.80,8164200 20-Feb-01,51.78,53.85,51.58,52.97,9336500 16-Feb-01,51.38,52.87,51.14,51.93,6659400 15-Feb-01,52.92,53.02,51.23,51.58,7636600 14-Feb-01,53.91,53.91,52.57,52.57,5095000 13-Feb-01,52.62,54.03,51.61,53.66,7423200 12-Feb-01,50.59,53.05,50.55,53.02,7287500 9-Feb-01,51.88,52.92,49.82,49.99,7911400 8-Feb-01,54.11,54.35,51.14,51.87,7967800 7-Feb-01,52.78,54.26,52.77,54.22,4928400 6-Feb-01,52.97,54.05,52.42,52.77,5394000 5-Feb-01,54.55,54.77,52.87,53.40,5604200 2-Feb-01,55.52,55.53,53.71,54.31,5065000 1-Feb-01,56.34,56.34,54.03,55.25,10385300 31-Jan-01,53.76,56.54,53.60,56.34,10848100 30-Jan-01,53.77,53.81,52.73,53.33,5124200 29-Jan-01,53.26,54.21,53.26,53.76,5114200 26-Jan-01,54.49,54.49,52.63,53.19,5230900 25-Jan-01,53.50,55.67,52.51,53.56,9057000 24-Jan-01,53.00,53.19,51.89,53.07,7789400 23-Jan-01,52.57,53.50,52.14,52.94,4917800 22-Jan-01,51.76,53.25,51.58,52.14,7805700 19-Jan-01,51.64,52.26,50.03,50.40,8963300 18-Jan-01,53.00,54.06,52.51,52.63,6877900 17-Jan-01,54.12,54.18,53.13,53.50,7814700 16-Jan-01,53.00,54.37,52.76,54.24,8331600 12-Jan-01,51.58,53.31,51.21,52.51,7322000 11-Jan-01,51.52,52.57,50.40,51.52,6702400 10-Jan-01,50.52,51.64,50.09,51.27,9981400 9-Jan-01,53.07,54.31,52.07,52.32,7210800 8-Jan-01,52.57,54.37,52.45,53.50,8442100 5-Jan-01,56.66,56.66,52.82,53.50,9809200 4-Jan-01,56.54,57.71,55.42,55.73,13812300 3-Jan-01,53.07,58.27,52.51,57.96,19957100 2-Jan-01,52.69,54.61,52.26,53.44,8813600 29-Dec-00,52.26,54.55,52.26,52.69,6582300 28-Dec-00,52.07,53.56,52.07,52.51,4096300 27-Dec-00,50.28,53.00,49.78,52.14,8224300 26-Dec-00,51.83,52.07,48.60,50.21,6021000 22-Dec-00,51.33,52.32,50.46,52.07,7484200 21-Dec-00,49.10,51.83,48.91,51.33,9380200 20-Dec-00,47.61,49.35,46.56,48.54,8283200 19-Dec-00,50.15,50.77,47.18,47.55,9128500 18-Dec-00,50.03,50.71,48.73,50.09,6964800 15-Dec-00,49.04,50.40,49.04,49.41,13142700 14-Dec-00,49.84,50.83,49.47,50.58,7246200 13-Dec-00,51.45,52.26,49.59,49.84,6558500 12-Dec-00,50.03,51.64,49.35,51.39,8344800 11-Dec-00,53.12,53.31,50.34,50.89,11596100 8-Dec-00,54.55,54.86,53.25,53.93,6877000 7-Dec-00,54.55,55.41,54.05,54.48,7646200 6-Dec-00,54.11,55.35,52.81,54.30,10703100 5-Dec-00,53.31,54.79,52.75,54.73,10380600 4-Dec-00,50.46,53.31,49.90,53.31,13404100 1-Dec-00,52.13,52.26,50.21,50.71,10723700 30-Nov-00,51.02,51.70,49.90,51.70,11607100 29-Nov-00,48.79,51.39,48.73,51.39,9903000 28-Nov-00,48.29,50.40,47.61,48.54,9787100 27-Nov-00,46.50,49.35,46.44,48.85,10650400 24-Nov-00,45.51,45.75,44.27,44.76,3482500 22-Nov-00,46.75,46.87,45.45,45.45,4945900 21-Nov-00,47.67,48.05,46.06,46.68,4389000 20-Nov-00,48.17,48.17,47.12,47.43,4379100 17-Nov-00,48.05,49.10,47.18,48.11,6140200 16-Nov-00,48.29,48.73,47.67,47.80,5529700 15-Nov-00,46.19,48.91,45.94,48.54,8646200 14-Nov-00,46.81,47.98,46.31,46.44,8533200 13-Nov-00,42.60,45.01,42.16,44.89,10993000 10-Nov-00,44.58,44.58,42.78,43.28,14914600 9-Nov-00,47.61,47.67,45.75,46.68,8060800 8-Nov-00,48.54,50.40,48.17,48.29,7622900 7-Nov-00,48.54,49.53,47.55,48.48,7137500 6-Nov-00,47.86,48.91,46.62,48.54,7276500 3-Nov-00,47.98,48.66,46.37,46.93,8258500 2-Nov-00,45.57,49.53,45.07,47.98,20850500 1-Nov-00,46.06,47.61,45.69,46.25,23272200 31-Oct-00,43.77,45.38,43.59,44.95,14696600 30-Oct-00,42.97,43.53,42.72,43.34,13205600 27-Oct-00,43.03,43.71,42.84,42.84,12554800 26-Oct-00,45.45,45.51,42.97,43.03,14962100 25-Oct-00,47.98,47.98,45.20,45.51,8390700 24-Oct-00,47.12,48.05,46.81,47.92,5913800 23-Oct-00,46.13,47.36,45.14,46.87,6031300 20-Oct-00,46.44,46.87,45.63,46.13,7153200 19-Oct-00,46.13,47.49,45.69,47.36,6302900 18-Oct-00,45.51,46.56,44.45,46.31,6148400 17-Oct-00,47.12,47.49,45.26,45.57,6268900 16-Oct-00,44.83,47.24,44.76,46.87,7098300 13-Oct-00,43.22,44.70,43.22,44.58,9358200 12-Oct-00,41.61,44.27,41.05,43.71,19439900 11-Oct-00,45.69,45.94,44.45,44.89,8390900 10-Oct-00,45.51,46.25,44.95,45.94,6683200 9-Oct-00,45.26,46.00,44.70,44.70,6033800 6-Oct-00,45.45,45.45,44.21,45.07,11160500 5-Oct-00,45.94,46.31,45.32,45.63,8732500 4-Oct-00,45.26,47.43,45.07,45.69,11085200 3-Oct-00,45.75,45.94,43.71,45.38,16548400 2-Oct-00,47.74,48.17,45.01,45.82,11174600 29-Sep-00,48.05,49.04,47.55,47.67,7532900 28-Sep-00,47.98,49.41,47.55,48.11,8137800 27-Sep-00,47.18,47.92,46.68,47.67,7582800 26-Sep-00,48.97,48.97,46.44,46.93,9409100 25-Sep-00,50.15,50.21,48.48,48.54,5466000 22-Sep-00,51.45,51.45,49.10,50.03,6726300 21-Sep-00,48.23,50.89,48.17,49.53,8645500 20-Sep-00,49.47,49.53,47.61,48.05,9882700 19-Sep-00,50.15,50.40,48.79,49.41,8573700 18-Sep-00,50.52,52.19,50.15,50.65,5211600 15-Sep-00,51.82,52.44,50.96,51.51,8109100 14-Sep-00,53.12,53.12,51.39,52.01,4711600 13-Sep-00,53.74,53.93,52.50,53.37,4981600 12-Sep-00,53.00,54.05,52.38,53.43,6351100 11-Sep-00,52.20,54.18,52.14,53.81,9844600 8-Sep-00,50.96,52.07,50.47,51.58,7380600 7-Sep-00,50.65,51.52,49.97,50.47,8400600 6-Sep-00,49.72,50.59,49.35,49.48,8310400 5-Sep-00,48.43,49.66,48.30,49.23,8031000 1-Sep-00,47.06,48.61,46.88,48.24,7661500 31-Aug-00,47.81,48.24,46.63,47.13,12236200 30-Aug-00,48.36,48.49,47.50,47.93,8155500 29-Aug-00,48.98,49.41,48.36,48.92,5665100 28-Aug-00,49.54,50.10,48.12,48.98,7003200 25-Aug-00,49.11,49.97,48.73,49.97,4877100 24-Aug-00,49.23,49.60,48.49,48.92,4967300 23-Aug-00,49.23,49.66,48.55,48.61,6875700 22-Aug-00,48.49,49.48,48.05,48.61,7610900 21-Aug-00,48.73,49.23,46.63,48.49,14148700 18-Aug-00,49.17,50.34,49.04,50.34,7349300 17-Aug-00,49.04,49.91,48.12,49.48,6799800 16-Aug-00,50.22,50.34,48.24,49.41,13811000 15-Aug-00,51.33,52.01,50.71,51.02,7953000 14-Aug-00,51.70,52.51,51.58,52.32,6032800 11-Aug-00,50.90,51.83,50.59,51.58,7534100 10-Aug-00,52.57,52.69,50.16,50.47,12380600 9-Aug-00,53.50,54.18,52.38,53.06,17750700 8-Aug-00,55.85,57.02,54.49,57.02,5859800 7-Aug-00,52.57,55.35,52.45,54.55,5605200 4-Aug-00,53.50,53.50,52.20,52.38,5842400 3-Aug-00,55.91,55.91,52.88,53.31,8229100 2-Aug-00,53.93,54.49,53.25,53.50,6734800 1-Aug-00,53.43,54.36,52.45,53.93,9055300 31-Jul-00,58.26,58.26,53.68,54.67,7534300 28-Jul-00,59.19,59.31,56.65,58.07,5247600 27-Jul-00,58.75,59.68,58.38,59.43,4744800 26-Jul-00,57.58,59.50,57.58,58.13,7322100 25-Jul-00,56.90,58.69,56.71,58.57,4122000 24-Jul-00,58.38,58.57,56.59,56.84,5045800 21-Jul-00,59.68,59.87,58.63,59.06,3911000 20-Jul-00,59.31,60.18,58.94,59.37,4986800 19-Jul-00,59.56,59.87,58.75,59.37,3736400 18-Jul-00,60.30,60.49,59.12,59.43,3592100 17-Jul-00,59.68,60.61,59.00,60.08,4610700 14-Jul-00,59.19,60.30,58.75,58.88,4184100 13-Jul-00,59.87,60.55,58.51,58.51,4302600 12-Jul-00,61.41,61.54,59.99,60.36,5833600 11-Jul-00,60.42,62.09,60.18,61.35,5897600 10-Jul-00,60.73,62.28,60.05,60.61,8233700 7-Jul-00,57.33,61.41,56.71,60.92,10513400 6-Jul-00,57.33,57.83,56.22,56.90,5757800 5-Jul-00,56.71,57.33,55.97,56.40,5139800 3-Jul-00,56.65,56.77,55.54,56.28,2577300 30-Jun-00,53.56,57.13,53.50,57.02,7622200 29-Jun-00,54.73,54.80,53.00,53.56,5290900 28-Jun-00,55.91,56.59,55.10,55.40,4824100 27-Jun-00,53.56,56.84,53.19,56.22,6554400 26-Jun-00,53.62,54.12,53.19,53.19,3924700 23-Jun-00,53.13,53.87,52.32,53.19,6269600 22-Jun-00,52.51,52.88,51.33,51.95,5667800 21-Jun-00,53.99,53.99,52.82,53.37,4287300 20-Jun-00,53.68,54.12,52.57,53.93,6063800 19-Jun-00,53.13,54.42,52.26,53.81,6001700 16-Jun-00,54.18,55.54,52.69,53.31,9569700 15-Jun-00,54.49,55.60,54.24,54.92,5682300 14-Jun-00,54.36,55.10,53.56,54.55,6686800 13-Jun-00,51.46,54.36,51.03,54.36,7711700 12-Jun-00,53.38,53.75,51.21,52.14,8089200 9-Jun-00,56.77,57.33,53.31,53.38,7283100 8-Jun-00,57.14,57.33,55.66,56.22,3993100 7-Jun-00,57.08,58.38,57.08,57.21,3424600 6-Jun-00,58.13,58.13,57.08,57.58,4440100 5-Jun-00,58.63,59.06,58.07,58.63,4360400 2-Jun-00,58.20,59.37,57.39,58.38,7088100 1-Jun-00,56.47,57.02,55.60,56.34,4786400 31-May-00,54.24,59.31,53.87,56.96,7658900 30-May-00,52.45,53.50,52.08,52.76,4352700 26-May-00,53.62,54.36,52.51,53.38,3996400 25-May-00,55.17,56.03,53.44,54.36,4619200 24-May-00,54.61,56.34,52.14,56.22,10341500 23-May-00,56.90,57.70,56.16,56.53,4291000 22-May-00,57.02,57.02,55.54,56.71,4628100 19-May-00,55.48,58.07,55.48,56.40,6357700 18-May-00,55.60,57.27,55.54,57.27,4887900 17-May-00,56.03,56.09,54.80,55.72,4592300 16-May-00,56.77,58.38,56.53,57.33,6378700 15-May-00,55.60,56.65,54.86,56.34,4272300 12-May-00,55.11,56.53,54.67,56.16,4371000 11-May-00,56.28,56.40,54.36,55.35,6105300 10-May-00,52.82,56.47,52.39,56.03,11245300 9-May-00,53.75,54.24,51.89,52.39,8888200 8-May-00,50.66,51.77,48.93,51.77,7626100 5-May-00,49.61,52.26,49.61,50.72,8640000 4-May-00,53.31,53.31,49.85,50.41,10766900 packet/data/include/0040755000076400007640000000000007525063545013336 5ustar iankiankpacket/data/include/yahooTS.h0100644000076400007640000000626607525062773015106 0ustar iankiank #ifndef _YAHOOTS_H_ #define _YAHOOTS_H_ /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ /** Process historical equity (stock) data downloaded from finance.yahoo.com. The data is downloaded in "spread sheet" format from the historical data page. There is probably some limitation on using this data (e.g., no commercial use and no resale) so use at your own risk. The format of the file is ASCII. The first line lists the title for each of the fields in the file. The titles and the fields are comma separated. This class is specific to the data format that was downloaded from Yahoo at the time. More general code could be written to easily account for changing formats. However, I just wanted to extract the data. The Yahoo data has two places of accuracy, presumably reflecting decimalization. The equity time series are adjusted for splits and dividends, backward in time from the most recent time in the time series. This can cause problems over long periods of time since at some point a stock that pays dividends will pay all of it's worth out in dividends and the value will become negative (as a result, a reinvest is a better choice). The format for the data is: <title line> <time series line>+ (e.g,. a titled followed by one or more time series lines). The title line consists of six comma separated strings (e.g., "Date,Open,High,Low,Close,Volume"). Time time series lines have the values suggested in the title. For my current purposes I am not interested in date values, so these are ignored. All values are returned as vectors of doubles, although volume is an unsigned integer value. */ class yahooTS { private: const char *path_; public: typedef enum { badEnum, Open, High, Low, Close, Volume, lastEnum } dataKind; yahooTS() { path_ = 0; }; yahooTS( const char *p ) : path_(p) {} const double *getTS( const char *fileName, double *a, size_t &N, dataKind kind ) const; void path( const char *p ) { path_ = p; } const char *path() { return path_; } private: const char *getStr_( char *&line, char *buf, size_t bufSize ) const; void parseVals_( char *line, double *vals, const size_t n ) const; const double getValue_( char *line, const yahooTS::dataKind kind ) const; }; // yahooTS #endif packet/data/src/0040755000076400007640000000000007525060202012465 5ustar iankiankpacket/data/src/tstest.cpp0100644000076400007640000000060507525024672014530 0ustar iankiank #include #include "yahooTS.h" main() { const size_t VEC_SIZE = 512; double vec[VEC_SIZE]; yahooTS ts( "equities\\" ); size_t N = VEC_SIZE; if (ts.getTS( "aa", vec, N, yahooTS::Close )) { for (size_t i = 0; i < VEC_SIZE; i++) { printf("%3d %f\n", i, vec[i] ); } } else { fprintf(stderr, "main: getTS failed\n"); } } packet/data/src/yahooTS.cpp0100644000076400007640000001422107525024672014567 0ustar iankiank /** \file The documentation in this file is formatted for doxygen (see www.doxyeng.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include #include #include #include "yahooTS.h" /** Copy from the input string until either the end of the string (e.g., the null) is reached or a comma is found. \param line A reference to a pointer to the input string. This pointer is incremented until either the end of string or a comma is encountered. When this function returns line will either point to the end of the string or a character following a comma. \param buf A buffer into which the string will be copied. \param bufSize The size of buf. */ const char *yahooTS::getStr_( char *&line, char *buf, size_t bufSize ) const { const char *rtnPtr = 0; if (line != 0) { for (size_t charCnt = 0; charCnt < bufSize-1 && *line != '\0'; charCnt++) { if (*line == ',') { line++; break; } else { buf[charCnt] = *line++; } } buf[charCnt] = '\0'; if (charCnt > 0) { rtnPtr = buf; } } return rtnPtr; } // getStr_ /** Parse a comma separated line of values into a vector of doubles. The comma separated values are: Date,Open,High,Low,Close,Volume The date value is skipped. \param line A pointer to a line of Yahoo historical data \param vals A vector of doubles that the values in the historical data line will be stored. \param n The number of elements in vals */ void yahooTS::parseVals_( char *line, double *vals, const size_t n ) const { char buf[128]; const char *ptr; // skip the date ptr = getStr_( line, buf, sizeof( buf ) ); if (ptr == 0) { fprintf(stderr, "parseVals: date expected\n" ); return; } // get the Open, High, Low, Close and Volume values size_t cnt = 0; for (dataKind kind = Open; kind <= Volume && cnt < n; kind = (dataKind)((size_t)kind + 1)) { ptr = getStr_( line, buf, sizeof( buf ) ); if (ptr == 0) { fprintf(stderr, "parseVals: value expected\n"); return; } double v; sscanf( buf, "%lf", &v ); vals[cnt] = v; cnt++; } } // parseVals_ /** A data line from a Yahoo historical data file consists of a set of comma separated values:
    date,open,high,low,close,volume
This function is passed a Yahoo data line and a kind value which indicates which value to return. Date is is ignored, so the value of kind should be one of: Open, High, Low, Close, Volume. */ const double yahooTS::getValue_( char *line, const yahooTS::dataKind kind ) const { double retval = 0; if (kind > badEnum && kind < lastEnum) { const size_t NUM_VALS = 5; double vals[ NUM_VALS ]; parseVals_( line, vals, NUM_VALS ); size_t ix = (size_t)kind - 1; if (ix < NUM_VALS) { retval = vals[ix]; } } return retval; } // getValue /** Read a Yahoo equity time series from a file. Yahoo allows historical equity data to be downloaded in "spread sheet" format. In this format there is a title line, listing the data columns (e.g., date, open, high, low, close and volume). Following the title line are comma separated values. In reading this Yahoo data file, the first line is skipped. The Yahoo data values are listed from most recent to oldest. In the data vector returned, a[0] will be the oldest and a[N-1] will be the most recent. \param fileName name of the file containing the time series. This file will be prefixed by the path in the class variable path_. \param a A pointer to a vector of doubles that will be initialized with values from fileName. \param N Number of doubles that will fit in a N is an input/output variable. The value returned in N will be the actual number of values read. \param kind The kind of time series to fetch from fileName (e.g., open, high, low, close, volume. \return If there was no error reading data from fileName the function returns a pointer to the initialized array (e.g., the argument a). If the data could not be read, a null pointer (0) is returned. */ const double *yahooTS::getTS( const char *fileName, double *a, size_t &N, const yahooTS::dataKind kind ) const { const double *rtnPtr = 0; char fullPath[512]; size_t freePath = sizeof( fullPath ); FILE *fptr; if (path_ != 0) { strncpy( fullPath, path_, freePath-1 ); freePath = freePath - strlen( fullPath ); } strncat( fullPath, fileName, freePath-1 ); fptr = fopen( fullPath, "r" ); if (fptr != 0) { char line[512]; size_t lineSize = sizeof( line ); int ix = N-1; if (fgets( line, lineSize, fptr ) != 0) { rtnPtr = a; while (fgets( line, lineSize, fptr ) != 0) { if (ix >= 0) { a[ix] = getValue_( line, kind ); ix--; } else { break; } } // while } else { fprintf(stderr, "getTS: title line expected\n"); } ix++; N = N - ix; } else { const char *error = strerror( errno ); fprintf(stderr, "getTS: Error opening %s: %s\n", fullPath, error ); } return rtnPtr; } // getTS packet/doxygenDocConfig0100644000076400007640000007775107525062543014171 0ustar iankiank# Doxyfile 1.2.8.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # General configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = "Wavelet Packet Transform and Lossless Compression" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French, # German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, # Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish. OUTPUT_LANGUAGE = English # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these class will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. It is allowed to use relative paths in the argument list. STRIP_FROM_PATH = # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a class diagram (in Html and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. CLASS_DIAGRAMS = YES # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = YES # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower case letters. If set to YES upper case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # users are adviced to set this option to NO. CASE_SENSE_NAMES = YES # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explict @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # reimplements. INHERIT_DOCS = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consist of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = MainPage src include lossless/src lossless/include data/src data/include # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. FILE_PATTERNS = *.h *.cpp # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. INPUT_FILTER = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse. FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = doc # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the Html help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript and frames is required (for instance Netscape 4.0+ # or Internet explorer 4.0+). GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimised for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assigments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = #--------------------------------------------------------------------------- # Configuration::addtions related to external references #--------------------------------------------------------------------------- # The TAGFILES tag can be used to specify one or more tagfiles. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermedate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::addtions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO # The CGI_NAME tag should be the name of the CGI script that # starts the search engine (doxysearch) with the correct parameters. # A script with this name will be generated by doxygen. CGI_NAME = # The CGI_URL tag should be the absolute URL to the directory where the # cgi binaries are located. See the documentation of your http daemon for # details. CGI_URL = # The DOC_URL tag should be the absolute URL to the directory where the # documentation is located. If left blank the absolute path to the # documentation, with file:// prepended to it, will be used. DOC_URL = # The DOC_ABSPATH tag should be the absolute path to the directory where the # documentation is located. If left blank the directory on the local machine # will be used. DOC_ABSPATH = # The BIN_ABSPATH tag must point to the directory where the doxysearch binary # is installed. BIN_ABSPATH = # The EXT_DOC_PATHS tag can be used to specify one or more paths to # documentation generated for other projects. This allows doxysearch to search # the documentation for these projects as well. EXT_DOC_PATHS = packet/include/0040755000076400007640000000000010176075625012423 5ustar iankiankpacket/include/blockpool.h0100644000076400007640000001103507525053013014544 0ustar iankiank #ifndef _BLOCKPOOL_H_ #define _BLOCKPOOL_H_ /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org). Copyright and Use You may use this source code without limitation and without fee as long as you include:
This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.
This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International. Please send any bug fixes or suggested source changes to:
     iank@bearcave.com
@author Ian Kaplan */ #include #include #include /** This class supports memory pool allocation. A memory pool is allocated in blocks and smaller chunks of memory are allocated from these blocks. Instead of calling a set of class destructors (which is time consuming) the memory pool allows all the objects allocated in the memory pool to be destroyed at once. This provide a sort of "poorman's garbage collector. Deallocating memory in a single place simplifies the software structure, since allocation can be scattered throughout the code without worry about deallocation. This is a simplified version of a low level memory allocator that can be used to create multiple memory pools. In this class the class variables are static and shared by all instances of the class. This allows the class to be declared locally to allocate memory, but the state remains global. This makes the local instance a window into the global state. The limitation is that only one memory pool can be used. Originally written November, 1996
Revised for the wavelet packet transform code March 2002 \author Ian Kaplan */ class block_pool { public: // typedefs and variables /** the largest block of memory that can be allocated is the page_size * max_block_multiple */ typedef enum { one_kay = 1024, page_size = (4 * one_kay), /* 4 Kb */ max_block_multiple = 256, /* 1 Mb */ last_enum } bogus; /** typedef for memory block chain */ typedef struct block_chain_struct { /** pointer to the current block */ void *block; /** number of bytes used in the block */ unsigned int bytes_used; /** total block size */ unsigned int block_size; /** pointer to the next block */ block_chain_struct *next_block; } block_chain; private: /** allocation granularity */ static unsigned int alloc_gran; /** start of the block list for this pool */ static block_chain *block_list_start; /** current block memory is being allocated from */ static block_chain *current_block; private: // class functions block_chain *new_block( unsigned int block_size ); void *add_block( unsigned int block_size ); void init_pool(void); protected: /** Allocate memory using calloc. The POSIX calloc function sets the memory to zero (in contrast to malloc which allocates the memory without initializing it.
      #include 
      void *calloc( size_t num, size_t size );
The arguments to calloc are: num: number of elements
size: size of the elements in bytes The argument to MemAlloc is the size, in bytes to allocate. */ virtual void *MemAlloc( unsigned int n_bytes ) { void *rtn = calloc( n_bytes, 1 ); return rtn; } /** Free memory that has been allocated with MemAlloc */ virtual void MemFree( void *addr ) { free( addr ); } public: // class functions /** constructor does nothing, since all the class variables are static */ block_pool(void) {} void free_pool(void); void *pool_alloc( unsigned int block_size ); void print_block_pool_info( FILE *fp = stdout ); }; // class block_pool /* Macros for block_chain pointers */ /** return the memory block */ #define Chain_block(p) ((p)->block) /** return the number of bytes used */ #define Chain_bytes_used(p) ((p)->bytes_used) /** return the size of the memory block */ #define Chain_block_size(p) ((p)->block_size) /** return the next block_chain structure in the list */ #define Chain_next(p) ((p)->next_block) #endif packet/include/costbase.h0100644000076400007640000000506207525053061014371 0ustar iankiank #ifndef _COSTBASE_H_ #define _COSTBASE_H_ #include "packnode.h" /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:
This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.
This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International. Please send any bug fixes or suggested source changes to:
     iank@bearcave.com
@author Ian Kaplan */ /** Base class for objects that define costs functions for the wavelet packet transform. The costbase base class provides a constructor that is passed the root of a wavelet packet tree (which is built by packtree.cpp). The wavelet packet tree is constructed from packnode objects (which are a subclass of the packdata). The cost function calculation invoked by the constructor traverses the wavelet packet tree (top down) and calls costCalc on each node in the tree. The cost function result is stored in the node. Note that the cost function also calculates a cost value for the original data, since in theory the original data may represent the minimal representation for the data in terms of the cost function. The pure virtual function costCalc, which calculates the cost function, must be defined by the subclass. A description of the cost functions associated with the wavelet packet transform can be found in Chapter 8 of Ripples in Mathematics by Jense and la Cour-Harbo. \author Ian Kaplan */ class costbase { private: /** disallow the copy constructor */ costbase( const costbase &rhs ) {} protected: /** Recursively traverse the wavelet packet tree and calculate the cost function. */ void traverse( packnode *node ) { if (node != 0) { double cost = costCalc( node ); node->cost( cost ); traverse( node->lhsChild() ); traverse( node->rhsChild() ); } } // traverse /** Cost function to be defined by the subclass */ virtual double costCalc(packnode *node) = 0; public: /** The default constructor does nothing */ costbase() {} }; // costbase #endif packet/include/costshannon.h0100644000076400007640000000270307525053115015122 0ustar iankiank #ifndef _COSTSHANNON_H_ #define _COSTSHANNON_H_ #include "costbase.h" #include "packnode.h" /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org). Copyright and Use You may use this source code without limitation and without fee as long as you include:
This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.
This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International. Please send any bug fixes or suggested source changes to:
     iank@bearcave.com
@author Ian Kaplan */ /** The costshannon class extends the abstract class costbase with a concrete implementation of the costCalc function that implements the a modified version of the Shannon entropy function as a cost function. \author Ian Kaplan */ class costshannon : public costbase { protected: double costCalc( packnode *node); public: /** Calculate a modified version of the the Shannon entropy cost function for the wavelet packet tree, filling in the cost value at each node */ costshannon( packnode *node ) { traverse( node ); } }; #endif packet/include/costthresh.h0100644000076400007640000000432107525053130014746 0ustar iankiank #ifndef _COSTTHRESH_H_ #define _COSTTHRESH_H_ #include "costbase.h" #include "packnode.h" /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ /** The costthresh class implements a wavelet packet transform cost function which counts the values in the data set that are greater than a threshold value. This threshold value is initialized in the constructor. The costbase class provides the wavelet packet tree traversal function which calls the subclass's cost function. \author Ian Kaplan */ class costthresh : public costbase { private: /** cost threshold */ double thresh; /** absolute value */ double abs(const double x) { double retval = x; if (retval < 0.0) retval = -retval; return retval; } // abs protected: /** This is a simple threshold calculation. The costCalc function returns the number of node data values whose absolute value is greater than the threshold. */ double costCalc(packnode *node) { double count = 0.0; if (node != 0) { size_t len = node->length(); for (int i = 0; i < len; i++) { if (abs((*node)[i]) > thresh) { count = count + 1.0; } } } return count; } // costCalc public: /** class constructor: calculate the wavelet packet cost function using a simple threshold, t. */ costthresh(packnode *node, double t ) { thresh = t; traverse( node ); } }; // costthresh #endif packet/include/daub.h0100644000076400007640000002332407474275003013507 0ustar iankiank #include /** Daubechies D4 wavelet transform (D4 denotes four coefficients) I have to confess up front that the comment here does not even come close to describing wavelet algorithms and the Daubechies D4 algorithm in particular. I don't think that it can be described in anything less than a journal article or perhaps a book. I even have to apologize for the notation I use to describe the algorithm, which is barely adequate. But explaining the correct notation would take a fair amount of space as well. This comment really represents some notes that I wrote up as I implemented the code. If you are unfamiliar with wavelets I suggest that you look at the bearcave.com web pages and at the wavelet literature. I have yet to see a really good reference on wavelets for the software developer. The best book I can recommend is Ripples in Mathematics by Jensen and Cour-Harbo. All wavelet algorithms have two components, a wavelet function and a scaling function. These are sometime also referred to as high pass and low pass filters respectively. The wavelet function is passed two or more samples and calculates a wavelet coefficient. In the case of the Haar wavelet this is
  coefi = oddi - eveni
  or 
  coefi = 0.5 * (oddi - eveni)
  
depending on the version of the Haar algorithm used. The scaling function produces a smoother version of the original data. In the case of the Haar wavelet algorithm this is an average of two adjacent elements. The Daubechies D4 wavelet algorithm also has a wavelet and a scaling function. The coefficients for the scaling function are denoted as hi and the wavelet coefficients are gi. Mathematicians like to talk about wavelets in terms of a wavelet algorithm applied to an infinite data set. In this case one step of the forward transform can be expressed as the infinite matrix of wavelet coefficients represented below multiplied by the infinite signal vector.
     ai = ...h0,h1,h2,h3, 0, 0, 0, 0, 0, 0, 0, ...   si
     ci = ...g0,g1,g2,g3, 0, 0, 0, 0, 0, 0, 0, ...   si+1
   ai+1 = ...0, 0, h0,h1,h2,h3, 0, 0, 0, 0, 0, ...   si+2
   ci+1 = ...0, 0, g0,g1,g2,g3, 0, 0, 0, 0, 0, ...   si+3
   ai+2 = ...0, 0, 0, 0, h0,h1,h2,h3, 0, 0, 0, ...   si+4
   ci+2 = ...0, 0, 0, 0, g0,g1,g2,g3, 0, 0, 0, ...   si+5
   ai+3 = ...0, 0, 0, 0, 0, 0, h0,h1,h2,h3, 0, ...   si+6
   ci+3 = ...0, 0, 0, 0, 0, 0, g0,g1,g2,g3, 0, ...   si+7
  
The dot product (inner product) of the infinite vector and a row of the matrix produces either a smoother version of the signal (ai) or a wavelet coefficient (ci). In an ordered wavelet transform, the smoothed (ai) are stored in the first half of an n element array region. The wavelet coefficients (ci) are stored in the second half the n element region. The algorithm is recursive. The smoothed values become the input to the next step. The transpose of the forward transform matrix above is used to calculate an inverse transform step. Here the dot product is formed from the result of the forward transform and an inverse transform matrix row.
      si = ...h2,g2,h0,g0, 0, 0, 0, 0, 0, 0, 0, ...  ai
    si+1 = ...h3,g3,h1,g1, 0, 0, 0, 0, 0, 0, 0, ...  ci
    si+2 = ...0, 0, h2,g2,h0,g0, 0, 0, 0, 0, 0, ...  ai+1
    si+3 = ...0, 0, h3,g3,h1,g1, 0, 0, 0, 0, 0, ...  ci+1
    si+4 = ...0, 0, 0, 0, h2,g2,h0,g0, 0, 0, 0, ...  ai+2
    si+5 = ...0, 0, 0, 0, h3,g3,h1,g1, 0, 0, 0, ...  ci+2
    si+6 = ...0, 0, 0, 0, 0, 0, h2,g2,h0,g0, 0, ...  ai+3
    si+7 = ...0, 0, 0, 0, 0, 0, h3,g3,h1,g1, 0, ...  ci+3
  
Using a standard dot product is grossly inefficient since most of the operands are zero. In practice the wavelet coefficient values are moved along the signal vector and a four element dot product is calculated. Expressed in terms of arrays, for the forward transform this would be:
  ai = s[i]*h0 + s[i+1]*h1 + s[i+2]*h2 + s[i+3]*h3
  ci = s[i]*g0 + s[i+1]*g1 + s[i+2]*g2 + s[i+3]*g3
  
This works fine if we have an infinite data set, since we don't have to worry about shifting the coefficients "off the end" of the signal. I sometimes joke that I left my infinite data set in my other bear suit. The only problem with the algorithm described so far is that we don't have an infinite signal. The signal is finite. In fact not only must the signal be finite, but it must have a power of two number of elements. If i=N-1, the i+2 and i+3 elements will be beyond the end of the array. There are a number of methods for handling the wavelet edge problem. This version of the algorithm acts like the data is periodic, where the data at the start of the signal wraps around to the end. This algorithm uses a temporary array. A Lifting Scheme version of the Daubechies D4 algorithm does not require a temporary. The matrix discussion above is based on material from Ripples in Mathematics, by Jensen and Cour-Harbo. Any error are mine. Author: Ian Kaplan
Use: You may use this software for any purpose as long as I cannot be held liable for the result. Please credit me with authorship if use use this source code. This comment is formatted for the doxygen documentation generator */ template class Daubechies : public liftbase { protected: void predict( T& vec, int N, transDirection direction ) { assert( false ); } // predict virtual void update( T& vec, int N, transDirection direction ) { assert( false ); } // update private: /** forward transform scaling coefficients */ double h0, h1, h2, h3; /** forward transform wave coefficients */ double g0, g1, g2, g3; double Ih0, Ih1, Ih2, Ih3; double Ig0, Ig1, Ig2, Ig3; public: /** Forward Daubechies D4 transform step */ void forwardStep( T& a, const int n ) { if (n >= 4) { int i, j; const int half = n >> 1; double* tmp = new double[n]; for (i = 0, j = 0; j < n-3; j += 2, i++) { tmp[i] = a[j]*h0 + a[j+1]*h1 + a[j+2]*h2 + a[j+3]*h3; tmp[i+half] = a[j]*g0 + a[j+1]*g1 + a[j+2]*g2 + a[j+3]*g3; } tmp[i] = a[n-2]*h0 + a[n-1]*h1 + a[0]*h2 + a[1]*h3; tmp[i+half] = a[n-2]*g0 + a[n-1]*g1 + a[0]*g2 + a[1]*g3; for (i = 0; i < n; i++) { a[i] = tmp[i]; } delete [] tmp; } } /** Forward Daubechies D4 transform step, where the locations for the high and low pass filters are reversed. */ void forwardStepRev( T& a, const int n ) { if (n >= 4) { int i, j; const int half = n >> 1; double* tmp = new double[n]; for (i = 0, j = 0; j < n-3; j += 2, i++) { tmp[i+half] = a[j]*h0 + a[j+1]*h1 + a[j+2]*h2 + a[j+3]*h3; tmp[i] = a[j]*g0 + a[j+1]*g1 + a[j+2]*g2 + a[j+3]*g3; } tmp[i+half] = a[n-2]*h0 + a[n-1]*h1 + a[0]*h2 + a[1]*h3; tmp[i] = a[n-2]*g0 + a[n-1]*g1 + a[0]*g2 + a[1]*g3; for (i = 0; i < n; i++) { a[i] = tmp[i]; } delete [] tmp; } } /** Inverse Daubechies D4 transform */ void inverseStep( T& a, const int n ) { if (n >= 4) { int i, j; const int half = n >> 1; const int halfPls1 = half + 1; double* tmp = new double[n]; // last smooth val last coef. first smooth first coef tmp[0] = a[half-1]*Ih0 + a[n-1]*Ih1 + a[0]*Ih2 + a[half]*Ih3; tmp[1] = a[half-1]*Ig0 + a[n-1]*Ig1 + a[0]*Ig2 + a[half]*Ig3; for (i = 0, j = 2; i < half-1; i++) { // smooth val coef. val smooth val coef. val tmp[j++] = a[i]*Ih0 + a[i+half]*Ih1 + a[i+1]*Ih2 + a[i+halfPls1]*Ih3; tmp[j++] = a[i]*Ig0 + a[i+half]*Ig1 + a[i+1]*Ig2 + a[i+halfPls1]*Ig3; } for (i = 0; i < n; i++) { a[i] = tmp[i]; } delete [] tmp; } } // inverseStep /** Initialize the filter constants used in the Daubechies D4 transform. */ Daubechies() { const double sqrt_3 = sqrt( 3 ); const double denom = 4 * sqrt( 2 ); // // forward transform scaling (smoothing) coefficients // h0 = (1 + sqrt_3)/denom; h1 = (3 + sqrt_3)/denom; h2 = (3 - sqrt_3)/denom; h3 = (1 - sqrt_3)/denom; // // forward transform wavelet coefficients (a.k.a. high // pass filter coefficients) // g0 = h3; g1 = -h2; g2 = h1; g3 = -h0; Ih0 = h2; Ih1 = g2; // h1 Ih2 = h0; Ih3 = g0; // h3 Ig0 = h3; Ig1 = g3; // -h0 Ig2 = h1; Ig3 = g1; // -h2 } /** Forward Daubechies D4 transform */ void forwardTrans( T& ts, int N ) { int n; for (n = N; n >= 4; n >>= 1) { forwardStep( ts, n ); } } // forwardTrans /** Inverse Daubechies D4 transform */ void inverseTrans( T& coef, int N ) { int n; for (n = 4; n <= N; n <<= 1) { inverseStep( coef, n ); } } // inverseTrans }; // Daubechies packet/include/fifo_list.h0100644000076400007640000001117707467262147014564 0ustar iankiank #ifndef FIFO_LIST_H #define FIFO_LIST_H /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include "blockpool.h" /** template class FIFO_LIST This is a generic list type for a list that has both a head and a tail pointer. In this list, items are added to the tail. When read from the front of the list, items will be read in a first-in, first-out order (FIFO). The template should be instantiated with a scalar type, like an integer or a pointer to a larger type (e.g., a string or a structure). For example
      FIFO_LIST list;
      FIFO_LIST list;
      FIFO_LIST list;
The list "links" are allocated in a memory pool. This allocation is handled by the local version of new in list_type. The memory allocated for the list_type objects will be deallocated when the memory pool is freed. */ template class FIFO_LIST { public: /** List backbone class */ class list_type { public: /** data element */ T data; /** pointer to the next element */ list_type *next; /** override the default new operator to allocate list_type objects from the a memory pool */ void *operator new(size_t num_bytes) { block_pool mem_pool; void *mem_addr = mem_pool.pool_alloc( num_bytes ); return mem_addr; } // new }; // class list_type private: /** list head */ list_type *list; /** list tail (items are added to the tail) */ list_type *tail; public: /** define a handle type to abstract the list_type type */ typedef list_type *handle; public: /** class constructor */ FIFO_LIST(void) { list = 0; tail = 0; } /** default destructor does nothing */ ~FIFO_LIST(void) {} /** deallocate the list */ void dealloc(void) { while ( remove() != 0 ) /* nada */; } // dealloc /** add an element to the FIFO list */ void add( T data ) { list_type *t; t = new list_type(); t->data = data; t->next = 0; if (list == 0) { list = t; tail = t; } else { tail->next = t; tail = t; } } // add /** reverse the list */ void reverse(void) { list_type *elem, *prev, *next; prev = 0; next = 0; tail = list; for (elem = list; elem != 0; prev = elem, elem = next) { next = elem->next; elem->next = prev; } // for list = prev; } // reverse /** return the lenght of the list */ unsigned int length(void) { list_type *elem; unsigned int cnt = 0; for (elem = list; elem != 0; elem = elem->next) cnt++; return cnt; } // lenght /** remove Remove an element from the start of the list and return the first element of the remaining list. This function relies on the fact that the list elements were allocated from a pool. The memory for these elements will be recovered when the pool is deallocated. */ handle remove(void) { list_type *t; if (list != 0) { t = list; list = t->next; // no delete t; } if (list == 0) tail = 0; return list; } // remove /** given a handle, return the associated data item */ T get_item( handle h) { return h->data; } // get_item /** get the first element from the list */ handle first(void) { return list; } // first /** return the last element in the list */ handle last(void) { return tail; } // last /** iterator to get the next element */ handle next(handle h) { list_type *next = 0; if (h != 0) { next = h->next; } return next; } // next }; // template class FIFO_LIST #endif packet/include/grow_array.h0100644000076400007640000001112507525053166014745 0ustar iankiank #ifndef _GROW_ARRAY_H_ #define _GROW_ARRAY_H_ /** \file The documentation in this file is formatted for doxygen (see www.doxyeng.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include "blockpool.h" /** This file defines an array template class that will grow as elements are added to the end of the array. This is similar to the STL class. This array class is designed for dense arrays where the all elements of the array are used. Usage: - Elements are added to the end of the array via the append function. - Elements in the array can be accessed via the [] operator. - If the elements in the array are dynamicly allocated, the user is responsible for deallocating these elements. A doubling algorithm is used when the data size is expanded because it minimizes the amount of copying that must be done. The array will quickly grow to a the size needed to accomodate the data set and no more copying will be necessary. For large arrays there is the drawback that more memory may be allocated than is needed, since the amount of memory used grows exponentially. \author Ian Kaplan */ template class GrowableArray { private: typedef enum { StartArraySize = 128 } bogus; /** number of data elements */ size_t num_elem; /** Array size (always <= num_elem) */ size_t array_size; T *pArray; private: /** twice Double the amount of memory allocated for the array. Return true if memory allocation succeeded, false otherwise. */ bool twice() { bool rslt; T *old_array = pArray; size_t new_size = array_size * 2; pArray = new T [ new_size ]; if (pArray != 0) { rslt = true; for (int i = 0; i < array_size; i++) { pArray[i] = old_array[i]; } delete [] old_array; array_size = new_size; } else { rslt = false; } return rslt; } // twice public: GrowableArray() { pArray = new T[ StartArraySize ]; num_elem = 0; array_size = StartArraySize; } // GrowableArray constructor /** destructor */ ~GrowableArray() { if (pArray != NULL) { delete [] pArray; } } // GrowableArray destructor /** Length of the data (which is not necessarily the same as the length of the internal array */ const size_t length(void) const { return num_elem; } /** set array to zero length */ void set_to_zero() { num_elem = 0; } /** LHS [] operator */ T &operator[](const size_t i) { assert( i < num_elem ); return pArray[ i ]; } /** RHS [] operator */ T operator[](const size_t i ) const { assert( i < num_elem ); return pArray[ i ]; } /** Get a pointer to the internal data array */ const T *getData() const { return pArray; } /** append an item to the end of the array */ void append( T item ) { if (num_elem == array_size) { bool allocOK = twice(); assert( allocOK ); } pArray[ num_elem ] = item; num_elem++; } // append /** expand Expand the number of array data slots by "amount" elements. Note that "array_size" is the total amount of storage available for data slots. "num_elem" is the number of data slots. The bounds over which the array can be indexed is governed by num_elem. Note that after expand() is called the new data elements can be read, but their value is undefined until they are initialized. */ void expand( size_t amount ) { bool allocOK = true; while (allocOK && num_elem + amount >= array_size) { allocOK = twice(); assert( allocOK ); } num_elem += amount; } // expand /** Remove one item from the end of the array. */ void remove(void) { if (num_elem > 0) num_elem--; } }; // GrowableArray #endif packet/include/haar.h0100644000076400007640000001455707525053205013512 0ustar iankiank #ifndef _HAAR_H_ #define _HAAR_H_ #include #include "liftbase.h" /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ /** Haar (flat line) wavelet. As with all Lifting scheme wavelet transform functions, the first stage of a transform step is the split stage. The split step moves the even element to the first half of an N element region and the odd elements to the second half of the N element region. The Lifting Scheme version of the Haar transform uses a wavelet function (predict stage) that "predicts" that an odd element will have the same value as it preceeding even element. Stated another way, the odd element is "predicted" to be on a flat (zero slope line) shared with the even point. The difference between this "prediction" and the actual odd value replaces the odd element. The wavelet scaling function (a.k.a. smoothing function) used in the update stage calculates the average between an even and an odd element. The merge stage at the end of the inverse transform interleaves odd and even elements from the two halves of the array (e.g., ordering them even0, odd0, even1, odd1, ...) This is a template version of the Haar wavelet. The template must be instantiated with an array or an object that acts like an array. Objects that act like arrays define the left hand side and right hand side index operators: []. See www.bearcave.com for more information on wavelets and the wavelet lifting scheme. \author Ian Kaplan */ template class haar : public liftbase { protected: /** Haar predict step */ void predict( T& vec, int N, transDirection direction ) { int half = N >> 1; for (int i = 0; i < half; i++) { double predictVal = vec[i]; int j = i + half; if (direction == forward) { vec[j] = vec[j] - predictVal; } else if (direction == inverse) { vec[j] = vec[j] + predictVal; } else { printf("haar::predict: bad direction value\n"); } } } /** Update step of the Haar wavelet transform. The wavelet transform calculates a set of detail or difference coefficients in the predict step. These are stored in the upper half of the array. The update step calculates an average from the even-odd element pairs. The averages will replace the even elements in the lower half of the array. The Haar wavelet calculation used in the Lifting Scheme is
       dj+1, i = oddj+1, i = oddj, i - evenj, i
       aj+1, i = evenj, i = (evenj, i + oddj, i)/2
    
Note that the Lifting Scheme uses an in-place algorithm. The odd elements have been replaced by the detail coefficients in the predict step. With a little algebra we can substitute the coefficient calculation into the average calculation, which gives us
       aj+1, i = evenj, i = evenj, i + (oddj, i/2)
    
*/ void update( T& vec, int N, transDirection direction ) { int half = N >> 1; for (int i = 0; i < half; i++) { int j = i + half; double updateVal = vec[j] / 2.0; if (direction == forward) { vec[i] = vec[i] + updateVal; } else if (direction == inverse) { vec[i] = vec[i] - updateVal; } else { printf("update: bad direction value\n"); } } } /** The normalization step assures that each step of the wavelet transform has the constant "energy" where energy is defined as
    double energy = 0.0;
    for (int n = 0; n < N; n++) {
       energy = energy + (a[i] * a[i]);
    }
    
See 5.2.1 of Ripples in Mathematics by Jensen and la Cour-Harbo The most common implementation of the Haar transform leaves out the normalization step, since it does not make much of a difference in many cases. However, in the case of the wavelet packet transform, many of the cost functions are squares, so normalization produces smaller wavelet values (although the scaling function values are larger). This may lead to a better wavelet packet result (e.g., a few large values and lots of small values). Normalization does have the disadvantage of destroying the averaging property of the Haar wavelet algorithm. That is, the final scaling factor is no longer the mean of the time series. */ void normalize( T& vec, int N, transDirection direction ) { const double sqrt2 = sqrt( 2.0 ); int half = N >> 1; for (int i = 0; i < half; i++) { int j = i + half; if (direction == forward) { vec[i] = sqrt2 * vec[i]; vec[j] = vec[j]/sqrt2; } else if (direction == inverse) { vec[i] = vec[i]/sqrt2; vec[j] = sqrt2 * vec[j]; } else { printf("normalize: bad direction value\n"); } } // for } // normalize /** One inverse wavelet transform step, with normalization */ void inverseStep( T& vec, const int n ) { normalize( vec, n, inverse ); update( vec, n, inverse ); predict( vec, n, inverse ); merge( vec, n ); } // inverseStep /** One step in the forward wavelet transform, with normalization */ void forwardStep( T& vec, const int n ) { split( vec, n ); predict( vec, n, forward ); update( vec, n, forward ); normalize( vec, n, forward ); } // forwardStep }; // haar #endif packet/include/haar_classic.h0100644000076400007640000001054507525053227015210 0ustar iankiank #ifndef _HAAR_CLASSIC_H_ #define _HAAR_CLASSIC_H_ #include #include "liftbase.h" /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org)

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2001.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ /** A version of the classic Haar wavelet transform This particular version of the Haar wavelet transform is frequently given as the definition for the Haar transform. This version differs from the lifting scheme version. In the case of the lifting scheme version of the Haar transform, the inverse transform is a mirror of the forward transform. The only difference is that the plus and minus operators are interchanged. This algorithm does not have this symmetry. For a data set of N elements, a wavelet transform will calculate N/2 smoothed values and N/2 difference values. In wavelet terminology the smoothed values are calculated by the scaling function and the difference (or coefficient) values are calculated by the wavelet function. This class implements one version of the Haar wavelet transform. This particular version is used in the chapter 8 of Ripples in Mathematics by Jensen and la Cour-Harbo to illustrate the wavelet packet transform. I have used it to verify my version of the wavelet packet algorithm. In the description below, an element ai is an even element and an element bi is an odd element. In this version of the Haar wavelet transform the scaling (or smoothing) function is
     s = (a + b)/2
The wavelet function is
     d = (a - b)/2
A lifting scheme expression is used in this implementation. Here the wavelet function is calculated first. The wavelet results overwrite the odd bi values. This means that the smoothing function values must be calculated with the result of the wavelet function. To recover the value of bi we use the expression
     b = a - 2d

     s = (a + (a - 2d))/2

     s = (2a - 2d)/2

     s = a - d
The lifting scheme terminology is maintained in the algorithm, although it does not fully apply. This is a template version of the Haar wavelet. The template must be instantiated with an array or an object that acts like an array. Objects that act like arrays define the left hand side and right hand side index operators: []. See www.bearcave.com for more information on wavelets and the wavelet lifting scheme. \author Ian Kaplan */ template class haar_classic : public liftbase { protected: /** Calculate the Haar wavelet or difference function (high pass filter) */ void predict( T& vec, int N, transDirection direction ) { int half = N >> 1; int cnt = 0; for (int i = 0; i < half; i++) { double predictVal = vec[i]; int j = i + half; if (direction == forward) { vec[j] = (predictVal - vec[j] )/2; } else if (direction == inverse) { vec[j] = predictVal - (2 * vec[j]); } else { printf("haar_classic::predict: bad direction value\n"); } } } // predict /** Calculate the smoothing or scaling function (low pass filter) */ void update( T& vec, int N, transDirection direction ) { int half = N >> 1; for (int i = 0; i < half; i++) { int j = i + half; double updateVal = vec[j]; if (direction == forward) { vec[i] = vec[i] - updateVal; } else if (direction == inverse) { vec[i] = vec[i] + updateVal; } else { printf("update: bad direction value\n"); } } } // update }; // haar_classic #endif packet/include/haar_classicFreq.h0100644000076400007640000001103107525053246016016 0ustar iankiank #ifndef _HAAR_CLASSICFREQ_H_ #define _HAAR_CLASSICFREQ_H_ #include "haar_classic.h" /** haar_classicFreq An extension of the "Haar classic" algorithm for frequency analysis. The haar_classicFreq template extends the haar_classic templace. The haar_classic template implements what I call the "Haar classic" algorithm. Here the high pass filter (wavelet) is
     b'i = (ai - bi)/2
where ai is an even element and bi is it odd element neighbor (of course using a lifting scheme style implementation, the even elements are moved to the first half of the array and the odd elements are moved to the second half. In the Haar classic algorithm the high pass result is placed in the upper half of the array. In the haar_classicFreq version the result is placed in the lower half of the array and the equation becomes
     a'i = (ai - bi)/2
The "Haar classic" low pass filter (smoothing function) is
     a'i = (ai + bi)/2
In the Haar classic algorithm the low pass filter result is placed in the lower half of the array. In the haar_classicFreq version the result is placed in the upper half of the array and the equation becomes
     b'i = (ai + bi)/2
The calculation of the high pass filter is done first and overwrites the even elements (e.g., a'i). To recover the ai values given a'i and bi:
     a'i = (ai - bi)/2
     2 * a'i = ai - bi
     ai = 2 * a'i + bi
Substituting this into the equation for calculating b'i we get:
     b'i = ((2 * a'i + bi) + bi)/2
     b'i = (2 * a'i + 2 * bi)/2
     b'i = a'i + bi
These equations differ from the Haar classic forward transform equations. \author Ian Kaplan */ template class haar_classicFreq : public haar_classic { protected: /** In the standard wavelet transform, the high pass filter is applied to the upper half of the array (this is the predict phase, in lifting scheme terminology). In the reverse transform step, which is used for wavelet frequency analysis, the high pass filter is applied to the lower half of the array. */ void predictRev( T& vec, int N, transDirection direction ) { int half = N >> 1; int cnt = 0; for (int i = 0; i < half; i++) { int j = i + half; if (direction == forward) { vec[i] = (vec[i] - vec[j] )/2; } else if (direction == inverse) { vec[i] = (2 * vec[i]) + vec[j]; } else { printf("predictRev: bad direction value\n"); } } } // predictRev /** Reverse low pass filter In the standard wavelet transform the low pass filter is applied to the data set (consisting of N elements) and the result is placed in the lower half of the array (the lower N/2 elements). In the reverse transform step, which is used for wavelet frequency analysis, the result of the low pass filter is placed in the upper half of the array (the upper N/2 elements). */ void updateRev( T& vec, int N, transDirection direction ) { int half = N >> 1; for (int i = 0; i < half; i++) { int j = i + half; if (direction == forward) { vec[j] = vec[j] + vec[i]; } else if (direction == inverse) { vec[j] = vec[j] - vec[i]; } else { printf("updateRev: bad direction value\n"); } } } // updateRev public: /** One forward step of the reverse Haar classic transform, where the results for the high and low pass filters are reversed. */ void forwardStepRev( T& vec, const int n ) { split( vec, n ); predictRev( vec, n, forward ); updateRev( vec, n, forward ); } /** One inverse step of the reverse Haar classic transform, where the results for the high and low pass filters are reversed. */ void inverseStepRev( T& vec, const int n ) { updateRev( vec, n, inverse ); predictRev( vec, n, inverse ); merge( vec, n ); } }; // haar_classicFreq #endif packet/include/invpacktree.h0100644000076400007640000000632607525053262015110 0ustar iankiank #ifndef _INVPACKTREE_H_ #define _INVPACKTREE_H_ /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include "liftbase.h" #include "list.h" #include "packcontainer.h" #include "packdata.h" #include "packdata_list.h" /** Inverse wavelet packet transform The invpacktree constructor is passed a packdata_list object and a wavelet transform object. It calculates the inverse wavelet packet transform, using the data in the packdata_list object and the inverse wavelet transform step function of the wavelet transform object. The best basis data is destroyed in calculating the inverse transform. The packdata_list object contains the "best basis" result from a wavelet packet transform. The wavelet packet transform should have been calculated with the same wavelet transform as the object passed to this constructor. After the constructor completes, the data result can be obtained by calling the getData() function. The wavelet transforms used by this object are all derived from the liftbase class and are "lifting scheme" wavelet transforms. I have found the wavelet literature difficult, in general. When it comes to the wavelet packet transform I have found most of it impossible to understand. Impossible, that it until I got the book Ripples in Mathematics by Jensen and la Cour-Harbo, Springer Verlag, 2001. The wavelet packet transform, for which this class is the inverse, is heavily based on Chapter 8 of Ripples in Mathematics. I have found very little material on the actual implementation of the inverse wavelet packet transform. This algorithm is my own design. \author Ian Kaplan */ class invpacktree { private: /** wavelet transform object */ liftbase *waveObj; /** disallow the copy constructor */ invpacktree( const invpacktree &rhs ) {} /** inverse wavelet packet transform calculation stack */ LIST stack; /** pointer to the inverse transform result */ const double *data; /** length of data */ size_t N; private: void new_level( packdata *elem ); void add_elem( packdata *elem ); void reduce(); public: invpacktree( packdata_list &list, liftbase *w ); /** The destructor does nothing */ ~invpacktree() {} /** Get the result of the inverse packet transform */ const double *getData() { return data; } void pr(); }; #endif packet/include/liftbase.h0100644000076400007640000002307407525053311014360 0ustar iankiank #ifndef _LIFTBASE_H_ #define _LIFTBASE_H_ /** \file Copyright and Use You may use this source code without limitation and without fee as long as you include:
This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.
This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International. Please send any bug fixes or suggested source changes to:
     iank@bearcave.com
@author Ian Kaplan */ #include /** This is the base class for simple Lifting Scheme wavelets using split, predict, update or update, predict, merge steps. Simple lifting scheme wavelets consist of three steps, a split/merge step, predict step and an update step:
  • The split step divides the elements in an array so that the even elements are in the first half and the odd elements are in the second half.

  • The merge step is the inverse of the split step. It takes two regions of an array, an odd region and an even region and merges them into a new region where an even element alternates with an odd element.

  • The predict step calculates the difference between an odd element and its predicted value based on the even elements. The difference between the predicted value and the actual value replaces the odd element.

  • The predict step operates on the odd elements. The update step operates on the even element, replacing them with a difference between the predict value and the actual odd element. The update step replaces each even element with an average. The result of the update step becomes the input to the next recursive step in the wavelet calculation.

The split and merge methods are shared by all Lifting Scheme wavelet algorithms. This base class provides the transform and inverse transform methods (forwardTrans and inverseTrans). The predict and update methods are abstract and are defined for a particular Lifting Scheme wavelet sub-class. This is a template version of the lifting scheme base class. The template must be instantiated with an array or an object that acts like an array. Objects that act like arrays define the left hand side and right hand side index operators: []. To allow wavelet transforms based on this base class to be used with the wavelet packet transform, this class makes public both the forward and inverse transforms (forwardTrans and inverseTrans) and the forward and inverse transform steps (forwardStep and inverseStep). These "step" functions are used to calculate the wavelet packet transform. Instantiating the Template The liftbase template takes two type arguments:
  1. The type of the array or '[]' operator indexable object.
  2. The type of the data element.
The simplest example is a wavelet class derived from an instance of the liftbase tempate which takes a double array and has a double element type. This declaration is shown below:
  class Haar : public liftbase
  
An object type can be used for the first template argument, as long as the object supports the '[]' operator, which returns an element whose type is defined by the second argument. In the example below, the packcontainer '[]' operator returns a double.
  class Poly : public liftbase
  
References: \author Ian Kaplan */ template class liftbase { protected: typedef enum { /** "enumeration" for forward wavelet transform */ forward = 1, /** "enumeration" for inverse wavelet transform */ inverse = 2 } transDirection; /** Split the vec into even and odd elements, where the even elements are in the first half of the vector and the odd elements are in the second half. */ void split( T& vec, int N ) { int start = 1; int end = N - 1; while (start < end) { for (int i = start; i < end; i = i + 2) { T_elem tmp = vec[i]; vec[i] = vec[i+1]; vec[i+1] = tmp; } start = start + 1; end = end - 1; } } /** Merge the odd elements from the second half of the N element region in the array with the even elements in the first half of the N element region. The result will be the combination of the odd and even elements in a region of length N. */ void merge( T& vec, int N ) { int half = N >> 1; int start = half-1; int end = half; while (start > 0) { for (int i = start; i < end; i = i + 2) { T_elem tmp = vec[i]; vec[i] = vec[i+1]; vec[i+1] = tmp; } start = start - 1; end = end + 1; } } /** Predict step, to be defined by the subclass @param vec input array @param N size of region to act on (from 0..N-1) @param direction forward or inverse transform */ virtual void predict( T& vec, int N, transDirection direction ) = 0; /** Reverse predict step. The predict step applied the high pass filter to the data set and places the result in the upper half of the array. The reverse predict step applies the high pass filter and places the result in the lower half of the array. This reverse predict step is only used by wavelet packet frequency analysis algorithms. The default version of this algorihtm does nothing. */ virtual void predictRev( T& vec, int N, transDirection direction ) {}; /** Update step, to be defined by the subclass @param vec input array @param N size of region to act on (from 0..N-1) @param direction forward or inverse transform */ virtual void update( T& vec, int N, transDirection direction ) = 0; /** Reverse update step */ virtual void updateRev( T& vec, int N, transDirection direction ) {} public: /** One step in the forward wavelet transform */ virtual void forwardStep( T& vec, const int n ) { split( vec, n ); predict( vec, n, forward ); update( vec, n, forward ); } // forwardStep /** Reverse forward transform step. The result of the high pass filter is stored in the lower half of the array and the result of the low pass filter is stored in the upper half. This function should be defined by any subclass that is used for wavelet frequency analysis. */ virtual void forwardStepRev( T& vec, const int N ) { assert(false); } /** Simple wavelet Lifting Scheme forward transform forwardTrans is passed an indexable object. The object must contain a power of two number of data elements. Lifting Scheme wavelet transforms are calculated in-place and the result is returned in the argument array. The result of forwardTrans is a set of wavelet coefficients ordered by increasing frequency and an approximate average of the input data set in vec[0]. The coefficient bands follow this element in powers of two (e.g., 1, 2, 4, 8...). */ virtual void forwardTrans( T& vec, const int N ) { for (int n = N; n > 1; n = n >> 1) { forwardStep( vec, n ); } } // forwardTrans /** One inverse wavelet transform step */ virtual void inverseStep( T& vec, const int n ) { update( vec, n, inverse ); predict( vec, n, inverse ); merge( vec, n ); } /** Reverse inverse transform step. Calculate the inverse transform from a high pass filter result stored in the lower half of the array and a low pass filter result stored in the upper half. This function should be defined by any subclass that is used for wavelet frequency analysis. */ virtual void inverseStepRev( T& vec, const int n ) { assert( false ); } /** Default two step Lifting Scheme inverse wavelet transform inverseTrans is passed the result of an ordered wavelet transform, consisting of an average and a set of wavelet coefficients. The inverse transform is calculated in-place and the result is returned in the argument array. */ virtual void inverseTrans( T& vec, const int N ) { for (int n = 2; n <= N; n = n << 1) { inverseStep( vec, n ); } } // inverseTrans }; // liftbase #endif packet/include/line.h0100644000076400007640000002003707525053337013522 0ustar iankiank #ifndef _LINE_H_ #define _LINE_H_ #include "liftbase.h" /** Line (with slope) wavelet The wavelet Lifting Scheme "line" wavelet approximates the data set using a line with with slope (in contrast to the Haar wavelet where a line has zero slope is used to approximate the data). The predict stage of the line wavelet "predicts" that an odd point will lie midway between its two neighboring even points. That is, that the odd point will lie on a line between the two adjacent even points. The difference between this "prediction" and the actual odd value replaces the odd element. The update stage calculates the average of the odd and even element pairs, although the method is indirect, since the predict phase has over written the odd value.

Copyright and Use

You may use this source code without limitation and without fee as long as you include:
This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2001.
This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International. Please send any bug fixes or suggested source changes to:
     iank@bearcave.com
\author Ian Kaplan */ template class line : public liftbase { private: /** Calculate an extra "even" value for the line wavelet algorithm at the end of the data series. Here we pretend that the last two values in the data series are at the x-axis coordinates 0 and 1, respectively. We then need to calculate the y-axis value at the x-axis coordinate 2. This point lies on a line running through the points at 0 and 1. Given two points, x1, y1 and x2, y2, where
        x1 = 0
        x2 = 1
     
calculate the point on the line at x3, y3, where
        x3 = 2
     
The "two-point equation" for a line given x1, y1 and x2, y2 is
     .          y2 - y1
     (y - y1) = -------- (x - x1)
     .          x2 - x1
     
Solving for y
     .    y2 - y1
     y = -------- (x - x1) + y1
     .    x2 - x1
     
Since x1 = 0 and x2 = 1
     .    y2 - y1
     y = -------- (x - 0) + y1
     .    1 - 0
     
or
     y = (y2 - y1)*x + y1
     
We're calculating the value at x3 = 2, so
     y = 2*y2 - 2*y1 + y1
     
or
     y = 2*y2 - y1
     
*/ double new_y( double y1, double y2) { double y = 2 * y2 - y1; return y; } protected: /** Predict phase of line Lifting Scheme wavelet The predict step attempts to "predict" the value of an odd element from the even elements. The difference between the prediction and the actual element is stored as a wavelet coefficient. The "predict" step takes place after the split step. The split step will move the odd elements (bj) to the second half of the array, leaving the even elements (ai) in the first half
    a0, a1, a1, a3, b0, b1, b2, b2, 
    
The predict step of the line wavelet "predicts" that the odd element will be on a line between two even elements.
    bj+1,i = bj,i - (aj,i + aj,i+1)/2
    
Note that when we get to the end of the data series the odd element is the last element in the data series (remember, wavelet algorithms work on data series with 2n elements). Here we "predict" that the odd element will be on a line that runs through the last two even elements. This can be calculated by assuming that the last two even elements are located at x-axis coordinates 0 and 1, respectively. The odd element will be at 2. The new_y() function is called to do this simple calculation. */ void predict( T& vec, int N, transDirection direction ) { int half = N >> 1; double predictVal; for (int i = 0; i < half; i++) { int j = i + half; if (i < half-1) { predictVal = (vec[i] + vec[i+1])/2; } else if (N == 2) { predictVal = vec[0]; } else { // calculate the last "odd" prediction double n_plus1 = new_y( vec[i-1], vec[i] ); predictVal = (vec[i] + n_plus1)/2; } if (direction == forward) { vec[j] = vec[j] - predictVal; } else if (direction == inverse) { vec[j] = vec[j] + predictVal; } else { printf("predictline::predict: bad direction value\n"); } } } // predict /** Update step of the linear interpolation wavelet The predict phase works on the odd elements in the second half of the array. The update phase works on the even elements in the first half of the array. The update phase attempts to preserve the average. After the update phase is completed the average of the even elements should be approximately the same as the average of the input data set from the previous iteration. The result of the update phase becomes the input for the next iteration. In a Haar wavelet the average that replaces the even element is calculated as the average of the even element and its associated odd element (e.g., its odd neighbor before the split). This is not possible in the line wavelet since the odd element has been replaced by the difference between the odd element and the mid-point of its two even neighbors. As a result, the odd element cannot be recovered. The value that is added to the even element to preserve the average is calculated by the equation shown below. This equation is given in Wim Sweldens' journal articles and his tutorial (Building Your Own Wavelets at Home) and in Ripples in Mathematics. A somewhat more complete derivation of this equation is provided in Ripples in Mathematics by A. Jensen and A. la Cour-Harbo, Springer, 2001. The equation used to calculate the average is shown below for a given iteratin i. Note that the predict phase has already completed, so the odd values belong to iteration i+1.
  eveni+1,j = eveni,j op (oddi+1,k-1 + oddi+1,k)/4
    
There is an edge problem here, when i = 0 and k = N/2 (e.g., there is no k-1 element). We assume that the oddi+1,k-1 is the same as oddk. So for the first element this becomes
      (2 * oddk)/4
    
or
      oddk/2
    
*/ void update( T& vec, int N, transDirection direction ) { int half = N >> 1; for (int i = 0; i < half; i++) { int j = i + half; double val; if (i == 0) { val = vec[j]/2.0; } else { val = (vec[j-1] + vec[j])/4.0; } if (direction == forward) { vec[i] = vec[i] + val; } else if (direction == inverse) { vec[i] = vec[i] - val; } else { printf("update: bad direction value\n"); } } // for } }; // line #endif packet/include/list.h0100644000076400007640000001024307467260340013543 0ustar iankiank #ifndef _LIST_H_ #define _LIST_H_ /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ /** template class LIST This is a generic list type. It should be instantiated with a scalar type, like an integer or a pointer to a larger type (e.g., a string or a structure). For example
   
      LIST list;
      LIST list;
The list "links" are allocated in a memory pool. This allocation is handled by the local version of new in list_type. The memory allocated for the list_type objects will be deallocated when the memory pool is freed. */ template class LIST { public: /** List backbone class */ class list_type { public: /** list data element */ T data; /** pointer to the next element in the list */ list_type *next; /** override the default new operator to allocate list_type objects from the a memory pool */ void *operator new(size_t num_bytes) { block_pool mem_pool; void *mem_addr = mem_pool.pool_alloc( num_bytes ); return mem_addr; } // new }; // class list_type private: /** list head */ list_type *list; public: /** define a handle type to abstract the list_type type */ typedef list_type *handle; public: /** class constructor */ LIST(void) { list = 0; } /** The copy constructor copies the list pointer */ LIST( const LIST &rhs ) { list = rhs.list; } /** destructor does nothing */ ~LIST() {} /** deallocate the list */ void dealloc(void) { while ( remove() != 0 ) /* nada */; } // dealloc /** Add an element to the list */ void add( T data ) { list_type *t; t = new list_type(); t->data = data; t->next = 0; if (list == 0) { list = t; } else { t->next = list; list = t; } } // add /** reverse the list */ void reverse(void) { list_type *revlist = 0; list_type *next; for (list_type *t = list; t != 0; t = next) { next = t->next; t->next = revlist; revlist = t; } list = revlist; } // reverse /** return the lenght of the list */ unsigned int length(void) { list_type *elem; unsigned int cnt = 0; for (elem = list; elem != 0; elem = elem->next) cnt++; return cnt; } // lenght /** remove Remove an element from the start of the list and return the first element of the remaining list. This function relies on the fact that the list elements were allocated from a pool. The memory for these elements will be recovered when the pool is deallocated. */ handle remove(void) { list_type *t; if (list != 0) { t = list; list = t->next; // no delete t; } return list; } // remove /** given a handle, return the associated data item */ T get_item( handle h) { return h->data; } // get_item /** get the first element from the list */ handle first(void) { return list; } // first /** iterator to get the next element */ handle next(handle h) { list_type *next = 0; if (h != 0) { next = h->next; } return next; } // next }; // template class LIST #endif packet/include/packcontainer.h0100644000076400007640000001130010176075345015404 0ustar iankiank #ifndef _PACKCONTAINER_H_ #define _PACKCONTAINER_H_ #include "packnode.h" /** The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ /** A container for use when calculating a packet wavelet tree. By overriding the LHS and RHS versions of the [] operator, packcontainer class allows a block of data to be treated as an array while a wavelet transform step is being calculated. After the wavelet transform step the data can be referenced as a left hand side half (the result of the wavelet scaling function) and a right hand side half (the result of the wavelet function). By allowing the two halves of the array to be referenced, copying is avoided. */ class packcontainer { private: /** number of elements at this packet tree level */ size_t N; /** left (low pass) half of the packcontainer data */ double* lhs; /** right (high pass) half of the packnode data */ double* rhs; private: /** disallow the copy constructor */ packcontainer( const packcontainer &rhs ) {}; /** disallow default constructor */ packcontainer() {}; public: /** This version of teh packcontainer object is used as a container in calculating the forward wavelet packet transform. The packcontainer constructor is passed a pointer to a packnode object. As the wavelet packet tree is being built this packnode object contain the data from the previous level. The length of the packnode object is N. The constructor will dynamically allocate two vectors (lhs and rhs), each with N/2 elements. After the wavelet transform step has been calculated on the packcontainer object, the lhs vector will contain the wavelet scaling function, or low pass, result. The rhs vector will contain the wavelet function, or high pass, result. These will be used to construct two new packnode objects which will be children of the object passed to the constructor. */ packcontainer( packnode* node ) { assert( node != 0 ); N = node->length(); assert( N > 1 ); size_t half = N >> 1; block_pool mem_pool; size_t num_bytes = half * sizeof(double); lhs = (double *)mem_pool.pool_alloc( num_bytes ); rhs = (double *)mem_pool.pool_alloc( num_bytes ); for (size_t i = 0; i < N; i++) { (*this)[i] = (*node)[i]; } } // packcontainer /** This version is used when calculating the inverse wavelet packet transform. The constructor is passed the size of the container (or at least the size that the container will be, when the left and right hand size arrays are initialized). The lhs and rhs arrays are then initialized and the inverse transform step is calculated. */ packcontainer( size_t n ) { N = n; lhs = 0; rhs = 0; } /** This is a local implementation of new. When new is applied to a packcontainer object, memory will be allocated from a memory pool, rather than from the system memory pool. */ void *operator new( unsigned int num_bytes ) { block_pool mem_pool; void *mem_addr = mem_pool.pool_alloc( num_bytes ); return mem_addr; } // new /** LHS [] operator */ double &operator[]( const size_t i ) { assert( i < N ); size_t half = N >> 1; if (i < half) return lhs[i]; else { return rhs[i-half]; } } /** RHS [] operator */ double operator[]( const size_t i ) const { assert( i < N ); size_t half = N >> 1; if (i < half) return lhs[i]; else { return rhs[i-half]; } } /** return the left hand size array */ double* lhsData() { return lhs; } /** return the right hand size array */ double* rhsData() { return rhs; } /** set the left hand size array */ void lhsData(double* l) { lhs = l; } /** set the right hand size array */ void rhsData(double* r) { rhs = r; } /** return the length of the data in the packet container. Note that this length is the length of the rhs plus the length of the lhs arrays. */ size_t length() { return N; } }; // packcontainer #endif packet/include/packdata.h0100644000076400007640000000612607525053412014340 0ustar iankiank #ifndef _PACKDATA_H_ #define _PACKDATA_H_ /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include "blockpool.h" /** The packdata class is a container for the core information for a wavelet packet transform node. This class serves as the base class for the packnode class. It is also the element used in the list that results from the wavelet packet transform. This list represents the data in a minimal for, relative to the wavelet packet transform cost function. \author Ian Kaplan */ template class packdata { private: /** Disallow the copy constructor */ packdata( const packdata &rhs ) {} public: typedef enum { BadNodeKind, OriginalData, LowPass, HighPass } transformKind; protected: /** Kind of data: original data, result of the low pass filer (wavelet scaling function), result of the high pass filter (wavelet function) */ transformKind kind; /** number of elements at this packet tree level */ size_t N; /** Wavelet packet data */ T* data; /** default constructor */ packdata() {} public: /** \arg vec a pointer to an array of type T elements \arg n the size of the array of type T elements \arg k the kind of data (e.g., original data, low pass result, high pass result. */ packdata( T *vec, const size_t n, const transformKind k ) { data = vec; N = n; kind = k; } /** define a virtual destructure which in the base class */ virtual ~packdata() {} /** Overload the standard new operator and allocate memory from the memory pool. */ void *operator new( unsigned int num_bytes ) { block_pool mem_pool; void *mem_addr = mem_pool.pool_alloc( num_bytes ); return mem_addr; } // new /** print the data */ void pr() const { for (int i = 0; i < N; i++) { printf("%7.4f ", data[i] ); } printf("\n"); } // pr /** get a pointer to the data */ const T* getData() { return data; } /** Return the "kind" of data (e.g., original data, low pass result, high pass result). */ const transformKind getKind() { return kind; } /** return the length of the array in the packdata object */ size_t length() { return N; } }; // packdata #endif packet/include/packdata_list.h0100644000076400007640000000356407525053460015401 0ustar iankiank #ifndef _PACKDATA_LIST_H_ #define _PACKDATA_LIST_H_ #include "fifo_list.h" #include "packdata.h" /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
\author Ian Kaplan */ /** The packdata_list class is based on a subclass built from a FIFO_LIST instance of the FIFO_LIST template. The packdata_list is constructed by traversing the wavelet packet tree depth first, left to right. New elements are added to the end of the list, ordering the list from front to back. The resulting list reflects the ordering of the wavelet packet tree nodes the make up the best basis. This class extends the FIFL_LIST instance by adding a print function. \author Ian Kaplan */ template class packdata_list : public FIFO_LIST *> { public: /** Print the packet data list. Each list element (which is a wavelet packet data set) is printed one element per line. */ void pr() { handle h; packdata *elem; for (h = first(); h != 0; h = next( h )) { elem = get_item( h ); elem->pr(); } // for h printf("\n"); } // pr }; // packdata_list #endif packet/include/packfreq.h0100644000076400007640000000516607525053515014373 0ustar iankiank #ifndef _PACKFREQ_H_ #define _PACKFREQ_H_ #include "packnode.h" #include "packcontainer.h" #include "packtree_base.h" #include "liftbase.h" #include "grow_array.h" /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
\author Ian Kaplan */ /** Build a wavelet packet tree for frequency analysis. Wavelet frequency analysis uses a modified wavelet packet tree. Horizontal slices through the modified wavelet packet tree (the so called "level basis") are ordered in increasing frequency regions. This class and the standard wavelet packet tree class are derived from the same base class. The standard wavelet class includes functions to calculate a minimal data representation relative to a cost function. The constructor for this class is passed two arguments:
  1. A vector of doubles containing the data set (e.g., the signal). The length of the vector must be a power of two.
  2. A pointer to a wavelet lifting scheme class that will be used in calculating the wavelet transform step.
If the vector passed to the constructor contains N double values, the result of the constructor will be a wavelet packet tree with log2(N) levels. \author Ian Kaplan */ class packfreq : public packtree_base { private: /** Level basis matrix */ GrowableArray *> mat; void findLevel( packnode* top, size_t cur_level, const size_t level ); protected: /** disallow the copy constructor */ packfreq( const packfreq &rhs ) {}; /** disallow the default constructor */ packfreq() {}; public: packfreq( const double *vec, const size_t n, liftbase *w ); /** destructor does nothing */ ~packfreq() {} void getLevel( const size_t level ); void plotMat(const size_t N); void prMat(); }; // packfreq #endif packet/include/packnode.h0100644000076400007640000000744407521557425014371 0ustar iankiank #ifndef _PACKNODE_H_ #define _PACKNODE_H_ #include "packdata.h" /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ /** A wavelet packet tree node A description of the wavelet packet algorithm can be found in Chapter 8 of Ripples in Mathematics by Jensen and la Cour-Harbo. For a data set consisting of N data elements, the wavelet packet algorithm will build a binary tree with log2(N) levels. Since it is a binary tree, the number of nodes doubles at each level. At the same time, the amount of data that is stored in each node is halved. A node will have n data elements. The two children will each have n/2 elements, stored in packnode children. A pointer to the data vector for the node and the length of the data is set by the class constructor. Once the wavelet packet tree is built a cost value is assigned to each node in the tree. */ template class packnode : public packdata { private: /** left child (with N/2) data elements */ packnode* leftChild; /** right child (with N/2) data elements */ packnode* rightChild; /** cost value for this level */ T costVal; /** chosen == true: node is part of the best basis of the wavelet transform, otherwise, false. */ bool chosen; private: /** disallow the copy constructor */ packnode( const packnode &rhs ) {}; /** disallow default constructor */ packnode() {}; public: /** Packnode constructor */ packnode( T *vec, const size_t n, const transformKind k ) : packdata(vec, n, k) { leftChild = 0; rightChild = 0; costVal = 0.0; chosen = false; } /** LHS [] operator */ T &operator[]( const size_t i ) { assert( i < N ); return data[i]; } /** RHS [] operator */ T operator[]( const size_t i ) const { assert( i < N ); return data[i]; } /** print the cost value */ void prCost() const { printf("%7.4f\n", costVal ); } /** if the node is selected as part of the best basis function, print it. */ void prBestBasis() const { for (int i = 0; i < N; i++) { printf("%7.4f ", data[i] ); } if (chosen) { printf(" *"); } printf("\n"); } // prBestBasis /** set the left child pointer */ void lhsChild( packnode *l ) { leftChild = l; } /** get the left child pointer */ packnode *lhsChild(void) { return leftChild; } /** set the right child pointer */ void rhsChild( packnode *r ) { rightChild = r; } /** get the right child pointer */ packnode *rhsChild(void) { return rightChild; } /** set the cost value for the node */ void cost( T val ) { costVal = val; } /** get the cost value for the node */ T cost(void) { return costVal; } /** the "chosen" flag marks a node for inclusion in the best basis set. */ void mark( bool b ) { chosen = b; } /** return the value of the "mark" boolean flag */ bool mark() { return chosen; } }; // packnode #endif packet/include/packtree.h0100644000076400007640000000501107515163704014363 0ustar iankiank #ifndef _PACKTREE_H_ #define _PACKTREE_H_ #include "packtree_base.h" #include "packdata_list.h" #include "packcontainer.h" #include "liftbase.h" /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ /** The packtree object constructs a wavelet packet tree The constructor is passed a vector of doubles, the length of the vector (which must be a power of two) and a pointer to a wavelet lifting scheme class that will be used in calculating the wavelet transform step. If the vector passed to the constructor contains N double vaues, the result of the constructor will be a wavelet packet tree with log2(N) levels. */ class packtree : public packtree_base { private: /** Found original data marked as part of the best basis. This means that the best basis function failed (or that the original data is the most compact representation relative to the cost function used). */ bool foundOriginalData; /** found a best basis value in the wavelet packet tree */ bool foundBestBasisVal; private: /** disallow the copy constructor */ packtree( const packtree &rhs ) {}; /** disallow the default constructor */ packtree() {}; double bestBasisWalk( packnode *root ); void buildBestBasisList( packnode *root, packdata_list &list ); void checkBestBasis( packnode *root ); void cleanTree(packnode *root, bool removeMark ); public: packtree( const double *vec, const size_t n, liftbase *w ); /** destructor does nothing */ ~packtree() {} void prCost(); void prBestBasis(); void bestBasis(); bool bestBasisOK(); packdata_list getBestBasisList(); }; // packtree #endif packet/include/packtree_base.h0100644000076400007640000000317510176075625015367 0ustar iankiank #ifndef _PACKTREE_BASE_H_ #define _PACKTREE_BASE_H_ /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
\author Ian Kaplan */ #include "packnode.h" #include "liftbase.h" /** Base class for wavelet packet trees. Subclasses for this class include classes to built wavelet packet trees for best basis calculation and wavelet packet trees for frequency analysis. \author Ian Kaplan */ class packtree_base { protected: /** root of the wavelet packet tree */ packnode *root; /** wavelet packet transform object */ liftbase *waveObj; typedef enum { BadPrintKind, printData, printCost, printBestBasis } printKind; void breadthFirstPrint(printKind kind); void newLevel( packnode* top, bool freqCalc, bool reverse ); public: void pr(); /** get the root of the wavelet packet tree */ packnode *getRoot() { return root; } }; // packtree_base #endif packet/include/queue.h0100644000076400007640000000607607525053631013723 0ustar iankiank #ifndef _QUEUE_H_ #define _QUEUE_H_ #include "fifo_list.h" #include "packnode.h" /** \file This file defines a queue (FIFO) object for use in breadth first tree traversal of a wavelet packet tree. See chapter 8 of Ripples in Mathematics by Jensen and la Cour-Harbo for a description of the wavelet packet algorithm. The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ /** A queue element. This class stores a pointer to a wavelet packet tree node (a packnode) and the indentation (in spaces) to be used when printing the tree. \author Ian Kaplan */ template class queueElem { private: /** disallow the default constructor */ queueElem() {} public: packnode *node; size_t indent; /** Initialize the queue element */ queueElem( packnode *n, size_t i ) { node = n; indent = i; } /** allocate queueElem objects from a memory pool */ void *operator new(size_t num_bytes) { block_pool mem_pool; void *mem_addr = mem_pool.pool_alloc( num_bytes ); return mem_addr; } // new }; // queueElem /** The queue class extends the FIFO_LIST template (which in this case is instantiated with queueElem *. This class is designed to support breadth first printing of a wavelet packet tree. \author Ian Kaplan */ template class queue : protected FIFO_LIST *> { public: /** Get the first element in the queue */ queueElem *queueStart() { handle h = first(); queueElem *elem = get_item( h ); return elem; } // queueStart /** Remove the element at the start of the list. This function does not actually call delete to recover the object. It relies on the fact that the FIFO_LIST template uses pool allocation and the memory will be recovered when the pool is deallocated. */ void deleteStart() { handle h = first(); if (h != 0) { queueElem *elem = get_item( h ); remove(); // no delete elem; } } // deleteStart /** Add an element to the queue */ void addQueue(packnode *node, size_t indent ) { queueElem *elem = new queueElem(node, indent); add( elem ); } // addQueue /** return true if the queue is empty */ bool queueEmpty() { return (first() == 0); } }; // queue #endif packet/include/packcontainer.h~0100644000076400007640000001157007515162100015600 0ustar iankiank #ifndef _PACKCONTAINER_H_ #define _PACKCONTAINER_H_ #include "packnode.h" /** The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ /** A container for use when calculating a packet wavelet tree. By overriding the LHS and RHS versions of the [] operator, packcontainer class allows a block of data to be treated as an array while a wavelet transform step is being calculated. After the wavelet transform step the data can be referenced as a left hand side half (the result of the wavelet scaling function) and a right hand side half (the result of the wavelet function). By allowing the two halves of the array to be referenced, copying is avoided. */ class packcontainer { private: /** number of elements at this packet tree level */ size_t N; /** left (low pass) half of the packcontainer data */ double* lhs; /** right (high pass) half of the packnode data */ double* rhs; private: /** disallow the copy constructor */ packcontainer( const packcontainer &rhs ) {}; /** disallow default constructor */ packcontainer() {}; public: /** This version of teh packcontainer object is used as a container in calculating the forward wavelet packet transform. The packcontainer constructor is passed a pointer to a packnode object. As the wavelet packet tree is being built this packnode object contain the data from the previous level. The length of the packnode object is N. The constructor will dynamically allocate two vectors (lhs and rhs), each with N/2 elements. After the wavelet transform step has been calculated on the packcontainer object, the lhs vector will contain the wavelet scaling function, or low pass, result. The rhs vector will contain the wavelet function, or high pass, result. These will be used to construct two new packnode objects which will be children of the object passed to the constructor. */ packcontainer( packnode* node ) { assert( node != 0 ); N = node->length(); assert( N > 1 ); size_t half = N >> 1; block_pool mem_pool; size_t num_bytes = half * sizeof(double); lhs = (double *)mem_pool.pool_alloc( num_bytes ); rhs = (double *)mem_pool.pool_alloc( num_bytes ); for (size_t i = 0; i < N; i++) { (*this)[i] = (*node)[i]; } } // packcontainer /** This version is used when calculating the inverse wavelet packet transform. The constructor is passed the size of the container (or at least the size that the container will be, when the left and right hand size arrays are initialized). The lhs and rhs arrays are then initialized and the inverse transform step is calculated. */ packcontainer( size_t n ) { N = n; lhs = 0; rhs = 0; } /** This is a local implementation of new. When new is applied to a packcontainer object, memory will be allocated from a memory pool, rather than from the system memory pool. */ void *operator new( unsigned int num_bytes ) { block_pool mem_pool; void *mem_addr = mem_pool.pool_alloc( num_bytes ); return mem_addr; } // new /** LHS [] operator */ double &operator[]( const size_t i ) { assert( i < N ); size_t half = N >> 1; if (i < half) return lhs[i]; else { return rhs[i-half]; } } /** RHS [] operator */ double operator[]( const size_t i ) const { assert( i < N ); size_t half = N >> 1; if (i < half) return lhs[i]; else { return rhs[i-half]; } } /** return the left hand size array */ double* lhsData() { return lhs; } /** return the right hand size array */ double* rhsData() { return rhs; } /** set the left hand size array */ void lhsData(double* l) { lhs = l; } /** set the right hand size array */ void rhsData(double* r) { rhs = r; } /** return the length of the data in the packet container. Note that this length is the length of the rhs plus the length of the lhs arrays. */ size_t length() { return N; } }; // packcontainer #endif packet/include/packtree_base.h~0100644000076400007640000000331007525053573015556 0ustar iankiank #ifndef _PACKTREE_BASE_H_ #define _PACKTREE_BASE_H_ /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
\author Ian Kaplan */ #include "packnode.h" #include "liftbase.h" /** Base class for wavelet packet trees. Subclasses for this class include classes to built wavelet packet trees for best basis calculation and wavelet packet trees for frequency analysis. \author Ian Kaplan */ class packtree_base { protected: /** root of the wavelet packet tree */ packnode *root; /** wavelet packet transform object */ liftbase *waveObj; typedef enum { BadPrintKind, printData, printCost, printBestBasis } printKind; void breadthFirstPrint(printKind kind); void newLevel( packnode* top, bool freqCalc, bool reverse ); public: void pr(); /** get the root of the wavelet packet tree */ packnode *getRoot() { return root; } }; // packtree_base #endif packet/lossless/0040755000076400007640000000000007525263472012652 5ustar iankiankpacket/lossless/include/0040755000076400007640000000000007525060126014264 5ustar iankiankpacket/lossless/include/costbase_int.h0100644000076400007640000000514107523327722017116 0ustar iankiank #ifndef _COSTBASE_INT_H_ #define _COSTBASE_INT_H_ #include "packnode.h" /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:
This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.
This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International. Please send any bug fixes or suggested source changes to:
     iank@bearcave.com
@author Ian Kaplan */ /** Base class for objects that define integer costs functions for an integer version of the wavelet packet transform. The costbase base class provides a constructor that is passed the root of an integer wavelet packet tree (which is built by packtree_int.cpp). The integer wavelet packet tree is constructed from packnode objects (which are a subclass of the packdata). The cost function calculation invoked by the constructor traverses the wavelet packet tree (top down) and calls costCalc on each node in the tree. The cost function result is stored in the node. Note that the cost function also calculates a cost value for the original data, since in theory the original data may represent the minimal representation for the data in terms of the cost function. The pure virtual function costCalc, which calculates the cost function, must be defined by the subclass. A description of the cost functions associated with the wavelet packet transform can be found in Chapter 8 of Ripples in Mathematics by Jense and la Cour-Harbo. */ class costbase_int { private: /** disallow the copy constructor */ costbase_int( const costbase_int &rhs ) {} protected: /** Recursively traverse the wavelet packet tree and calculate the cost function. */ void traverse( packnode *node ) { if (node != 0) { int cost = costCalc( node ); node->cost( cost ); traverse( node->lhsChild() ); traverse( node->rhsChild() ); } } // traverse /** Cost function to be defined by the subclass */ virtual int costCalc(packnode *node) = 0; public: /** The default constructor does nothing */ costbase_int() {} }; // costbase_int #endif packet/lossless/include/costwidth.h0100644000076400007640000000235407523334101016441 0ustar iankiank #ifndef _COSTWIDTH_H_ #define _COSTWIDTH_H_ /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:
This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.
This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International. Please send any bug fixes or suggested source changes to:
     iank@bearcave.com
@author Ian Kaplan */ #include "costbase_int.h" /** For a wavelet packet tree node, consisting of n integer values, calculate the minimal number of bits needed to represent the values. This cost function is used for lossless wavelet packet compression. */ class costwidth : public costbase_int { protected: int costCalc( packnode *root ); public: costwidth( packnode *root ) { traverse( root ); } }; #endif packet/lossless/include/delta.h0100644000076400007640000000354407525051002015522 0ustar iankiank /** The delta transform. A data set of N elements is replaced by the differences. In this simple algorithm
  si = si - si-1.
  
For an array indexed from 0, i = 1 to N-1. The element at s0 is the reference element, which is unchanged. The next element at s1 is replaced by the difference between that element and s0. The algorithm implemented here is an in-place algorithm which replaces the original data in the forward transform and reconstructs the data from in-place in the inverse transform. The class is implemented as a template class. Obviously the type used to instantiate the template must support signed arithmetic. The class was written as a comparision baseline for the wavelet compresson algorithms. The "delta" algorithm is very simple and has a time complexity of N, where as the wavelet algorithm is Nlog2N. Obviously, if the wavelet algorithm does not do better than this simple algorithm for the data set in question, the wavelet is a poor choice (or, perhaps, the wavelet function in the predict step is poorly chosen for the data set). */ template class delta_trans { public: /** Convert the value in the array into an initial reference value and a set of delta values. */ void forward( T *vec, size_t len ) { if (vec != 0 && len > 0) { // reference value T next; T refVal = vec[0]; for (size_t i = 1; i < len; i++) { next = vec[i]; vec[i] = vec[i] - refVal; refVal = next; } } } // forward void inverse( T *vec, size_t len ) { if (vec != 0 && len > 0) { for (size_t i = 1; i < len; i++) { vec[i] = vec[i] + vec[i-1]; } } } // inverse }; // delta_trans packet/lossless/include/haar_int.h0100644000076400007640000001107507474537664016246 0ustar iankiank#ifndef _HAAR_INT_H_ #define _HAAR_INT_H_ /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include "stdio.h" #include "liftbase.h" /** A lifting scheme version of the Haar integer to integer transform. The standard wavelet transform creates real wavelet coefficients, even if the input data consists of integers. This is a problem in lossless compression (e.g., lossless image compression) and in other compression related algorithm. This verson of the Haar wavelet transform takes an data set and creates an integer result. In the case of the Lifting Scheme version of the Haar transform, the code is the same as the real version, except that integers are used. This algorithm is sometimes called the S-transform in the image compression world. References
  1. Wavelet Transforms that Map Integers to Integers by A.R. Calderbank, ingrid daubechies, wim weldens and Boon-Lock Yeo, August 1996

    This is the central reference that was used to develop this code. Parts 1 and 2 of this paper are for the mathematicially sophisticated (which is to say, they are not light reading). However, for the implementer, part 3 and part 4 of this paper provide excellent coverage of perfectly invertable wavelet transforms that map integers to integers. In fact, part 3 of this paper is worth reading in general for its discussion of the wavelet Lifting Scheme.

  2. Ripples in Mathematics: the Discrete Wavelet Transform by Arne Jense and Anders la Cour-Harbo, Springer, 2001

    This book is a good reference for the Lifting Scheme and the wavelet transform in general.

*/ class haar_int : public liftbase { public: /** the constructor does nothing */ haar_int() {} /** the destructor does nothing */ ~haar_int() {} /** declare but do not define the copy constructor */ haar_int( const haar_int &rhs ); protected: /** Haar wavelet lifting scheme predict step. The predict step "predicts" that an odd value will be equal to the even value. The difference between the actual value of the odd element and the even element are stored in the upper half of the array. The predict step is sometime referred to as the high pass filter or the wavelet function. The integer wavelet transform predict step is the same as the standard (real) version of the lifting scheme Haar transform. */ void predict( int *& vec, int N, transDirection direction ) { int half = N >> 1; for (int i = 0; i < half; i++) { int predictVal = vec[i]; int j = i + half; if (direction == forward) { vec[j] = vec[j] - predictVal; } else if (direction == inverse) { vec[j] = vec[j] + predictVal; } else { printf("haar_int::predict: bad direction value\n"); } } } // predict /** Update step of the integer to integer wavelet transform. In the Haar transform the update step calculates the low pass filter (or average). For a detailed discussion of this algorithm, see Basic Lifting Scheme Wavelets. */ void update( int *& vec, int N, transDirection direction ) { int half = N >> 1; for (int i = 0; i < half; i++) { int j = i + half; // updateVal = floor( vec[j] / 2.0 ) int updateVal = vec[j] >> 1; if (direction == forward) { vec[i] = vec[i] + updateVal; } else if (direction == inverse) { vec[i] = vec[i] - updateVal; } else { printf("update_int: bad direction value\n"); } } } // update }; // haar_int #endif packet/lossless/include/invpacktree_int.h0100644000076400007640000000635107523334250017624 0ustar iankiank #ifndef _INVPACKTREE_INT_H_ #define _INVPACKTREE_INt_H_ /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include "liftbase.h" #include "list.h" #include "packcontainer_int.h" #include "packdata.h" #include "packdata_list.h" /** Inverse wavelet packet transform The invpacktree_int constructor is passed a packdata_list object and a wavelet transform object. It calculates the inverse wavelet packet transform, using the data in the packdata_list object and the inverse wavelet transform step function of the wavelet transform object. The best basis data is destroyed in calculating the inverse transform. The packdata_list object contains the "best basis" result from a wavelet packet transform. The wavelet packet transform should have been calculated with the same wavelet transform as the object passed to this constructor. After the constructor completes, the data result can be obtained by calling the getData() function. The wavelet transforms used by this object are all derived from the liftbase class and are "lifting scheme" wavelet transforms. I have found the wavelet literature difficult, in general. When it comes to the wavelet packet transform I have found most of it impossible to understand. Impossible, that it until I got the book Ripples in Mathematics by Jensen and la Cour-Harbo, Springer Verlag, 2001. The wavelet packet transform, for which this class is the inverse, is heavily based on Chapter 8 of Ripples in Mathematics. I have found very little material on the actual implementation of the inverse wavelet packet transform. This algorithm is my own design. */ class invpacktree_int { private: /** wavelet transform object */ liftbase *waveObj; /** disallow the copy constructor */ invpacktree_int( const invpacktree_int &rhs ) {} /** inverse wavelet packet transform calculation stack */ LIST stack; /** pointer to the inverse transform result */ const int *data; /** length of data */ size_t N; private: void new_level( packdata *elem ); void add_elem( packdata *elem ); void reduce(); public: invpacktree_int( packdata_list &list, liftbase *w ); /** The destructor does nothing */ ~invpacktree_int() {} /** Get the result of the inverse packet transform */ const int *getData() { return data; } void pr(); }; // invpacktree_int #endif packet/lossless/include/line_int.h0100644000076400007640000002134507523333620016240 0ustar iankiank #ifndef _LINE_INT_H_ #define _LINE_INT_H_ /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include "stdio.h" #include "liftbase.h" /** An integer version of the linear interpolation wavelet The linear interpolation wavelet uses a predict phase that "predicts" that an odd element in the data set will line on a line between its two even neighbors. This is an integer version of the linear interpolation wavelet. It is interesting to note that unlike the S transform (the integer version of the Haar wavelet) or the TS transform (an integer version of the CDF(3,1) transform) this algorithm does not preserve the mean. That is, when the transform is calculated, the first element of the result array will not be the mean. */ template class line_int : public liftbase { public: /** the constructor does nothing */ line_int() {} /** the destructor does nothing */ ~line_int() {} /** declare, but do not define the copy constructor */ line_int( const line_int &rhs ); private: /** Given y1 at x-coordinate 0 and y2 at x-coordinate 1, calculate y, at x-coordinate 2. */ int new_n_plus1( int y1, int y2) { int y = 2 * y2 - y1; return y; } /** Given a point y1 at x-coordinate 0 and y2 at x-coordinate 1, calculate y at x-coordinate -1. */ int new_n_minus1( int y1, int y2) { int y = 2 * y1 - y2; return y; } protected: /** Predict phase of Lifting Scheme linear interpolation wavelet The predict step attempts to "predict" the value of an odd element from the even elements. The difference between the prediction and the actual element is stored as a wavelet coefficient. The "predict" step takes place after the split step. The split step will move the odd elements (bj) to the second half of the array, leaving the even elements (ai) in the first half
    a0, a1, a1, a3, b0, b1, b2, b2, 
    
The predict step of the line wavelet "predicts" that the odd element will be on a line between two even elements.
    bj+1,i = bj,i - (aj,i + aj,i+1)/2
    
Note that when we get to the end of the data series the odd element is the last element in the data series (remember, wavelet algorithms work on data series with 2n elements). Here we "predict" that the odd element will be on a line that runs through the last two even elements. This can be calculated by assuming that the last two even elements are located at x-axis coordinates 0 and 1, respectively. The odd element will be at 2. The new_n_plus1() function is called to do this simple calculation. Note that in the case where (N == 2), the algorithm becomes the same as the Haar wavelet. We "predict" that the odd value vec[1] will be the same as the even value, vec[0]. */ void predict( T & vec, int N, transDirection direction ) { int half = N >> 1; int predictVal; for (int i = 0; i < half; i++) { int j = i + half; if (i < half-1) { predictVal = (int)((((float)vec[i] + (float)vec[i+1])/2.0) + 0.5); } else if (N == 2) { predictVal = vec[0]; } else { // i == half-1 // Calculate the last "odd" prediction int n_plus1 = new_n_plus1( vec[i-1], vec[i] ); predictVal = (int)((((float)vec[i] + (float)n_plus1)/2.0) + 0.5); } if (direction == forward) { vec[j] = vec[j] - predictVal; } else if (direction == inverse) { vec[j] = vec[j] + predictVal; } else { printf("line::predict: bad direction value\n"); } } } // predict /** Update step of the linear interpolation wavelet The predict phase works on the odd elements in the second half of the array. The update phase works on the even elements in the first half of the array. The update phase attempts to preserve the average. After the update phase is completed the average of the even elements should be approximately the same as the average of the input data set from the previous iteration. The result of the update phase becomes the input for the next iteration. In a Haar wavelet the average that replaces the even element is calculated as the average of the even element and its neighboring odd element (e.g., its odd neighbor before the split). In the lifting scheme version of the Haar wavelet the odd element has been overwritten by the difference between the odd element and its even neighbor. In calculating the average (to replace the even element) the value of the odd element can be recovered via a simple algebraic manipulation. In the line wavelet the odd element has been replaced by the difference between the odd element and the mid-point of its two even neighbors. Recovering the value of the odd element to calculate the average is not as simple in this case. The value that is added to the even element to preserve the average is calculated by the equation shown below. This equation is given in Wim Sweldens' journal articles and his tutorial (Building Your Own Wavelets at Home) and in Ripples in Mathematics. A somewhat more complete derivation of this equation is provided in Ripples in Mathematics by A. Jensen and A. la Cour-Harbo, Springer, 2001. The equation used to calculate the average is shown below for a given iteratin i. Note that the predict phase has already completed, so the odd values belong to iteration i+1.
  eveni+1,j = eveni,j op (oddi+1,k-1 + oddi+1,k)/4
    
This version of the line wavelet code implements an integer version of linear interpolating wavelet. This versoin comes from the paper Wavelet Transforms that Map Integers to Integers by A.R. Calderbank, ingrid daubechies, wim weldens and Boon-Lock Yeo, August 1996 This is the central reference that was used to develop this code. Parts 1 and 2 of this paper are for the mathematicially sophisticated (which is to say, they are not light reading). However, for the implementer, part 3 and part 4 of this paper provide excellent coverage of perfectly invertable wavelet transforms that map integers to integers. In fact, part 3 of this paper is worth reading in general for its discussion of the wavelet Lifting Scheme. The value added (or subtracted) from the eveni,j (depending on whether the forward or inverse transform is being calculated) is calculated from oddi+1,k-1 and oddi+1,k from the predict step. This means that there is missing value at the start of the set of odd elements (e.g., i = 0, j == half). This missing value assumed to line on a line with the first two odd elements. Because interpolated values are used, the average is not perfectly maintained. */ void update( T & vec, int N, transDirection direction ) { int half = N >> 1; for (int i = 0; i < half; i++) { int j = i + half; int val; if (i == 0 && N == 2) { val = (int)(((float)vec[j]/2.0) + 0.5); } else if (i == 0 && N > 2) { int v_n_minus_1 = new_n_minus1( vec[j], vec[j+1] ); val = (int)((((float)v_n_minus_1 + (float)vec[j])/4.0) + 0.5); } else { val = (int)((((float)vec[j-1] + (float)vec[j])/4.0) + 0.5); } if (direction == forward) { vec[i] = vec[i] + val; } else if (direction == inverse) { vec[i] = vec[i] - val; } else { printf("update: bad direction value\n"); } } // for } // update }; // line_int #endif packet/lossless/include/packcontainer_int.h0100644000076400007640000001165107523321551020131 0ustar iankiank #ifndef _PACKCONTAINER_INT_H_ #define _PACKCONTAINER_INT_H_ #include "packnode.h" /** The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ /** A container for use when calculating a packet wavelet tree. By overriding the LHS and RHS versions of the [] operator, packcontainer class allows a block of data to be treated as an array while a wavelet transform step is being calculated. After the wavelet transform step the data can be referenced as a left hand side half (the result of the wavelet scaling function) and a right hand side half (the result of the wavelet function). By allowing the two halves of the array to be referenced, copying is avoided. */ class packcontainer_int { private: /** number of elements at this packet tree level */ size_t N; /** left (low pass) half of the packcontainer_int data */ int* lhs; /** right (high pass) half of the packnode data */ int* rhs; private: /** disallow the copy constructor */ packcontainer_int( const packcontainer_int &rhs ) {}; /** disallow default constructor */ packcontainer_int() {}; public: /** This version of the packcontainer object is used as a container in calculating the forward wavelet packet transform for an integer data set. The packcontainer_int constructor is passed a pointer to a packnode object. As the wavelet packet tree is being built this packnode object contain the data from the previous level. The length of the packnode object is N. The constructor will dynamically allocate two vectors (lhs and rhs), each with N/2 elements. After the wavelet transform step has been calculated on the packcontainer_int object, the lhs vector will contain the wavelet scaling function, or low pass, result. The rhs vector will contain the wavelet function, or high pass, result. These will be used to construct two new packnode objects which will be children of the object passed to the constructor. */ packcontainer_int( packnode* node ) { assert( node != 0 ); N = node->length(); assert( N > 1 ); size_t half = N >> 1; block_pool mem_pool; size_t num_bytes = half * sizeof(int); lhs = (int *)mem_pool.pool_alloc( num_bytes ); rhs = (int *)mem_pool.pool_alloc( num_bytes ); for (size_t i = 0; i < N; i++) { (*this)[i] = (*node)[i]; } } // packcontainer_int /** This version is used when calculating the inverse wavelet packet transform. The constructor is passed the size of the container (or at least the size that the container will be, when the left and right hand size arrays are initialized). The lhs and rhs arrays are then initialized and the inverse transform step is calculated. */ packcontainer_int( size_t n ) { N = n; lhs = 0; rhs = 0; } /** This is a local implementation of new. When new is applied to a packcontainer_int object, memory will be allocated from a memory pool, rather than from the system memory pool. */ void *operator new( unsigned int num_bytes ) { block_pool mem_pool; void *mem_addr = mem_pool.pool_alloc( num_bytes ); return mem_addr; } // new /** LHS [] operator */ int &operator[]( const size_t i ) { assert( i < N ); size_t half = N >> 1; if (i < half) return lhs[i]; else { return rhs[i-half]; } } /** RHS [] operator */ int operator[]( const size_t i ) const { assert( i < N ); size_t half = N >> 1; if (i < half) return lhs[i]; else { return rhs[i-half]; } } /** return the left hand size array */ int* lhsData() { return lhs; } /** return the right hand size array */ int* rhsData() { return rhs; } /** set the left hand size array */ void lhsData(int* l) { lhs = l; } /** set the right hand size array */ void rhsData(int* r) { rhs = r; } /** return the length of the data in the packet container. Note that this length is the length of the rhs plus the length of the lhs arrays. */ size_t length() { return N; } }; // packcontainer_int #endif packet/lossless/include/packtree_base_int.h0100644000076400007640000000363207523326251020102 0ustar iankiank #ifndef _PACKTREE_BASE_INT_H_ #define _PACKTREE_BASE_INT_H_ /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include "packnode.h" #include "liftbase.h" #include "packcontainer_int.h" /** This is an integer version of the wavelet packet tree base class. This class can be used for both compression and time/frequency analysis of an integer time series. However, this version was developed for lossless integer compression. This class may be subclassed for classes that apply the wavelet best basis algorithm or for time/frequency wavelet packet trees. */ class packtree_base_int { protected: /** root of the wavelet packet tree */ packnode *root; /** wavelet packet transform object */ liftbase *waveObj; typedef enum { BadPrintKind, printData, printCost, printBestBasis } printKind; void breadthFirstPrint(printKind kind); void newLevel( packnode* top, bool freqCalc, bool reverse ); public: void pr(); /** get the root of the wavelet packet tree */ packnode *getRoot() { return root; } }; // packtree_base_int #endif packet/lossless/include/packtree_int.h0100644000076400007640000000502307523326600017102 0ustar iankiank #ifndef _PACKTREE_INT_H_ #define _PACKTREE_INT_H_ #include "packtree_base_int.h" #include "packdata_list.h" #include "packcontainer.h" #include "liftbase.h" /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ /** The packtree_int object constructs a wavelet packet tree The constructor is passed a vector of integers, the length of the vector (which must be a power of two) and a pointer to a wavelet lifting scheme class that will be used in calculating the wavelet transform step. If the vector passed to the constructor contains N int vaues, the result of the constructor will be a wavelet packet tree with log2(N) levels. */ class packtree_int : public packtree_base_int { private: /** Found original data marked as part of the best basis. This means that the best basis function failed (or that the original data is the most compact representation relative to the cost function used). */ bool foundOriginalData; /** found a best basis value in the wavelet packet tree */ bool foundBestBasisVal; private: /** disallow the copy constructor */ packtree_int( const packtree_int &rhs ) {}; /** disallow the default constructor */ packtree_int() {}; int bestBasisWalk( packnode *root ); void buildBestBasisList( packnode *root, packdata_list &list ); void checkBestBasis( packnode *root ); void cleanTree(packnode *root, bool removeMark ); public: packtree_int( const int *vec, const size_t n, liftbase *w ); /** destructor does nothing */ ~packtree_int() {} void prCost(); void prBestBasis(); void bestBasis(); bool bestBasisOK(); packdata_list getBestBasisList(); }; // packtree_int #endif packet/lossless/include/support.h0100644000076400007640000000557307525261701016162 0ustar iankiank #ifndef _SUPPORT_H_ #define _SUPPORT_H_ /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ /** Various support functions for compression and bit width estimation. These functions are the object oriented version of global functions. They are all pure functions (e.g., no state in the function or in the class) and static. Bit width calculation In compression applications an attempt is made to represent a data set in a minimal number of bits. For these applications it must also be possible to decompress the data. If the values in the data set are stored in bit fields of different widths, information about these fields must be stored as well. Unlike compression algorithms, where decompresson must be taken into account, this code simple calculates the sum of the bit fields needed to represent a set of signed integer values. This is useful for estimating how closely a wavelet transform approximated a data set. Double to integer conversion The compression algorith uses integer to integer lossless wavelet transforms. Since the financial data I am interested in is in real form, it needs to be converted to integer. This is done preserving three fractional digits. The constructors and destructor are declared but not defined, which will result in a link error if an instance of this class is created (which is not the intent in the design). */ class support { private: static size_t nearestPower2Width_( size_t val ); static int roundVal_( const double val ); public: /** declare but do not define the constructor */ support(); /** declare but do not define the destructor */ ~support(); /** declare but never define copy constructor */ support( const support &rhs ); static size_t valWidth( const int val ); size_t UnsignedValWidth( const size_t val ); static size_t vecWidth( const int *vec, const size_t N ); static void roundToInt( int *intVec, const double *realVec, const size_t len ); static void decimalToInt( int *intVec, const double *realVec, const size_t len ); }; // support #endif packet/lossless/include/ts_trans_int.h0100644000076400007640000001775507501537633017166 0ustar iankiank #ifndef _TS_TRANS_INT_H_ #define _TS_TRANS_INT_H_ /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include "stdio.h" #include "haar_int.h" /** An integer version of the TS transform (an extended S, or Haar transform). The TS transform is an extension of integer version of the Haar trasform (which is sometimes referred the S-transform in the image processing literature. The TS transform is an integer version of the so called Cohen-Daubechies-Feaveau (3,1) transform. Here the (3,1) refer to 3 vanishing moments for the wavelet function and 1 vanishing moment for the scaling function. The equations for the lifting scheme version of the forward TS transform are shown below. As with all lifting scheme algorithms, the inverse transform exchanges addition and subtraction operators. The TS transform and the S transform are the same in the first two steps (the first predict and update steps). An average interpolation step is added to the S (Haar) transform.
  d(1)1,i = s0,2i+1 - s0,2i
  
  s1,i = s0,2i + floor( d(1)1,i/2 )

  d1,i = d(1)1,i + floor((s1,i-1 - s1,i+1)/4.0 + 0.5)
  
This notation and the algorithm implemented here is taken directly from Wavelet Transformst that Map Integers to Integers by A.R. Calderbank, Ingrid Daugbechies, Wim Sweldens, and Boon-Lock Yeo, 1996 The mathematical structure is reflected in the class structure. Here the ts_trans_int class extends the haar_int class. The haar_int class provide the predict() and update functions. An additional predict2() function is added that implements interpolation step. Since an extra step has been added, the forwardStep and inverseStep functions in the base class (liftbase) are over-ridden by ts_trans_int. A brief note on vanishing moments This algorithm is commonly known as the CDF (3,1) wavelet algorithm. As noted above, these numbers refer to the vanishing moments. I have never found a definition of "vanishing moment" that made intuitive sense to me, at least when applied to wavelet basis functions. As I understand the definition, a vanishing moment is a region over which the integral is zero. So the area of sin(x) in the region 0..2Pi has an integral of zero, since the region between 0..Pi results in a positive integral and the area between Pi..2Pi results in the same integeral value, but with a negative sign. The sum of these two regions is zero. If a wavelet were constructed from the sine function, such that
  x = {0..2Pi}      : y = sin(x)
  x = anything else : y = 0
  
This would be a wavelet with "compact support" (it is a defined for a finite region, 0..2Pi) and one vanishing moment. */ // class ts_trans_int : public liftbase class ts_trans_int : public haar_int { public: /** the constructor does nothing */ ts_trans_int() {} /** the destructor does nothing */ ~ts_trans_int() {} /** declare, but do not define the copy constructor */ ts_trans_int( const ts_trans_int &rhs ); private: /** Calculate the element s1,i+1. The low pass half of the array is in the array index range {0..half-1}. In the equation below, when i = half-1 a non-existent element at i+1 is needed. This function calculates this element from s[half-2] and s[half-1].
    d1,i = d(1)1,i + floor((s1,i-1 - s1,i+1)/4.0 + 0.5)
    
Here the non-existent element s[half] is assumed to lie on the line from s[half-2] and s[half-1]. We pretend that s[half-2] has the x-coordinate of 0 and s[half-1] has an x-coordinate of 1. We then need to calculate the y value at the x-coordinate 2. The "two-point equation" for a line is used for this calculation, where we are trying to find the value of y, given
     .          y2 - y1
     (y - y1) = -------- (x - x1)
     .          x2 - x1
     
Solving for y
     .    y2 - y1
     y = -------- (x - x1) + y1
     .    x2 - x1
     
where
    x1 = 0
    x2 = 1
    y1 = s[half-2]
    y2 = s[half-1]
    x = 2
    
Substituting in these values we get
     y = 2*y2 - y1
     
*/ int new_n_plus1( int y1, int y2) { int y = 2 * y2 - y1; return y; } /** In the function new_n_plus1 a point beyond the end of the low pass filter array is calculated. Here a point beyond the beginning of the array is calculated.
    x1 = 0
    x2 = 1
    y1 = s[0]
    y2 = s[1]
    x = -1
    
When these values are plugged into the two point equation we get
    y = 2 * y1 - y2
    
*/ int new_n_minus1( int y1, int y2) { int y = 2 * y1 - y2; return y; } protected: /** The predict interpolation step. Note that special cases exist at the start and end of the array. A special case also exists for N = 2, where the calculation is the same as the Haar wavelet (e.g., no interpolation factor is added in). */ void predict2( int *& vec, int N, transDirection direction ) { int half = N >> 1; int predictVal; for (int i = 0; i < half; i++) { int j = i + half; int y_n_plus1; int y_n_minus1; if (N == 2) { y_n_minus1 = vec[0]; y_n_plus1 = vec[0]; } else if (i == 0) { y_n_minus1 = new_n_minus1( vec[0], vec[1] ); y_n_plus1 = vec[1]; } else if (i < half-1) { y_n_minus1 = vec[i-1]; y_n_plus1 = vec[i+1]; } else { // i == half-1 y_n_minus1 = vec[i-1]; y_n_plus1 = new_n_plus1( vec[i-1], vec[i] ); } predictVal = (int)( (((float)y_n_minus1 - (float)y_n_plus1)/4.0) + 0.5 ); if (direction == forward) { vec[j] = vec[j] + predictVal; } else if (direction == inverse) { vec[j] = vec[j] - predictVal; } else { printf("haar_int::predict: bad direction value\n"); } } } // predict2 public: /** One TS transform forward step. This extends the S transform (Haar integer transform) with the predict2 step. */ void forwardStep( int *& vec, const int n ) { split( vec, n ); predict( vec, n, forward ); update( vec, n, forward ); predict2( vec, n, forward ); } // forwardStep /** One TS transform inverse step. This extends the S transform (Haar integer transform) with the predict2 step. */ void inverseStep( int *& vec, const int n ) { predict2( vec, n, inverse ); update( vec, n, inverse ); predict( vec, n, inverse ); merge( vec, n ); } // inverseStep }; // ts_trans_int #endif packet/lossless/Makefile0100644000076400007640000000536007525050265014305 0ustar iankiank # # Makefile for lossless wavelet compression software # # This makefile assumes that the Microsoft environment has # been enhanced with the cygwin UNIX utilities for Win32. # These are available from Red Hat (which purchased Cygnus). # # Command: # nmake -f Makefile # DEBUG = -Zi BROWSE = -FR CFLAGS = $(BROWSE) $(DEBUG) -DWIN32 -Tp OBJ = obj EXE = .exe TOPINC = ..\include DOXYPATH = e:/doxygen/bin INCLUDE = -Iinclude -I$(TOPINC) -I..\data\include -I "d:\Program Files\Microsoft Visual Studio\Vc98\Include" PACKET_OBJ = blockpool.$(OBJ) packtree_base_int.$(OBJ) packtree_int.$(OBJ) invpacktree_int.$(OBJ) costwidth.$(OBJ) support.$(OBJ) yahooTS.$(OBJ) all: compresstest compresstest: compresstest$(EXE) compresstest$(EXE): $(PACKET_OBJ) compresstest.$(OBJ) $(CC) $(PACKET_OBJ) compresstest.$(OBJ) $(DEBUG) -o compresstest$(EXE) # # clean-up for Microsoft object and browser files and emacs temps # clean: rm -f *.obj *.pdb *.sbr *.ilk *.exe rm -f include/*~ rm -f src/*~ $(TOPINC)\costbase.h: $(TOPINC)\packnode.h include\costwidth.h: $(TOPINC)\costbase.h include\line_int.h: $(TOPINC)\liftbase.h $(TOPINC)\packdata.h: $(TOPINC)\blockpool.h include\invpacktree_int.h: $(TOPINC)\packdata.h $(TOPINC)\packnode.h: $(TOPINC)\packdata.h $(TOPINC)\packdata_list.h: $(TOPINC)\fifo_list.h $(TOPINC)\packdata.h $(TOPINC)\packcontainer.h: $(TOPINC)\packnode.h $(TOPINC)\queue.h: $(TOPINC)\fifo_list.h $(TOPINC)\packnode.h include\packtree_base_int.h: $(TOPINC)\packnode.h $(TOPINC)\liftbase.h include\packtree_int.h: include\packtree_base_int.h $(TOPINC)\packcontainer.h $(TOPINC)\liftbase.h include\invpacktree_int.h: $(TOPINC)\liftbase.h $(TOPINC)\list.h $(TOPINC)\packcontainer.h $(TOPINC)\packdata.h $(TOPINC)\packdata_list.h packtree_base_int.$(OBJ): src\$*.cpp include\$*.h $(CC) -c $(INCLUDE) $(CFLAGS) src\$*.cpp packtree_int.$(OBJ): src\$*.cpp include\$*.h $(TOPINC)\queue.h $(TOPINC)\packcontainer.h $(TOPINC)\blockpool.h $(CC) -c $(INCLUDE) $(CFLAGS) src\$*.cpp invpacktree_int.$(OBJ): src\$*.cpp include\$*.h $(TOPINC)\blockpool.h $(CC) -c $(INCLUDE) $(CFLAGS) src\$*.cpp blockpool.$(OBJ): ..\src\$*.cpp ..\include\$*.h $(CC) -c $(INCLUDE) $(CFLAGS) ..\src\$*.cpp costwidth.$(OBJ): src\$*.cpp include\$*.h $(CC) -c $(INCLUDE) $(CFLAGS) src\$*.cpp support.$(OBJ): src\$*.cpp include\$*.h $(CC) -c $(INCLUDE) $(CFLAGS) src\$*.cpp yahooTS.$(OBJ): ..\data\src\$*.cpp ..\data\include\$*.h $(CC) -c $(INCLUDE) $(CFLAGS) ..\data\src\$*.cpp compresstest.$(OBJ): src\$*.cpp include\line_int.h $(TOPINC)\packnode.h $(TOPINC)\packcontainer.h include\packtree_int.h include\invpacktree_int.h $(CC) -c $(INCLUDE) $(CFLAGS) src\$*.cpp packet/lossless/src/0040755000076400007640000000000007525263472013441 5ustar iankiankpacket/lossless/src/compresstest.cpp0100644000076400007640000001724107525263247016702 0ustar iankiank /** \file This file contains code to test various lossless compression algorithms on financial time series (e.g., stock close price). The documentation in this file is formatted for doxygen (see www.doxyeng.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include #include "invpacktree_int.h" #include "packtree_int.h" #include "support.h" #include "delta.h" #include "haar_int.h" #include "ts_trans_int.h" #include "line_int.h" #include "costwidth.h" #include "yahooTS.h" /** Make a copy of an integer array. Note that the function allocates memory, but does not deallocate it. */ int *copy( int *intVec, const size_t N ) { int *newVec = new int[ N ]; for (size_t i = 0; i < N; i++) { newVec[i] = intVec[i]; } return newVec; } // copy /** Compare two integer arrays of size N. Return true if they are equal, false otherwise. */ bool compare( const int *v1, const int *v2, const size_t N ) { bool rslt = true; for (size_t i = 0; i < N; i++) { if (v1[i] != v2[i]) { rslt = false; break; } } return rslt; } // compare /** Calculate the number of bits needed to represent the result of the wavelet packet transform. The result of this version of the wavelet packet transform is a list of vectors, where each vector represents a best basis fit for a particular region of the signal. The result returned here is an obvious lower bound, since in practice a vector would consist of a fixed set of values. Also the length of the vector would have to be included, along with the width the the length values. */ size_t calcPacketWidth( packdata_list &bestBasisList ) { packdata_list::handle h; size_t totalWidth = 0; for (h = bestBasisList.first(); h != 0; h = bestBasisList.next( h )) { packdata *node = bestBasisList.get_item( h ); const size_t len = node->length(); const int *vec = node->getData(); int nodeWidth = support::vecWidth( vec, len ); totalWidth += nodeWidth; } return totalWidth; } // calcPacketWidth /** Wavelet packet calculation The function returns the minimal total number of bits needed to represent the data when compressed using the wavelet packet algorithm. */ size_t packet_calc( const int *intVec, const int *copyVec, const int N ) { // The "line" wavelet transform (e.g., line with slope) line_int line; // calculate the wavelet packet tree, using the line wavelet transform packtree_int tree( intVec, N, &line ); // get the root of the wavelet packet transform tree packnode *treeRoot = tree.getRoot(); // Assign a cost on the basis of bit width costwidth cost( treeRoot ); // Calculate the "best basis" function from the tree tree.bestBasis(); // Check that the best basis function succeeded. That is, // that the best basis function does not include the // original data. if (! tree.bestBasisOK()) { printf("Best basis calculation failed\n"); } // Get the best basis list. This will be a list of // nodes consisting of the best basis set. This set is // obtained by traversing the tree, top down, left to // right. packdata_list bestBasis = tree.getBestBasisList(); // Sum the cost values (width for each node in the best basis // list size_t width = calcPacketWidth( bestBasis ); invpacktree_int invtree( bestBasis, &line ); const int *invRslt = invtree.getData(); bool isEqual = compare( invRslt, copyVec, N ); if (! isEqual) printf("Wavelet packet inverse is wrong\n"); return width; } // packet_calc /** Calculate the number of bits needed to represent the data after "delta" compression. Delta compression stores the difference between value si-1 and si. */ size_t delta_calc( int *intVec, const int *copyVec, const int N ) { delta_trans delta; delta.forward( intVec, N ); const size_t deltaWidth = support::vecWidth( intVec, N ); delta.inverse( intVec, N); bool isEqual = compare( intVec, copyVec, N); if (! isEqual) printf("Delta compression inverse failed\n"); return deltaWidth; } // delta_calc /** Calculate the number of bits needed to represent the data after wavelet compression wavelet compression. \param intVec A pointer to an array of integers \param copyVec A pointer to a copy of the integer array. This is used to verify that the inverse(forward(intVec)) transform yields the original data. \param N the size of intVec and copyVec \param w a pointer to a wavelet class */ size_t wave_calc( int *intVec, const int *copyVec, const int N, liftbase *w ) { w->forwardTrans( intVec, N ); const size_t waveWidth = support::vecWidth( intVec, N ); w->inverseTrans( intVec, N ); bool isEqual = compare( intVec, copyVec, N); if (! isEqual) printf("Line wavelet inverse is wrong\n"); return waveWidth; } // wave_calc /** Read in a set of equity time series file. Calculate the number of bits needed to represent the data without compression and after wavelet and wavelet packet compression. */ int main() { const char *files[] = { "aa", // Alcoa Aluminium "amat", // Applied Materials "ba", // Boeing "cof", // Capital One "ge", // General Electric "ibm", // IBM Corp. "intc", // Intel "mmm", // 3M "mrk", // Merck "wmt", // Wal-Mart 0 // The null pointer }; const size_t N = 512; double realVec[ N ]; int intVec[ N ]; // an instance of yahooTS with the path to the data directory const char *dataDirPath = "..\\data\\equities\\"; yahooTS ts( dataDirPath ); printf("Equity Uncompressed delta Haar line TS wavelet packet (line)\n"); for (size_t i = 0; files[i] != 0; i++) { size_t n = N; if (! ts.getTS( files[i], realVec, n, yahooTS::Close )) { break; } if (n != N) { printf("Error: %d out of %d data elements read\n", n, N ); break; } support::decimalToInt( intVec, realVec, N ); int *copyVec = copy( intVec, N ); const size_t beforeWidth = support::vecWidth( intVec, N ); const size_t deltaWidth = delta_calc( intVec, copyVec, N ); haar_int haar; const size_t haarWidth = wave_calc( intVec, copyVec, N, &haar ); line_int line; const size_t lineWidth = wave_calc( intVec, copyVec, N, &line ); ts_trans_int ts_trans; const size_t tsTransWidth = wave_calc( intVec, copyVec, N, &ts_trans); const size_t packetWidth = packet_calc( intVec, copyVec, N ); printf(" %4s %4d %4d %4d %4d %d %4d\n", files[i], beforeWidth, deltaWidth, haarWidth, lineWidth, tsTransWidth, packetWidth ); } return 0; } packet/lossless/src/costwidth.cpp0100644000076400007640000000202307523330015016131 0ustar iankiank /** \file The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:
This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.
This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International. Please send any bug fixes or suggested source changes to:
     iank@bearcave.com
@author Ian Kaplan */ #include "costwidth.h" #include "support.h" int costwidth::costCalc( packnode *root ) { assert( root != 0 ); size_t N = root->length(); const int *a = root->getData(); int width = support::vecWidth( a, N ); return width; } // costCalc packet/lossless/src/invpacktree_int.cpp0100644000076400007640000001540307523334337017327 0ustar iankiank #include #include #include "blockpool.h" #include "invpacktree_int.h" /** \file For additional information on this implementation of the inverse wavelet packet transform see http://www.bearcave.com/misl/misl_tech/wavelets/packet/index.html The documentation in this file is formatted for doxygen (see www.doxyeng.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ /** Allocate a new level in the wavelet packet tree that is being constructed. The new "level" is built from a packcontainer_int object. The left child will be the elem argument. The length of the data in the new level will be twice that of lower level (of which elem is half). */ void invpacktree_int::new_level( packdata *elem ) { size_t half = elem->length(); size_t n = half * 2; packcontainer_int *container = new packcontainer_int( n ); container->lhsData( (int *)elem->getData() ); stack.add( container ); } // new_level /** At this point the Top Of Stack (TOS) packcontainer_int object should have both a right and a left array. Calculate an inverse wavelet transform step on the packcontainer_int object. The packcontainer_int object allows the right and left hand side arrays to be treated as one array If the current top of stack is twice the size of the inverse wavelet transform step result, the result becomes the right hand size of top of stack packcontainer_int and reduce is called recursively. If the TOS is empty or it is not twice the size of the inverse transform result, a new packcontainer_int will be pushed on the stack. The left hand size will be the transform result. */ void invpacktree_int::reduce() { LIST::handle h; h = stack.first(); packcontainer_int *tos = stack.get_item( h ); assert( tos->lhsData() != 0 && tos->rhsData() != 0 ); /** Remove the linked list element that used to contain tos (e.g., pop the linked list element off). Note that this leaves the tos object unchanged (e.g., it does not delete it). */ stack.remove(); size_t n = tos->length(); // calculate the inverse wavelet transform step waveObj->inverseStep( (*tos), n ); // copy the result of the inverse wavelet transform // into a new data array. block_pool mem_pool; int *vec = (int *)mem_pool.pool_alloc( n * sizeof( int ) ); for (int i = 0; i < n; i++) { vec[i] = (*tos)[i]; } if (stack.first() != 0) { h = stack.first(); packcontainer_int *tos = stack.get_item( h ); if (tos->length() == n*2) { tos->rhsData( vec ); reduce(); } else { assert( tos->length() > n*2 ); packcontainer_int *container = new packcontainer_int( n*2 ); container->lhsData( vec ); stack.add( container ); } // else } else { // the stack is empty packcontainer_int *container = new packcontainer_int( n*2 ); container->lhsData( vec ); stack.add( container ); } } // reduce /** Add a packdata element to the inverse wavelet packet transform calculation. A packdata element contains the wavelet packet data items from one level of the wavelet packet transform tree. The inverse wavelet packet transform calculation uses a stack. Each level in the stack consists of a packcontainer_int object. This object consists of left and right hand size arrays. When both these arrays are present, they can be treated as one contiguous array (courtesy of C++ operator overloading). The size of the packcontainer_int object is twice the size of its left and right hand size arrays. If the stack is empty, a new level is created. A packetcontainer object can be viewed as a binary tree element. The left hand size is filled in first. If the stack is not empty and the packcontainer_int object on the top of stack (TOS) is twice the size of the elem argument, then the array contained in the elem argument is added to the TOS element and reduce is called to calculate a step of the inverse wavelet transform. If the TOS element is greater than twice the size of elem then a new level is added. */ void invpacktree_int::add_elem( packdata *elem ) { assert( elem != 0 ); if (stack.first() == 0) { new_level( elem ); } else { size_t half = elem->length(); size_t n = half * 2; LIST::handle h; h = stack.first(); packcontainer_int *tos = stack.get_item( h ); if (tos->length() == n) { assert( tos->rhsData() == 0); tos->rhsData( (int *)elem->getData() ); reduce(); } else if (tos->length() > n) { new_level( elem ); } else { printf("add_elem: the size of the TOS elem is wrong\n"); } } // else } // add_elem /** This constructor calculates the inverse wavelet packet transform. The constructor is passed a packdata_list object, which contains the "best basis" result of the wavelet packet transform. The liftbase template argument is a pointer to a wavelet transform function. This wavelet transform must be the same function that was used to calculate the packet transform. */ invpacktree_int::invpacktree_int( packdata_list &list, liftbase *w ) { data = 0; N = 0; waveObj = w; // Traverse the "best basis" list and calculate the inverse // wavelet packet transform. packdata_list::handle h; for (h = list.first(); h != 0; h = list.next( h )) { packdata *elem = list.get_item( h ); add_elem( elem ); } // for LIST::handle tosHandle; tosHandle = stack.first(); packcontainer_int *tos = stack.get_item( tosHandle ); if (tos != 0) { size_t len = tos->length(); N = len/2; data = tos->lhsData(); stack.remove(); } } // invpacktree_int /** print the result of the inverse wavelet packet transform */ void invpacktree_int::pr() { if (data != 0) { for (int i = 0; i < N; i++) { printf("%7.4f ", data[i] ); } printf("\n"); } } // pr packet/lossless/src/packtree_base_int.cpp0100644000076400007640000001314007523321622017571 0ustar iankiank #include "queue.h" #include "packnode.h" #include "packcontainer_int.h" #include "packtree_base_int.h" /** Add a new level to the wavelet packet tree. Wavelet packet trees are data structures that support a variety of applications. If the reverse argument is true, the locations of the high pass and low pass filter results in the wavelet calculation will be reversed. This is used in building a wavelet packet tree for frequency analysis. The top packnode object contains data from the previous level. If this is the first level in the tree, top will contain the input data set. A packcontainer_int object is created with the top data. The packcontainer_int constructor will allocate new storage and copy the data into this storage. If the packcontainer_int object consists of N elements, then there will be N/2 elements on the left and N/2 or the right. The object allows the lhs and rhs data to be accessed as one array. A wavelet transform step is calculated on the N element data set. This results in N/2 values from the wavelet scaling function (low pass function) and N/2 values from the wavelet function (high pass function). These values are used to create two new packnode objects which become children of top. Sub-trees for the new packnode objects are recursively calculated. As the tree is constructed, the leaves of the tree are marked with a boolean flag in preparation for calculating the "best basis" representation for the data. See the algorithm outlined in section 8.2.2 of "Ripples in Mathematics" by Jensen and la Cour-Harbo The wavelet packet tree form that is used for wavelet packet frequency analysis is described in section 9.3 (figure 9.14) ofg "Ripples in Mathematics". */ void packtree_base_int::newLevel( packnode* top, bool freqCalc, bool reverse ) { if (top != 0) { const size_t len = top->length(); if (len > 1) { // Create a new wavelet packet container for use in // calculating the wavelet transform. Note that the // container is only used locally. packcontainer_int container( top ); if (reverse) { // Calculate the reverse foward wavelet transform step, // where the high pass result is stored in the upper half // of the container and the low pass result is stored // in the lower half of the container. waveObj->forwardStepRev( container, len ); } else { // Calculate the foward wavelet transform step, where // the high pass result is stored in the upper half // of the container and the low pass result is stored // in the lower half of the container. waveObj->forwardStep( container, len ); } packnode *lhs = new packnode(container.lhsData(), len/2, packnode::LowPass ); packnode *rhs = new packnode(container.rhsData(), len/2, packnode::HighPass ); // set the "mark" in the top node to false and // mark the two children to true. top->mark( false ); lhs->mark( true ); rhs->mark( true ); top->lhsChild( lhs ); top->rhsChild( rhs ); // The transform on the left hand side always uses // the standard order (e.g., low pass filter result // goes in the lower half, high pass goes in the // upper half of the container). newLevel( lhs, freqCalc, false ); if (freqCalc) { // wavelet packet frequency analysis reverses the // storage locations for the filter results in the // right hand child newLevel( rhs, freqCalc, true ); } else { // freq == false // use standard filter location newLevel( rhs, freqCalc, false ); } } } } // newLevel /** Print the wavelet packet tree, breadth first (this is also sometimes called a level traversal). The breadth first traversal uses a queue. The root of the tree is initially inserted into the queue. The function operates by deleting the node at teh front of the queue, printing the data associated with that node and adding the node's left and right children to the queue. Since a node's children are at the next lower level, and we add the left child before the right child, the function prints a tree level from left to right. The above paragraph paraphrases Chapter 5, Level Order Traversal of Fundamentals of Data Structures in C by Horowitz, Sahni and Anderson-Freed, 1993. */ void packtree_base_int::breadthFirstPrint(const printKind kind) { queue Q; Q.addQueue( root, 0 ); while (! Q.queueEmpty() ) { packnode *node = Q.queueStart()->node; size_t indent = Q.queueStart()->indent; Q.deleteStart(); if (indent > 0) { // print 'indent' spaces printf("%*c", indent, ' '); } switch (kind) { case printData: node->pr(); break; case printCost: node->prCost(); break; case printBestBasis: node->prBestBasis(); break; default: assert( false ); break; } // switch packnode *lhs = node->lhsChild(); packnode *rhs = node->rhsChild(); if (lhs != 0) { Q.addQueue( lhs, indent + 2 ); } if (rhs != 0) { Q.addQueue( rhs, indent + 2 ); } } } // packtree_base_int::breadthFirstPrint /** Print the wavelet packet tree data and wavelet transform result to standard out. */ void packtree_base_int::pr() { if (root != 0) { breadthFirstPrint(printData); } } // pr packet/lossless/src/packtree_int.cpp0100644000076400007640000001715207523326656016622 0ustar iankiank /** \file The documentation in this file is formatted for doxygen (see www.doxyeng.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include #include #include "packcontainer_int.h" #include "packtree_int.h" /** Construct a wavelet packet tree from a vector of integer values. The size of the vector, which must be a power of two, is passed in N. A wavelet Lifting Scheme object is passed in w. This object is used to calculate the wavelet transform step which is applied at each level (where level > 0) of the wavelet packet tree. The first level (level 0) of the wavelet packet tree contains the original data set. \arg vec An array of integer values on which the wavelet packet transform is calculated. \arg N The number of elements in the input array \arg w A pointer to the the wavelet transform object to use in calculating the wavelet packet transform. */ packtree_int::packtree_int( const int *vec, const size_t N, liftbase *w ) { waveObj = w; block_pool mem_pool; int *vecCopy = (int *)mem_pool.pool_alloc( N * sizeof( int ) ); for (int i = 0; i < N; i++) { vecCopy[i] = vec[i]; } root = new packnode( vecCopy, N, packnode::OriginalData ); root->mark( true ); newLevel( root, false, false ); } // packtree_int /** The best basis algorithm selects the nodes nearest the tree root for the best basis set. These nodes are "marked" true with a boolean flag. The best basis algorithm outlined in Ripples in Mathematics sets any marks in nodes that are below a marked node in the tree (nodes which are in a subtree of a marked node) to false. However, this is unnecessary when the best basis set is collected, since the algorithm uses top down tree traversal and stops at marked node. A problem does arise when the entire tree is printed to show the nodes that are marked as part of the best basis set. In this case the result may appear wrong, since child nodes of a best basis node are marked. This function does a top down traversal setting the "marks" on these child nodes to false. */ void packtree_int::cleanTree(packnode *top, bool removeMark ) { if (top != 0) { if (removeMark) { if (top->mark()) { top->mark( false ); } } else { // if a mark is found, then set all the "marks" below that // point to false (e.g., remove the marks). if (top->mark()) { removeMark = true; } } cleanTree( top->lhsChild(), removeMark ); cleanTree( top->rhsChild(), removeMark ); } } // cleanTree /** Print the wavelet packet tree cost values in breadth first order. */ void packtree_int::prCost() { if (root != 0) { breadthFirstPrint(printCost); } } /** Print the wavelet packet tree, showing the nodes that have been selected by the "best basis" algorithm. */ void packtree_int::prBestBasis() { if (root != 0) { cleanTree( root, false ); breadthFirstPrint(printBestBasis); } } // prBestBasis /** Walk the wavelet packet tree and apply the "best basis" algorithm described in Chapter 8 of Ripples in Mathematics. Nodes that are "marked" become part of the best basis, which is a minimal representation of the data in terms of the cost function. */ int packtree_int::bestBasisWalk( packnode *top ) { int cost = 0; if (top != 0) { packnode *lhs = top->lhsChild(); packnode *rhs = top->rhsChild(); if (lhs == 0 && rhs == 0) { // we've reached a leaf cost = top->cost(); } else if (lhs != 0 && rhs != 0) { int lhsCost = bestBasisWalk( lhs ); int rhsCost = bestBasisWalk( rhs ); int v1 = top->cost(); int v2 = lhsCost + rhsCost; if (v1 <= v2) { top->mark( true ); lhs->mark( false ); rhs->mark( false ); } else { // v1 > v2 top->cost( v2 ); } cost = top->cost(); } else { // The tree does not seem to be a full binary tree // Something has gone badly wrong. assert( false ); } } return cost; } // bestBasicWalk /** Calculate the wavelet packet "best basis" */ void packtree_int::bestBasis() { bestBasisWalk( root ); } // bestBasis /** Recursively traverse the wavelet packet tree and check that the best basis result is correct. That is, that the best basis has been calculated and that it does not include the orignal data set. The best basis includes the original data set with the packnode ofr the original data set is marked. This algorithm makes use of two class global variables. There may be a purely recursive, way to do this without these global class variables, but these variables make the algorithm much easier. The variables are initialized by the calling function bestBasisOK(). */ void packtree_int::checkBestBasis( packnode *top ) { if (top != 0) { if (top->mark()) { foundBestBasisVal = true; if (top->getKind() == packdata::OriginalData) { foundOriginalData = true; } } if (!foundOriginalData) { checkBestBasis( top->lhsChild() ); } if (!foundOriginalData) { checkBestBasis( top->rhsChild() ); } } } // checkBestBasis /** Return true is be best basis has been calculated properly, return false if the best basis has not been calculated or it was not calculated properly. The best basis is calculated in reference to a particular cost function. A particular cost function will not always result in a data set which differs from the original data set. If this is the case, the "best basis" result will include the original data. */ bool packtree_int::bestBasisOK() { foundOriginalData = false; foundBestBasisVal = false; checkBestBasis( root ); bool rslt = (foundBestBasisVal && (!foundOriginalData)); return rslt; } // bestBasicOK /** Traverse the tree from the top down and add the best basis nodes to the best basis list. Note that the list object is simply a package for a scalar value, the pointer to the head of the list. So it can be passed by value without incurring a cost greater than passing a pointer (e.g., pass by reference). */ void packtree_int::buildBestBasisList( packnode *top, packdata_list &list ) { if (top != 0) { if (top->mark()) { list.add( top ); } else { buildBestBasisList( top->lhsChild(), list ); buildBestBasisList( top->rhsChild(), list ); } } } // buildBestBasisList /** Return a list consisting of the best basis packdata values. */ packdata_list packtree_int::getBestBasisList() { packdata_list list; buildBestBasisList( root, list ); return list; } // getBestBasisList packet/lossless/src/support.cpp0100644000076400007640000001115207525263210015644 0ustar iankiank #include "support.h" /** Represent a real value with three fractional digits in integer form. To accomplish this the real number is rounded and then multiplied by 1000.0. The rounding used is so proper rounding:
  • If the digit in the fourth place is greater than 5, the digit in the third place is incremented by one.
  • If the digit in the fourth place is less than 5, the third digit is left unchanged.
  • If the digit in the fourth place is 5 and the digit in the third place is odd, the third digit is incremented.
Proper rounding is unbiased (that is, in a random sample of numbers the same number of values are rounded up as are rounded down). Some examples:
     12.4567 is rounded to 12.457 and converted to the integer
     12457.

     42.1234 is rounded to 42.123 and converted to the integer
     42123.

     127.1235 is rounded to 127.124 and converted to the integer
     127124.
  
While this function does what I intended, it does seem to do it in a lot of operations. There is probably a faster way to do this by directly manipulating IEEE floating point. While this might be faster, it is more complex. */ int support::roundVal_( const double val ) { int intPart = static_cast(val); double fracPart = val - intPart; int threeDigits = fracPart * 1000.0; int fourDigits = fracPart * 10000.0; int forthDigit = fourDigits % 10; int thirdDigit = threeDigits % 10; double roundVal = 0.001; if (forthDigit < 5) { roundVal = 0.0; } else if (forthDigit == 5) { if ((thirdDigit & 0x1) == 0) { roundVal = 0.0; } } double newVal = val + roundVal; double intRslt = newVal * 1000.0; return intRslt; } // roundVal_ /** Round an array of doubles to three decimal places and multiply by 1000, resulting in an integer that reflects the double value. For equity time series this kind of rounding is useful for "old style" pre-decimalization time series where the fractional values represent increments by 1/16. This kind of rounding is also useful for adjusted time series (e.g., the time series is adjusted by a split and/or dividends are reinvested). Since this function results in an integer vector with integer values reflecting three decimal places, this function should not be used for decimalized values (which only have two decimal places). */ void support::roundToInt( int *intVec, const double *realVec, const size_t len ) { if (intVec != 0 && realVec != 0) { for (size_t i = 0; i < len; i++) { intVec[i] = roundVal_( realVec[i] ); } } } // roundToInt /** Convert a decimalized array of doubles (e.g., where there are two base ten fractional digits (e.g., 6.02, 3.14, 1.15) into integer form. This is done my multiplying by 100 and truncating. No rounding is done, since this function assumes that here are only two significant fractional digits. The roundToInt function can be used for rounding. */ void support::decimalToInt( int *intVec, const double *realVec, const size_t len ) { if (intVec != 0 && realVec != 0) { for (size_t i = 0; i < len; i++) { intVec[i] = (int)(realVec[i] * 100.0); } } } // roundToInt size_t support::nearestPower2Width_( size_t val ) { size_t width = 0; if (val > 0) { width = 1; size_t power = 1; while (power < val && width < 32) { power = power << 1; width++; } } return width; } // nearestPower2Width_ /** Calculate the number of bits needed to represent an integer value. A sign bit is added, so that positive numbers always have a leading zero and negative numbers have a leading one. */ size_t support::valWidth( const int val ) { size_t wholeNum = (val < 0) ? -val : val; size_t width = 1 + nearestPower2Width_( wholeNum ); return width; } // valWidth /** Calculate the number of bits needed to represent an unsigned value. */ size_t support::UnsignedValWidth( const size_t val ) { size_t width = nearestPower2Width_( val ); return width; } // valWidth /** Calculate the minimum number of bits needed to represent the values in an integer vector. */ size_t support::vecWidth( const int *vec, const size_t N ) { size_t totalWidth = 0; if (vec != 0) { for (size_t i = 0; i < N; i++) { totalWidth += valWidth( vec[i] ); } } return totalWidth; } // vecWidth( int *) packet/MainPage0100644000076400007640000002705207525057655012416 0ustar iankiank /*! \mainpage

Introduction

This the main page for the doxygen documentation for the following C++ source code that implements:
  • Wavelet packet algorithm
  • Inverse wavelet packet algorithm
  • Time/Frequency analysis version of the wavelet packet algorithm
  • Floating point (e.g., double) versoins of the Daubechies D4, Haar and "line" wavelet algorithms.
  • Lossless integer wavelet compression algorithms (Haar, TS Transform and "line" wavelets).
  • Integer wavelet packet transform (for lossless compression)
  • Support code to read in Yahoo historical equity data files.
The C++ wavelet algorithms published here are related to a set of Java algorithms also published on bearcave.com (see Wavelets in Java). C++ was used to implement the wavelet packet algorithms because C++ provides features like operator overloading and templates which proved useful in creating reusable wavelet packet code. The associated Web pages can be found on Bearcave.com at: The web pages above provide an overview of the wavelet packet transform. These web pages are meant to be read along with this source code, which is extensively documented. The wavelet packet transform has a variety of applications, but one of the most common involves data compression. A cost function is associated with the wavelet packet transform which will find the best wavelet "basis" for various regions of the data set. The "best basis" is the wavelet scale that best fits that region. The determination of "best fit" is made relative to a given wavelet and cost function pair. Assuming that the wavelet function can produce an approxiation of the data set, the end result of both the floating point and integer versions of the wavelet packet transform will be the data set mapped into a set of smaller values. In the case of lossy compression small values can be set to zero, allowing coding compression (e.g., Huffman or "run length" encoding). The integer version of the wavelet packet algorithm (which uses lossless integer to integer wavelet transforms) is useful for lossless compression. In this case, compression is achieved by the fact that the data set can be mapped to smaller values which can be represented in fewer bits. The source code included here also includes a modified wavelet packet algorithm, which is used for time/requency analysis. Given the complexity of wavelets, the web pages above (and the commented source code) fall short in completeness of explanation. The material I've written should be read along with other sources (e.g., books and articles on wavelets). No single reference will cover all the facets of wavelet mathematics and application. There is a vast literature on wavelets. Many articles and books are written by mathematicians, either for other mathematicians or for students of mathematics. One of the few books I've found that leans less toward theory and more toward application is Ripples in Mathematics by Jensen and la-Cour Harbo, Springer Verlag, 2001. The wavelet packet algorithms implemented here are based on Chapter 8 and 9 of this book.

Download

You can download the source code, in tar format, for the wavelet packet transform here. The source include Makefiles for both Windows NT (nmake) and UNIX. This source code contains both the wavelet packet transform code, the modified wavelet packet transform for wavelet time frequency analysis, lossless wavelet compression code and support to read Yahoo equity time series files.

Trees vs. Tables

I have chosen to represent the result of the wavelet packet transform as a dynamically allocated tree. The same data can be represented as a table, where each table row corresponds to a horizontal slice through the tree (e.g., the level basis). I think that the tree representation is more flexible and natural. Dynamic data structures are easily implemented in languages like C++ and Java. This may not be true of MATLAB code.

Overview of the Source Code

The source code published here can be divided into three catagories:

  1. Floating point wavelet packet and modified wavelet packet code. The wavelet packet code uses floating point wavelet algorithms and floating point cost functions (e.g., Shannon and threshold cost functions).
  2. Lossless wavelet packet compression code. This code is supported by integer to integer wavelet transforms.
  3. Memory management. The wavelet packet algorithm uses dynamic allocation (e.g., new). To make deallocation fast, memory is allocated from a memory pool. This allows all allocated memory to be deallocated at once. Pool allocation also simplifies the code, since a single deallocation call is made when the data structures are no longer needed.
  4. Data input support for the lossless wavelet compression algorithm. My motivation for developing the lossless wavelet compression code is the application of this algorithm to financial time series (e.g., stock close prices). In this case these are historical data sets downloaded from Yahoo.

Data structure templates

The wavelet packet algorithm makes use of a several general data structure templates:
  1. FIFO_LIST template. This template supports a list with both a list head and a tail tail pointer. Items are added to the end of the list. When read from the front, the items will be read in first-in, first-out order. This is used to build a "queue" which is used in calculating the inverse wavelet packet transform and in constructing the wavelet packet data list that results from the wavelet packet transform.
  2. LIST template. This supports a simple linked list with a single list head pointer.
  3. GrowableArray template. This is a generic growable array that is by the modified wavelet packet algorithm for time frequency analysis.

Wavelet Algorithm Templates

The wavelet algorithms used by the wavelet packet algorithms are based on the wavelet lifting scheme, where thare are one or more predict and update stages. The liftbase template provides a common base class and can be instantiated for the array type and the array element type. The wavelet algorithms themselfs are also templatized to allow them to be used with simple data structures and with an indexible data structure like packcontainer.

Wavelet packet tree code

The packtree and packfreq classes (derived from the common base class packtree_base) build wavelet packet trees. In the case of the packfreq class, the nodes at a given level (a so called level basis) of the tree are ordered by frequency, (moving from left to right).

The wavelet packet algorithm is independent of the actual wavelet algorithm that is used while building the tree. The following wavelet algorithms are included:

  • Daubechies D4. The forward and inverse Daubechies D4 algorith is supported for building a standard wavelet packet tree (which can be used in best basis calculation). Only the forward wavelet step functions are provided for calculating a frequency ordered wavelet packet tree.

  • Haar

    • Lifting scheme version of the Haar wavelet (see Basic Lifting Scheme Wavelets).

    • Haar "classic". This is the most common version of the Haar wavelet.
    • Haar "classic" for frequency ordering. This includes the forward and inverse wavelets steps for calculating a frequency ordered wavelet packet tree and for calculating the inverse.

  • Line wavelet. This is a lifting scheme wavelet that uses linear interpolation.

The lossless wavelet packet tree code uses integer to integer versions of the Haar and line wavelet algorithms. Another algorithm, sometimes called the TS transform, which is popular in image processing is also included. Once the wavelet packet tree is constructed a "best basis" algorithm can be applied. The "best basis" is the minimal representation of the data relative to a particular cost function. This code provides cost functions derived from a common base class, costbase. The packcontainer class allows a sequence of N numbers to be treated as both a contiguous array or as a left half and a right half (each consisting of N/2 data elements). The wavelet packet and modified wavelet packet algorithms were developed for floating point (e.g., double) arrays (or containers with double elements). The lossless wavelet packet compression code uses integer to integer transforms. In writing this code I have attempted to share as much as possible with the original floating point wavelet packet code. However, in some cases the lossless compression code consists of integer specific versions of the original wavelet packet code. For example, costbase_int is the integer specific cost function base class. The packtree_int and invpacktree_int classes provide integer specific wavelet packet tree support. In most cases memory is allocated from a memory pool. This approach to dynamic allocation allows memory to be allocated without worrying about deallocation. At a point in the program when the memory is no longer needed, it is all deallocated at once by deallocating the memory pool. The only exception to pool allocation is the GrowableArray class, which uses the standard new and delete operators.

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
*/ packet/Makefile0100644000076400007640000000615407525020700012427 0ustar iankiank # # Makefile for Wavelet Packet code # # This makefile assumes that the Microsoft environment has # been enhanced with the cygwin UNIX utilities for Win32. # These are available from Red Hat (which purchased Cygnus). # # Command: # nmake -f Makefile # DEBUG = -Zi BROWSE = -FR CFLAGS = $(BROWSE) $(DEBUG) -DWIN32 -Tp OBJ = obj EXE = .exe LOCALINC = include DOXYPATH = e:\doxygen\bin INCLUDE = -I$(LOCALINC) -I "d:\Program Files\Microsoft Visual Studio\Vc98\Include" PACKET_OBJ = blockpool.$(OBJ) packtree_base.$(OBJ) packtree.$(OBJ) packfreq.$(OBJ) costshannon.$(OBJ) invpacktree.$(OBJ) all: packtest freqtest packtest: packtest$(EXE) freqtest: freqtest$(EXE) packtest$(EXE): $(PACKET_OBJ) packtest.$(OBJ) $(CC) $(PACKET_OBJ) packtest.$(OBJ) $(DEBUG) -o packtest$(EXE) freqtest$(EXE): $(PACKET_OBJ) freqtest.$(OBJ) $(CC) $(PACKET_OBJ) freqtest.$(OBJ) $(DEBUG) -o freqtest$(EXE) # # clean-up for Microsoft object and browser files and emacs temps # clean: rm -f *.obj *.pdb *.sbr *.ilk *.exe rm -f include/*~ rm -f src/*~ doxygen: $(DOXYPATH)\doxygen doxygenDocConfig include\costbase.h: include\packnode.h include\costshannon.h: include\costbase.h include\packnode.h include\costthresh.h: include\costbase.h include\packnode.h include\haar.h: include\liftbase.h include\haar_classic.h: include\liftbase.h include\line.h: include\liftbase.h include\packdata.h: include\blockpool.h include\invpacktree.h: include\packdata.h include\packnode.h: include\packdata.h include\packdata_list.h: include\fifo_list.h include\packdata.h include\packcontainer.h: include\packnode.h include\queue.h: include\fifo_list.h include\packnode.h include\packtree_base.h: include\packnode.h include\liftbase.h include\packtree.h: include\packtree_base.h include\packcontainer.h include\liftbase.h include\packfreq.h: include\packtree_base.h include\liftbase.h include\invpacktree.h: include\liftbase.h include\list.h include\packcontainer.h include\packdata.h include\packdata_list.h packtree_base.$(OBJ): src\$*.cpp include\$*.h $(CC) -c $(INCLUDE) $(CFLAGS) src\$*.cpp packtree.$(OBJ): src\$*.cpp include\$*.h include\queue.h include\packcontainer.h include\blockpool.h $(CC) -c $(INCLUDE) $(CFLAGS) src\$*.cpp packfreq.$(OBJ): src\$*.cpp include\$*.h $(CC) -c $(INCLUDE) $(CFLAGS) src\$*.cpp costshannon.$(OBJ): src\$*.cpp include\$*.h $(CC) -c $(INCLUDE) $(CFLAGS) src\$*.cpp invpacktree.$(OBJ): src\$*.cpp include\$*.h include\blockpool.h $(CC) -c $(INCLUDE) $(CFLAGS) src\$*.cpp blockpool.$(OBJ): src\$*.cpp include\$*.h $(CC) -c $(INCLUDE) $(CFLAGS) src\$*.cpp local_new.$(OBJ): src\$*.cpp $(CC) -c $(INCLUDE) $(CFLAGS) src\$*.cpp packtest.$(OBJ): src\$*.cpp include\haar.h include\haar_classic.h include\packnode.h include\packcontainer.h include\packtree.h include\invpacktree.h include\costshannon.h include\costthresh.h $(CC) -c $(INCLUDE) $(CFLAGS) src\$*.cpp freqtest.$(OBJ): src\$*.cpp include\haar_classicFreq.h include\packcontainer.h $(CC) -c $(INCLUDE) $(CFLAGS) src\$*.cpp packet/Makefile.unix0100644000076400007640000000520110176102663013406 0ustar iankiank # # Makefile for Wavelet Packet code on UNIX (Live Free or Die!) # # This make file assumes that the GNU g++ compiler is available # # To run this make file (on UNIX) enter # # make -f Makefile.unix # # Most recently tested using # # g++ (GCC) 3.2.3 20030502 (Red Hat Linux 3.2.3-42) # DEBUG = -g BROWSE = GNU_FLAGS = -Wno-deprecated CFLAGS = $(BROWSE) $(DEBUG) -D_UNIX_ $(GNU_FLAGS) OBJ = o # # Specify the UNIX C++ compiler here # CC = g++ # CC = CC # CC = /usr/local/forte/SUNWspro/bin/CC # LOCALINC = include INCLUDE = -I$(LOCALINC) PACKET_OBJ = blockpool.$(OBJ) packtree_base.$(OBJ) packtree.$(OBJ) packfreq.$(OBJ) costshannon.$(OBJ) invpacktree.$(OBJ) packtest.$(OBJ) all: $(PACKET_OBJ) $(CC) $(PACKET_OBJ) $(DEBUG) -o packet # # clean-up for Microsoft object and browser files and emacs temps # # It's totally wierd, clean stopped working... clean: # rm *.obj *.pdb *.sbr *.exe # rm -f include/*~ # rm -f src/*~ include/costbase.h: include/packnode.h include/costshannon.h: include/costbase.h include/packnode.h include/costthresh.h: include/costbase.h include/packnode.h include/haar.h: include/liftbase.h include/haar_classic.h: include/liftbase.h include/line.h: include/liftbase.h include/packdata.h: include/blockpool.h include/invpacktree.h: include/packdata.h include/packnode.h: include/packdata.h include/packdata_list.h: include/fifo_list.h include/packdata.h include/packcontainer.h: include/packnode.h include/queue.h: include/fifo_list.h include/packnode.h include/packtree.h: include/packnode.h include/packcontainer.h include/liftbase.h include/invpacktree.h: include/liftbase.h include/list.h include/packcontainer.h include/packdata.h include/packdata_list.h packtree_base.$(OBJ): include/queue.h include/packnode.h include/packcontainer.h include/packtree_base.h $(CC) -c $(INCLUDE) $(CFLAGS) src/$*.cpp packtree.$(OBJ): include/queue.h include/packcontainer.h include/blockpool.h $(CC) -c $(INCLUDE) $(CFLAGS) src/$*.cpp packfreq.$(OBJ): include/packfreq.h $(CC) -c $(INCLUDE) $(CFLAGS) src/$*.cpp costshannon.$(OBJ): $(CC) -c $(INCLUDE) $(CFLAGS) src/$*.cpp packdata_list.$(OBJ): $(CC) -c $(INCLUDE) $(CFLAGS) src/$*.cpp invpacktree.$(OBJ): include/blockpool.h $(CC) -c $(INCLUDE) $(CFLAGS) src/$*.cpp blockpool.$(OBJ): $(CC) -c $(INCLUDE) $(CFLAGS) src/$*.cpp local_new.$(OBJ): $(CC) -c $(INCLUDE) $(CFLAGS) src/$*.cpp packtest.$(OBJ): include/haar.h include/haar_classic.h include/packnode.h include/packcontainer.h include/packtree.h include/invpacktree.h include/costshannon.h include/costthresh.h $(CC) -c $(INCLUDE) $(CFLAGS) src/$*.cpp %.o: src/%.cpp include/%.h packet/src/0040755000076400007640000000000010176075422011562 5ustar iankiankpacket/src/blockpool.cpp0100644000076400007640000001555010176075422014255 0ustar iankiank /** \file This file contains the class functions for a "pool" based memory allocator. These functions manage the block chain that makes up the memory pool and allocates memory from the individual blocks. The entire pool is freed at once. The pool allocator was originally written as a low level allocation package. The original package queries the system to find the page size and allocation block size. This version has been simplified, but some of the low level nature remains. The documentation in this file is formatted for doxygen (see www.doxyeng.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include #include #include #include "blockpool.h" unsigned int block_pool::alloc_gran = (unsigned int)block_pool::page_size; block_pool::block_chain *block_pool::current_block = 0; block_pool::block_chain *block_pool::block_list_start = 0; /** block_pool::init_pool This function is automatically called to initialize the block_pool object when the "current_block" pointer is null. */ void block_pool::init_pool( void ) { block_chain *new_link; new_link = new_block( alloc_gran ); block_list_start = new_link; current_block = new_link; } /* init_pool */ /** new_block The new_block function is the "root" memory allocator for the block_pool object. The amount of memory allocated is rounded up to the next "block_size" boundary. Both the block_chain structure and the allocatible memory are allocated from a single block that is a multiple of the page size. This should avoid fragmentation in the system memory allocator. The "page" referenced here is a virtual memory page. This version of the code does not actually check the system page size, but assumes a 4Kb page. */ block_pool::block_chain *block_pool::new_block( unsigned int block_size ) { const unsigned int max_block_size = max_block_multiple * page_size; block_chain *new_link = 0; unsigned int alloc_amt, total_alloc; // add in the memory needed for the block_chain structure total_alloc = block_size + sizeof(block_chain); if (total_alloc < alloc_gran) alloc_amt = alloc_gran; else { // its larger than the minimum allocation granularity, so round // up the the nearest page. alloc_amt = ((total_alloc + (page_size-1))/page_size) * page_size; } if (alloc_amt <= max_block_size) { /* Allocate memory for both the block_chain structure and the memory block */ new_link = (block_chain *)MemAlloc( alloc_amt ); // The new memory block starts after the block_chain structure Chain_block(new_link) = (void *)(((unsigned int)new_link) + sizeof(block_chain)); assert( alloc_amt >= block_size ); Chain_bytes_used(new_link) = 0; Chain_block_size(new_link) = alloc_amt - sizeof(block_chain); Chain_next(new_link) = 0; } else { printf("block_pool::new_block: allocation request too large\n"); } return new_link; } // block_chain::new_block /** block_pool::add_block Add a new memory block to the memory pool. This function is called when the amount of memory requested by pool_alloc will not fit in the current block. */ void *block_pool::add_block( unsigned int block_size ) { block_chain *block = 0; block_chain *last_block; last_block = current_block; block = new_block( block_size ); Chain_next(current_block) = block; current_block = block; return (void *)block; } // block_chain::add_block /** pool_alloc Allocate memory from the memory pool. The pool_alloc and free_pool functions do memory allocation and deallocation. This function is called to allocate memory from the memory pool. If there is enough free memory in the current block to satisify the memory request, memory is allocated from the current block and the amount of free memory is updated. If the current block does not have enough memory, add_block is called to allocate a new memory block which will be large enough. */ void *block_pool::pool_alloc( unsigned int num_bytes ) { const unsigned int align = sizeof( int ); void *addr = 0; unsigned int amt_free; /* the number of bytes allocated must be a multiple of the align size */ num_bytes = ((num_bytes + (align-1))/align) * align; if (current_block == 0) { init_pool(); } amt_free = Chain_block_size(current_block) - Chain_bytes_used(current_block); if (num_bytes > amt_free) { if (add_block( num_bytes ) != 0) { amt_free = Chain_block_size(current_block); } } if (amt_free >= num_bytes) { addr = (void *)((unsigned int)Chain_block(current_block) + Chain_bytes_used(current_block)); Chain_bytes_used(current_block) += num_bytes; } else { printf("block_pool::block_alloc: allocation error\n"); exit(1); } return addr; } // block_pool::pool_alloc /** block_pool::free_pool Walk through the block chain and deallocate the blocks. Note that the block chain structures and the allocatible memory is contained within a single allocated block. The block_chain structure is at the start of this block so passing its address to the memory deallocation function deallocates both the block chain structure and the allocatible memory */ void block_pool::free_pool(void) { block_chain *tmp; while (block_list_start != 0) { tmp = block_list_start; block_list_start = Chain_next(block_list_start); MemFree( (void *)tmp ); } } // free_pool /** print_block_pool_info Print information about the block pool */ void block_pool::print_block_pool_info( FILE *fp /*= stdout */) { int total_allocated = 0; int total_unused = 0; block_chain *ptr = block_list_start; fprintf(fp, "Minimum memory allocation size: %d\n", alloc_gran ); fprintf(fp, "Page size: %d\n", (unsigned int)page_size ); fprintf(fp, "[block size, bytes_used]\n"); while (ptr != 0) { fprintf(fp, "[%4d, %4d]", Chain_block_size(ptr), Chain_bytes_used(ptr)); total_allocated += Chain_bytes_used(ptr); total_unused += (Chain_block_size(ptr) - Chain_bytes_used(ptr)); if (Chain_next(ptr) != 0) { fprintf(fp, ", "); } else { fprintf(fp, "\n"); } ptr = Chain_next(ptr); } // while fprintf(fp, "Total allocated = %5d, total unused = %3d\n", total_allocated, total_unused ); } packet/src/costshannon.cpp0100644000076400007640000000155407515164511014626 0ustar iankiank #include #include #include #include "costshannon.h" /** An implementation of a modified version of the Shannon entropy function as a wavelet packet cost function. This is described in section 8.3.2 of Ripples in Mathematics by Jensen and la Cour-Harbo. The log function here is the natural log (sometimes denoted as ln()). Note that the result of the entropy function is always negative. */ double costshannon::costCalc( packnode *node ) { assert( node != 0 ); size_t len = node->length(); const double *a = node->getData(); double sum = 0.0; for (int i = 0; i < len; i++) { double val = 0.0; if (a[i] != 0.0) { double square = a[i] * a[i]; val = square * log( square ); } sum = sum + val; } return -sum; } // costshannon packet/src/freqtest.cpp0100644000076400007640000001314607525022502014120 0ustar iankiank /** \file This file contains code to test wavelet frequency analysis via wavelet packets. See http://www.bearcave.com/misl/misl_tech/wavelets/packfreq/index.html The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include #include #include "packcontainer.h" #include "haar_classicFreq.h" #include "daub.h" #include "packfreq.h" /** Some small data sets */ /**/ double data[] = { 32.0, 10.0, 20.0, 38.0, 37.0, 28.0, 38.0, 34.0, 18.0, 24.0, 18.0, 9.0, 23.0, 24.0, 28.0, 34.0 }; /**/ /* double data[] = { 56.0, 40.0, 8.0, 24.0, 48.0, 48.0, 40.0, 16.0 }; */ /** \function Generate a signal composed of a sum of sine waves. The sine waves summed are in decreasing magnitude and decreasing frequency. */ void gen_freqMix( double *vecX, double *vecY, size_t N) { const double PI = 3.1415926535897932384626433832795; const double range = 2 * PI; const double incr = range / (double)N; double point = 0.0; int i; for (i = 0; i < N; i++) { vecX[i] = point; vecY[i] = 4 * sin( 64 * point ) + 2 * sin( 32 * point ) + 1 * sin( 16 * point ) + 0.5 * sin( 8 * point ); // printf("%7.4g, %7.4g\n", vecX[i], vecY[i] ); point = point + incr; } } // gen_freqMix /** \function Generate a signal composed of one or more sine waves. */ void gen_sinCombo( double *vecX, double *vecY, size_t N ) { const double PI = 3.1415926535897932384626433832795; const double range = 8 * PI; const double incr = range / (double)N; double point = 0.0; int stepCnt = 0; int i; for (i = 0; i < N; i++) { vecX[i] = point; // vecY[i] = sin( 64 * point ) + sin( 32 * point ) + sin( 16 * point ); // vecY[i] = sin( 16 * PI * point ) + sin( 4 * PI * point ); vecY[i] = sin( 4 * PI * point ); // printf("x[%2d] = %7.4g, y[%2d] = %7.4g\n", i, vecX[i], i, vecY[i] ); // printf("%7.4g, %7.4g\n", vecX[i], vecY[i] ); // printf("%d, %7.4g\n", i, vecY[i] ); point = point + incr; } } /** \function Generate a signal that increases in frequency by steps. */ void gen_steps( double *vecX, double *vecY, size_t N, size_t steps ) { const double PI = 3.1415926535897932384626433832795; const double range = 32 * PI; const double incr = range / (double)N; double point = 0.0; double mult = 1; const size_t stepWidth = N / steps; int stepCnt = 0; int i; for (i = 0; i < N; i++) { vecX[i] = point; vecY[i] = sin( mult * point ); // printf("x[%2d] = %7.4g, y[%2d] = %7.4g\n", i, vecX[i], i, vecY[i] ); // printf("%7.4g, %7.4g\n", vecX[i], vecY[i] ); // printf("%d, %7.4g\n", i, vecY[i] ); point = point + incr; stepCnt++; if (stepCnt == stepWidth) { mult = mult + (PI/2.0); stepCnt = 0; } } } /** \function Generate a linear chirp signal */ void gen_chirp( double *vecX, double *vecY, size_t N ) { const double PI = 3.1415926535897932384626433832795; const double range = 2; // const double range = 16 * PI; const double incr = range / (double)N; double point = 0.0; int i; for (i = 0; i < N; i++) { vecX[i] = point; vecY[i] = sin( 128 * PI * point * point ); // printf("x[%2d] = %7.4g, y[%2d] = %7.4g\n", i, vecX[i], i, vecY[i] ); // printf("%7.4g, %7.4g\n", vecX[i], vecY[i] ); // printf("%d, %7.4g\n", i, vecY[i] ); point = point + incr; } } /** \function Print a vector of doubles whose length is len. */ void prCoords( double *vecX, double *vecY, size_t len ) { for (int i = 0; i < len; i++) { printf("%7.4f %7.4f\n", vecX[i], vecY[i] ); } } /** \function Print a vector of doubles */ void prVec( double *vec, size_t len ) { for (int i = 0; i < len; i++) { printf("%4d %7.4f\n", i, vec[i] ); } } // prVec /** \function The entry point for code to test the wavelet packet transform. The code in main provides a simple example of how to call the wavelet packet transform code. */ int main() { const size_t N = 1024; // const size_t N = sizeof( data ) / sizeof( double ); double vecX[N], vecY[N]; // gen_chirp( vecX, vecY, N ); // gen_steps( vecX, vecY, N, 8 ); gen_freqMix( vecX, vecY, N ); // gen_sinCombo( vecX, vecY, N ); // prVec( vecY, N ); // prCoords( vecX, vecY, N ); // The "Haar" classic transform haar_classicFreq h; // Daubechies h; // calculate the wavelet packet tree, using the wavelet transform h packfreq tree( vecY, N, &h ); // packfreq tree( data, N, &h ); // tree.pr(); // printf("\n"); tree.getLevel( 5 ); tree.plotMat(N); // free the memory pool block_pool mem_pool; mem_pool.free_pool(); return 0; } packet/src/invpacktree.cpp0100644000076400007640000001524707515164710014611 0ustar iankiank #include #include #include "blockpool.h" #include "invpacktree.h" /** \file For additional information on this implementation of the inverse wavelet packet transform see http://www.bearcave.com/misl/misl_tech/wavelets/packet/index.html The documentation in this file is formatted for doxygen (see www.doxyeng.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ /** Allocate a new level in the wavelet packet tree that is being constructed. The new "level" is built from a packcontainer object. The left child will be the elem argument. The length of the data in the new level will be twice that of lower level (of which elem is half). */ void invpacktree::new_level( packdata *elem ) { size_t half = elem->length(); size_t n = half * 2; packcontainer *container = new packcontainer( n ); container->lhsData( (double *)elem->getData() ); stack.add( container ); } // new_level /** At this point the Top Of Stack (TOS) packcontainer object should have both a right and a left array. Calculate an inverse wavelet transform step on the packcontainer object. The packcontainer object allows the right and left hand side arrays to be treated as one array If the current top of stack is twice the size of the inverse wavelet transform step result, the result becomes the right hand size of top of stack packcontainer and reduce is called recursively. If the TOS is empty or it is not twice the size of the inverse transform result, a new packcontainer will be pushed on the stack. The left hand size will be the transform result. */ void invpacktree::reduce() { LIST::handle h; h = stack.first(); packcontainer *tos = stack.get_item( h ); assert( tos->lhsData() != 0 && tos->rhsData() != 0 ); /** Remove the linked list element that used to contain tos (e.g., pop the linked list element off). Note that this leaves the tos object unchanged (e.g., it does not delete it). */ stack.remove(); size_t n = tos->length(); // calculate the inverse wavelet transform step waveObj->inverseStep( (*tos), n ); // copy the result of the inverse wavelet transform // into a new data array. block_pool mem_pool; double *vec = (double *)mem_pool.pool_alloc( n * sizeof( double ) ); for (int i = 0; i < n; i++) { vec[i] = (*tos)[i]; } if (stack.first() != 0) { h = stack.first(); packcontainer *tos = stack.get_item( h ); if (tos->length() == n*2) { tos->rhsData( vec ); reduce(); } else { assert( tos->length() > n*2 ); packcontainer *container = new packcontainer( n*2 ); container->lhsData( vec ); stack.add( container ); } // else } else { // the stack is empty packcontainer *container = new packcontainer( n*2 ); container->lhsData( vec ); stack.add( container ); } } // reduce /** Add a packdata element to the inverse wavelet packet transform calculation. A packdata element contains the wavelet packet data items from one level of the wavelet packet transform tree. The inverse wavelet packet transform calculation uses a stack. Each level in the stack consists of a packcontainer object. This object consists of left and right hand size arrays. When both these arrays are present, they can be treated as one contiguous array (courtesy of C++ operator overloading). The size of the packcontainer object is twice the size of its left and right hand size arrays. If the stack is empty, a new level is created. A packetcontainer object can be viewed as a binary tree element. The left hand size is filled in first. If the stack is not empty and the packcontainer object on the top of stack (TOS) is twice the size of the elem argument, then the array contained in the elem argument is added to the TOS element and reduce is called to calculate a step of the inverse wavelet transform. If the TOS element is greater than twice the size of elem then a new level is added. */ void invpacktree::add_elem( packdata *elem ) { assert( elem != 0 ); if (stack.first() == 0) { new_level( elem ); } else { size_t half = elem->length(); size_t n = half * 2; LIST::handle h; h = stack.first(); packcontainer *tos = stack.get_item( h ); if (tos->length() == n) { assert( tos->rhsData() == 0); tos->rhsData( (double *)elem->getData() ); reduce(); } else if (tos->length() > n) { new_level( elem ); } else { printf("add_elem: the size of the TOS elem is wrong\n"); } } // else } // add_elem /** This constructor calculates the inverse wavelet packet transform. The constructor is passed a packdata_list object, which contains the "best basis" result of the wavelet packet transform. The liftbase template argument is a pointer to a wavelet transform function. This wavelet transform must be the same function that was used to calculate the packet transform. */ invpacktree::invpacktree( packdata_list &list, liftbase *w ) { data = 0; N = 0; waveObj = w; // Traverse the "best basis" list and calculate the inverse // wavelet packet transform. packdata_list::handle h; for (h = list.first(); h != 0; h = list.next( h )) { packdata *elem = list.get_item( h ); add_elem( elem ); } // for LIST::handle tosHandle; tosHandle = stack.first(); packcontainer *tos = stack.get_item( tosHandle ); if (tos != 0) { size_t len = tos->length(); N = len/2; data = tos->lhsData(); stack.remove(); } } // invpacktree /** print the result of the inverse wavelet packet transform */ void invpacktree::pr() { if (data != 0) { for (int i = 0; i < N; i++) { printf("%7.4f ", data[i] ); } printf("\n"); } } // pr packet/src/local_new.cpp0100644000076400007640000000167407466637225014253 0ustar iankiank #include #include /** \file This file contains overrides for the global new and delete operators. These exist to assure that only the pool allocation functions are called. If you see a message from one of these functions then something other than pool allocation is taking place. This file is only used for testing. If you don't want to do this check you can remove this file from the software build. */ void *operator new( size_t num_bytes ) { printf("global operator new\n"); void *rtn = malloc( num_bytes ); return rtn; } // new void *operator new[]( size_t num_bytes ) { printf("global operator new []\n"); void *rtn = malloc( num_bytes ); return rtn; } void operator delete( void *addr ) { printf("global operator delete\n"); free( addr ); } void operator delete[](void *addr ) { printf("global operator delete []\n"); free( addr ); } packet/src/packfreq.cpp0100644000076400007640000002117407515164006014064 0ustar iankiank /** \file The documentation in this file is formatted for doxygen (see www.doxyeng.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include #include #include #include "packfreq.h" /** Construct a wavelet packet tree from a vector of double values. The size of the vector, which must be a power of two, is passed in N. A pointer to a wavelet Lifting Scheme object is passed in w. The wavelet Lifting Scheme object is used to calculate the wavelet transform step which is applied at each level (where level > 0) of the wavelet packet tree. The first level (level 0) of the wavelet packet tree contains the original data set. The "newLevel" function is defined in the base class. This function is used to calculate both the standard and the modified wavelet packet trees. The modified wavelet packet tree is calculated by this class and is used for Wavelet frequency analysis. The wavelet transform step uses two filters H and G to calculate the low pass (scaling function) and the high pass (wavelet function). In the standard transform the low pass result is always placed in the lower half of the array and the high pass result is placed in the upper half of the array. Each of these two half arrays form the input for the next step. In the modified transform calculated by this class, the right child uses the standard algorithm where H and G results are in the upper and lower halves of the result array. However, the left child inverts the locations of the H and G results, placing the result of the G filter in the lower half and the result of the H filter in the upper half. The two boolean flags that are passed to the newLevel function determine whether a frequency ordered wavelet packet tree is calculated and whether the location of the filter results is inverted. \arg vec An array of double values on which the wavelet packet transform is calculated. \arg N The number of elements in the input array \arg w A pointer to the the wavelet transform object to use in calculating the wavelet packet transform. */ packfreq::packfreq( const double *vec, const size_t N, liftbase *w ) { waveObj = w; block_pool mem_pool; double *vecCopy = (double *)mem_pool.pool_alloc( N * sizeof( double ) ); for (int i = 0; i < N; i++) { vecCopy[i] = vec[i]; } root = new packnode( vecCopy, N, packnode::OriginalData ); root->mark( true ); // // The first level uses the standard wavelet calculation, so // reverse = false // freqCalc, reverse newLevel( root, true, false ); } // packfreq /** Traverse the tree, from left to right, and add a node at level to the level basis matrix. Levels are numbered from 0 at the root. */ void packfreq::findLevel( packnode* top, size_t cur_level, const size_t level ) { if (top != 0) { if (cur_level == level) { mat.append(top); } else { findLevel( top->lhsChild(), cur_level+1, level ); findLevel( top->rhsChild(), cur_level+1, level ); } } } // findLevel /** Build a level basis matrix The "level basis" is a horizontal slice through the wavelet packet tree. Here the levels are numbered from zero at root (which contains the original data). The most useful basis for frequency analysis is a square matrix. If the original data set consists of 1024 elements, level 5 of the tree consists of 32 tree nodes containing 32 elements each.
     number of elements
     in a tree node    level number of nodes
           1024                  0                 1
            512                  1                 2
            256                  2                 4
            128                  3                 8
             64                  4                16
             32                  5                32
The level basis is built from left to right, in the horizontal slice through the tree. The left most node contains the lowest frequency band. */ void packfreq::getLevel( const size_t level ) { findLevel( root, 0, level ); } // getLevel /** Print out the level basis matrix so that it can be plotted as a three dimensional surface. The level basis for a given level is constructed by the getLevel() function. In the discussion of this function below, we will consider the case where the modified wavelet packet tree was built from a data set of 1024 elements and the level basis was at level 5, resulting in a matrix of 32 nodes, each of which has 32 values. mat[0] is the left most node (and lowest frequency band), mat[31] is the right most (and highest frequency band). The values (*mat[0])[0] ... (*mat[0])[31] represent frequency values at particular time intervals. If we use two variables, x and y, to index the matrix then (*mat[y])[x] defines a time/frequency plane, where the x-index is time and the y-index is frequency. The value at (*mat[y])[x] is the magnitude a particular time/frequency point. In plotting a surface from this data, time or frequency are plotted on the x or y axis. The magnitude at (*mat[y])[x] is plotted on the Z-axis. Following Ripples in Mathematics by Jensen and la-Cour Harbo (Springer Verlag, 2001), the calculation for the z-axis value is:
      m = (*mat)[y][x]
      z_val = log( 1 + val^2 )  
Where log is the natural log. This function has been used to generate data for gnuPlot surface plots. Whether frequency is plotted on the x-axis or the y-axis depends on the nature of the data. If a signal line sin(x) is analyzed, the frequency is constant. To avoid the ridge produced by the sin(x) frequency obscuring the surface, it is better to plot time on the y-axis and frequency on the x-axis. In the case of a constantly changing frequency (like the linear chirp), time is plotted on the x-axis and frequency is plotted on the y-axis. Another wrinkle involves the values plotted on the x and y axis. The simplest plot of time (say on the x-axis) would consist of the 32 time regions (e.g., (*mat[y][x])). Similarly, frequency would consist of 32 frequency regions (on the y-axis). This would yield a surface numbered from 0..31 on both the x and y axis. The axis labels can be scaled to represent the frequency and time ranges. This function was used to generate different plots, so various parts are commented out, making it a bit of a hack. */ void packfreq::plotMat(const size_t N) { size_t num_y = mat.length(); const double incr = (double)N / (double)num_y; if (num_y > 0) { size_t num_x = mat[0]->length(); double freq_start = 0.0; for (size_t y = 0; y < num_y; y++) { double time_start = 0.0; for (size_t x = 0; x < num_x; x++) { double val = (*mat[y])[ x ]; // plot time on the x, frequency on y // printf(" %d %d %7.4f\n", x, y, log(1+(val*val)) ); // plot frequency on x, time on y printf(" %d %d %7.4f\n", y, x, log(1+(val*val)) ); // plot actual frequency and time values, // with frequency on x and time on y // printf(" %7.4f %7.4f %7.4f\n", // freq_start, time_start, log(1+(val*val)) ); time_start = time_start + incr; } freq_start = freq_start + incr; printf("\n"); } } } // plotMat /** Print the contents of the level basis matrix */ void packfreq::prMat() { int num_y = mat.length(); if (num_y > 0) { size_t num_x = mat[0]->length(); for (int y = num_y-1; y >= 0; y--) { for (size_t x = 0; x < num_x; x++) { printf(" %7.4f ", (*mat[y])[ x ] ); } printf("\n"); fflush(stdout); } } } // prMat packet/src/packtest.cpp0100644000076400007640000001065207525021700014077 0ustar iankiank /** \file This file contains test code for wavelet packet tree construction and for testing the best basis calculation. The documentation in this file is formatted for doxygen (see www.doxygen.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include #include #include "haar.h" #include "haar_classic.h" #include "haar_classicFreq.h" #include "packnode.h" #include "packcontainer.h" #include "packtree.h" #include "invpacktree.h" #include "costshannon.h" #include "costthresh.h" /** \file Test code for the floating point form of the wavelet packet algorithm. */ double data[] = { 32.0, 10.0, 20.0, 38.0, 37.0, 28.0, 38.0, 34.0, 18.0, 24.0, 18.0, 9.0, 23.0, 24.0, 28.0, 34.0 }; /** double data[] = { 56.0, 40.0, 8.0, 24.0, 48.0, 48.0, 40.0, 16.0 }; */ /** \function Print a vector of doubles whose length is len. */ void prVec( double *vec, size_t len ) { for (int i = 0; i < len; i++) { printf("%7.4f ", vec[i] ); } printf("\n"); } /** Test that the wavelet transform is invertable */ void testWaveletTrans(const double *data, const size_t len ) { haar haarVec; block_pool mem_pool; size_t num_bytes = len * sizeof(double); double *vec = (double *)mem_pool.pool_alloc( num_bytes ); for (int i = 0; i < len; i++) { vec[i] = data[i]; } printf("Before forward trans:\n"); prVec( vec, len ); haarVec.forwardTrans( vec, len ); printf("After forward trans:\n"); prVec( vec, len ); haarVec.inverseTrans( vec, len ); printf("After inverse trans:\n"); prVec( vec, len ); printf("\n"); } // testWaveletTrans /** The entry point for code to test the wavelet packet transform. The code in main provides a simple example of how to call the wavelet packet transform code. */ int main() { size_t len = sizeof(data)/sizeof(double); // testWaveletTrans( data, len ); // The "Haar" classic transform haar_classic h; // calculate the wavelet packet tree, using the wavelet transform h packtree tree( data, len, &h ); // print the wavelet transform tree (breadth first) tree.pr(); // get the root of the wavelet packet transform tree packnode *treeRoot = tree.getRoot(); // assign the Shannon entropy cost function to the tree costshannon cost( treeRoot ); // Calculate a simple threshold cost function on the // wavelet packet transform tree // costthresh thresh( treeRoot, 1.0 ); printf("\n"); // Print the wavelet packet transform tree showing the cost // function result. tree.prCost(); // Calculate the "best basis" function from the tree tree.bestBasis(); printf("\n"); // Print the wavelet packet tree showing the nodes selected // as part of the "best basis" set. tree.prBestBasis(); // Check that the best basis function succeeded. That is, // that the best basis function does not include the // original data. if (tree.bestBasisOK()) { printf("Best basis calculation succeeded\n"); } else { printf("Best basis calculation failed\n"); } printf("\n"); // Get the best basis list. This will be a list of // nodes consisting of the best basis set. This set is // obtained by traversing the tree, top down, left to // right. packdata_list bestBasis = tree.getBestBasisList(); // Print the "best basis" set. bestBasis.pr(); printf("\n"); // Calculate the inverse wavelet packet transform from the // "best basis" list. invpacktree invtree( bestBasis, &h ); printf("Inverse wavelet packet transform result:\n"); invtree.pr(); // free the memory pool block_pool mem_pool; mem_pool.free_pool(); return 0; } packet/src/packtree.cpp0100644000076400007640000001721307524573350014073 0ustar iankiank /** \file The documentation in this file is formatted for doxygen (see www.doxyeng.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include #include #include "packcontainer.h" #include "packtree.h" /** Construct a wavelet packet tree from a vector of double values. The size of the vector, which must be a power of two, is passed in N. A wavelet Lifting Scheme object is passed in w. This object is used to calculate the wavelet transform step which is applied at each level (where level > 0) of the wavelet packet tree. The first level (level 0) of the wavelet packet tree contains the original data set. \arg vec An array of double values on which the wavelet packet transform is calculated. \arg N The number of elements in the input array \arg w A pointer to the the wavelet transform object to use in calculating the wavelet packet transform. */ packtree::packtree( const double *vec, const size_t N, liftbase *w ) { waveObj = w; block_pool mem_pool; double *vecCopy = (double *)mem_pool.pool_alloc( N * sizeof( double ) ); for (int i = 0; i < N; i++) { vecCopy[i] = vec[i]; } root = new packnode( vecCopy, N, packnode::OriginalData ); root->mark( true ); newLevel( root, false, false ); } // packtree /** The best basis algorithm selects the nodes nearest the tree root for the best basis set. These nodes are "marked" true with a boolean flag. The best basis algorithm outlined in Ripples in Mathematics sets any marks in nodes that are below a marked node in the tree (nodes which are in a subtree of a marked node) to false. However, this is unnecessary when the best basis set is collected, since the algorithm uses top down tree traversal and stops at marked node. A problem does arise when the entire tree is printed to show the nodes that are marked as part of the best basis set. In this case the result may appear wrong, since child nodes of a best basis node are marked. This function does a top down traversal setting the "marks" on these child nodes to false. */ void packtree::cleanTree(packnode *top, bool removeMark ) { if (top != 0) { if (removeMark) { if (top->mark()) { top->mark( false ); } } else { // if a mark is found, then set all the "marks" below that // point to false (e.g., remove the marks). if (top->mark()) { removeMark = true; } } cleanTree( top->lhsChild(), removeMark ); cleanTree( top->rhsChild(), removeMark ); } } // cleanTree /** Print the wavelet packet tree cost values in breadth first order. */ void packtree::prCost() { if (root != 0) { breadthFirstPrint(printCost); } } /** Print the wavelet packet tree, showing the nodes that have been selected by the "best basis" algorithm. */ void packtree::prBestBasis() { if (root != 0) { cleanTree( root, false ); breadthFirstPrint(printBestBasis); } } // prBestBasis /** Walk the wavelet packet tree and apply the "best basis" algorithm described in Chapter 8 of Ripples in Mathematics. Nodes that are "marked" become part of the best basis, which is a minimal representation of the data in terms of the cost function. */ double packtree::bestBasisWalk( packnode *top ) { double cost = 0.0; if (top != 0) { packnode *lhs = top->lhsChild(); packnode *rhs = top->rhsChild(); if (lhs == 0 && rhs == 0) { // we've reached a leaf cost = top->cost(); } else if (lhs != 0 && rhs != 0) { double lhsCost = bestBasisWalk( lhs ); double rhsCost = bestBasisWalk( rhs ); double v1 = top->cost(); double v2 = lhsCost + rhsCost; if (v1 <= v2) { top->mark( true ); lhs->mark( false ); rhs->mark( false ); } else { // v1 > v2 top->cost( v2 ); } cost = top->cost(); } else { // The tree does not seem to be a full binary tree // Something has gone badly wrong. assert( false ); } } return cost; } // bestBasicWalk /** Calculate the wavelet packet "best basis" */ void packtree::bestBasis() { bestBasisWalk( root ); } // bestBasis /** Recursively traverse the wavelet packet tree and check that the best basis result is correct. That is, that the best basis has been calculated and that it does not include the orignal data set. The best basis includes the original data set with the packnode ofr the original data set is marked. This algorithm makes use of two class global variables. There may be a purely recursive, way to do this without these global class variables, but these variables make the algorithm much easier. The variables are initialized by the calling function bestBasisOK(). */ void packtree::checkBestBasis( packnode *top ) { if (top != 0) { if (top->mark()) { foundBestBasisVal = true; if (top->getKind() == packdata::OriginalData) { foundOriginalData = true; } } if (!foundOriginalData) { checkBestBasis( top->lhsChild() ); } if (!foundOriginalData) { checkBestBasis( top->rhsChild() ); } } } // checkBestBasis /** Return true is be best basis has been calculated properly, return false if the best basis has not been calculated or it was not calculated properly. The best basis is calculated in reference to a particular cost function. A particular cost function will not always result in a data set which differs from the original data set. If this is the case, the "best basis" result will include the original data. */ bool packtree::bestBasisOK() { foundOriginalData = false; foundBestBasisVal = false; checkBestBasis( root ); bool rslt = (foundBestBasisVal && (!foundOriginalData)); return rslt; } // bestBasicOK /** Traverse the tree from the top down and add the best basis nodes to the best basis list. Note that the list object is simply a package for a scalar value, the pointer to the head of the list. So it can be passed by value without incurring a cost greater than passing a pointer (e.g., pass by reference). */ void packtree::buildBestBasisList( packnode *top, packdata_list &list ) { if (top != 0) { if (top->mark()) { list.add( top ); } else { buildBestBasisList( top->lhsChild(), list ); buildBestBasisList( top->rhsChild(), list ); } } } // buildBestBasisList /** Return a list consisting of the best basis packdata values. */ packdata_list packtree::getBestBasisList() { packdata_list list; buildBestBasisList( root, list ); return list; } // getBestBasisList packet/src/packtree_base.cpp0100644000076400007640000001313107515163066015057 0ustar iankiank #include "queue.h" #include "packnode.h" #include "packcontainer.h" #include "packtree_base.h" /** Add a new level to the wavelet packet tree. Wavelet packet trees are data structures that support a variety of applications. If the reverse argument is true, the locations of the high pass and low pass filter results in the wavelet calculation will be reversed. This is used in building a wavelet packet tree for frequency analysis. The top packnode object contains data from the previous level. If this is the first level in the tree, top will contain the input data set. A packcontainer object is created with the top data. The packcontainer constructor will allocate new storage and copy the data into this storage. If the packcontainer object consists of N elements, then there will be N/2 elements on the left and N/2 or the right. The object allows the lhs and rhs data to be accessed as one array. A wavelet transform step is calculated on the N element data set. This results in N/2 values from the wavelet scaling function (low pass function) and N/2 values from the wavelet function (high pass function). These values are used to create two new packnode objects which become children of top. Sub-trees for the new packnode objects are recursively calculated. As the tree is constructed, the leaves of the tree are marked with a boolean flag in preparation for calculating the "best basis" representation for the data. See the algorithm outlined in section 8.2.2 of "Ripples in Mathematics" by Jensen and la Cour-Harbo The wavelet packet tree form that is used for wavelet packet frequency analysis is described in section 9.3 (figure 9.14) ofg "Ripples in Mathematics". */ void packtree_base::newLevel( packnode* top, bool freqCalc, bool reverse ) { if (top != 0) { const size_t len = top->length(); if (len > 1) { // Create a new wavelet packet container for use in // calculating the wavelet transform. Note that the // container is only used locally. packcontainer container( top ); if (reverse) { // Calculate the reverse foward wavelet transform step, // where the high pass result is stored in the upper half // of the container and the low pass result is stored // in the lower half of the container. waveObj->forwardStepRev( container, len ); } else { // Calculate the foward wavelet transform step, where // the high pass result is stored in the upper half // of the container and the low pass result is stored // in the lower half of the container. waveObj->forwardStep( container, len ); } packnode *lhs = new packnode(container.lhsData(), len/2, packnode::LowPass ); packnode *rhs = new packnode(container.rhsData(), len/2, packnode::HighPass ); // set the "mark" in the top node to false and // mark the two children to true. top->mark( false ); lhs->mark( true ); rhs->mark( true ); top->lhsChild( lhs ); top->rhsChild( rhs ); // The transform on the left hand side always uses // the standard order (e.g., low pass filter result // goes in the lower half, high pass goes in the // upper half of the container). newLevel( lhs, freqCalc, false ); if (freqCalc) { // wavelet packet frequency analysis reverses the // storage locations for the filter results in the // right hand child newLevel( rhs, freqCalc, true ); } else { // freq == false // use standard filter location newLevel( rhs, freqCalc, false ); } } } } // newLevel /** Print the wavelet packet tree, breadth first (this is also sometimes called a level traversal). The breadth first traversal uses a queue. The root of the tree is initially inserted into the queue. The function operates by deleting the node at teh front of the queue, printing the data associated with that node and adding the node's left and right children to the queue. Since a node's children are at the next lower level, and we add the left child before the right child, the function prints a tree level from left to right. The above paragraph paraphrases Chapter 5, Level Order Traversal of Fundamentals of Data Structures in C by Horowitz, Sahni and Anderson-Freed, 1993. */ void packtree_base::breadthFirstPrint(const printKind kind) { queue Q; Q.addQueue( root, 0 ); while (! Q.queueEmpty() ) { packnode *node = Q.queueStart()->node; size_t indent = Q.queueStart()->indent; Q.deleteStart(); if (indent > 0) { // print 'indent' spaces printf("%*c", indent, ' '); } switch (kind) { case printData: node->pr(); break; case printCost: node->prCost(); break; case printBestBasis: node->prBestBasis(); break; default: assert( false ); break; } // switch packnode *lhs = node->lhsChild(); packnode *rhs = node->rhsChild(); if (lhs != 0) { Q.addQueue( lhs, indent + 2 ); } if (rhs != 0) { Q.addQueue( rhs, indent + 2 ); } } } // packtree_base::breadthFirstPrint /** Print the wavelet packet tree data and wavelet transform result to standard out. */ void packtree_base::pr() { if (root != 0) { breadthFirstPrint(printData); } } // pr packet/src/blockpool.cpp~0100644000076400007640000001615607447470002014456 0ustar iankiank /** \file This file contains the class functions for a "pool" based memory allocator. These functions manage the block chain that makes up the memory pool and allocates memory from the individual blocks. The entire pool is freed at once. The pool allocator was originally written as a low level allocation package. The original package queries the system to find the page size and allocation block size. This version has been simplified, but some of the low level nature remains. The documentation in this file is formatted for doxygen (see www.doxyeng.org).

Copyright and Use

You may use this source code without limitation and without fee as long as you include:

This software was written and is copyrighted by Ian Kaplan, Bear Products International, www.bearcave.com, 2002.

This software is provided "as is", without any warranty or claim as to its usefulness. Anyone who uses this source code uses it at their own risk. Nor is any support provided by Ian Kaplan and Bear Products International.

Please send any bug fixes or suggested source changes to:

     iank@bearcave.com
@author Ian Kaplan */ #include #include #include #include "blockpool.h" unsigned int block_pool::alloc_gran = (unsigned int)block_pool::page_size; block_pool::block_chain *block_pool::current_block = 0; block_pool::block_chain *block_pool::block_list_start = 0; /** block_pool::init_pool This function is automatically called to initialize the block_pool object when the "current_block" pointer is null. */ void block_pool::init_pool( void ) { block_chain *new_link; new_link = new_block( alloc_gran ); block_list_start = new_link; current_block = new_link; } /* init_pool */ /** new_block The new_block function is the "root" memory allocator for the block_pool object. The amount of memory allocated is rounded up to the next "block_size" boundary. Both the block_chain structure and the allocatible memory are allocated from a single block that is a multiple of the page size. This should avoid fragmentation in the system memory allocator. The "page" referenced here is a virtual memory page. This version of the code does not actually check the system page size, but assumes a 4Kb page. */ block_pool::block_chain *block_pool::new_block( unsigned int block_size ) { const unsigned int max_block_size = max_block_multiple * page_size; block_chain *new_link = 0; unsigned int alloc_amt, total_alloc; // add in the memory needed for the block_chain structure total_alloc = block_size + sizeof(block_chain); if (total_alloc < alloc_gran) alloc_amt = alloc_gran; else { // its larger than the minimum allocation granularity, so round // up the the nearest page. alloc_amt = ((total_alloc + (page_size-1))/page_size) * page_size; } if (alloc_amt <= max_block_size) { /* Allocate memory for both the block_chain structure and the memory block */ new_link = (block_chain *)MemAlloc( alloc_amt ); // The new memory block starts after the block_chain structure Chain_block(new_link) = (void *)(((unsigned int)new_link) + sizeof(block_chain)); assert( alloc_amt >= block_size ); Chain_bytes_used(new_link) = 0; Chain_block_size(new_link) = alloc_amt - sizeof(block_chain); Chain_next(new_link) = 0; } else { printf("block_pool::new_block: allocation request too large\n"); } return new_link; } // block_chain::new_block /** block_pool::add_block Add a new memory block to the memory pool. This function is called when the amount of memory requested by pool_alloc will not fit in the current block. */ void *block_pool::add_block( unsigned int block_size ) { block_chain *block = 0; block_chain *last_block; last_block = current_block; block = new_block( block_size ); Chain_next(current_block) = block; current_block = block; return (void *)block; } // block_chain::add_block /** pool_alloc Allocate memory from the memory pool. The pool_alloc and free_pool functions do memory allocation and deallocation. This function is called to allocate memory from the memory pool. If there is enough free memory in the current block to satisify the memory request, memory is allocated from the current block and the amount of free memory is updated. If the current block does not have enough memory, add_block is called to allocate a new memory block which will be large enough. */ void *block_pool::pool_alloc( unsigned int num_bytes ) { const unsigned int align = sizeof( int ); void *addr = 0; unsigned int amt_free; /* the number of bytes allocated must be a multiple of the align size */ num_bytes = ((num_bytes + (align-1))/align) * align; if (current_block == 0) { init_pool(); } amt_free = Chain_block_size(current_block) - Chain_bytes_used(current_block); if (num_bytes > amt_free) { if (add_block( num_bytes ) != 0) { amt_free = Chain_block_size(current_block); } } if (amt_free >= num_bytes) { addr = (void *)((unsigned int)Chain_block(current_block) + Chain_bytes_used(current_block)); Chain_bytes_used(current_block) += num_bytes; } else { printf("block_pool::block_alloc: allocation error\n"); exit(1); } return addr; } // block_pool::pool_alloc /** block_pool::free_pool Walk through the block chain and deallocate the blocks. Note that the block chain structures and the allocatible memory is contained within a single allocated block. The block_chain structure is at the start of this block so passing its address to the memory deallocation function deallocates both the block chain structure and the allocatible memory */ void block_pool::free_pool(void) { block_chain *tmp; while (block_list_start != 0) { tmp = block_list_start; block_list_start = Chain_next(block_list_start); MemFree( (void *)tmp ); } } // free_pool /** print_block_pool_info Print information about the block pool */ void block_pool::print_block_pool_info( FILE *fp /*= stdout */) { int total_allocated = 0; int total_unused = 0; block_chain *ptr = block_list_start; fprintf(fp, "Minimum memory allocation size: %d\n", alloc_gran ); fprintf(fp, "Page size: %d\n", (unsigned int)page_size ); fprintf(fp, "[block size, bytes_used]\n"); while (ptr != 0) { fprintf(fp, "[%4d, %4d]", Chain_block_size(ptr), Chain_bytes_used(ptr)); total_allocated += Chain_bytes_used(ptr); total_unused += (Chain_block_size(ptr) - Chain_bytes_used(ptr)); if (Chain_next(ptr) != 0) { fprintf(fp, ", "); } else { fprintf(fp, "\n"); } ptr = Chain_next(ptr); } // while fprintf(fp, "Total allocated = %5d, total unused = %3d\n", total_allocated, total_unused ); }