summaryrefslogtreecommitdiff
path: root/contrib/ffmpeg/tests
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ffmpeg/tests')
-rw-r--r--contrib/ffmpeg/tests/Makefile33
-rw-r--r--contrib/ffmpeg/tests/audiogen.c19
-rw-r--r--contrib/ffmpeg/tests/ffmpeg.regression.ref128
-rw-r--r--contrib/ffmpeg/tests/ffserver.regression.ref20
-rw-r--r--contrib/ffmpeg/tests/lena.pnm2
-rw-r--r--contrib/ffmpeg/tests/libav.regression.ref51
-rwxr-xr-xcontrib/ffmpeg/tests/regression.sh367
-rw-r--r--contrib/ffmpeg/tests/rotozoom.c21
-rw-r--r--contrib/ffmpeg/tests/rotozoom.regression.ref128
-rw-r--r--contrib/ffmpeg/tests/seek_test.c91
-rwxr-xr-xcontrib/ffmpeg/tests/seek_test.sh25
-rwxr-xr-xcontrib/ffmpeg/tests/server-regression.sh18
-rw-r--r--contrib/ffmpeg/tests/test.conf7
-rw-r--r--contrib/ffmpeg/tests/videogen.c19
14 files changed, 552 insertions, 377 deletions
diff --git a/contrib/ffmpeg/tests/Makefile b/contrib/ffmpeg/tests/Makefile
index c4c6925f8..3417c687e 100644
--- a/contrib/ffmpeg/tests/Makefile
+++ b/contrib/ffmpeg/tests/Makefile
@@ -6,6 +6,7 @@ include ../config.mak
VPATH=$(SRC_PATH_BARE)/tests
SRC_DIR=$(SRC_PATH)/tests
+BUILD_DIR=$(BUILD_ROOT)/tests
CFLAGS=-O2 -Wall -g
REFFILE1=$(SRC_DIR)/ffmpeg.regression.ref
@@ -15,9 +16,15 @@ SERVER_REFFILE=$(SRC_DIR)/ffserver.regression.ref
LIBAV_REFFILE=$(SRC_DIR)/libav.regression.ref
-all fulltest test: codectest libavtest test-server
+SEEK_REFFILE=$(SRC_DIR)/seek.regression.ref
+
+all fulltest test: codectest libavtest
test-server: vsynth1/00.pgm asynth1.sw
+ @echo
+ @echo "Unfortunately ffserver is broken and therefore its regression"
+ @echo "test fails randomly. Treat the results accordingly."
+ @echo
@$(SRC_DIR)/server-regression.sh $(SERVER_REFFILE) $(SRC_DIR)/test.conf
# fast regression tests for all codecs
@@ -36,15 +43,27 @@ libavtest:
@echo
endif
+ifeq ($(CONFIG_SWSCALER),yes)
+test-server codectest mpeg4 mpeg ac3 snow snowll libavtest: swscale_error
+swscale_error:
+ @echo
+ @echo "This regression test is incompatible with --enable-swscaler."
+ @echo
+ @exit 1
+endif
+
+seektest: seek_test$(EXESUF)
+ @$(SRC_DIR)/seek_test.sh $(SEEK_REFFILE)
+
# video generation
vsynth1/00.pgm: videogen$(EXESUF)
@mkdir -p vsynth1
- ./videogen 'vsynth1/'
+ $(BUILD_DIR)/$< 'vsynth1/'
vsynth2/00.pgm: rotozoom$(EXESUF)
@mkdir -p vsynth2
- ./rotozoom 'vsynth2/' $(SRC_DIR)/lena.pnm
+ $(BUILD_DIR)/$< 'vsynth2/' $(SRC_DIR)/lena.pnm
videogen$(EXESUF): videogen.c
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $<
@@ -55,7 +74,7 @@ rotozoom$(EXESUF): rotozoom.c
# audio generation
asynth1.sw: audiogen$(EXESUF)
- ./audiogen $@
+ $(BUILD_DIR)/$< $@
audiogen$(EXESUF): audiogen.c
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $<
@@ -63,6 +82,10 @@ audiogen$(EXESUF): audiogen.c
tiny_psnr$(EXESUF): tiny_psnr.c
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $<
+#FIXME cleanup shit below
+seek_test$(EXESUF): seek_test.c
+ $(CC) $(LDFLAGS) $(CFLAGS) -DHAVE_AV_CONFIG_H -I.. -I$(SRC_PATH)/libavformat/ -I$(SRC_PATH)/libavcodec/ -I$(SRC_PATH)/libavutil/ -o $@ $< $(SRC_PATH)/libavformat/libavformat.a $(SRC_PATH)/libavcodec/libavcodec.a $(SRC_PATH)/libavutil/libavutil.a $(EXTRALIBS)
+
DSPDEPS = $(SRC_PATH)/libavcodec/i386/dsputil_mmx.c \
$(SRC_PATH)/libavcodec/i386/dsputil_mmx_avg.h \
$(SRC_PATH)/libavcodec/i386/dsputil_mmx_rnd.h \
@@ -87,5 +110,5 @@ distclean clean:
rm -rf vsynth1 vsynth2 data
rm -f asynth1.sw *~ audiogen$(EXESUF) videogen$(EXESUF) rotozoom$(EXESUF) tiny_psnr$(EXESUF)
-.PHONY: all fulltest test codectest libavtest test-server
+.PHONY: all fulltest test codectest libavtest test-server seektest
.PHONY: mpeg4 mpeg ac3 snow snowll distclean clean
diff --git a/contrib/ffmpeg/tests/audiogen.c b/contrib/ffmpeg/tests/audiogen.c
index 31c437149..68ae13586 100644
--- a/contrib/ffmpeg/tests/audiogen.c
+++ b/contrib/ffmpeg/tests/audiogen.c
@@ -1,7 +1,26 @@
/*
* Generates a synthetic stereo sound
* NOTE: no floats are used to guaranty a bit exact output.
+ *
+ * Copyright (c) 2002 Fabrice Bellard
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+
#include <stdlib.h>
#include <stdio.h>
diff --git a/contrib/ffmpeg/tests/ffmpeg.regression.ref b/contrib/ffmpeg/tests/ffmpeg.regression.ref
index 9db847a1f..ae5355406 100644
--- a/contrib/ffmpeg/tests/ffmpeg.regression.ref
+++ b/contrib/ffmpeg/tests/ffmpeg.regression.ref
@@ -7,10 +7,10 @@ f3b008355f68394b6cad694f3488ea2b *./data/a-mpeg2.mpg
736978 ./data/a-mpeg2.mpg
9f364a477987c3b14412e303b94377ca *./data/out.yuv
stddev: 7.68 PSNR:30.41 bytes:7602176
-1ed851cc079a7bc999e1cc2dc2aa146c *./data/a-mpeg2ivlc.mpg
-727637 ./data/a-mpeg2ivlc.mpg
-9f364a477987c3b14412e303b94377ca *./data/out.yuv
-stddev: 7.68 PSNR:30.41 bytes:7602176
+1716f466ea82b4d90677868b2ce1f8e2 *./data/a-mpeg2ivlc-qprd.mpg
+708232 ./data/a-mpeg2ivlc-qprd.mpg
+40746946d5661606f7a649c62b6c4bee *./data/out.yuv
+stddev: 12.21 PSNR:26.38 bytes:7602176
2566ea5760247a9485c8281cb52291a8 *./data/a-mpeg2.mpg
735853 ./data/a-mpeg2.mpg
55c22a09e4924977ee2cc4180078d3ae *./data/out.yuv
@@ -19,17 +19,17 @@ stddev: 7.67 PSNR:30.42 bytes:7602176
749746 ./data/a-mpeg2i.mpg
5189af71e6aa96cc2f6452e7f6b29287 *./data/out.yuv
stddev: 7.68 PSNR:30.41 bytes:7602176
-f2067ddbe91a90ef12d606bba91cb900 *./data/a-mpeg2thread.mpg
-812667 ./data/a-mpeg2thread.mpg
-f101d3844ea2e12ac38001718c519232 *./data/out.yuv
-stddev: 7.63 PSNR:30.46 bytes:7602176
-fb900ca681fc054ed634ee4eadc9dc38 *./data/a-mpeg2threadivlc.mpg
-803035 ./data/a-mpeg2threadivlc.mpg
-f101d3844ea2e12ac38001718c519232 *./data/out.yuv
-stddev: 7.63 PSNR:30.46 bytes:7602176
-fd5f3e2a81558213bdfb8a7c86b3f541 *./data/a-mpeg2reuse.mpg
-2099878 ./data/a-mpeg2reuse.mpg
-e7f8692982e6d339a1f64bde4c297e59 *./data/out.yuv
+69576facff13d45171e3a6c53b8018c4 *./data/a-mpeg2thread.mpg
+813459 ./data/a-mpeg2thread.mpg
+c0e8cbde76ff8377494fe6843fd03e11 *./data/out.yuv
+stddev: 7.63 PSNR:30.47 bytes:7602176
+17af99d1a7fc391242a809b0782263af *./data/a-mpeg2threadivlc.mpg
+803833 ./data/a-mpeg2threadivlc.mpg
+c0e8cbde76ff8377494fe6843fd03e11 *./data/out.yuv
+stddev: 7.63 PSNR:30.47 bytes:7602176
+c8d8b07b5fa97e0affb4a52d4d30a2b6 *./data/a-mpeg2reuse.mpg
+2102956 ./data/a-mpeg2reuse.mpg
+75d3dfc8133f0122cb9e272a21bc8c5c *./data/out.yuv
stddev: 7.67 PSNR:30.42 bytes:7602176
c83ae8d8f3e2b4506df58e6a2f7e3b2a *./data/a-msmpeg4v2.avi
636512 ./data/a-msmpeg4v2.avi
@@ -67,22 +67,30 @@ stddev: 7.99 PSNR:30.06 bytes:7602176
7933744 ./data/a-huffyuv.avi
799d3db687f6cdd7a837ec156efc171f *./data/out.yuv
stddev: 0.00 PSNR:99.99 bytes:7602176
-5f35533ff4357e405971466ee06375db *./data/a-mpeg4-rc.avi
-814102 ./data/a-mpeg4-rc.avi
-2cc2a0b6699d861b4cffad28a704067b *./data/out.yuv
-stddev: 10.41 PSNR:27.76 bytes:7602176
+b27e911f1563455700c93e6ae39715ca *./data/a-mpeg4-rc.avi
+813988 ./data/a-mpeg4-rc.avi
+f57311745de96b6551c175679b138efc *./data/out.yuv
+stddev: 10.40 PSNR:27.78 bytes:7602176
85e2456a673041d528b242d78318fb65 *./data/a-mpeg4-adv.avi
600188 ./data/a-mpeg4-adv.avi
60edc5a67271e425d0a2a52981895b81 *./data/out.yuv
stddev: 10.25 PSNR:27.91 bytes:7602176
-c429ad61139904f03a211ba2bdf4cf01 *./data/a-mpeg4-thread.avi
-761308 ./data/a-mpeg4-thread.avi
-cd5bb5cbd9a7ea0953825482d2990f5a *./data/out.yuv
-stddev: 12.31 PSNR:26.31 bytes:7602176
-339c0dd9f30afa33a6f7134f84d5b60a *./data/a-mpeg4-Q.avi
-878910 ./data/a-mpeg4-Q.avi
-83b3cef07c91a397c63bc4bc45df667f *./data/out.yuv
+d099307d14c1a4daa145618ca0522888 *./data/a-mpeg4-qprd.avi
+657996 ./data/a-mpeg4-qprd.avi
+8a52c562082bad78cabb40ffa292ceec *./data/out.yuv
+stddev: 12.12 PSNR:26.44 bytes:7602176
+9192b10ae298ba325d53abf7b5b91ba3 *./data/a-mpeg4-adap.avi
+400650 ./data/a-mpeg4-adap.avi
+0ce1d1fbebc9e9178e1a1d4a32a5804c *./data/out.yuv
+stddev: 14.66 PSNR:24.80 bytes:7602176
+41b27141442f773eca9ef3d48d8d555a *./data/a-mpeg4-Q.avi
+878264 ./data/a-mpeg4-Q.avi
+8995abbcc97ed4767fcbc0bf46accd01 *./data/out.yuv
stddev: 5.61 PSNR:33.13 bytes:7602176
+5fff534f0b958547dfdb811d4f289931 *./data/a-mpeg4-thread.avi
+761170 ./data/a-mpeg4-thread.avi
+fe1d119938f8a26174b38eeaa18dff85 *./data/out.yuv
+stddev: 12.31 PSNR:26.31 bytes:7602176
c1dae02bddd79790266bc0a9f7d6eb0e *./data/a-mpeg4-PSP.mp4
406449 ./data/a-mpeg4-PSP.mp4
7315281e07830456208dff61337c982b *./data/a-error-mpeg4-adv.avi
@@ -93,9 +101,9 @@ b699b2fd005571dda3f8d34cb0ce7aec *./data/a-mpeg4-nr.avi
688676 ./data/a-mpeg4-nr.avi
2c16e13b1367022d52b0e75d93a734ba *./data/out.yuv
stddev: 7.02 PSNR:31.18 bytes:7602176
-215cd567b5001181c24128e535cf77b0 *./data/a-mpeg1b.mpg
-1026948 ./data/a-mpeg1b.mpg
-1ee27511d22a4a553cac2ca64a79f2e1 *./data/out.yuv
+225ab004f6ac16e5ade3b453f45b9d96 *./data/a-mpeg1b.mpg
+1026429 ./data/a-mpeg1b.mpg
+dd9a471c6b2d1004a90e42f34707becf *./data/out.yuv
stddev: 6.34 PSNR:32.07 bytes:7602176
2f9cb2ede35f7d12f6b518c50e20d81c *./data/a-mjpeg.avi
1567580 ./data/a-mjpeg.avi
@@ -105,8 +113,8 @@ stddev: 7.93 PSNR:30.13 bytes:7602176
6264498 ./data/a-ljpeg.avi
799d3db687f6cdd7a837ec156efc171f *./data/out.yuv
stddev: 0.00 PSNR:99.99 bytes:7602176
-8b9359781a7e87d09af1b1c9a536cb75 *./data/a-jpegls.avi
-9086694 ./data/a-jpegls.avi
+dca9d700da7857217408c310c501b9bc *./data/a-jpegls.avi
+9086676 ./data/a-jpegls.avi
0f8637e9b861230aff9894825af83720 *./data/out.yuv
stddev: 2.84 PSNR:39.04 bytes:7602176
7eee6367442884321e27d15a26bc032a *./data/a-rv10.rm
@@ -125,30 +133,30 @@ stddev: 20.00 PSNR:22.10 bytes:7602176
1454536 ./data/a-asv2.avi
0b310840a6d3970595983491687669df *./data/out.yuv
stddev: 18.82 PSNR:22.63 bytes:7602176
-4478bd22d09ae383b5cff05100437727 *./data/a-flv.flv
-649017 ./data/a-flv.flv
+cbdb25fe5bb6a895baf9799b8ccb3038 *./data/a-flv.flv
+649040 ./data/a-flv.flv
40281942d6ee254f7d3027b8593b19be *./data/out.yuv
stddev: 8.06 PSNR:29.99 bytes:7602176
f8f51fa737add17f7fecaefa118b57ed *./data/a-ffv1.avi
2654678 ./data/a-ffv1.avi
799d3db687f6cdd7a837ec156efc171f *./data/out.yuv
stddev: 0.00 PSNR:99.99 bytes:7602176
-b12ff53580cd8a9ce92ab7a0649e99f9 *./data/a-snow.avi
-155948 ./data/a-snow.avi
-b3feb1bf17bb4e720da1f1e8b4da4c03 *./data/out.yuv
-stddev: 23.19 PSNR:20.81 bytes:7602176
-265c4e0c45b2313817fa4d86dccbe6ba *./data/a-snow53.avi
-3519574 ./data/a-snow53.avi
+9078723c943de5d79490f54b99e6ea9e *./data/a-snow.avi
+156656 ./data/a-snow.avi
+f2932084b52e2ede167c9ba21eae0656 *./data/out.yuv
+stddev: 23.14 PSNR:20.83 bytes:7602176
+ba999e86070aa971376e7f317a022c37 *./data/a-snow53.avi
+3519486 ./data/a-snow53.avi
799d3db687f6cdd7a837ec156efc171f *./data/out.yuv
stddev: 0.00 PSNR:99.99 bytes:7602176
-2fcbcdc63816e1321bf4b6b5380338d2 *./data/a-dv.dv
+c299f64c3e85b928c5bfe71629cee006 *./data/a-dv.dv
7200000 ./data/a-dv.dv
-c2082cd8adf417c4ebc32654e446cba1 *./data/out.yuv
-stddev: 8.86 PSNR:29.17 bytes:7602176
-4f71942eb699bf3b12508a9e777a319f *./data/a-dv.dv
+3b9ead854b912e43ead976e4e86aab3b *./data/out.yuv
+stddev: 8.91 PSNR:29.12 bytes:7602176
+70dc9a58345e603094dedcac71e2dcd2 *./data/a-dv.dv
14400000 ./data/a-dv.dv
-fc866b8879a34f5b440647e5135e4bfb *./data/out.yuv
-stddev: 8.45 PSNR:29.58 bytes:7602176
+d727da8c7ce387ebe68845a1be916ee3 *./data/out.yuv
+stddev: 8.50 PSNR:29.52 bytes:7602176
6860534864cad0de4b1af9f987aaf9bf *./data/a-svq1.mov
1365791 ./data/a-svq1.mov
fb0a97094a89d6f379535f615783d00c *./data/out.yuv
@@ -158,25 +166,33 @@ stddev: 10.98 PSNR:27.30 bytes:7602176
83f8df5d5f84480566af548bb037fceb *./data/out.wav
stddev:9330.70 PSNR:16.92 bytes:1054720
stddev:4396.13 PSNR:23.46 bytes:1052672
-dd68110cb7e5388392f89d5160d3a825 *./data/a-ac3.rm
+aefe11ab5067621a1c674859d6413891 *./data/a-ac3.rm
98203 ./data/a-ac3.rm
-9e6e66847a568ef4f1f229b0939d2aae *./data/a-g726.wav
-24268 ./data/a-g726.wav
-a719ab6d47d8d601520edb13bf6136b4 *./data/out.wav
-stddev:8459.88 PSNR:17.77 bytes:96256
-ea2efb8ba20695a35ab0d71a7ee86f22 *./data/a-adpcm_ima.wav
-266288 ./data/a-adpcm_ima.wav
+39878597b1d65cce473639a7d8c93b02 *./data/a-g726.wav
+24279 ./data/a-g726.wav
+888f2f016e608d044a1bacbca5497ed2 *./data/out.wav
+stddev:8368.02 PSNR:17.87 bytes:96256
+de3f0e1f50b19bd8572fdd3dee2e72c4 *./data/a-adpcm_ima.wav
+266300 ./data/a-adpcm_ima.wav
60178d48204f5662d91776e36eddc82e *./data/out.wav
stddev:11441.89 PSNR:15.15 bytes:1054720
-d2eee867856d2bdb6d08e936d4ceec0c *./data/a-adpcm_ms.wav
-267308 ./data/a-adpcm_ms.wav
+628d4789cf9ee16a756ac54b7fd8650d *./data/a-adpcm_ms.wav
+267320 ./data/a-adpcm_ms.wav
91a84bb4f319a3a0bf0c0441b3d3a529 *./data/out.wav
stddev:1050.18 PSNR:35.89 bytes:1054720
-48ae9fcb043a44e316998b85043b61bc *./data/a-adpcm_yam.wav
-264236 ./data/a-adpcm_yam.wav
+ab11d9151644cbff27827b7e89f37aa9 *./data/a-adpcm_yam.wav
+264248 ./data/a-adpcm_yam.wav
e92cec8c07913ffb91ad2b11f79cdc00 *./data/out.wav
stddev:18312.68 PSNR:11.06 bytes:1056768
c3382f03ce2efb5d475240d288a33898 *./data/a-flac.flac
353368 ./data/a-flac.flac
c4228df189aad9567a037727d0e763e4 *./data/out.wav
stddev: 33.31 PSNR:65.87 bytes:1040384
+0c406c4e4586ca27064e28637b662631 *./data/a-wmav1.asf
+106004 ./data/a-wmav1.asf
+stddev:12251.50 PSNR:14.56 bytes:1056768
+stddev:2106.00 PSNR:29.85 bytes:1048576
+82442aaa5fdbd327769e4c4ad369147e *./data/a-wmav2.asf
+106044 ./data/a-wmav2.asf
+stddev:12255.92 PSNR:14.55 bytes:1056768
+stddev:2099.31 PSNR:29.88 bytes:1048576
diff --git a/contrib/ffmpeg/tests/ffserver.regression.ref b/contrib/ffmpeg/tests/ffserver.regression.ref
index 7350fa481..851a40d22 100644
--- a/contrib/ffmpeg/tests/ffserver.regression.ref
+++ b/contrib/ffmpeg/tests/ffserver.regression.ref
@@ -1,10 +1,10 @@
-418d0c843a6605a7d48f285804a69df4 ff-test_h.avi
-ad4605187044d5e169f32a2ea205f937 ff-test_l.avi
-34f4f0c160efcdb37c0999680e07c41c ff-test.swf
-fe6de6234a8bb4ace52b86763741cecd ff-test_h.asf
-68e7c8a8ff64c4016a8d4e5ea27353f3 ff-test_l.asf
-cba8663681bf3ef89c95c09bb90204db ff-test_h.rm
-0a14086c708a7b8f4604e705a2bb7087 ff-test_l.rm
-353a9a8fb3d5bb2334ac991b5c60f6d3 ff-test.jpg
-7cbd46a6174d8203c26be333980595b5 ff-test_small.jpg
-aaa459e638cd1dc2c120760fa4e1e384 ff-test.mjpg
+b33ed697236149e1503b60ca9f645b6f ff-test_h.avi
+3c104d3664ed260be9117ed1273c6dcc ff-test_l.avi
+d976848a9e4d5d8fc2659e4841cdece5 ff-test.swf
+5dd7a3cbc430f2534cdfc68030e4d5f5 ff-test_h.asf
+1111699f36f2fe2240d3e5c73827df50 ff-test_l.asf
+0b4c970507eeb57381c92c3309f2d982 ff-test_h.rm
+daaaa2e170f48f8bd423c0c45ab632c7 ff-test_l.rm
+e0dc91430660c619e97b5c82e0f398fc ff-test.jpg
+0346739ee6ba2d3bbacb9814d00d7d2d ff-test_small.jpg
+77a905f865ca536b6b92b9beb96beb94 ff-test.mjpg
diff --git a/contrib/ffmpeg/tests/lena.pnm b/contrib/ffmpeg/tests/lena.pnm
index 9fa0c923f..700508c86 100644
--- a/contrib/ffmpeg/tests/lena.pnm
+++ b/contrib/ffmpeg/tests/lena.pnm
@@ -2,7 +2,7 @@ P6
# CREATOR: The GIMP's PNM Filter Version 1.0
256 256
255
-}߈v|{|rބu݄nފv߂kބj܄pg݂tށsjrvrrwzyvxvtwfvvZaP_@T>\=YEXGXJZIZJ\NWJVLVOZLXLXNXLVNZNZJSJTOVSYTZXZTXZY^Z[\`\^\\Zf_b^ebabbbkhffd`b]b``^g_d^d`a^hahjb^ebfagfebe`ddfbgdhef`d^ffjffefbjfgbidibichjheghknhlffe_ddf^e]cbcbjhibdadddbb\e`hbf`g`jdd\fd``jjplgcd_bbe`d`fgb^b`e``eiebcc^b`cbccabadbbbd^^bcba\`[dZ`ZaX_T[PXHVLPV\`]lbqlzlt܄pވnފrڎv݂nzg~jڀjlހn܀rނr݀pކxނn߀hހj~j߀eހlf}f݂jށh܀eބh܄m܆n݂jކq݈q݄p܂h؄nn﹅ȐΖОԣԜԟȐ⪀rjM\HXPZOZX\Z\Za^`acX\^^ZZ^bdh[c\aZ[[^ZZZ^^^]`_^`c`b^_^]V\`c`bbh``[[bba`[]V\V\VZ\b{v撀zrd}߈v|{|rބu݄nފv߂kބj܄pg݂tށsjrvrrwzyvxvtwfvvZaP_@T>\=YEXGXJZIZJ\NWJVLVOZLXLXNXLVNZNZJSJTOVSYTZXZTXZY^Z[\`\^\\Zf_b^ebabbbkhffd`b]b``^g_d^d`a^hahjb^ebfagfebe`ddfbgdhef`d^ffjffefbjfgbidibichjheghknhlffe_ddf^e]cbcbjhibdadddbb\e`hbf`g`jdd\fd``jjplgcd_bbe`d`fgb^b`e``eiebcc^b`cbccabadbbbd^^bcba\`[dZ`ZaX_T[PXHVLPV\`]lbqlzlt܄pވnފrڎv݂nzg~jڀjlހn܀rނr݀pކxނn߀hހj~j߀eހlf}f݂jށh܀eބh܄m܆n݂jކq݈q݄p܂h؄nn﹅ȐΖОԣԜԟȐ⪀rjM\HXPZOZX\Z\Za^`acX\^^ZZ^bdh[c\aZ[[^ZZZ^^^]`_^`c`b^_^]V\`c`bbh``[[bba`[]V\V\VZ\b{v撀zrd|yvxvvno߄m߆p߀hhބog݀tނn߂lށntqryzyvvuowhomX_O^AW>Y<VBVFZFYJZJZKVJTJTLXISJVLWJTLXLWJRKUPWQXU[WYVZZX\Z\]][^^[[a^c^dbdda^heccfbc^a`a`fcd`b`b_iegjd_gdhdidfaeafbfbfbidd`c_ecgbdbfchbgahafbhdhfgagjhijjebb`bae^d]cab`fdjab_ddc_a\fbfafaf^gbe^d`b_hhjihddabad_c_ccd_a`daachi^`a^ccdea`bcce`bbd```a`a\_[b\`Y`W^TZOYJVJPTX_^jbplyl}r݂rއuߊrۊs݃m|jh~km}k~oނp܀m݂pރoh߀hj~f~lހh~iހhބi܁dރhނi܆o܃j݄qކnބp܁iفloŏΘМԡԝ֞˔求zmNXHXLVQ\X]Y\Y\\^``Z]]]\[^b`e]a[`[\Y\ZY\]_`^]^^_aa``_^\WZ_a^abd_`]Zbb`^\\U\V\Z\_btlޅv}lWZxqvnvte}lnih~gނkf|jނk߄nހgnrvt|xysngxifbZ\L[<U7S;T<S>T@TKZLYFSFQEPIVFRGSJVHOFNITGOKVLRORVXTXWY\\_Z\V^ZZUZX_\b\a[ec`\b_cba^`abbf`d_c]c`b]c`b\c\fgfdfbf`b^ebe`d^a[f^b^abcdc_c^fcfddaedfdc^b`dhkndfmjbbgbb`d``Zc`jfiebbe`^Xd\d^gdd^h`b`e`a]fbd^ffedd`a\_\`c`^fh^]b`a`a__^bea\abcabaab`^bd_\^^^`[]Z^\fW^T[RZLTKXEPUX\^e`lgvn{nہrۆpވt߈tބmނo~g}go|gހn܀ni݂n߂lfi߁fe~cih݀j߀f}deނg݂i܂l݄m܄rނk݂jiہhxʐКқԞ֞ҕÉߞsd_HXJWP]V]V[[]TW[^Z]ZZ`^Z^`a\^^b_d]^^\a[___[`_^]]\\^\Z^^[`^^``]b\[bd`\_`[\[]`cb`VZET~,KfEiprntrklknjiށn~m~hl~ijmrrwsrnpldtfjaWZNX=R:Q8N:O@RDTDRDPHSFPDNLWGRKRHRGOHNHRJTLUPYOXQYVZUWZ]YW]]^Y^]]Xa^]]`^_[d]c_b`b^d_d`a^b]b^d^b\b^f_bac`fagbfah^had^b_gbhadbb`kheddafbdba`efcad`bf`_`bdbb^gfba`\^\`]fbgdhced^V_[b\e_dcb^a]c`b[b_b\cad^fbec`\a^b``\bb]]b]`^`]\\^`^^]^baa__\`[b`[[^]]]_^\^Y_YaTXPXQSLUHTJUSY]^ffqlxp{n܂qބtߊu߅r߂n݂pހj~jރkl߂ijބm߁ijkge߁jg߀jj}eށj߂jރj܂l܁l݁nہm܁l܁kځh~mމn쮀Œ̙КӞӛԙ͒~ЄlU[LYNUS\SZXZZ]\^Z_Z\]^[^]a\a\]X[Z`\^^^`^[X_^Z\_[\_^Z]\]^`\`c```]`_a]bbbd_^_\NT/Id@\B\Alnizkoklknnki~hhlbhjjnoqsonhm}eo^f]\[KT;O8Q8P<P@SBR@PHSCNGQFPGTIOIRDMGPIQDOJRKSOVOSQTVZW[[_]`\^[V^Z[Wb\^Zb__Za^`\a^_Zfdd^d`e_`]c\aZ`]e]`[dbfbfbb^b[dad`ebd^ca_\bbfbb^d`d_`]c^fabbc\c`cba^fddbb`b`cb`\a^a^`^fcb^cZc]bab\dacahdc]d`a]a_`_`[b_d_d_c^bbaZ`]`]a^bfb]``a__^aa^]`dd``_a]a`ba`]^_\`V\YbTZU`NVNXLYHVNXX^egjfsozr~t߄vuro߁lނpj߁lilmojljl߁j߀ijhjk~fg߁l}a݁nlڃlhۀfڂg|iktƒΘМԚ֜ӘƌulcJRIULURXSZVX\]ZZY^^aZZ]^Y\\]Y_ZZXZ\\\\^^]b]^^\\\^\\\^^^_^\_\\\^`dcfbhb_]HO,Fe@\@ZAZBnpknnjhljqlkj߀ijhjqnrpttknhh~gp\h]VTJR?Q7N:O=O<NBRDQIVGRLXKVMVNVFNDOIPCLFODOJRRVNWRRWVVZVYZ^X[\Z\Y\X]Y]V[X^Xb```b_d_ebd`c`b^bab`a\c\d``\bcgcb\b^d^gdg]c^b\b\fcddd`c`b]_]d_`adc`cc_b_eae`dadcd`b^`^b__\b^cac`c`_[`Zebb]hdhdhaddfbb`ebb^b]d`b_b^fbdfa\b`_Zcab`ba^]b`__c`^\]^`^`__^`^dd__]b\`\`Z^V`PZPXSZPZITHWS\_hkiqnvl}tmvssmm߅lނonlmokppjfljgkfހhh~d܂j܀j~j܂o܀fڀjڂm|h~k܄l|ʒЛԞ՜֞ј֐rWYLXM[T\TZTXX]Y_X\\_\]ZZ\^[]Z\X[^c[[^a[Z]\ZY\]\\\\[\a^`[\[`a^`^^hcgc]YOV,Gb$HY@X=Z@\>pnje߄nhljmjgjgހjiippqrvrnnmof~hr^bVX\NW>R<Q<R<M?OFTCNFSIRJUKTJUJRHOCPIPKPBKDMJQMVOVPQTWTZVU[a^\^\\Y]Yb[^X^Yb^^Z^\b]d`c`a^d\b^a`a^_\c\d`c]c_b^b^aZheb`c]b`b[cbd`dbfec^`\``fddefdcbeca`c_dddac`c\d_b^b\c`d]dab`c`_Zc]e_b[d^had_gfddb]gdb]`^ddd`b_aacbc`bca^`\`\_]`^_``bbc`a`_b^a```e_ad^c^b^`\aX^WYR]T]VcN[KYJXNZVaehpkvr|qsޅtprvntrtnppojkkglhhh~fffh~h|j|hـkـp܀lڀo؂p~jyhqč͘Ҝ՟֝՟ʓ簀{iMXMYMUNWOUZ[T\VZ\^Y[ZY`][[YX\]Z\\`\bZ^\\]`^]_`_^]^^^^^`Zcddceck`Z\EQ&Ea?\HZBZ<\B\Bpmmglgohgkjj~f~mjtntpqpplmnmg|go\f\WYHR<L7L6J=O:JFRGQ@LKRHOHRMVHTGTFQJTDMDNDKENMPNQQURSTSXVZ[\b]Z\Y]Z^Z`\_\_[ea`\a[d\b^a[b^c^b^faa^`Zc_c`f_fdd^c^gefbe`khegfca]d^f\efd^a_``fceccba_edgdffhdecb^ffeb`\_\`Zf]d_c`ba`]b]c^f]iffcjfe^cad`b\ebc^c`a_d\c`_\`\ba`[`_`]^Z[^_^_^bbaabc``bd`^bcb`_``bY\Z]TXQVT[ZcMXOWJ\HWS^^hoovpwp}q܄wptsstlppulqqmnonjnlfg}bhބr|ej|lۀm}l~m~h}i{i~h{ʑўӜ֢֠ҜÎvb`JXLVNZPWX\TZV[Z_Y\[[[ZZ[[]_\[\_a]_^^ab_b\\cea^`[b^b`b\d`hbfe\[@Ly!B^>W>X<ZBY>[9_@llshjihkkmipmlppronqppsjuod{jreje^aQ\@S8M9L?P@MDMCNBNFPGRLTIWFPHTJTFODNJSDLKSNRQWUZSWY_XXY\WZ^[\\YV`]`\^``[a_^\a\d\dbc_c]fdd`fca^b_daa]b`c``[aadbfbd_d_f`c_b^b^dac\b\ca^[bcjidbb^dbcbabaadbdagea`dfbe`bfbgbf`_]_^b]d]gagfigjfgddcfbdafcd`b_gffb`^a^\[a`cdcbde_Z`^^b_``\bbcaadab\Z__aa^dbg^dZ`VZTYS\P[NXNXHVFXQ^[gfgolxq~u܂utrxvwooqrummqjmjonphkdj݁l~l~jl}jـpln~izexf߉jŊΕӠԞ֟֝̓ЅlNXISM\NVTZV^TZX_Z\\Z_`\`_[``\]]`^`bb]^__^^b^bd^]b`fbg^gdiaZ[>Lu$CZ<V@YBZC^D\?\>`;jonlljmkll~nnnnoqtoprnopklod|fqbhb^^V\BR=O9N=J>JBPFPFOOWIRFNKQHPIQCODLKPELEKFROXOVRUQPUUVVWVZY\YZW\V\\\X_^a[`^a`a[cb`__]ef_[c`b`dab`dcbZabc`d\a`a]c`d`c^`ZaZc``_babad_cbaaeec``]`]_\ecfgbba`acbbb`jfbbe`c`cabb^\`Zb`a]caedghkmooefdeb^fdb_b`bafc`Za`]_b[_``]```\\]Z[```^^\`^``_^_\_^^Z^`\`]h\delV\PXT\LZJXNYFTOYV^ecokztzn܁s߄pvyvvpotxrnrpolnporfsjރp}k~n~lj܀jځol}o|k}l{kyetɒϚӠ֠ؤӘƌwjbLTR[NUT[PWX^X\X\Z\\``aZ^[]\_`eZ^^`aehjababb_feedhgiglf\]?Nx#D[AR@ZFXFX@\CZB]?aAql~ilminmrlnmjimtnttnlppljrh{hwhhe`dOZ@R8N;N?OAKALDNGPQXDMFODNELHNGNHNELIPGNHPLQPTNQUUSVZYWXWVZXZV\W\\`\_]`[c^b[`Yc_`\ccc_c``\`bb[`^b``Zc_dbb]b]c]dba^cf`]c]`[b_^Zc^_Zb^ec^^b^d`\X_[b`^]]]`\b^a^``\[b^c]b^``c`^\`\_Ybbfdbbedfdffbbc`bca`b`dbb`b]e`aaa_`[dd[Y\_]\\]^Z`^^Z`Z\]^\Z\\Za_`\]]\`[`[bY]X`RVQZPZS\JWJZO[P[`djixpzv܀x݄tyvwxnrmpstnkoqgmjjhmhl~jۀl|kۀj}j~l|i{k~k~lvevf܄j|É̒қԞ՞עҗf֌iTWJSPUPZRVV[Y\VXV\UX\\_][^\]WZ\`Z\adbcfidhddedgdhild\[>OnA_IV@XEZA\ LZ?]>\>b<c@hlntqjmlmlroqpstvsorqsrkllj}dtch\ZZLT@N6I5H>M<I=JBNJRJRHPHRCOJRJPFLFKELEMHNLPMPPULRQSWXZYZWWUZXYT`\_\_[`^ZV^\c]c_`[c_^__Zb^b_]^```^`^_\`Yb``Z^Yd_fde`_\a\`Y`Z```\b`fhgfdaa_a\^\^W_Z]XZV^[^[ZW]W]^\^^]]Y^Z`Z^[^Z`]\W][aa`_b`didbcbb`cabac_cbd__\`\^\\Z^Zb^`X\[_\\Y\[^^_\_\^[\Z[\\X```_\[\a^dZb_fV]Q\NWN[NWJVL\T`Yhafjltr{t~x߅y|vxxtuprrnlnkoi߁jljji߁ol~hl~mڀk}k}jl}l|j|izmxkydqǒКԞ֢ء֝ʎ~w`JUKSOXTWX^]]ZY\]Z]\Z^Z[]\YZ]ZZY\]cbf]_cbdfdhifjg\_<Nr#Gf4XWDV>W=X<Z=X:`;_?f?f@f߂pojnmiimrnmnprtrsroipnqjpn~gt^g[TQFL7F8L0G6I<LBMDNHNENGPHQLVJTITDNFPFQDLGNKOLPJNQWSTX\YXUUZ\ZV^\XYab^[b_^\]a^Y^_`Zbc^a^Z`^```ebcb_cbaac_`\^X\ZaZ_``_`]b^^Z]Z`\dbcddlhfgfeb`a^ZXXYV[WZZZZZW]W\X`\`b^[`[\_\Z_\`]^]^[baZX`b]^bbfecdcbaadbddcbfc_Z_]^Z^\^[__^`][ab^_]W_``^^]`X\\]Zb`^_^]^`]^Y`\_^a^dR\MXNWLSJQJYP^Wb[ffjolut܀xx{zuuwtsmqpmlhhkރll߄njkބmjހl~lmہmlh؀m|j}m~kwhzlvh܀dz‹͘ҙ՟إ۠ԙ‰ڜw\ZJPNTRWV[STac^c`aY^]^^^Z]\\V\ab^c\\_bbbd`hehh^X=MsAYA\FYDS:U7Z<\8_=c9h=j>c9pomjhnlhoojruotrtrpshkoqhnlcsZgZXRJN<K6H3H;ICN?MDOHSDNHPIRHNLVFNKVFNHPEPHMKTKOKRSVSRTWXUZ\YXYX\[]Z`Z`Z^W]Z]Za\^[_[_[\]b]aba_a`ch]]bbbaacabc]ac`]`]dd^^`a\]^^__^Z^^edfehhgaad[\ZX\Z[XZWVUWRZZVW]\bd^[ZY\`\XZ[YY^\^^\Za^a_b`^^bd`^bebfb^dchfbbb^\\_]^\_ba^`a`a^[\Z_]\X]\\Z]\Z]Z]a`^a_\]\\_^bU]X^V^YbOWQXNVLULXPaXcaifjprwt~wރy߄vx{txtvto߇tomjkjjimmqnlރr߂o݂s܄rހn~l~n~h~q{hxkxixdvglǑћԟ֠ؤآДɁlINMUOUTYUWVXZZ[^^]\Z[]]]ZZ[`]]^ab`^^fdfdjdZ_9Kt>W=V:ZCXA[BW;^?^<b=d=g@a>f'Ljqpmmkpiqnqnvrwrtrrljnrtknmfs^gXXUKP=K:N4K<K@MBRBLFRLVLVNVDNLUGMEPFOIRDPIQIRJOKQNRTUTVWV\_[Z[X\Z\ZZV_[\Y`^_]`_`\`^]Z^^\\`\_a``bfad``_cd__^b]c``\``cb^`a^`]`__^^^bfebdea`bbdc`c_\YVZZUUXVZVYW\[Z\\Z`]^^]`\\\X]^[\\[]\[Xcadgac`^b`bdeffha`dh^[a`]`bb\[\_b^``_^b^]\ZX^a_^[Z^^]`\`ba^\```abdX]T_V^V\V`TYLWNXNZKZOa[jclilkjwx|tހvxtsxwt߅vqvopighmjlenqrh~kރp݃rބp߂nނl~l܀ozljyjwgxjtf|gxʔҜա٧٤מ˒vd]JPOTPXUVVVXXV[^`]`Y\ZZ\^^]`b[]``cdgbgcZV=Ks<X9W@[@\@\BZ=]?^>b=e<e<b:bAcEgpnilhjlpvprstrrrtpeflpioijcv^hV[VHN<J9J9K?Q?PANBNDNGQHSKTKTNVFOCLCLEPENHOGPJSNUPVPQTUUVYZZ]\\VV[[\\_\^Zb]Z]`\^\a`_a^Z]`]Z`a`^`a`^`a```_aab]bbb]bc_`_^aeeh`^^]_\````cdbbdd\Z\Y`_[XXVZXZVXYVW[XVD[Y]Z]^Z[^[\\\XZZ\Y\Y[^_]ab_`be`a]`abhebecb_`__^]__^^aJab^`^^a_^\ZX`\`c\`]\[^^][]`]``]`^_[_W_X_T`RXQHL]N[HXJXLYY]^beljjqnws|rހrރvxwtv߄wކt߆s߆srmrolVopkqoj߄nނp߆nn߃Tރrހm݁no~q~o|nvmrOqe܃ildӂؗڞۡ֠Ƙښ\~NwNiPZVVWUUZXZ[Y_[^[^\aa^^_`d`geg][]CUw#R[NXNTG_DZ2]B\:`Hb?eBe;b<`<d@d >slnkmlnprtrqurqropkjmmllilg~er[fVVPHM>K6L;M;KBPBR@MIRGPHPHQJQFMFNISEKCMBMCMEOLTOWOURRSVSUXXWT[ZZV]Y\\[Z\Y`]__^]][`]_]_X`^ZZ]\YZ^`a_ceb^^`^\ZX``bd`ba``^^e`e``^^`_^]`acgda``^`][[XZYWUXY[\XZX[XVX[Z[\^^^b`XV[ZWWYWYX]\[X_^abaf_aefbcbfejgffjaa^\bd`_`abaa_\`][^^]\]Z]`]\]\\X[]`]]]^]_``d]^[_W^W^RYT^P[P[RZJXLYQ^VaYcbfhkqnwq}t}t߁utކvtuބvqo߄nkmnnnim݅pnppl߁on߃mހpmr߁p~op~p~pxjzjtctcves˗ҠרګۦڥΘ賆vfLUJSNXPWQTVYVX\]^^ZX[\^adhbbdbhg]\?Pu>Z9W;V=Z=Z@a"LaBfFdCf;iAd<b@d@f>e<wmolvrnnypstorppjnfjimnkjll|ep[dT[RHP<H5H4I9H@P@OCNDQFNDOFLFNHPHNEQEQCOJUISFPLTNTQXPUX[RVY[VTVXXX^YZ\VX^X_`^Y][\Zcd_\\W\ZYY^^X\^\\\``\][Z`_\V^\\_^b`__ackgkbd`^`]^^\\_^`^^]]^Z\\Z[[ZX[W[WYVYZ^`XT_a]X]X]VXTXU\XXZVW]ZZZ]]`b`cab`adcaefjccejab``]`^`^^`_`^`^]^^`][ZXZXZZ^__a[X][\Z\\]__cXZWZY]V\QZY`T]T\PVJTJZM[Uc[fblklmptrzq~uހu߂t܀t߃sttކrށmޅolrl߂p߃ooq߃lހornloko߂jހpp߃q~l{p{n{ozl{kvitfrc݁f~ƎИ֤ئک֣۫ōܞy^YDOFQOTRXSXTYZ\^^]_bb_cecfdfeVW:Js?X:W>V<Y>YC^D`FdDdCe>d@d?^>d=cAa<^;vnogrjqpsurrosojfkenkjrolng}gq]i]XQFK6F0C3G8J?NBNCPDJGMKTCKGNFNDLGPHNHQGPBNEPKRNSQTSUSUSXZ\VXVXVYW]^^]Y\]\\_Z[W]\_]^^\Y\ZVV]]`c`^^_`_ab^^ab^ZZY`^`b_a^]`c`b_a`c`^\\^\bc\[]]\[Z[[YZZZZ\]YZTT\^XYVVXX[XZZTSVTTXVVTWZ[Y[\^\Z\\`b]`_dbhbeehacab``^^^^^_^`^a```^Z\^a`_\Z]_^\[^Z\]X_`[X[\]\]bY^ZcV\UXV_WaWdU`NVJXHYKYR`]fchhkpnwszszq~o݀u܀u݄tv߅xކs߂o܆tjohpp߂lmo~j~kjroloރsnn~m~lzkzjzlyiwfufqbparbp˔Ԟ٪ڪ۬ܩҙ΃hJRDOOXPVPTRYUZW`Y[_dacdfheW[>Nn@Y<X@U>Y?V=\Cb"Od'Pe#Kj%Ld$GdDb>d@b>_?^<`Cwpnpjpqvtuvopoikfkjlnmqjhlg}fp[bVUPAJ:I0F2G<N:KBPHRJTFPAPBLEPEPDNEQEODNENGPEMFNNTPTQSVWX\VVZ\YX\Y\^WZ][VTYZ]Z]Y]^\`^`[ZZZZWZ^YZ[]^`\Z^`^^_a^Z\Zba`b^]a_\]`d\^a`^\\`^a^^^a\^^b\\\\^^[[]a\[XY[WZUYTTPTTWVWSWYYUVVVQXZVVXXWW^\``]aabefafbdbf_^]`_e^]Z[^c^`_`_^^`][YX^`_`^^^b^Z]X\Z][^^]\\^[`Y_UZTZR[S\S\R\PZOZL\NYT_Zdbdfloprnwswo|tv݀u܁xނv݂tކs߅sނokl߂oiނtilj}i~i߀lpnrl߀jl~m}n~jzjzi{ivjubtbtbp_n_dyȎї֥ڪ۩ުפȍzf[EPLROXMSQYRZT\Z_\`ddd_\\?Lt?Z=V=X@X>\>Z@^@d@fAdAa>b<`@`<a:_>_9Z>\>mpopkppsyrxjlhfcfejnrhoojklzfp\gXYUEM7K1H4I:N<ODTDOEPDJHSHOHSGOLRALJPDODMIOFJIPMRNQRXUXXTYWTTTTZ_\[\[]ZYXXXZYZZ\b`_YZZZ\\YX_^^b`a^b^b][\_\Y\bZY`^[Z`]_`^^_b`^``]^^]__``]\\^^^ZZ\Zca^\ZX[WZX[UWVZVXTXVURXUUVWTSRXRTRXWVUVW\[\]^_\`_b_dadbe^a\^\a_`^_`eZ\`gbdeh[^\_bf^b][_b\X\YZZ]Y^]_aYZY[Z\XZRWX]RVS]Q\R]NYKXMZR]Xd\`jjljqntrxpypzp~s܀w~p܄w߃ttj߂ljnn݀rނl܀q~gkl~ln~jnqm~l|jzfwfxkvftgvjtbsbqdq^o\s_o̔բئڬۧܧԛъlMRGPLUMVOVRYSYZ]]bheYY>Hw"A^>V<V=X>Y>]A_BaHg"If&KdCb@_DaD`B]?^<^:]>\;pklllrquuvmheghbeigdmhnlnln|fubbWVSDM=L/E3F=M=NAMCPDQENEOGREQBNHRHOFLFPFOFPHPLRIRPTU\RVVVVXVXXY\Z^[ZY\Y][[Z\X\Y^`ZY\[Z[\^^\^b]]`bbl[^^^\_[]ZX_bc`^^`_^_bc\_ab[Z^`Z_[YbbbbZZ^ZXYZY[\_\[\Z^X[Z^Xcdqhrȇuzņy~v~jpkr[`X^WVWVXW[XXZWZ^^\_Z_[_X\^a^^^`^`^c]`^aaebc`d\\]]]^\``cb^[U^Z]Z]`]^\^Z^]\Y_S\T^Q\R\VaPXJTJZLYP\T`^chglknfvqtiwpzr}s|v|n݀uނtނrރq߁oހl߀mm܁ql߂pjjkii~hoi}hzlzgzjwjujqdwhqerctbrcsbp_rd{dxŌΘ֤ڨکܪ٣̐}hZFRJTKSPXU\RZ^bb`X\@Nv@[>X?W=X@X>\A_AdCa FeFg"IgFaEa@dAb>^9^<`;_>]<xqsnltnurhhh|c}cz_z[|bcljplqulpb~lt_j^\[GS;K3J2H<R=N>OCLFQFNHSKTLUGNFRGQFMENFPHNGNPWNURYQYUTXUWXZYVXZXZVYU[Z[Y\Z]\[\\`^c[\ZX]a^]a\\\[^`b^b`b]]Z]\]\^lj_a``bbdm]`\`]_YY_`[[^\hf_eY\\`Z\bn_fzpuus{xńʝϔΠԜΡКѨԤͤɠu}[]VYRTTTVVVZXZ\aZZZ_Z]\^Y]_b]abfbf`hac_d_cY_[]]a\\ZZYZ__\^[ZZ]Y_YYV\T_R[Q\S[R^LVKTHTNYUaU_`egdklqnsmuptoulxr{uzrہx݀tހo݃r߁lނp~j~mn}oހlހnigli|h~i|i|hyhvfxfvhwlvdvjrctgudpavdsdqaqbpȒӜצ۪ܪ۩ԜĈזtRWW_OXSZU]Y^_aVV8Jq B\:V?ZBZAY<Z@]@^BbDgGh"Fe#IcDfAcE`=]<]>]=\<^?\<unklnmysple}ew]w^u\xdw]jnhnmprrph}ds_e\]ZHO<M6L2J9K<L=O@LBQFRFUFQJXFPEMHOFMCNDLFLFLPSPVNQLPQVUSYYVWYXYZ\[ZY^[[V\Y^Z]^^^\^^]ZZ\\^\\\^`cd\a]^^_[_^`]_^^]_]\abb``b\^^\^]_[X[ZZ]^\birivrq}~}}|~ȉʖ͒ϔϥΡΣΟӭѥִ٨ְڳӤʧȘv|`hWZUXVYX^V]\_Z`ZZ\^]_`dehdlagdicd`b\^aeZX^^]^[^`_[^\^^`Z\Y^UVX^V\NVOZNZP[LXIVLXP]X`\cedkjqjsnqmtlxptl{xzr~p~vހpށpށqq{m~n~n~k}mjljgg{e|hzj}fzhxdwftfvjtdvhrbpar`scrbsdobubxew͘ԤبڨܩڧϗxaNUKTUZU\_\TV@Nq@X :V<V>X:W>Z:`@`Ae!Ga@f$Id: lena.pnm,v 1.1.2.1 2006/12/02 01:20:05 dgp85 Exp $Jb"Gd"FbE^>[:Z:\;a<^;`<`=qrnntqsuqhbt]t\p^n\qcv`jomnlqqlnihscgXZVFL:G2H6F9I:G>N?LBRFPERIQDNDMENGPHPHOENFKJOMNNVOTQVTVY]WVXZVRWT\YZT`_ZT\X\Y[Z_\\Z[\\[eg`b_`__^`^b^^ac\\]aY^]`^]_`a\f_]\\\^\\YZXZ\[fivw{ɂ}ƃǃʐҠ̘͐͘ϞզԭѨͣҦҩЧѦң֯۶ڴسϥĔpz]fU[NWWYUXZ[Y[X^^b`ddjah_e^b`c\_^^Z^ZY\_\Z\[[^\^XYVWT_VZS[W`SXMWOZMWLYJ\KVP\V\_ffamlrltjsjsjumuqvlzmzr{nހsnހq߀n~nl߀p߀mk|h~o|g~gizf|hzhvfubwgudrdqgsbpfpfpapbp^pfn^n_pbve߄nƑК֧ڪܭئɎvc[PXX\]]XX=Lq>[;S:U<Y=Z<Z>Z?^?bDcCcBfCdBdEbA`EZ>X9Z:^8a8]7_=^;tlkrmpplmhx`r\lWiZm]kYw^glhoplosih|dr\fWWREM8G2E3F6K<L8LBODNGTFQFLIRDRKODMCLGQGPJPHNHPMTPRRVTSVVXWZVUVWTZXZX]Y]Z\VYVYUZZ\]^\_^_\]]`]ZZ`a__^^_\`_^a]^^^\[]^[Z^X]Y\`Z\[][afrtv~}ʆzs||z|ʊҖΝ̛ΘΝϣԪէԧХѬ͚ʝ̟Ъըөֳ׭ݺ޸سХ„doPWRXSZY_X^[^\a`d\a[`]`^`\e]c]`[]^_W[YYZ^^^X`T[VaUWSXT`RXOXP^QZJXIVIVMZX`bcgenjoixusntqroupwowrxq|wzs݂r}q~nq{l{g|l~j{l{i|hzh|hxjzfsdwescretdpen`qeo`odocp^rdscscn\pcqdudq˒Ӣاܬ߮֞֍rYZYZXYGQuA\<R=U >X>V>X=[>Z>`@dDfDbCb>d@`>`@\@\@[>^<`9b:\8Z9]8hoisrornhesXlY`R^ReZl]u^gjimnplkpejrZjZVPFL6F.C6I5J:K<L?JAPCPFNAMBPFLFNFPEMIQCLEPJNMTRZVZRUTWVTSUWVZXYYYXZ][\\Y^ZZWZXZ[^Zbaa``]\\\\\b]\^`YY\\XY^ZUV\\^^^]^\\\Y][can_pfxy}qzɄzu~tyǂƂȂ̌ГɌ̔ИМԢУѮЦΤΡ̢РУ԰ҦӬֱڳٰݼ߷ยҪ|U^PVUZUZRW\_\b^hZb^d\bbj[^\cZ\^b[aY`Z\W[Y`SYX]TYR^PXR]O[QXPXJXIYP\NZZ```hflgshshtkrlsnsnvnvnxtzs~x~u~sq߀n|lyl{n}m{lzfvfvfzfvdxcubtcrbp`vhsdndnbodlbn`ocseodpdo`nbrckbv`zČИب۫ܯެҘuf\ZDOz"D\@T?T>XAXD\D`@`DbCcFdEd Eb@b>d@^>W?X>\FbHb=`:_?^9\9`<mlpqpqlhexZmUcSXO[R`Yo`{bfljknluppliubfXZTBI6J-F.D4E5H;H?K>M@LAMDO@LDLFOERBNFPIRIQFOISMTTZOQTVSRUVWVYVUT\\XZ\]WWZXYU[YZY`^YZ[ZZZ^^Z\_`]\`c\^\[XZYXXZ]]^`bneoppyjw`kdvtxˀv~zx~|~v{zxzzłȂx~ǂɁȆƐʇΒ͓̕ӠҤԨѢҦϢҩ՞ҪԯקӫڵݴشۺỦ޶̞jrPYPUT\X`]g[b`i`h^f\bZ_Zb\`\^Y`Z^VZX^XZUXS[RWNVQZR\NUR]JSO[HVQ^NVY_^_jipondshvmukritmuowoyqwq}x{v|u|m|q}iylvjzgxhwevcubxcwft`thrarbtcp`peqck`ndm`kXpbo]pbp`o^o^pbl^l`f֮̕ڮܬ߮ݩ̓yMR~#CX<W@S>U=W;Z?Z@_CdBgCe?cEcAb@cAaBZ@Z?`F`B`B]:\>Z9Z;_<`:ompozmmlzbrXdTVKSORNdZvh~lgllilllnnh}`vdh[VPCL4F*B/F2EAX>M@O>M>LANBKFS@ICMDL?L@JJSJPFOJROTNSQRTWTTTTVTXXX\VWZ\ZXZ\XUW\XT]X]^\Y^\^^Z\\_]^]^[ZZZX]U]alZkkx~~~rzfmXeYdixhrnspxrvx|rwqwvzȂ}ɄxzȁʆȍLjʔΘ̙ϔ͖ҤҜϗѨ֧ϜҬ٨ӫڸخֲܺݶܼܶ޼༦๥ֵ~T_NVV_[dV_Y`^e\dV\V[Xc[`Y^X]Z\X\W\TZRXR\QWNWMXOULVMYGTFTIWMZOVR\]`fdmlrkvnulultjsmsmtpvpzwwuxs|p}r}n|nzhugwftbxhxfsbr_veteuducqdp^rfpcpbpen`pfl\m`l^l`oao^o`sbmal\q\sĐϟתܭޱ߮ڠ񼈩HP\>RAV@U?XAZAZ?X>bAeDf>d@bBd@eBdD_C^D[@^>aD`>]=\A]?\:_:b9rmxnvpjfzfiZXPJJEJOL`Xrb|dimpkommkjjgt[k\[PDM6H3G.G5M;N7J=LCSFPGTALAKAJDMALDKEMFQISHRKSJUMSLQTZSTUURUXZZ\UTW[TXWU\_YWZZVU\[[^ZX]`Z[]^^\[^UXX\TZelߛyс}|v{owbibi\c\i_ndllwlvnsfmkpjrzxqwutȁ|{ʅˀ~Ȅˆ͓Ґϒ͞ћʔ̘ҢԤҫգӞ״ܮ֬ظܱܰڷߺ⺡ݴۻ侦ݺǝguR_XcPXS[R\WZX_YZV^X^X^V\V]X^X]V]T[PTPXPVQWNXL\LWKUDREQKXOXRW`hedpiritnvnultirjqjwjwmvnsmvr}q|rzk|n~rzltdqctdqepbrbr`uetcvgqbr`pbqepbpgo`l`pap_n_o_pfrco`rdo_m^k^}dőҠبݰޣ򾀑.CM 8P>R=W?V@\@Z=\>dBhCc@bBbBdE`=]?Z=\B_@g#I_@^BW<^B`?_6d=f:rrpvqjhx`p]^OKM@J@JUPdXug~fdtlmjmlmoi~hvaf[XSFO6J,D0F2J8L6H:L=L=N@N@N?KANAMBIFMCLCLFOELJQLVNXPVQVTVPRTYWYZ^XZTSXXVUZZXVYZZVXX[\[YZYZ\XZXXY\XXwb``daemqllgjcj^jbh\g[j\h`rgnnzlpnvfrerhpwhtrxy|~}ʈȄň̎Ж͎͎Иɓ͠МЦ֬ѝҲײլֱۯ֥ײݸڮױܼ޹ݸ޼޺հXfNZNXPXV]T\SZT[[`V]W[UXU_WYV[UZTZOWMSPZKWJYLWFSGU@JKWKUT^^`hflbqhwjvntmthslsjtnwrvowrunvn{uxkyl}o}qwhuirbn`nbrasbsbvftcqasgp`rbufpepcodpbpbo^p_sbqathqfl_oapfsfsОتްԐ|_Z8P>Q=T>W>Z?\@_?bBfBeDdAdCeA`<[<Y>Z>`@d!Db?]<\=X;\9`;b:hAf=mvsrvddw^iXQKBF3C9ERNbVsbfhnhmljnnmn}hv\fZWOCI4G+B-C2F0E4G:I?N?L@O=JCNAKDJCMBLFSFTFNHSHNMVFKOVRYQRTWS[VYSRUVRUZ[WZ[]Z\XWW[^_Z\ZZWY[^WUXYV\g_rNMV[_d\d_c`eX]]g\e\f`n^cblmsnvlpipdohpptsxprpwtw|~~t|˅˄~ΒɅĉ̖͍ӧӛКզٮٱֲڰ֥ԯڲ۲۵ڶްڭڸ໦ຨܸڻܾ⾪۷ÖcmLXNXNWNXT\YdT]U\SXTYS[SXTZS]TYQ\NVOVMXP_GTLXFSFTFRLZS\_affnhtivjyoujtgsjsjqitnrjtnsnuptnun|k|qyixopdpbnando`o^pbqavfp`oaqdscrdpeo`k`pbn^l_pauerfsetjrdpcqen`yk|ʕצ߲Օp)AL :Q>Q 9U=X>YB^@dCgGfCcBdBhBb@[:Y<X<]@a@c@`BY=Y:\:]:c<g>c9\8pxrmkixbq``WJI:J+B>FQOe\ta~eknkljqjknhzbrYf[VNFN2E-F)C.G4H8M>N;L:G>L@K>K@MCOBQEPDOENHTBNGMFRDNNTNVPSQURXVVQTPSTX`cZ[XX\[Z[Z^ZYVVZXZZZ[XXQWXZ}o\:TNY\cZb`iX[^eX``j[e\eWbbijpflkoegfpjrlvnukos{nwxrtzƆŃăȌˉҥԞЛΣԤԦְخգشڴ٨ر۸ޮתص๠ݶܺ޿޼໭ڻڼںݺԮt{N[FTIVOZU`PWNSRYRXR[TZRXT\PYLVOYJULYLZKXHQFRAQFVNZW^_ajfmgtlwlxnylxltfuqrmsptlqlrmpmpiupunxp{k{nrbphlbn`nanep`sdtbtepdoarfodqapeo`pbohoaqesgtep`tdugrfufteshmҞۥҖxBHT=N>Q>T@T@V<\Bb?gCf Fd@f EgAhC`BX>Y=]?cBbA^@X:Z?[>`;d>k?d>T2I2rwwrj}ftddVTR<F*B*B;IRMbZo\|`lkjqljmlli|bmYcUUQCK4D)B)B2F6H:K=L@N<LBPCR@NAODOBPDPGTCLDPFNHPKTLSNUPUPSNPOURTRRVZTVWYV[VZUWZYZ^VY]_ZXZZZXXX\\XVuXRTIZPXV_VY^cV`Xb_iei[hYd\ddpdnilkrfqfqgojsourvjnknpuxvx}vyƀ|ˆ̉ВГҤӢӠդ֤ԦԬجتدذް٪ܹടܯܴ߸Ả޸ۼ²ݼڶڽܾ۾WcDTMXJUGPJSLWQXOWQZPXOXOUN[LUOZO]HXJWJVHRETGUNZP[`ejdpivnzq{mzmxqwltjtnrjromhtmnkokmfnhrl{mzpsdtjpendo`r`rasdugtepdr`pfoaqapdnbqhpgpdrjqhtfnbsetdukugxlxnxj~Ȓ̌qHNY?Q;T>V@U>V<[=\=dAa>d@cBfBgA`AZ@\A]@`BdA_AV=Z@[>\=bBi"Cg!DW9F3D3~pokhx^lYZTFN.>*C0F?LRNc\p\yagljrniqnmk{`lXfXVQEK/D(C(B2J8L4G;R@RFWHVGYHXBPGRCOAQEPDRIUDRKVJTITNRRXTYJPMQSVSXUXUZVZUYUVUZX[XX\[[\YXWZZ\XYZVpgNRMURZKVV]W_V]V_ZaZ^_h\e\g\edmlpnqksenkujsovoriracktt{krjt{yżЊ͒ӗԚӤآњҭإϠөۯ֣Ԧظ޶ܱ۸ߺ߱۵޾ᾥວݻݾ޻ܼúóˡYgCUBPHSHQJSJRMTPWRXNXPYNXNZMVK^IVJULXIYANFTJXR\Z]ihnfwnzrznzjyn|qyrwnrlmijllkjhklgdlhoiwkylvhthpbpbp_reofsft`tipao`piqbpfpdoesircrgtepesdtgtjtjwiujzn}p{nu}i<FX<W?WBW>V=X<Z>]>`<d<`@d@cCd?a@Y@ZBcFeDg@bB^EX<]A\@d>n(Jp,ObAI
+}߈v|{|rބu݄nފv߂kބj܄pg݂tށsjrvrrwzyvxvtwfvvZaP_@T>\=YEXGXJZIZJ\NWJVLVOZLXLXNXLVNZNZJSJTOVSYTZXZTXZY^Z[\`\^\\Zf_b^ebabbbkhffd`b]b``^g_d^d`a^hahjb^ebfagfebe`ddfbgdhef`d^ffjffefbjfgbidibichjheghknhlffe_ddf^e]cbcbjhibdadddbb\e`hbf`g`jdd\fd``jjplgcd_bbe`d`fgb^b`e``eiebcc^b`cbccabadbbbd^^bcba\`[dZ`ZaX_T[PXHVLPV\`]lbqlzlt܄pވnފrڎv݂nzg~jڀjlހn܀rނr݀pކxނn߀hހj~j߀eހlf}f݂jށh܀eބh܄m܆n݂jކq݈q݄p܂h؄nn﹅ȐΖОԣԜԟȐ⪀rjM\HXPZOZX\Z\Za^`acX\^^ZZ^bdh[c\aZ[[^ZZZ^^^]`_^`c`b^_^]V\`c`bbh``[[bba`[]V\V\VZ\b{v撀zrd}߈v|{|rބu݄nފv߂kބj܄pg݂tށsjrvrrwzyvxvtwfvvZaP_@T>\=YEXGXJZIZJ\NWJVLVOZLXLXNXLVNZNZJSJTOVSYTZXZTXZY^Z[\`\^\\Zf_b^ebabbbkhffd`b]b``^g_d^d`a^hahjb^ebfagfebe`ddfbgdhef`d^ffjffefbjfgbidibichjheghknhlffe_ddf^e]cbcbjhibdadddbb\e`hbf`g`jdd\fd``jjplgcd_bbe`d`fgb^b`e``eiebcc^b`cbccabadbbbd^^bcba\`[dZ`ZaX_T[PXHVLPV\`]lbqlzlt܄pވnފrڎv݂nzg~jڀjlހn܀rނr݀pކxނn߀hހj~j߀eހlf}f݂jށh܀eބh܄m܆n݂jކq݈q݄p܂h؄nn﹅ȐΖОԣԜԟȐ⪀rjM\HXPZOZX\Z\Za^`acX\^^ZZ^bdh[c\aZ[[^ZZZ^^^]`_^`c`b^_^]V\`c`bbh``[[bba`[]V\V\VZ\b{v撀zrd|yvxvvno߄m߆p߀hhބog݀tނn߂lށntqryzyvvuowhomX_O^AW>Y<VBVFZFYJZJZKVJTJTLXISJVLWJTLXLWJRKUPWQXU[WYVZZX\Z\]][^^[[a^c^dbdda^heccfbc^a`a`fcd`b`b_iegjd_gdhdidfaeafbfbfbidd`c_ecgbdbfchbgahafbhdhfgagjhijjebb`bae^d]cab`fdjab_ddc_a\fbfafaf^gbe^d`b_hhjihddabad_c_ccd_a`daachi^`a^ccdea`bcce`bbd```a`a\_[b\`Y`W^TZOYJVJPTX_^jbplyl}r݂rއuߊrۊs݃m|jh~km}k~oނp܀m݂pރoh߀hj~f~lހh~iހhބi܁dރhނi܆o܃j݄qކnބp܁iفloŏΘМԡԝ֞˔求zmNXHXLVQ\X]Y\Y\\^``Z]]]\[^b`e]a[`[\Y\ZY\]_`^]^^_aa``_^\WZ_a^abd_`]Zbb`^\\U\V\Z\_btlޅv}lWZxqvnvte}lnih~gނkf|jނk߄nހgnrvt|xysngxifbZ\L[<U7S;T<S>T@TKZLYFSFQEPIVFRGSJVHOFNITGOKVLRORVXTXWY\\_Z\V^ZZUZX_\b\a[ec`\b_cba^`abbf`d_c]c`b]c`b\c\fgfdfbf`b^ebe`d^a[f^b^abcdc_c^fcfddaedfdc^b`dhkndfmjbbgbb`d``Zc`jfiebbe`^Xd\d^gdd^h`b`e`a]fbd^ffedd`a\_\`c`^fh^]b`a`a__^bea\abcabaab`^bd_\^^^`[]Z^\fW^T[RZLTKXEPUX\^e`lgvn{nہrۆpވt߈tބmނo~g}go|gހn܀ni݂n߂lfi߁fe~cih݀j߀f}deނg݂i܂l݄m܄rނk݂jiہhxʐКқԞ֞ҕÉߞsd_HXJWP]V]V[[]TW[^Z]ZZ`^Z^`a\^^b_d]^^\a[___[`_^]]\\^\Z^^[`^^``]b\[bd`\_`[\[]`cb`VZET~,KfEiprntrklknjiށn~m~hl~ijmrrwsrnpldtfjaWZNX=R:Q8N:O@RDTDRDPHSFPDNLWGRKRHRGOHNHRJTLUPYOXQYVZUWZ]YW]]^Y^]]Xa^]]`^_[d]c_b`b^d_d`a^b]b^d^b\b^f_bac`fagbfah^had^b_gbhadbb`kheddafbdba`efcad`bf`_`bdbb^gfba`\^\`]fbgdhced^V_[b\e_dcb^a]c`b[b_b\cad^fbec`\a^b``\bb]]b]`^`]\\^`^^]^baa__\`[b`[[^]]]_^\^Y_YaTXPXQSLUHTJUSY]^ffqlxp{n܂qބtߊu߅r߂n݂pހj~jރkl߂ijބm߁ijkge߁jg߀jj}eށj߂jރj܂l܁l݁nہm܁l܁kځh~mމn쮀Œ̙КӞӛԙ͒~ЄlU[LYNUS\SZXZZ]\^Z_Z\]^[^]a\a\]X[Z`\^^^`^[X_^Z\_[\_^Z]\]^`\`c```]`_a]bbbd_^_\NT/Id@\B\Alnizkoklknnki~hhlbhjjnoqsonhm}eo^f]\[KT;O8Q8P<P@SBR@PHSCNGQFPGTIOIRDMGPIQDOJRKSOVOSQTVZW[[_]`\^[V^Z[Wb\^Zb__Za^`\a^_Zfdd^d`e_`]c\aZ`]e]`[dbfbfbb^b[dad`ebd^ca_\bbfbb^d`d_`]c^fabbc\c`cba^fddbb`b`cb`\a^a^`^fcb^cZc]bab\dacahdc]d`a]a_`_`[b_d_d_c^bbaZ`]`]a^bfb]``a__^aa^]`dd``_a]a`ba`]^_\`V\YbTZU`NVNXLYHVNXX^egjfsozr~t߄vuro߁lނpj߁lilmojljl߁j߀ijhjk~fg߁l}a݁nlڃlhۀfڂg|iktƒΘМԚ֜ӘƌulcJRIULURXSZVX\]ZZY^^aZZ]^Y\\]Y_ZZXZ\\\\^^]b]^^\\\^\\\^^^_^\_\\\^`dcfbhb_]HO,Fe@\@ZAZBnpknnjhljqlkj߀ijhjqnrpttknhh~gp\h]VTJR?Q7N:O=O<NBRDQIVGRLXKVMVNVFNDOIPCLFODOJRRVNWRRWVVZVYZ^X[\Z\Y\X]Y]V[X^Xb```b_d_ebd`c`b^bab`a\c\d``\bcgcb\b^d^gdg]c^b\b\fcddd`c`b]_]d_`adc`cc_b_eae`dadcd`b^`^b__\b^cac`c`_[`Zebb]hdhdhaddfbb`ebb^b]d`b_b^fbdfa\b`_Zcab`ba^]b`__c`^\]^`^`__^`^dd__]b\`\`Z^V`PZPXSZPZITHWS\_hkiqnvl}tmvssmm߅lނonlmokppjfljgkfހhh~d܂j܀j~j܂o܀fڀjڂm|h~k܄l|ʒЛԞ՜֞ј֐rWYLXM[T\TZTXX]Y_X\\_\]ZZ\^[]Z\X[^c[[^a[Z]\ZY\]\\\\[\a^`[\[`a^`^^hcgc]YOV,Gb$HY@X=Z@\>pnje߄nhljmjgjgހjiippqrvrnnmof~hr^bVX\NW>R<Q<R<M?OFTCNFSIRJUKTJUJRHOCPIPKPBKDMJQMVOVPQTWTZVU[a^\^\\Y]Yb[^X^Yb^^Z^\b]d`c`a^d\b^a`a^_\c\d`c]c_b^b^aZheb`c]b`b[cbd`dbfec^`\``fddefdcbeca`c_dddac`c\d_b^b\c`d]dab`c`_Zc]e_b[d^had_gfddb]gdb]`^ddd`b_aacbc`bca^`\`\_]`^_``bbc`a`_b^a```e_ad^c^b^`\aX^WYR]T]VcN[KYJXNZVaehpkvr|qsޅtprvntrtnppojkkglhhh~fffh~h|j|hـkـp܀lڀo؂p~jyhqč͘Ҝ՟֝՟ʓ簀{iMXMYMUNWOUZ[T\VZ\^Y[ZY`][[YX\]Z\\`\bZ^\\]`^]_`_^]^^^^^`Zcddceck`Z\EQ&Ea?\HZBZ<\B\Bpmmglgohgkjj~f~mjtntpqpplmnmg|go\f\WYHR<L7L6J=O:JFRGQ@LKRHOHRMVHTGTFQJTDMDNDKENMPNQQURSTSXVZ[\b]Z\Y]Z^Z`\_\_[ea`\a[d\b^a[b^c^b^faa^`Zc_c`f_fdd^c^gefbe`khegfca]d^f\efd^a_``fceccba_edgdffhdecb^ffeb`\_\`Zf]d_c`ba`]b]c^f]iffcjfe^cad`b\ebc^c`a_d\c`_\`\ba`[`_`]^Z[^_^_^bbaabc``bd`^bcb`_``bY\Z]TXQVT[ZcMXOWJ\HWS^^hoovpwp}q܄wptsstlppulqqmnonjnlfg}bhބr|ej|lۀm}l~m~h}i{i~h{ʑўӜ֢֠ҜÎvb`JXLVNZPWX\TZV[Z_Y\[[[ZZ[[]_\[\_a]_^^ab_b\\cea^`[b^b`b\d`hbfe\[@Ly!B^>W>X<ZBY>[9_@llshjihkkmipmlppronqppsjuod{jreje^aQ\@S8M9L?P@MDMCNBNFPGRLTIWFPHTJTFODNJSDLKSNRQWUZSWY_XXY\WZ^[\\YV`]`\^``[a_^\a\d\dbc_c]fdd`fca^b_daa]b`c``[aadbfbd_d_f`c_b^b^dac\b\ca^[bcjidbb^dbcbabaadbdagea`dfbe`bfbgbf`_]_^b]d]gagfigjfgddcfbdafcd`b_gffb`^a^\[a`cdcbde_Z`^^b_``\bbcaadab\Z__aa^dbg^dZ`VZTYS\P[NXNXHVFXQ^[gfgolxq~u܂utrxvwooqrummqjmjonphkdj݁l~l~jl}jـpln~izexf߉jŊΕӠԞ֟֝̓ЅlNXISM\NVTZV^TZX_Z\\Z_`\`_[``\]]`^`bb]^__^^b^bd^]b`fbg^gdiaZ[>Lu$CZ<V@YBZC^D\?\>`;jonlljmkll~nnnnoqtoprnopklod|fqbhb^^V\BR=O9N=J>JBPFPFOOWIRFNKQHPIQCODLKPELEKFROXOVRUQPUUVVWVZY\YZW\V\\\X_^a[`^a`a[cb`__]ef_[c`b`dab`dcbZabc`d\a`a]c`d`c^`ZaZc``_babad_cbaaeec``]`]_\ecfgbba`acbbb`jfbbe`c`cabb^\`Zb`a]caedghkmooefdeb^fdb_b`bafc`Za`]_b[_``]```\\]Z[```^^\`^``_^_\_^^Z^`\`]h\delV\PXT\LZJXNYFTOYV^ecokztzn܁s߄pvyvvpotxrnrpolnporfsjރp}k~n~lj܀jځol}o|k}l{kyetɒϚӠ֠ؤӘƌwjbLTR[NUT[PWX^X\X\Z\\``aZ^[]\_`eZ^^`aehjababb_feedhgiglf\]?Nx#D[AR@ZFXFX@\CZB]?aAql~ilminmrlnmjimtnttnlppljrh{hwhhe`dOZ@R8N;N?OAKALDNGPQXDMFODNELHNGNHNELIPGNHPLQPTNQUUSVZYWXWVZXZV\W\\`\_]`[c^b[`Yc_`\ccc_c``\`bb[`^b``Zc_dbb]b]c]dba^cf`]c]`[b_^Zc^_Zb^ec^^b^d`\X_[b`^]]]`\b^a^``\[b^c]b^``c`^\`\_Ybbfdbbedfdffbbc`bca`b`dbb`b]e`aaa_`[dd[Y\_]\\]^Z`^^Z`Z\]^\Z\\Za_`\]]\`[`[bY]X`RVQZPZS\JWJZO[P[`djixpzv܀x݄tyvwxnrmpstnkoqgmjjhmhl~jۀl|kۀj}j~l|i{k~k~lvevf܄j|É̒қԞ՞עҗf֌iTWJSPUPZRVV[Y\VXV\UX\\_][^\]WZ\`Z\adbcfidhddedgdhild\[>OnA_IV@XEZA\ LZ?]>\>b<c@hlntqjmlmlroqpstvsorqsrkllj}dtch\ZZLT@N6I5H>M<I=JBNJRJRHPHRCOJRJPFLFKELEMHNLPMPPULRQSWXZYZWWUZXYT`\_\_[`^ZV^\c]c_`[c_^__Zb^b_]^```^`^_\`Yb``Z^Yd_fde`_\a\`Y`Z```\b`fhgfdaa_a\^\^W_Z]XZV^[^[ZW]W]^\^^]]Y^Z`Z^[^Z`]\W][aa`_b`didbcbb`cabac_cbd__\`\^\\Z^Zb^`X\[_\\Y\[^^_\_\^[\Z[\\X```_\[\a^dZb_fV]Q\NWN[NWJVL\T`Yhafjltr{t~x߅y|vxxtuprrnlnkoi߁jljji߁ol~hl~mڀk}k}jl}l|j|izmxkydqǒКԞ֢ء֝ʎ~w`JUKSOXTWX^]]ZY\]Z]\Z^Z[]\YZ]ZZY\]cbf]_cbdfdhifjg\_<Nr#Gf4XWDV>W=X<Z=X:`;_?f?f@f߂pojnmiimrnmnprtrsroipnqjpn~gt^g[TQFL7F8L0G6I<LBMDNHNENGPHQLVJTITDNFPFQDLGNKOLPJNQWSTX\YXUUZ\ZV^\XYab^[b_^\]a^Y^_`Zbc^a^Z`^```ebcb_cbaac_`\^X\ZaZ_``_`]b^^Z]Z`\dbcddlhfgfeb`a^ZXXYV[WZZZZZW]W\X`\`b^[`[\_\Z_\`]^]^[baZX`b]^bbfecdcbaadbddcbfc_Z_]^Z^\^[__^`][ab^_]W_``^^]`X\\]Zb`^_^]^`]^Y`\_^a^dR\MXNWLSJQJYP^Wb[ffjolut܀xx{zuuwtsmqpmlhhkރll߄njkބmjހl~lmہmlh؀m|j}m~kwhzlvh܀dz‹͘ҙ՟إ۠ԙ‰ڜw\ZJPNTRWV[STac^c`aY^]^^^Z]\\V\ab^c\\_bbbd`hehh^X=MsAYA\FYDS:U7Z<\8_=c9h=j>c9pomjhnlhoojruotrtrpshkoqhnlcsZgZXRJN<K6H3H;ICN?MDOHSDNHPIRHNLVFNKVFNHPEPHMKTKOKRSVSRTWXUZ\YXYX\[]Z`Z`Z^W]Z]Za\^[_[_[\]b]aba_a`ch]]bbbaacabc]ac`]`]dd^^`a\]^^__^Z^^edfehhgaad[\ZX\Z[XZWVUWRZZVW]\bd^[ZY\`\XZ[YY^\^^\Za^a_b`^^bd`^bebfb^dchfbbb^\\_]^\_ba^`a`a^[\Z_]\X]\\Z]\Z]Z]a`^a_\]\\_^bU]X^V^YbOWQXNVLULXPaXcaifjprwt~wރy߄vx{txtvto߇tomjkjjimmqnlރr߂o݂s܄rހn~l~n~h~q{hxkxixdvglǑћԟ֠ؤآДɁlINMUOUTYUWVXZZ[^^]\Z[]]]ZZ[`]]^ab`^^fdfdjdZ_9Kt>W=V:ZCXA[BW;^?^<b=d=g@a>f'Ljqpmmkpiqnqnvrwrtrrljnrtknmfs^gXXUKP=K:N4K<K@MBRBLFRLVLVNVDNLUGMEPFOIRDPIQIRJOKQNRTUTVWV\_[Z[X\Z\ZZV_[\Y`^_]`_`\`^]Z^^\\`\_a``bfad``_cd__^b]c``\``cb^`a^`]`__^^^bfebdea`bbdc`c_\YVZZUUXVZVYW\[Z\\Z`]^^]`\\\X]^[\\[]\[Xcadgac`^b`bdeffha`dh^[a`]`bb\[\_b^``_^b^]\ZX^a_^[Z^^]`\`ba^\```abdX]T_V^V\V`TYLWNXNZKZOa[jclilkjwx|tހvxtsxwt߅vqvopighmjlenqrh~kރp݃rބp߂nނl~l܀ozljyjwgxjtf|gxʔҜա٧٤מ˒vd]JPOTPXUVVVXXV[^`]`Y\ZZ\^^]`b[]``cdgbgcZV=Ks<X9W@[@\@\BZ=]?^>b=e<e<b:bAcEgpnilhjlpvprstrrrtpeflpioijcv^hV[VHN<J9J9K?Q?PANBNDNGQHSKTKTNVFOCLCLEPENHOGPJSNUPVPQTUUVYZZ]\\VV[[\\_\^Zb]Z]`\^\a`_a^Z]`]Z`a`^`a`^`a```_aab]bbb]bc_`_^aeeh`^^]_\````cdbbdd\Z\Y`_[XXVZXZVXYVW[XVD[Y]Z]^Z[^[\\\XZZ\Y\Y[^_]ab_`be`a]`abhebecb_`__^]__^^aJab^`^^a_^\ZX`\`c\`]\[^^][]`]``]`^_[_W_X_T`RXQHL]N[HXJXLYY]^beljjqnws|rހrރvxwtv߄wކt߆s߆srmrolVopkqoj߄nނp߆nn߃Tރrހm݁no~q~o|nvmrOqe܃ildӂؗڞۡ֠Ƙښ\~NwNiPZVVWUUZXZ[Y_[^[^\aa^^_`d`geg][]CUw#R[NXNTG_DZ2]B\:`Hb?eBe;b<`<d@d >slnkmlnprtrqurqropkjmmllilg~er[fVVPHM>K6L;M;KBPBR@MIRGPHPHQJQFMFNISEKCMBMCMEOLTOWOURRSVSUXXWT[ZZV]Y\\[Z\Y`]__^]][`]_]_X`^ZZ]\YZ^`a_ceb^^`^\ZX``bd`ba``^^e`e``^^`_^]`acgda``^`][[XZYWUXY[\XZX[XVX[Z[\^^^b`XV[ZWWYWYX]\[X_^abaf_aefbcbfejgffjaa^\bd`_`abaa_\`][^^]\]Z]`]\]\\X[]`]]]^]_``d]^[_W^W^RYT^P[P[RZJXLYQ^VaYcbfhkqnwq}t}t߁utކvtuބvqo߄nkmnnnim݅pnppl߁on߃mހpmr߁p~op~p~pxjzjtctcves˗ҠרګۦڥΘ賆vfLUJSNXPWQTVYVX\]^^ZX[\^adhbbdbhg]\?Pu>Z9W;V=Z=Z@a"LaBfFdCf;iAd<b@d@f>e<wmolvrnnypstorppjnfjimnkjll|ep[dT[RHP<H5H4I9H@P@OCNDQFNDOFLFNHPHNEQEQCOJUISFPLTNTQXPUX[RVY[VTVXXX^YZ\VX^X_`^Y][\Zcd_\\W\ZYY^^X\^\\\``\][Z`_\V^\\_^b`__ackgkbd`^`]^^\\_^`^^]]^Z\\Z[[ZX[W[WYVYZ^`XT_a]X]X]VXTXU\XXZVW]ZZZ]]`b`cab`adcaefjccejab``]`^`^^`_`^`^]^^`][ZXZXZZ^__a[X][\Z\\]__cXZWZY]V\QZY`T]T\PVJTJZM[Uc[fblklmptrzq~uހu߂t܀t߃sttކrށmޅolrl߂p߃ooq߃lހornloko߂jހpp߃q~l{p{n{ozl{kvitfrc݁f~ƎИ֤ئک֣۫ōܞy^YDOFQOTRXSXTYZ\^^]_bb_cecfdfeVW:Js?X:W>V<Y>YC^D`FdDdCe>d@d?^>d=cAa<^;vnogrjqpsurrosojfkenkjrolng}gq]i]XQFK6F0C3G8J?NBNCPDJGMKTCKGNFNDLGPHNHQGPBNEPKRNSQTSUSUSXZ\VXVXVYW]^^]Y\]\\_Z[W]\_]^^\Y\ZVV]]`c`^^_`_ab^^ab^ZZY`^`b_a^]`c`b_a`c`^\\^\bc\[]]\[Z[[YZZZZ\]YZTT\^XYVVXX[XZZTSVTTXVVTWZ[Y[\^\Z\\`b]`_dbhbeehacab``^^^^^_^`^a```^Z\^a`_\Z]_^\[^Z\]X_`[X[\]\]bY^ZcV\UXV_WaWdU`NVJXHYKYR`]fchhkpnwszszq~o݀u܀u݄tv߅xކs߂o܆tjohpp߂lmo~j~kjroloރsnn~m~lzkzjzlyiwfufqbparbp˔Ԟ٪ڪ۬ܩҙ΃hJRDOOXPVPTRYUZW`Y[_dacdfheW[>Nn@Y<X@U>Y?V=\Cb"Od'Pe#Kj%Ld$GdDb>d@b>_?^<`Cwpnpjpqvtuvopoikfkjlnmqjhlg}fp[bVUPAJ:I0F2G<N:KBPHRJTFPAPBLEPEPDNEQEODNENGPEMFNNTPTQSVWX\VVZ\YX\Y\^WZ][VTYZ]Z]Y]^\`^`[ZZZZWZ^YZ[]^`\Z^`^^_a^Z\Zba`b^]a_\]`d\^a`^\\`^a^^^a\^^b\\\\^^[[]a\[XY[WZUYTTPTTWVWSWYYUVVVQXZVVXXWW^\``]aabefafbdbf_^]`_e^]Z[^c^`_`_^^`][YX^`_`^^^b^Z]X\Z][^^]\\^[`Y_UZTZR[S\S\R\PZOZL\NYT_Zdbdfloprnwswo|tv݀u܁xނv݂tކs߅sނokl߂oiނtilj}i~i߀lpnrl߀jl~m}n~jzjzi{ivjubtbtbp_n_dyȎї֥ڪ۩ުפȍzf[EPLROXMSQYRZT\Z_\`ddd_\\?Lt?Z=V=X@X>\>Z@^@d@fAdAa>b<`@`<a:_>_9Z>\>mpopkppsyrxjlhfcfejnrhoojklzfp\gXYUEM7K1H4I:N<ODTDOEPDJHSHOHSGOLRALJPDODMIOFJIPMRNQRXUXXTYWTTTTZ_\[\[]ZYXXXZYZZ\b`_YZZZ\\YX_^^b`a^b^b][\_\Y\bZY`^[Z`]_`^^_b`^``]^^]__``]\\^^^ZZ\Zca^\ZX[WZX[UWVZVXTXVURXUUVWTSRXRTRXWVUVW\[\]^_\`_b_dadbe^a\^\a_`^_`eZ\`gbdeh[^\_bf^b][_b\X\YZZ]Y^]_aYZY[Z\XZRWX]RVS]Q\R]NYKXMZR]Xd\`jjljqntrxpypzp~s܀w~p܄w߃ttj߂ljnn݀rނl܀q~gkl~ln~jnqm~l|jzfwfxkvftgvjtbsbqdq^o\s_o̔բئڬۧܧԛъlMRGPLUMVOVRYSYZ]]bheYY>Hw"A^>V<V=X>Y>]A_BaHg"If&KdCb@_DaD`B]?^<^:]>\;pklllrquuvmheghbeigdmhnlnln|fubbWVSDM=L/E3F=M=NAMCPDQENEOGREQBNHRHOFLFPFOFPHPLRIRPTU\RVVVVXVXXY\Z^[ZY\Y][[Z\X\Y^`ZY\[Z[\^^\^b]]`bbl[^^^\_[]ZX_bc`^^`_^_bc\_ab[Z^`Z_[YbbbbZZ^ZXYZY[\_\[\Z^X[Z^Xcdqhrȇuzņy~v~jpkr[`X^WVWVXW[XXZWZ^^\_Z_[_X\^a^^^`^`^c]`^aaebc`d\\]]]^\``cb^[U^Z]Z]`]^\^Z^]\Y_S\T^Q\R\VaPXJTJZLYP\T`^chglknfvqtiwpzr}s|v|n݀uނtނrރq߁oހl߀mm܁ql߂pjjkii~hoi}hzlzgzjwjujqdwhqerctbrcsbp_rd{dxŌΘ֤ڨکܪ٣̐}hZFRJTKSPXU\RZ^bb`X\@Nv@[>X?W=X@X>\A_AdCa FeFg"IgFaEa@dAb>^9^<`;_>]<xqsnltnurhhh|c}cz_z[|bcljplqulpb~lt_j^\[GS;K3J2H<R=N>OCLFQFNHSKTLUGNFRGQFMENFPHNGNPWNURYQYUTXUWXZYVXZXZVYU[Z[Y\Z]\[\\`^c[\ZX]a^]a\\\[^`b^b`b]]Z]\]\^lj_a``bbdm]`\`]_YY_`[[^\hf_eY\\`Z\bn_fzpuus{xńʝϔΠԜΡКѨԤͤɠu}[]VYRTTTVVVZXZ\aZZZ_Z]\^Y]_b]abfbf`hac_d_cY_[]]a\\ZZYZ__\^[ZZ]Y_YYV\T_R[Q\S[R^LVKTHTNYUaU_`egdklqnsmuptoulxr{uzrہx݀tހo݃r߁lނp~j~mn}oހlހnigli|h~i|i|hyhvfxfvhwlvdvjrctgudpavdsdqaqbpȒӜצ۪ܪ۩ԜĈזtRWW_OXSZU]Y^_aVV8Jq B\:V?ZBZAY<Z@]@^BbDgGh"Fe#IcDfAcE`=]<]>]=\<^?\<unklnmysple}ew]w^u\xdw]jnhnmprrph}ds_e\]ZHO<M6L2J9K<L=O@LBQFRFUFQJXFPEMHOFMCNDLFLFLPSPVNQLPQVUSYYVWYXYZ\[ZY^[[V\Y^Z]^^^\^^]ZZ\\^\\\^`cd\a]^^_[_^`]_^^]_]\abb``b\^^\^]_[X[ZZ]^\birivrq}~}}|~ȉʖ͒ϔϥΡΣΟӭѥִ٨ְڳӤʧȘv|`hWZUXVYX^V]\_Z`ZZ\^]_`dehdlagdicd`b\^aeZX^^]^[^`_[^\^^`Z\Y^UVX^V\NVOZNZP[LXIVLXP]X`\cedkjqjsnqmtlxptl{xzr~p~vހpށpށqq{m~n~n~k}mjljgg{e|hzj}fzhxdwftfvjtdvhrbpar`scrbsdobubxew͘ԤبڨܩڧϗxaNUKTUZU\_\TV@Nq@X :V<V>X:W>Z:`@`Ae!Ga@f$Id$Jb"Gd"FbE^>[:Z:\;a<^;`<`=qrnntqsuqhbt]t\p^n\qcv`jomnlqqlnihscgXZVFL:G2H6F9I:G>N?LBRFPERIQDNDMENGPHPHOENFKJOMNNVOTQVTVY]WVXZVRWT\YZT`_ZT\X\Y[Z_\\Z[\\[eg`b_`__^`^b^^ac\\]aY^]`^]_`a\f_]\\\^\\YZXZ\[fivw{ɂ}ƃǃʐҠ̘͐͘ϞզԭѨͣҦҩЧѦң֯۶ڴسϥĔpz]fU[NWWYUXZ[Y[X^^b`ddjah_e^b`c\_^^Z^ZY\_\Z\[[^\^XYVWT_VZS[W`SXMWOZMWLYJ\KVP\V\_ffamlrltjsjsjumuqvlzmzr{nހsnހq߀n~nl߀p߀mk|h~o|g~gizf|hzhvfubwgudrdqgsbpfpfpapbp^pfn^n_pbve߄nƑК֧ڪܭئɎvc[PXX\]]XX=Lq>[;S:U<Y=Z<Z>Z?^?bDcCcBfCdBdEbA`EZ>X9Z:^8a8]7_=^;tlkrmpplmhx`r\lWiZm]kYw^glhoplosih|dr\fWWREM8G2E3F6K<L8LBODNGTFQFLIRDRKODMCLGQGPJPHNHPMTPRRVTSVVXWZVUVWTZXZX]Y]Z\VYVYUZZ\]^\_^_\]]`]ZZ`a__^^_\`_^a]^^^\[]^[Z^X]Y\`Z\[][afrtv~}ʆzs||z|ʊҖΝ̛ΘΝϣԪէԧХѬ͚ʝ̟Ъըөֳ׭ݺ޸سХ„doPWRXSZY_X^[^\a`d\a[`]`^`\e]c]`[]^_W[YYZ^^^X`T[VaUWSXT`RXOXP^QZJXIVIVMZX`bcgenjoixusntqroupwowrxq|wzs݂r}q~nq{l{g|l~j{l{i|hzh|hxjzfsdwescretdpen`qeo`odocp^rdscscn\pcqdudq˒Ӣاܬ߮֞֍rYZYZXYGQuA\<R=U >X>V>X=[>Z>`@dDfDbCb>d@`>`@\@\@[>^<`9b:\8Z9]8hoisrornhesXlY`R^ReZl]u^gjimnplkpejrZjZVPFL6F.C6I5J:K<L?JAPCPFNAMBPFLFNFPEMIQCLEPJNMTRZVZRUTWVTSUWVZXYYYXZ][\\Y^ZZWZXZ[^Zbaa``]\\\\\b]\^`YY\\XY^ZUV\\^^^]^\\\Y][can_pfxy}qzɄzu~tyǂƂȂ̌ГɌ̔ИМԢУѮЦΤΡ̢РУ԰ҦӬֱڳٰݼ߷ยҪ|U^PVUZUZRW\_\b^hZb^d\bbj[^\cZ\^b[aY`Z\W[Y`SYX]TYR^PXR]O[QXPXJXIYP\NZZ```hflgshshtkrlsnsnvnvnxtzs~x~u~sq߀n|lyl{n}m{lzfvfvfzfvdxcubtcrbp`vhsdndnbodlbn`ocseodpdo`nbrckbv`zČИب۫ܯެҘuf\ZDOz"D\@T?T>XAXD\D`@`DbCcFdEd Eb@b>d@^>W?X>\FbHb=`:_?^9\9`<mlpqpqlhexZmUcSXO[R`Yo`{bfljknluppliubfXZTBI6J-F.D4E5H;H?K>M@LAMDO@LDLFOERBNFPIRIQFOISMTTZOQTVSRUVWVYVUT\\XZ\]WWZXYU[YZY`^YZ[ZZZ^^Z\_`]\`c\^\[XZYXXZ]]^`bneoppyjw`kdvtxˀv~zx~|~v{zxzzłȂx~ǂɁȆƐʇΒ͓̕ӠҤԨѢҦϢҩ՞ҪԯקӫڵݴشۺỦ޶̞jrPYPUT\X`]g[b`i`h^f\bZ_Zb\`\^Y`Z^VZX^XZUXS[RWNVQZR\NUR]JSO[HVQ^NVY_^_jipondshvmukritmuowoyqwq}x{v|u|m|q}iylvjzgxhwevcubxcwft`thrarbtcp`peqck`ndm`kXpbo]pbp`o^o^pbl^l`f֮̕ڮܬ߮ݩ̓yMR~#CX<W@S>U=W;Z?Z@_CdBgCe?cEcAb@cAaBZ@Z?`F`B`B]:\>Z9Z;_<`:ompozmmlzbrXdTVKSORNdZvh~lgllilllnnh}`vdh[VPCL4F*B/F2EAX>M@O>M>LANBKFS@ICMDL?L@JJSJPFOJROTNSQRTWTTTTVTXXX\VWZ\ZXZ\XUW\XT]X]^\Y^\^^Z\\_]^]^[ZZZX]U]alZkkx~~~rzfmXeYdixhrnspxrvx|rwqwvzȂ}ɄxzȁʆȍLjʔΘ̙ϔ͖ҤҜϗѨ֧ϜҬ٨ӫڸخֲܺݶܼܶ޼༦๥ֵ~T_NVV_[dV_Y`^e\dV\V[Xc[`Y^X]Z\X\W\TZRXR\QWNWMXOULVMYGTFTIWMZOVR\]`fdmlrkvnulultjsmsmtpvpzwwuxs|p}r}n|nzhugwftbxhxfsbr_veteuducqdp^rfpcpbpen`pfl\m`l^l`oao^o`sbmal\q\sĐϟתܭޱ߮ڠ񼈩HP\>RAV@U?XAZAZ?X>bAeDf>d@bBd@eBdD_C^D[@^>aD`>]=\A]?\:_:b9rmxnvpjfzfiZXPJJEJOL`Xrb|dimpkommkjjgt[k\[PDM6H3G.G5M;N7J=LCSFPGTALAKAJDMALDKEMFQISHRKSJUMSLQTZSTUURUXZZ\UTW[TXWU\_YWZZVU\[[^ZX]`Z[]^^\[^UXX\TZelߛyс}|v{owbibi\c\i_ndllwlvnsfmkpjrzxqwutȁ|{ʅˀ~Ȅˆ͓Ґϒ͞ћʔ̘ҢԤҫգӞ״ܮ֬ظܱܰڷߺ⺡ݴۻ侦ݺǝguR_XcPXS[R\WZX_YZV^X^X^V\V]X^X]V]T[PTPXPVQWNXL\LWKUDREQKXOXRW`hedpiritnvnultirjqjwjwmvnsmvr}q|rzk|n~rzltdqctdqepbrbr`uetcvgqbr`pbqepbpgo`l`pap_n_o_pfrco`rdo_m^k^}dőҠبݰޣ򾀑.CM 8P>R=W?V@\@Z=\>dBhCc@bBbBdE`=]?Z=\B_@g#I_@^BW<^B`?_6d=f:rrpvqjhx`p]^OKM@J@JUPdXug~fdtlmjmlmoi~hvaf[XSFO6J,D0F2J8L6H:L=L=N@N@N?KANAMBIFMCLCLFOELJQLVNXPVQVTVPRTYWYZ^XZTSXXVUZZXVYZZVXX[\[YZYZ\XZXXY\XXwb``daemqllgjcj^jbh\g[j\h`rgnnzlpnvfrerhpwhtrxy|~}ʈȄň̎Ж͎͎Иɓ͠МЦ֬ѝҲײլֱۯ֥ײݸڮױܼ޹ݸ޼޺հXfNZNXPXV]T\SZT[[`V]W[UXU_WYV[UZTZOWMSPZKWJYLWFSGU@JKWKUT^^`hflbqhwjvntmthslsjtnwrvowrunvn{uxkyl}o}qwhuirbn`nbrasbsbvftcqasgp`rbufpepcodpbpbo^p_sbqathqfl_oapfsfsОتްԐ|_Z8P>Q=T>W>Z?\@_?bBfBeDdAdCeA`<[<Y>Z>`@d!Db?]<\=X;\9`;b:hAf=mvsrvddw^iXQKBF3C9ERNbVsbfhnhmljnnmn}hv\fZWOCI4G+B-C2F0E4G:I?N?L@O=JCNAKDJCMBLFSFTFNHSHNMVFKOVRYQRTWS[VYSRUVRUZ[WZ[]Z\XWW[^_Z\ZZWY[^WUXYV\g_rNMV[_d\d_c`eX]]g\e\f`n^cblmsnvlpipdohpptsxprpwtw|~~t|˅˄~ΒɅĉ̖͍ӧӛКզٮٱֲڰ֥ԯڲ۲۵ڶްڭڸ໦ຨܸڻܾ⾪۷ÖcmLXNXNWNXT\YdT]U\SXTYS[SXTZS]TYQ\NVOVMXP_GTLXFSFTFRLZS\_affnhtivjyoujtgsjsjqitnrjtnsnuptnun|k|qyixopdpbnando`o^pbqavfp`oaqdscrdpeo`k`pbn^l_pauerfsetjrdpcqen`yk|ʕצ߲Օp)AL :Q>Q 9U=X>YB^@dCgGfCcBdBhBb@[:Y<X<]@a@c@`BY=Y:\:]:c<g>c9\8pxrmkixbq``WJI:J+B>FQOe\ta~eknkljqjknhzbrYf[VNFN2E-F)C.G4H8M>N;L:G>L@K>K@MCOBQEPDOENHTBNGMFRDNNTNVPSQURXVVQTPSTX`cZ[XX\[Z[Z^ZYVVZXZZZ[XXQWXZ}o\:TNY\cZb`iX[^eX``j[e\eWbbijpflkoegfpjrlvnukos{nwxrtzƆŃăȌˉҥԞЛΣԤԦְخգشڴ٨ر۸ޮתص๠ݶܺ޿޼໭ڻڼںݺԮt{N[FTIVOZU`PWNSRYRXR[TZRXT\PYLVOYJULYLZKXHQFRAQFVNZW^_ajfmgtlwlxnylxltfuqrmsptlqlrmpmpiupunxp{k{nrbphlbn`nanep`sdtbtepdoarfodqapeo`pbohoaqesgtep`tdugrfufteshmҞۥҖxBHT=N>Q>T@T@V<\Bb?gCf Fd@f EgAhC`BX>Y=]?cBbA^@X:Z?[>`;d>k?d>T2I2rwwrj}ftddVTR<F*B*B;IRMbZo\|`lkjqljmlli|bmYcUUQCK4D)B)B2F6H:K=L@N<LBPCR@NAODOBPDPGTCLDPFNHPKTLSNUPUPSNPOURTRRVZTVWYV[VZUWZYZ^VY]_ZXZZZXXX\\XVuXRTIZPXV_VY^cV`Xb_iei[hYd\ddpdnilkrfqfqgojsourvjnknpuxvx}vyƀ|ˆ̉ВГҤӢӠդ֤ԦԬجتدذް٪ܹടܯܴ߸Ả޸ۼ²ݼڶڽܾ۾WcDTMXJUGPJSLWQXOWQZPXOXOUN[LUOZO]HXJWJVHRETGUNZP[`ejdpivnzq{mzmxqwltjtnrjromhtmnkokmfnhrl{mzpsdtjpendo`r`rasdugtepdr`pfoaqapdnbqhpgpdrjqhtfnbsetdukugxlxnxj~Ȓ̌qHNY?Q;T>V@U>V<[=\=dAa>d@cBfBgA`AZ@\A]@`BdA_AV=Z@[>\=bBi"Cg!DW9F3D3~pokhx^lYZTFN.>*C0F?LRNc\p\yagljrniqnmk{`lXfXVQEK/D(C(B2J8L4G;R@RFWHVGYHXBPGRCOAQEPDRIUDRKVJTITNRRXTYJPMQSVSXUXUZVZUYUVUZX[XX\[[\YXWZZ\XYZVpgNRMURZKVV]W_V]V_ZaZ^_h\e\g\edmlpnqksenkujsovoriracktt{krjt{yżЊ͒ӗԚӤآњҭإϠөۯ֣Ԧظ޶ܱ۸ߺ߱۵޾ᾥວݻݾ޻ܼúóˡYgCUBPHSHQJSJRMTPWRXNXPYNXNZMVK^IVJULXIYANFTJXR\Z]ihnfwnzrznzjyn|qyrwnrlmijllkjhklgdlhoiwkylvhthpbpbp_reofsft`tipao`piqbpfpdoesircrgtepesdtgtjtjwiujzn}p{nu}i<FX<W?WBW>V=X<Z>]>`<d<`@d@cCd?a@Y@ZBcFeDg@bB^EX<]A\@d>n(Jp,ObAI
3?0R9ztlefr\cWTS;H.D(A3EBJQSbXp[|hjnpttrnlgj{boZg\TPBI-B,B(@1E6J:K>P?ODVDUARL^DTCN>MBN@MEQ?NEOGRKULXKRPXNXTZTZRUQYTWRTXYUXTTUVWWTXZZXXYXUVV[SWppdWMUQ[SVVXRWPWMVSaU\Vb^d\gbi^b`ijm^agnmpjrljmonmeoenrznr|yrp{~|w͍ΆΖӘБԣՙӜ֭ذڪը״߸ܱڶݹܵ۵߻ย๩ܻݿ߻ںٹ·õĭΥbo>MBN>JBNDNIRLWR[KRPWLXJXHWJVL^PVIUETBRFVIXS\^ejjqnvh}n|k|m~pylzotlsjmfhdfdficfb_baiepixpymvirbobp`peqetguisdq_pepdp`oeobrfqfshrcsgrdvfqbvhxjyixjwjnllo\2C_AU?ZBVAV=Z@[?a?`=b@f>e>f@f;b>[<U;^Bg$JdC`>ZEV@Z>bEbCq)Ls.QfBT;D6K;E]xrnlxdl^VSDH1B-D*B4FBOVXdYn\hhlnqssmoiixar\bWVUCK,B*D*@2G6H:M@P=MBTAODRGSCQGSBRDQBQBODPERHRHRMVKTQYPWPVPZNTPUSWVUVZTVUVVUX[X\ZZXYYVWWW[f`~PQMXSWPSOUMVKWPWS]V]Y[ahfk[a`ghe_d]bgjlpjlopnpjwkouxmspplswzqx{˃z|ȍʇɖϐΎП׬ؠ֨װܨڭ۳ݹݴ۲ܺ߶ݵ޼෢޼ܼۺ޻߼ܾܾ޶ڴݾƺҲ~tSb<K@ODQGRO[KVOXJSJUJXHSETJZDUDUBTCXKWN^^dnpwszn|l|lsr~oxpwjxnohebbd\`]dZ[\`bgnjrkzkvlsepen`rcucudxjwbl_nbpbn^odqfpfsetdshretjzotdvhxhwexjzlphkb7J`@X>V=V<Y=V:V9Y?aAg Ch!Cf?d<`=_:Z=X:^>dAgBdF\GZAYD]BfDh$Gr+Ng"EV:J5O;:Survpl~fq\`TLN5G9M2J,D4HCNUSdXq]{bhiojpnrkif|ct`bUVR@I,D*D*D1F4F3I@R?LGY@M>P@R@MDRCRCODOERDOFNHPJQLTOTMTNSSRT\QTQVRVZ[UVSVXZSXX\VXSVWX\\YXTZwpmUNUQPNSIPJSIPP]QVX`Y]T\]aX_cibe\a_cfllneihrchnnqupqprjllxszekxzz||~zǀ|͑˂~˚Ԥԙզ٭تکٳܲڨڱ۸ᴜ۰ܷ߸ສ޸ݻ༧޸ֶػڸӬѰҽξ`h5H;MDQMZIRKWLWHPDTHTGUIVFXFXBYEVK\S^bdnmsm{p~nmnn~s{n|sxlodd`\_V^PZTXT\`_edpiulxkufpdrdsgrbxgvjtdn^nepcp`pdpcrlrgrdqfreukqerhuiwixj{hoowhKPk@XAU@V?W=W<V:\>bDc?fBc@h@f<d:\>Y=^AeCe DfG]BXC\A\@`Dh!Fr2Sh$HS;J<N<y0Nio{vmiwdj\VR?G.D3G6I1E/FAMTSbZqb|chnsppunhjd~dr]fYTPEN2F(D/F2F:L5J?MFTH[BQ@OEQFQBQDTAPFTCODOGRGUIPNYPXTYU]TWNTPRPVUXQXXYTUV]V\YZVZVXVXXXVX\Vx^UWSSLRJTFOLXKSU_W]X]SXU\PXbfZ\dlXbbghmdldhafgmlnilnslnjrrprxsxz|zzyw|zˋΖҔҗ׬ݩئشݶܬק۷ܱۨ۷ܺᷦڮܿ༦޳ڷڷ֭ҭҸľҴDV4L8JERFTLVHPEPCQCOFUGVFXFX>TGXK\O`_clhukwl{np~lp|nzk{l|rrigbX^PXDNJVIVTZ]^kjoiwnxntir`rhrcrdtesdpfn`rhpcrepdodqfqepdobtgrbvlwkwlzn~qn|gVVz'HXCU@X>X@V 8[AX<`@`>d@h@c=c<`8[:Z<]<d?jEb?_HVDX@^D^Bf$Kq.Py7Yf FO9Q@m'NYi~txfnycn`^WMO:K.A2G3H5G3HFRWTd^td|fgilnnpmjml|bq]aVRL@K5F*D&B2H4J8M<L?S>N?P@O?NFRER@NERFRDQCOETJPLVMVLSNUQXRWPVPUV[X\[\X_VW\bVZ\ZX^TTTWZ\Z]gb[VQRKRHPMXKTNWO[T]^^RXRXX_]c^d\c\d]b^bemdlcj[bjldolrhlqojiishlrv΂ll|xπ}ˊΌ~ӟء֠ڰ޲ܩئ۶۫اٲݸްݴ۸๦޲ٯٱتӰԿ̾ھ|1H4K>MCRGTDQHVCTFTFWBSDTDV@VDXN\Q^`cgbslwi}n~l}kk}n|n}q|orfg`ZYJP?J;M;MIXU^cakmtpxlujsdoapbo`tcrdpbpdncqdodqhuiqgtirerdrfsbshwhthzlnzk_Z.JZ>VET=X?X<\>^>`>c?f Da>e@f>b@]AX=Z=cBjBhC\AVAXBX=^B`Go-R|:[t5XdHW=o)KXhxzۃuwvhtcdVQP@K.F0H4H4G0H5HCNTUd\q`|bfkknqrjtpkz`m[aZOP>K0F+C+F2F6I;L>R>L<OGTDTDPDPCPBPBNAODTHQHSITJRNTOZOTNVRTRVPTRVSUXYVXTXZ`WZWXTYYXXW[\\]]VQTINLQNTLUNUT_U`ZbWaRY[c]`X^[f[^Z`Z`_dT]cf`dhnckrubklqbdnrhklprqpropim~zzw͈ԕԏӘګܮ֢ر߳ڪ׬޹ޭ֧ڵݺۮ֧ҠҨҴɸ̺̿ʼͼĸ^l0I7J>NFSBQESESDPBSFVDSBV=UBVKZP\`djhrluhzjm{i~l|mzn|ozrsklj_`NW8J1H2J6MJX[_hinjtkvpserfobreufr`pboaofrjpbndpfqhvjrgshshsiulvivitpmc<O`@T>T?U 8Z8Z8[;b>c>d@d@d@f=b>`@W<Y<b<i>i?`BU?ZBYB\AcFi(Or-Ts0Tn+P`?p&JSdpr~wهvߋu|dybm^ZQEO5J.D4K4I5H6J8HDOTTbVq_|dfnllpnnomdz_n[`TMQML5J+E,F2H6H8J?N@N?QBP@NBOCT@PL[HWDRFSANHUBOJRNVOWQTTXQTQXRZVYSVX[TXWVW]VVZ[VY]XYY[\aXPRHPMTIQKRLTOTX`V`V`T`]b\cVZZbZc]bT^^]Xbal`gfggnjmlnroipvvcfprklqvrsjnz|vẁҋφՙכלܯ߮ܩڬ޵ລݰٲڴܦԤΜϤѲĿʹ˽ɾɿɼ̺ŻʵдBT2F7L<M>P>MDR@O@QDV@QAU?R>TKZPY]defnjxlpm|k{mzn~p|pxpqjle_\NW:J%C"A(D@RTZcehirlvjujtkn`rfvetirgpdqdrhn`ndrfthobpdqfsjtjxivmylnviLPmCU=U9T :V 7[:]@b?d@f@fBc>f@c@`<X>W=_@d>iBbAZ=W@\?^B`Bg"Mq1Wv6[l)Pg%Jz1RNcmrx}t~uՆyvar^aRLL7G.B6L5H:L9J1D;NBLTVdXo[{hnhplrrnnmdzbn[bUTRFM6J-E2L3G:L8L:L<N@Q@MCPBNBPFQJXDQBQARDQDNHTJRKRLSNUQTPQPOPURTRVVZVWUUVVVWZ^YX\[Z\]YW\LTFPHRHNPZRVT^X`MXXa`hY_X_[bZaU\ZaU]V^^fbfghkobbnttthnollnooilrvzyoswukqπ|ֆҀԌԑۣ֘ݪؚٮݪܨگ޷ڭώϖΠո˻ȻîƵɺ˾̽ǺȻƹ̺ƹʶؿ:N-F2F;L>OCU@TASF[@R?T:O@TIXPX[_fcokzn~p~mzm|k|l}o|qzsqklfbdQW7M~=q@x=4ILWX\fhlmumvmvgriocofresindmdtloephpgrhpfnbodpfnepfxo~l|mc`%@[:R 9U8X 6Y :Z:^=eBgCgChCdBgCaBY@T ;\Bd?hBa>\@Y@\B_Cf1Vh2Zm'Rr6Zp1Xn*Rx2TLcls|xЁwzuzs}rq^fVTP>J2I2E7K8I8G4C2D7KEOTVe[sc{bpnloqlqqkey_o\bXROCM5I,F(C2G3G:O;N@P;Q>M?RFTFRFSHUFUEOCTDOESKSKTLTKSOVPVSURUT[QWVXW\VVVXXXXXYYXX\^`\RROXJQJOLXHPPUS]NVPXU^Z\Y_UZQX`gTXV`U_U`W\cg^bgj^glpkmorjidjqsfjnptxmrrrtvzwt}w҆~|דؔՓأީ١֡ڳۦҕϔʕմʸȼƺ¼ŴʼžȻȿķɼǺɹμƺ˹ӻ2G0H0F9N<PBS?TAT@SBV>RASGTPZZ\gdqnzn~q|l~m~k{l|pxnytvkljafV[@R"Dh=p>$@;LQX\ahgpiuozotjpfpfpdthqgogpbqfpgqirdshn_reqfqfui{q}jl_5FbAT8V?Y>Z;Z<`@dBjBgDdBfAf@`@\AU@Y>h Dj"Bd?\=X?YB^Aa#Je&Oh)Sl-Vt8az/Z~3YPiiuzx́~ЂzwsrqulfR^NFJ7G2H6H8J6G:G7E6H4EEMQR`Zq_ybfronnplnlbycnZ`UPLDN2G(B,E4J;N<P?PAT>P@SDVGUCNHVFPDNERCPCRHQIRJPJRLTPUPSSUTXPTTXWVZ`ZZXZQTZ\WZXY^YXUJQNXGNKQOXKWQ[RYMZ[`\aRWX_T_Z[W\QZQ^Z`^d[\djc`X_fjkovsgfnptrlmrnqquxvtrs|xzz|}yvρ|Ԍӆѐ٤ܪڝ٥۬ס̄~ƍϦݹȺȼ˶ĵļ¼ȾʸȴȿǽǺµȸżǹƹ[k/E1I6F8M7M>NCU?R@R<P?RFUQ]]_ddnlxo~ttso|j{mzn|sxqolefV_AP%Bd8^9y:1GFSR[__khumulwkrcpdrfpeqfmcpgnhrjnfqnrgpfuhvpwnxn~rscBNk@VAb8\`0S^IZ<\=eCfAgAe@gBfBcB^@X@X>b@jBfB]AY>[@\?`=d$Lh%Nm+Vt4_u0\:`Khfwvx|zЁxӃwqnnl΂zZNQN=H1I6I8L?N8J:M5G9J6G>LTS^Xr`{ghrpotnlngdz`lZ^SRR@H6I,G+F8L8L<N?QAQAP;N?LDO@PAMDQ@P@NBNFSHSHNFQIQQYPTPVSVRURUTTUWUVTW[\VXWXYYZ^[SMRJQJOKRMWRZQZPZNXW_W\V^W`V\U\V^N\M\Tb]ebcehafekhmhmwtmnsrvrptwsnpxxvuwvtkrusrqsvv{vӁ֒۞ٙڡܩՖϊȃǞܾĸĹŴ俵´ȺĺIJ῰ïŶĻͳAS-C1G0F6J9L8M;P;P<P@SGXQ]]_ihqlzm~mq|l}o|l}m|q|vskppglZcBT$Ab9W;fB,HDUKVX`gbojtlwpthpgsjpgndqfocncrjohrcrjqepduluk}prZV @Y@V@V;Z>Y;\>a<c>h>hAd>gBfA_>Z>X?a?n Bm$E]=Z@]D^D_@^Ab"Gh*Xl.Yv7b:_Jgatt|yw~{Ёx|xon΀wԋRPDH2F2F7H>N>L:I8H:H2D4HAMQQc^q\xbffnsqsunlj|dn``TOM@H3G+F1J4O<PBRARBPFSAUBNBNASDMDSCRFRCOBQJTHNGNJPMPQYPTRYUWRQTSUXTYVXV^Z`Z[ZZ]_TXTTKRHQNSSZPZLWT`R_W^T^V]TVJTS\HYP\TaZcV_ehblfnabghlhijrqgjtwvsrswr{zzvnlhowtlmyyyv{z׏א֒ک֔юŀ}ФǼƶȹ÷ửĸƿ˼ŵǽݻڶ޼ƾùʽɹɼ̾@M0F,D3G3H7K8L7K6O?OHXRX^[ifphxn}p~p}l~tzi~sv|rvnphb`VZ<J%B_ 6P8`@v$F<UGWV^c`jgpkvlvmujpephldqflbpiphndqhpjqhsethxi|mmb7F^;R:R :W?X<]@bAh@fAg@g?j!De@`:X<R 9^;fBpBfBV<[@^>aC_AaBfLi&Tr5b~8bPnbwv}~|zw|sqr{qԋ|ؐ{CK9I3F5N6G:L:K;K9L6F1D8J=IPTbYnZw`ijvpsurnul~in^e`RRLT2F)E4I5K;O<MBQ?MDPET?OAPAM@LCQDPBNHQFNFSFMERJRPTOTQRX]UWRTSVQVVXVXVZW\ZabaYZX_Q\PZU]IURZNZNXR\S\X\U^SUOZRVXdV\ZgX\\i`b\dkl_fhleaotlhbdrsoltrtnyvzvlorxssosrrtwyyւ{ҀԔڞՑxzt|•٬ø¶´µ÷¸ûôɻིıหݼ޼¸úʹĸ°Ʊ²ƺɿŶ`t>O,B.B0B2F:G4K:NDQRZ]^hboixk}s~m}q~ryl{p~rynwnphdaY_<K">c9UBWFg G3MBTIU\\bbmhtntnufrbnbndmbmfmeoirlqjrhsjxjylzltiNPq>Z?Q
9V 8W;W=`BfDjEj"DfAe@dBb;^<Z<[?iBnBiA[=X=aE`BbDd Fj*Qf&Qg"Nu3]Ijdtry{|~{{xvut~uЈy֎}ג;L2F6J6J7H;K>P:G;N9L4H4GDPOS^UmZyhfhmprtrllkydj[^VTSDL7K*C+B+E9L;Q@P?RBRCRBQDU@OCN@OBODOAOFPFRJOJQJSMUOZRVTYSUSVNQT[VWXXV]WY_ae^QVNTLVQWTZPVOWLTRXQWT[V^T\OVYcXc\dX`WdZbYaeifhbhjn`flrtrkotrfmnsurjjvmnnsrnlinrrpm|zxtvwӍٖԊ|ppo~̥߲໱幦ķ߹ƺɼȾ᾵⺬Ļܾ۴ڿฦøʺŶིྶ޼úú¸ʻ4F-F)A0F3H3H:LBOOZ\^icolwkp~p|lt~l|nzr}vztqldaVX>M&Af:X=X@`<p82H?LTZ[]geoivltgseqdqdmcmfkanfphrirjtkxlzlxh^Z*FZ;S:T ;V ;W:\@gAl"HjDhAhBg>f?]<Z:W>d>qCjC`@W@[BbB`CcD`Ie"Jh$Rl(S;_[nrzzz{z΀|΀vvx|zӌ}ՔՐ}ד:N4H7J<J8J9J7H8J<N8N5G6H?MPO^Xpbu`jnpjvzstrmzbpabYRSBM5F+C,D0C7H9J=N@Q@RGSCPBNDPEO@MFPAOHVIQDPHNHOMSJSMSPWTVRUSVV\TVTZX[TUW\i`_\HTIRHRKTTZPTN\NUNXNVQZTZV\NXXbW\XZXbX\_hdmbcfnba`jnufkorppfknppot{rpptllnmirlklsrtoqxy~{ӌЀ{imÂױὮݵⴠۺ߶ƶ࿴弧ĵ´ܺ༯¹ݼǶܶݼݻ࿭ļļŹȻƼǼȾʾʽıFP$@)D/F2G6KBOMTX\hdrkzn~p~p|n~s{myk~su߃lgdfRX@L'Dj<Z>U:W 9f9~;4JFVV]a`gethtgterfn_lblbqgpgndqitlulxm{kj`8Ib5T 8T 8T9Y<\<^<h@i@jDl HgBfBfA\?V;`?kDlA`>^?\D\=fFbCc I`Lb!Nm$R{9^Rinxwxy|xv΁yzxxzщ~א~֑֓ؑ~<N7K9L<I<K:K<M=K:L9J6K9LANNMb\pbvdjprxtzwrsizdo`_XTVFN<O*D(B0F2F:K=M<KBP@N@NBSCQFRBODPFQEO@IFREJJNLRLQNSTVTWVXWXTVVXUXUXWZd^cYRULTPWEQLWOTRWOXRXNVQUR\NWPYTZU`RZWZYb^ffghlgj^dlspompwwsrhqzwjlnnonkrpofhlphjbmrsprtnnnkqrpnxɒܱ⺩⽮߼ڶ㼣۽ಠḧܺ߷޹޻޼߼ߵܾĴ߼ĮǸȾƻȾʼȼʺ̻̽ŰϾμ³}}%A"='@.C6L?OMV`afdocxsr}s|o~pzp|rzrpxrldb_RW@L'Dl:^=W:W 4`;m:)C<LGS`adcohuitgtfqem`lakbndritjtkyn|rsdPTr;Z>T:V<V<Z>`Af@j Bh@i@h=fBeDa<[@_AgAjBf H\>\>c"Gb@cBaD`I]Hb Nv3\Vnlxywxw|zwxxxz΅~Ӑ}֔֔גՎ}4J8H:L<M<N<K<K?J<J;P6J>PBNUYaZo`uanopruvrpojzepbbXRTBM<R*D,H/F8K<M?N?LAM>Q>MFUIVBL@MBPBOEMDQDQELIPLSJQNVPVRXTWVZXYVYRXPU\_݊uSTHMBPEPEPEPNRRXV[RXKTSUOXTXU^PVR\X_VbX``_hkadfrrrijuvwunorvljnpvwqynturflmrlrlmhhmrrlknemjs|њܦᶡඦ࿴࿰ྰ߯߸ܸ۱޶ܸڴຮອ޴ݶžƷᾶƱɾ߽ƲʿȾƺȼʾøŸʻ̾ʾȼξؼξVjv:~"@)A4H>KNVZYd`ngyozl~p|ozm}pzr|o~uwnnkdcTZBN-Hj<\8[9X6X5b 5v6+E>JWZ][fcnfritendk_k`jbjatjrhtlznygc\(F^;V<V;\=Z>^<d=i>i>h@f@eBh"DcA^@[?dAh Fc<\;V:^?`Bc?h$IZB]H\Mp(TNjlx{||xvxyqusv~xҊ֔֔ՓՒԐ~6K4J:K>P<L;K>N@N=K:L:N;LGSQWc\lZvbmnpprtshrj{fp_f`RSDO6L,G,F/F5K:N<N>K<O?L?LCRFUCPDT@L@MBNDOFNFNHPKRMTPWMVPVV[QVQUQUNVNWބpmNRAMDPIUDOJQNZMRQYPTMTOUQXQVMWP\PZW`[^^hZ\\fmujm`jsrsssurn\`nsqnptyznqqsrrenio^hbnll`jbldr͕۲ڨڢޭỰ漤༯޴޺ݱ߸شٰ຦ܳڦڲڷļķĺƼἴƷƲõǿķʼ;ȺȸʼʻɼƸظɮ~*D~ ?#B/D;HHR[Zd]ofvl{n}n}l~o~t{r}r|wvpombdXYFR,En=]<^<]>Z7[ 7f5~>2FDNUS`Zh`obvirak^j\k`lbrerhwpzmma>Ib:X>X<X=Z<X>`;iAj>hAgBi!EhAdC`@Z?^>gBfD`CY>^@dAfB`>_AVA_Kj%R?acwy}΁}{|rtnvpsҌ}ҏԒՑ~Ք֓~֑<J8I:L?L;L>L9J7I:J9J7L4FCPSX`Wnbzempoosqttro|ipccbRSEP<S,I,G3J5J8K<L<LANDRBOBPCRCNFPCPAOBNEMDPFMGOKRNSSYQTSXRXPNTVORPVTZꩄbEL=JDNKTHVNZRZLTR[LVOTNWPXMXT^U]X^V``f^dYcbb]cjqjpotztghajlrleiourjsorlochmn`j`f`b`j\ft~ӝݠ⸧ݬޮ߰崛ತ߶ܱ߶޺٭޸۲ڨװٴཱ࿵ྲྀ³ĻĹƺ⽫ɹƽȺʼǺȽķĸĺĶѿft;J B*B8HFOUVbZnfvj|l~o|mq~qzt~tznxolgcdTVCR+Er>^;\>^9\7[
6^ 4m5"=8FIOVU`Xj`qbpbj[j\h[n`qdtjwlvkRTt=V<V9U<Y=[=`Ed<j?f>h<gBfAf@cCZ>^BcBiDcBZA^DaCjBiF`@X@R=`I<d`wyЀ}|xzrqns~|͆}Ԍ{ՐԐ|֎|ԏ~ԓ֑}>P<J:H<J<M8L;L>M<J6H7K7KAPOTaZpewelnnqoopsxu|irde`VTEQ5M,H-K1J7M4F;L<L?MAOALBOFSDSFTFSDQDODVFRLXNVNUKRPTMUOVSXT\PXJUK\mduYBKBLEOHUKWKVJVLTNXKUPURWPWZ\Z^VZY_Z^Zbde^dalhlopppwnbchpjiilhstmjoqrmjflehahdeQ`PdVi֞ݙܯⰛఢ᳢ܦޮܯ߹ܹ޴ݯՠڶܸỪ߾ܶ཭߻żżƴ°IJŽŸżĵµµǺ̻ĺXft='C2HHRZ^d`mfugzl|nzm~r}n~w|r|txpnib`SZDT.Jr?b>`<_:`:\ 5\ 5] 5l5$>:GHNVXvyҐ֣֟Њi`nd܄}zjwfcZ'D[=YAW;[@Z;`Bb@h?j$Ig?f=iEhDdB_C^Bd>fDeE\?\BbBhBi!Cb>X=P 9T@r*SUtt|}~}~x{pwprzuшӌ}Ռ֑|ԏԎ|ԎՎ|Ռ|<L@P;L:H<N>O=J=O:M:L0F4G>PMPd_pdxchnmrossovt}ir`c\SVFT4N.J+G2L6L7K>N>N:L>K<JBPAOFRIVBQDQETGXMZLYGQLSPWKRQZRVRVLRLTIXQ]誊b`?RIUHYFSFVGONWHUPWNTPTORPUSVV]YaR[[baa^gblioinsqhgfnklihhrnklhlvrupumrbg^lceP`Od`p̘ݦܨ۪ᯕ⯣㷜ޱަۯۨ߶ݰެԠӣܴྴ俲޸ᾮ޾۷ඦ߿ĶǾǻöƹƻĻƶƺصĽƼ̻Ǹɾ˰}"B~ C0IFTXXccldxoyhxlyj}p|q{q~t}s~wpl``X[FU+FpD`;]>a:_:[7\6X 5Z
diff --git a/contrib/ffmpeg/tests/libav.regression.ref b/contrib/ffmpeg/tests/libav.regression.ref
index a5ea5f15d..a498d6799 100644
--- a/contrib/ffmpeg/tests/libav.regression.ref
+++ b/contrib/ffmpeg/tests/libav.regression.ref
@@ -2,35 +2,35 @@ ffmpeg regression test
8a0536ccfe36f4fff408b3327d33e1dd *./data/b-libav.avi
340344 ./data/b-libav.avi
./data/b-libav.avi CRC=0x400c29e9
-85caa242a36abeab85a27c82ba73cc28 *./data/b-libav.asf
-339767 ./data/b-libav.asf
+786446e80ead936e5faa8f5908f19281 *./data/b-libav.asf
+339775 ./data/b-libav.asf
./data/b-libav.asf CRC=0x74113749
-1ad618e9fd318eb3483270cf9b9b3f43 *./data/b-libav.rm
+1ce78eeb6881ffe5b649a9b5105de919 *./data/b-libav.rm
355405 ./data/b-libav.rm
bdb7484c68db722f66ba1630cf79844c *./data/b-libav.mpg
378880 ./data/b-libav.mpg
./data/b-libav.mpg CRC=0x2b71a386
-0bf8fb3b4d7bb70ed89356e94cd8ffa2 *./data/b-libav.ts
-471316 ./data/b-libav.ts
+322d59758fe9446147223a607d1699bc *./data/b-libav.ts
+471692 ./data/b-libav.ts
./data/b-libav.ts CRC=0xcc4948e1
-16cf1c37c123f8d3c4a31d192d9b0cc6 *./data/b-libav.swf
-41836 ./data/b-libav.swf
-./data/b-libav.swf CRC=0xcdec36a1
-87a8c8be5db2513356b28f29dff5769e *./data/b-libav.ffm
+d6fdeb9f7083cc827f9510c6c4517dc0 *./data/b-libav.swf
+335771 ./data/b-libav.swf
+./data/b-libav.swf CRC=0xe14e8847
+a1cd7fff97d5e4c83f0d18a22d51c552 *./data/b-libav.ffm
380928 ./data/b-libav.ffm
./data/b-libav.ffm CRC=0x01522b4a
-5e8aa303a877cfac6569ed11cf20e92b *./data/b-libav.flv
-335810 ./data/b-libav.flv
+f8ad5bd78f4d012a8ce9570aa395ac54 *./data/b-libav.flv
+335833 ./data/b-libav.flv
./data/b-libav.flv CRC=0xe14e8847
16518706f425cb537362bfc1c58b8de5 *./data/b-libav.mov
366923 ./data/b-libav.mov
./data/b-libav.mov CRC=0x45079dca
-26c41db318d9aacfd6b9e734c0ea4d94 *./data/b-libav.dv
+7820fa85ab86c62028d8dbda94589573 *./data/b-libav.dv
3600000 ./data/b-libav.dv
-./data/b-libav.dv CRC=0xa6b8b635
-2b3f921fb7a01bb126cab5ee21ae3f8d *./data/b-libav.gxf
-815700 ./data/b-libav.gxf
-./data/b-libav.gxf CRC=0x238a01b0
+./data/b-libav.dv CRC=0xf517e829
+feb04ba3cf4f607d5527664eb69ec72e *./data/b-libav.gxf
+814640 ./data/b-libav.gxf
+./data/b-libav.gxf CRC=0xa376c09e
9a9da315747599f7718cc9a9a09c21ff *./data/b-libav.pbm
317075 ./data/b-libav.pbm
./data/b-libav.pbm CRC=0xb92906cb
@@ -45,8 +45,15 @@ bdb7484c68db722f66ba1630cf79844c *./data/b-libav.mpg
b977a4fedff90a79baf70c8e02986820 *./data/b-libav.y4m
3801810 ./data/b-libav.y4m
./data/b-libav%02d.pgm CRC=0x84c09106
+de216b43403f51e57e644fbf812568bf *./data/b-libav02.pgm
./data/b-libav%02d.ppm CRC=0x25c06ecf
+86bbdb77afa289ff363120f8044f29df *./data/b-libav02.ppm
+./data/b-libav%02d.bmp CRC=0xf3a66ecf
+c3a9f333ddebff6eae3f4360bad2de29 *./data/b-libav02.bmp
+./data/b-libav%02d.tga CRC=0xf3a66ecf
+f558eef0740c4b247f1eb17e1dbf7adf *./data/b-libav02.tga
./data/b-libav%02d.jpg CRC=0x62328baa
+5d6c53e5297c4485e26c25e37885376f *./data/b-libav02.jpg
b0a8c8063d81921db5d7c8f50a1cc454 *./data/b-libav.wav
89132 ./data/b-libav.wav
./data/b-libav.wav CRC=0x2a09519c
@@ -62,8 +69,8 @@ e2a6d6fae17394dfe87cb5bb8ae11837 *./data/b-libav.al
272b91d8fc31ed43b08246d182719751 *./data/b-libav.mmf
22609 ./data/b-libav.mmf
./data/b-libav.mmf CRC=0x03633476
-c8cf5bac13fb7862bcbce76977328f92 *./data/b-libav.aif
-89160 ./data/b-libav.aif
+ae3a23a7ea13c92a2909445ca8144dcd *./data/b-libav.aif
+89142 ./data/b-libav.aif
./data/b-libav.aif CRC=0x2a09519c
8d117c49d6b210abe783d1b0b897cec7 *./data/b-libav.voc
32768 ./data/b-libav.voc
@@ -74,8 +81,8 @@ ce356ce2708cb6033ab5d762da93cfd4 *./data/b-libav-yuv422p.yuv
304128 ./data/b-libav-yuv422p.yuv
ce356ce2708cb6033ab5d762da93cfd4 *./data/b-libav-yuv444p.yuv
304128 ./data/b-libav-yuv444p.yuv
-ce356ce2708cb6033ab5d762da93cfd4 *./data/b-libav-yuv422.yuv
- 304128 ./data/b-libav-yuv422.yuv
+ce356ce2708cb6033ab5d762da93cfd4 *./data/b-libav-yuyv422.yuv
+ 304128 ./data/b-libav-yuyv422.yuv
545f61c353a8b4419808785cb4f0069d *./data/b-libav-yuv410p.yuv
304128 ./data/b-libav-yuv410p.yuv
d6c03f930018ff859bd43f52b92e9321 *./data/b-libav-yuv411p.yuv
@@ -90,8 +97,8 @@ deb2f7ebe297df2c1fe264d19b34d2fb *./data/b-libav-rgb24.yuv
304128 ./data/b-libav-rgb24.yuv
deb2f7ebe297df2c1fe264d19b34d2fb *./data/b-libav-bgr24.yuv
304128 ./data/b-libav-bgr24.yuv
-deb2f7ebe297df2c1fe264d19b34d2fb *./data/b-libav-rgba32.yuv
- 304128 ./data/b-libav-rgba32.yuv
+deb2f7ebe297df2c1fe264d19b34d2fb *./data/b-libav-rgb32.yuv
+ 304128 ./data/b-libav-rgb32.yuv
5d395f62bff8ac475f743268c772ca3a *./data/b-libav-rgb565.yuv
304128 ./data/b-libav-rgb565.yuv
2ffd6871fcbfe9570454e8703ac8ea01 *./data/b-libav-rgb555.yuv
diff --git a/contrib/ffmpeg/tests/regression.sh b/contrib/ffmpeg/tests/regression.sh
index 70f4eba12..c4c2f776b 100755
--- a/contrib/ffmpeg/tests/regression.sh
+++ b/contrib/ffmpeg/tests/regression.sh
@@ -4,7 +4,7 @@
#
#
#set -x
-# Even in the 21st century some diffs are not supporting -u.
+# Even in the 21st century some diffs do not support -u.
diff -u "$0" "$0" > /dev/null 2>&1
if [ $? -eq 0 ]; then
diff_cmd="diff -u"
@@ -24,7 +24,7 @@ datadir="./data"
logfile="$datadir/ffmpeg.regression"
outfile="$datadir/a-"
-# tests to do
+# tests to run
if [ "$1" = "mpeg4" ] ; then
do_mpeg4=y
elif [ "$1" = "mpeg" ] ; then
@@ -41,7 +41,7 @@ elif [ "$1" = "snow" ] ; then
elif [ "$1" = "snowll" ] ; then
do_snowll=y
elif [ "$1" = "libavtest" ] ; then
- do_libav=y
+ do_libavtest=y
logfile="$datadir/libav.regression"
outfile="$datadir/b-"
else
@@ -69,6 +69,8 @@ else
do_adpcm_ima_wav=y
do_adpcm_ms=y
do_flac=y
+ do_wma=y
+ do_vorbis=y
do_rc=y
do_mpeg4adv=y
do_mpeg4thread=y
@@ -93,6 +95,8 @@ ffmpeg="../ffmpeg_g"
tiny_psnr="./tiny_psnr"
reffile="$2"
benchfile="$datadir/ffmpeg.bench"
+bench="$datadir/bench.tmp"
+bench2="$datadir/bench2.tmp"
raw_src="$3/%02d.pgm"
raw_dst="$datadir/out.yuv"
raw_ref="$datadir/ref.yuv"
@@ -107,7 +111,7 @@ else
do_md5sum() { echo No md5sum program found; }
fi
-# create the data directory if it does not exists
+# create the data directory if it does not exist
mkdir -p $datadir
FFMPEG_OPTS="-y -flags +bitexact -dct fastint -idct simple"
@@ -117,7 +121,7 @@ do_ffmpeg()
f="$1"
shift
echo $ffmpeg $FFMPEG_OPTS $*
- $ffmpeg $FFMPEG_OPTS -benchmark $* > $datadir/bench.tmp 2> /tmp/ffmpeg$$
+ $ffmpeg $FFMPEG_OPTS -benchmark $* > $bench 2> /tmp/ffmpeg$$
egrep -v "^(Stream|Press|Input|Output|frame| Stream| Duration|video:)" /tmp/ffmpeg$$ || true
rm -f /tmp/ffmpeg$$
do_md5sum $f >> $logfile
@@ -128,8 +132,27 @@ do_ffmpeg()
else
wc -c $f >> $logfile
fi
- expr "`cat $datadir/bench.tmp`" : '.*utime=\(.*s\)' > $datadir/bench2.tmp
- echo `cat $datadir/bench2.tmp` $f >> $benchfile
+ expr "`cat $bench`" : '.*utime=\(.*s\)' > $bench2
+ echo `cat $bench2` $f >> $benchfile
+}
+
+do_ffmpeg_nomd5()
+{
+ f="$1"
+ shift
+ echo $ffmpeg $FFMPEG_OPTS $*
+ $ffmpeg $FFMPEG_OPTS -benchmark $* > $bench 2> /tmp/ffmpeg$$
+ egrep -v "^(Stream|Press|Input|Output|frame| Stream| Duration|video:)" /tmp/ffmpeg$$ || true
+ rm -f /tmp/ffmpeg$$
+ if [ $f = $raw_dst ] ; then
+ $tiny_psnr $f $raw_ref >> $logfile
+ elif [ $f = $pcm_dst ] ; then
+ $tiny_psnr $f $pcm_ref 2 >> $logfile
+ else
+ wc -c $f >> $logfile
+ fi
+ expr "`cat $bench`" : '.*utime=\(.*s\)' > $bench2
+ echo `cat $bench2` $f >> $benchfile
}
do_ffmpeg_crc()
@@ -148,27 +171,28 @@ do_ffmpeg_nocheck()
f="$1"
shift
echo $ffmpeg $FFMPEG_OPTS $*
- $ffmpeg $FFMPEG_OPTS -benchmark $* > $datadir/bench.tmp 2> /tmp/ffmpeg$$
+ $ffmpeg $FFMPEG_OPTS -benchmark $* > $bench 2> /tmp/ffmpeg$$
egrep -v "^(Stream|Press|Input|Output|frame| Stream| Duration|video:)" /tmp/ffmpeg$$ || true
rm -f /tmp/ffmpeg$$
- expr "`cat $datadir/bench.tmp`" : '.*utime=\(.*s\)' > $datadir/bench2.tmp
- echo `cat $datadir/bench2.tmp` $f >> $benchfile
+ expr "`cat $bench`" : '.*utime=\(.*s\)' > $bench2
+ echo `cat $bench2` $f >> $benchfile
}
do_video_decoding()
{
- do_ffmpeg $raw_dst -y -i $file -f rawvideo $@ $raw_dst
+ do_ffmpeg $raw_dst -y $1 -i $file -f rawvideo $2 $raw_dst
}
do_video_encoding()
{
- do_ffmpeg $file -y $1 -f pgmyuv -i $raw_src $2 $file
+ file=${outfile}$1
+ do_ffmpeg $file -y $2 -f $3 -i $raw_src $4 $file
}
do_audio_encoding()
{
file=${outfile}$1
- do_ffmpeg $file -y -ab 128 -ac 2 -f s16le -i $pcm_src $3 $file
+ do_ffmpeg $file -y -ab 128k -ac 2 -f s16le -i $pcm_src $3 $file
}
do_audio_decoding()
@@ -196,7 +220,7 @@ do_image_formats()
file=${outfile}libav%02d.$1
$ffmpeg -t 0.5 -y -qscale 10 -f pgmyuv -i $raw_src $2 $3 $file
do_ffmpeg_crc $file $3 -i $file
-
+ do_md5sum ${outfile}libav02.$1 >> $logfile
}
do_audio_only()
@@ -212,44 +236,33 @@ echo "ffmpeg benchmarks" > $benchfile
###################################
# generate reference for quality check
do_ffmpeg_nocheck $raw_ref -y -f pgmyuv -i $raw_src -an -f rawvideo $raw_ref
-do_ffmpeg_nocheck $pcm_ref -y -ab 128 -ac 2 -ar 44100 -f s16le -i $pcm_src -f wav $pcm_ref
+do_ffmpeg_nocheck $pcm_ref -y -ab 128k -ac 2 -ar 44100 -f s16le -i $pcm_src -f wav $pcm_ref
###################################
if [ -n "$do_mpeg" ] ; then
-# mpeg1 encoding
-file=${outfile}mpeg1.mpg
-do_video_encoding "-qscale 10" "-f mpeg1video"
-
-# mpeg1 decoding
+# mpeg1
+do_video_encoding mpeg1.mpg "-qscale 10" pgmyuv "-f mpeg1video"
do_video_decoding
fi
###################################
if [ -n "$do_mpeg2" ] ; then
-# mpeg2 encoding
-file=${outfile}mpeg2.mpg
-do_video_encoding "-qscale 10" "-vcodec mpeg2video -f mpeg1video"
-
-# mpeg2 decoding
+# mpeg2
+do_video_encoding mpeg2.mpg "-qscale 10" pgmyuv "-vcodec mpeg2video -f mpeg1video"
do_video_decoding
-# mpeg2 encoding using intra vlc
-file=${outfile}mpeg2ivlc.mpg
-do_video_encoding "-qscale 10" "-vcodec mpeg2video -f mpeg1video -flags2 +ivlc"
+# mpeg2 encoding intra vlc qprd
+do_video_encoding mpeg2ivlc-qprd.mpg "-vb 500k -bf 2 -flags +trell+qprd+mv0 -flags2 +ivlc -cmp 2 -subcmp 2 -mbd rd" pgmyuv "-vcodec mpeg2video -f mpeg2video"
# mpeg2 decoding
do_video_decoding
-# mpeg2 encoding
-file=${outfile}mpeg2.mpg
-do_video_encoding "-qscale 10" "-vcodec mpeg2video -idct int -dct int -f mpeg1video"
-
-# mpeg2 decoding
-do_ffmpeg $raw_dst -y -idct int -i $file -f rawvideo $raw_dst
+# mpeg2
+do_video_encoding mpeg2.mpg "-qscale 10" pgmyuv "-vcodec mpeg2video -idct int -dct int -f mpeg1video"
+do_video_decoding "-idct int"
# mpeg2 encoding interlaced
-file=${outfile}mpeg2i.mpg
-do_video_encoding "-qscale 10" "-vcodec mpeg2video -f mpeg1video -flags +ildct+ilme"
+do_video_encoding mpeg2i.mpg "-qscale 10" pgmyuv "-vcodec mpeg2video -f mpeg1video -flags +ildct+ilme"
# mpeg2 decoding
do_video_decoding
@@ -258,15 +271,13 @@ fi
###################################
if [ -n "$do_mpeg2thread" ] ; then
# mpeg2 encoding interlaced
-file=${outfile}mpeg2thread.mpg
-do_video_encoding "-qscale 10" "-vcodec mpeg2video -f mpeg1video -bf 2 -flags +ildct+ilme -threads 2"
+do_video_encoding mpeg2thread.mpg "-qscale 10" pgmyuv "-vcodec mpeg2video -f mpeg1video -bf 2 -flags +ildct+ilme -threads 2"
# mpeg2 decoding
do_video_decoding
# mpeg2 encoding interlaced using intra vlc
-file=${outfile}mpeg2threadivlc.mpg
-do_video_encoding "-qscale 10" "-vcodec mpeg2video -f mpeg1video -bf 2 -flags +ildct+ilme -flags2 +ivlc -threads 2"
+do_video_encoding mpeg2threadivlc.mpg "-qscale 10" pgmyuv "-vcodec mpeg2video -f mpeg1video -bf 2 -flags +ildct+ilme -flags2 +ivlc -threads 2"
# mpeg2 decoding
do_video_decoding
@@ -281,381 +292,301 @@ fi
###################################
if [ -n "$do_msmpeg4v2" ] ; then
-# msmpeg4 encoding
-file=${outfile}msmpeg4v2.avi
-do_video_encoding "-qscale 10" "-an -vcodec msmpeg4v2"
-
-# msmpeg4v2 decoding
+# msmpeg4
+do_video_encoding msmpeg4v2.avi "-qscale 10" pgmyuv "-an -vcodec msmpeg4v2"
do_video_decoding
fi
###################################
if [ -n "$do_msmpeg4" ] ; then
-# msmpeg4 encoding
-file=${outfile}msmpeg4.avi
-do_video_encoding "-qscale 10" "-an -vcodec msmpeg4"
-
-# msmpeg4 decoding
+# msmpeg4
+do_video_encoding msmpeg4.avi "-qscale 10" pgmyuv "-an -vcodec msmpeg4"
do_video_decoding
fi
###################################
if [ -n "$do_wmv1" ] ; then
-# wmv1 encoding
-file=${outfile}wmv1.avi
-do_video_encoding "-qscale 10" "-an -vcodec wmv1"
-
-# wmv1 decoding
+# wmv1
+do_video_encoding wmv1.avi "-qscale 10" pgmyuv "-an -vcodec wmv1"
do_video_decoding
fi
###################################
if [ -n "$do_wmv2" ] ; then
-# wmv2 encoding
-file=${outfile}wmv2.avi
-do_video_encoding "-qscale 10" "-an -vcodec wmv2"
-
-# wmv2 decoding
+# wmv2
+do_video_encoding wmv2.avi "-qscale 10" pgmyuv "-an -vcodec wmv2"
do_video_decoding
fi
###################################
if [ -n "$do_h261" ] ; then
-# h261 encoding
-file=${outfile}h261.avi
-do_video_encoding "-qscale 11" "-s 352x288 -an -vcodec h261"
-
-# h261 decoding
+# h261
+do_video_encoding h261.avi "-qscale 11" pgmyuv "-s 352x288 -an -vcodec h261"
do_video_decoding
fi
###################################
if [ -n "$do_h263" ] ; then
-# h263 encoding
-file=${outfile}h263.avi
-do_video_encoding "-qscale 10" "-s 352x288 -an -vcodec h263"
-
-# h263 decoding
+# h263
+do_video_encoding h263.avi "-qscale 10" pgmyuv "-s 352x288 -an -vcodec h263"
do_video_decoding
fi
###################################
if [ -n "$do_h263p" ] ; then
-# h263p encoding
-file=${outfile}h263p.avi
-do_video_encoding "-qscale 2 -flags +umv+aiv+aic" "-s 352x288 -an -vcodec h263p -ps 300"
-
-# h263p decoding
+# h263p
+do_video_encoding h263p.avi "-qscale 2 -flags +umv+aiv+aic" pgmyuv "-s 352x288 -an -vcodec h263p -ps 300"
do_video_decoding
fi
###################################
if [ -n "$do_mpeg4" ] ; then
# mpeg4
-file=${outfile}odivx.mp4
-do_video_encoding "-flags +mv4 -mbd bits -qscale 10" "-an -vcodec mpeg4"
-
-# mpeg4 decoding
+do_video_encoding odivx.mp4 "-flags +mv4 -mbd bits -qscale 10" pgmyuv "-an -vcodec mpeg4"
do_video_decoding
fi
###################################
if [ -n "$do_huffyuv" ] ; then
# huffyuv
-file=${outfile}huffyuv.avi
-do_video_encoding "" "-an -vcodec huffyuv -pix_fmt yuv422p"
-
-# huffyuv decoding
-do_video_decoding -strict -2 -pix_fmt yuv420p
+do_video_encoding huffyuv.avi "" pgmyuv "-an -vcodec huffyuv -pix_fmt yuv422p"
+do_video_decoding "" "-strict -2 -pix_fmt yuv420p"
fi
###################################
if [ -n "$do_rc" ] ; then
# mpeg4 rate control
-file=${outfile}mpeg4-rc.avi
-do_video_encoding "-b 400k -bf 2" "-an -vcodec mpeg4"
-
-# mpeg4 rate control decoding
+do_video_encoding mpeg4-rc.avi "-b 400k -bf 2" pgmyuv "-an -vcodec mpeg4"
do_video_decoding
fi
###################################
if [ -n "$do_mpeg4adv" ] ; then
# mpeg4
-file=${outfile}mpeg4-adv.avi
-do_video_encoding "-qscale 9 -flags +mv4+part+aic+trell -mbd bits -ps 200" "-an -vcodec mpeg4"
+do_video_encoding mpeg4-adv.avi "-qscale 9 -flags +mv4+part+aic+trell -mbd bits -ps 200" pgmyuv "-an -vcodec mpeg4"
+do_video_decoding
-# mpeg4 decoding
+# mpeg4
+do_video_encoding mpeg4-qprd.avi "-b 450k -bf 2 -flags +mv4+trell+qprd+mv0 -cmp 2 -subcmp 2 -mbd rd" pgmyuv "-an -vcodec mpeg4"
do_video_decoding
-fi
-###################################
-if [ -n "$do_mpeg4thread" ] ; then
# mpeg4
-file=${outfile}mpeg4-thread.avi
-do_video_encoding "-b 500k -flags +mv4+part+aic+trell -mbd bits -ps 200 -bf 2" "-an -vcodec mpeg4 -threads 2"
+do_video_encoding mpeg4-adap.avi "-b 550k -bf 2 -flags +mv4+trell+mv0 -cmp 1 -subcmp 2 -mbd rd -scplx_mask 0.3" pgmyuv "-an -vcodec mpeg4"
+do_video_decoding
-# mpeg4 decoding
+# mpeg4
+do_video_encoding mpeg4-Q.avi "-qscale 7 -flags +mv4+qpel -mbd 2 -bf 2 -cmp 1 -subcmp 2" pgmyuv "-an -vcodec mpeg4"
do_video_decoding
fi
###################################
-if [ -n "$do_mpeg4adv" ] ; then
+if [ -n "$do_mpeg4thread" ] ; then
# mpeg4
-file=${outfile}mpeg4-Q.avi
-do_video_encoding "-qscale 7 -flags +mv4+qpel -mbd 2 -bf 2 -cmp 1 -subcmp 2" "-an -vcodec mpeg4"
-
-# mpeg4 decoding
+do_video_encoding mpeg4-thread.avi "-b 500k -flags +mv4+part+aic+trell -mbd bits -ps 200 -bf 2" pgmyuv "-an -vcodec mpeg4 -threads 2"
do_video_decoding
fi
###################################
if [ -n "$do_mp4psp" ] ; then
# mp4 PSP style
-file=${outfile}mpeg4-PSP.mp4
-do_ffmpeg $file -y -b 768k -s 320x240 -f psp -ar 24000 -ab 32 -i $raw_src $file
+do_video_encoding mpeg4-PSP.mp4 "-vb 768k -s 320x240" psp "-ar 24000 -ab 32k -i $raw_src"
fi
###################################
if [ -n "$do_error" ] ; then
# damaged mpeg4
-file=${outfile}error-mpeg4-adv.avi
-do_video_encoding "-qscale 7 -flags +mv4+part+aic -mbd rd -ps 250 -error 10" "-an -vcodec mpeg4"
-
-# damaged mpeg4 decoding
+do_video_encoding error-mpeg4-adv.avi "-qscale 7 -flags +mv4+part+aic -mbd rd -ps 250 -error 10" pgmyuv "-an -vcodec mpeg4"
do_video_decoding
fi
###################################
if [ -n "$do_mpeg4nr" ] ; then
# noise reduction
-file=${outfile}mpeg4-nr.avi
-do_video_encoding "-qscale 8 -flags +mv4 -mbd rd -nr 200" "-an -vcodec mpeg4"
-
-# mpeg4 decoding
+do_video_encoding mpeg4-nr.avi "-qscale 8 -flags +mv4 -mbd rd -nr 200" pgmyuv "-an -vcodec mpeg4"
do_video_decoding
fi
###################################
if [ -n "$do_mpeg1b" ] ; then
# mpeg1
-file=${outfile}mpeg1b.mpg
-do_video_encoding "-qscale 8 -bf 3 -ps 200" "-an -vcodec mpeg1video -f mpeg1video"
-
-# mpeg1 decoding
+do_video_encoding mpeg1b.mpg "-qscale 8 -bf 3 -ps 200" pgmyuv "-an -vcodec mpeg1video -f mpeg1video"
do_video_decoding
fi
###################################
if [ -n "$do_mjpeg" ] ; then
# mjpeg
-file=${outfile}mjpeg.avi
-do_video_encoding "-qscale 10" "-an -vcodec mjpeg -pix_fmt yuvj420p"
-
-# mjpeg decoding
-do_video_decoding -pix_fmt yuv420p
+do_video_encoding mjpeg.avi "-qscale 10" pgmyuv "-an -vcodec mjpeg -pix_fmt yuvj420p"
+do_video_decoding "" "-pix_fmt yuv420p"
fi
###################################
if [ -n "$do_ljpeg" ] ; then
# ljpeg
-file=${outfile}ljpeg.avi
-do_video_encoding "" "-an -vcodec ljpeg -strict -1"
-
-# ljpeg decoding
+do_video_encoding ljpeg.avi "" pgmyuv "-an -vcodec ljpeg -strict -1"
do_video_decoding
fi
###################################
if [ -n "$do_jpegls" ] ; then
# jpeg ls
-file=${outfile}jpegls.avi
-do_video_encoding "" "-an -vcodec jpegls -vtag MJPG"
-
-# jpeg ls decoding
-do_video_decoding -pix_fmt yuv420p
+do_video_encoding jpegls.avi "" pgmyuv "-an -vcodec jpegls -vtag MJPG"
+do_video_decoding "" "-pix_fmt yuv420p"
fi
###################################
if [ -n "$do_rv10" ] ; then
# rv10 encoding
-file=${outfile}rv10.rm
-do_video_encoding "-qscale 10" "-an"
-
-# rv10 decoding
+do_video_encoding rv10.rm "-qscale 10" pgmyuv "-an"
do_video_decoding
fi
###################################
if [ -n "$do_rv20" ] ; then
# rv20 encoding
-file=${outfile}rv20.rm
-do_video_encoding "-qscale 10" "-vcodec rv20 -an"
-
-# rv20 decoding
+do_video_encoding rv20.rm "-qscale 10" pgmyuv "-vcodec rv20 -an"
do_video_decoding
fi
###################################
if [ -n "$do_asv1" ] ; then
# asv1 encoding
-file=${outfile}asv1.avi
-do_video_encoding "-qscale 10" "-an -vcodec asv1"
-
-# asv1 decoding
+do_video_encoding asv1.avi "-qscale 10" pgmyuv "-an -vcodec asv1"
do_video_decoding
fi
###################################
if [ -n "$do_asv2" ] ; then
# asv2 encoding
-file=${outfile}asv2.avi
-do_video_encoding "-qscale 10" "-an -vcodec asv2"
-
-# asv2 decoding
+do_video_encoding asv2.avi "-qscale 10" pgmyuv "-an -vcodec asv2"
do_video_decoding
fi
###################################
if [ -n "$do_flv" ] ; then
# flv encoding
-file=${outfile}flv.flv
-do_video_encoding "-qscale 10" "-an -vcodec flv"
-
-# flv decoding
+do_video_encoding flv.flv "-qscale 10" pgmyuv "-an -vcodec flv"
do_video_decoding
fi
###################################
if [ -n "$do_ffv1" ] ; then
# ffv1 encoding
-file=${outfile}ffv1.avi
-do_video_encoding "-strict -2" "-an -vcodec ffv1"
-
-# ffv1 decoding
+do_video_encoding ffv1.avi "-strict -2" pgmyuv "-an -vcodec ffv1"
do_video_decoding
fi
###################################
if [ -n "$do_snow" ] ; then
-# snow encoding
-file=${outfile}snow.avi
-do_video_encoding "-strict -2" "-an -vcodec snow -qscale 2 -flags +qpel -me iter -dia_size 2 -cmp 12 -subcmp 12 -s 128x64"
-
-# snow decoding
-do_video_decoding -s 352x288
+# snow
+do_video_encoding snow.avi "-strict -2" pgmyuv "-an -vcodec snow -qscale 2 -flags +qpel -me iter -dia_size 2 -cmp 12 -subcmp 12 -s 128x64"
+do_video_decoding "" "-s 352x288"
fi
###################################
if [ -n "$do_snowll" ] ; then
-# snow encoding
-file=${outfile}snow53.avi
-do_video_encoding "-strict -2" "-an -vcodec snow -qscale .001 -pred 1 -flags +mv4+qpel"
-
-# snow decoding
+# snow
+do_video_encoding snow53.avi "-strict -2" pgmyuv "-an -vcodec snow -qscale .001 -pred 1 -flags +mv4+qpel"
do_video_decoding
fi
###################################
if [ -n "$do_dv" ] ; then
-# dv encoding
-file=${outfile}dv.dv
-do_video_encoding "-dct int" "-s pal -an"
-
-# dv decoding
-do_video_decoding -s cif
+# dv
+do_video_encoding dv.dv "-dct int" pgmyuv "-s pal -an"
+do_video_decoding "" "-s cif"
fi
###################################
if [ -n "$do_dv50" ] ; then
-# dv50 encoding
-file=${outfile}dv.dv
-do_video_encoding "-dct int" "-s pal -pix_fmt yuv422p -an"
-
-# dv50 decoding
-do_video_decoding -s cif -pix_fmt yuv420p
+# dv50
+do_video_encoding dv.dv "-dct int" pgmyuv "-s pal -pix_fmt yuv422p -an"
+do_video_decoding "" "-s cif -pix_fmt yuv420p"
fi
###################################
if [ -n "$do_svq1" ] ; then
-# svq1 encoding
-file=${outfile}svq1.mov
-do_video_encoding "" "-an -vcodec svq1 -qscale 3 -pix_fmt yuv410p"
-
-# svq1 decoding
-do_video_decoding -pix_fmt yuv420p
+# svq1
+do_video_encoding svq1.mov "" pgmyuv "-an -vcodec svq1 -qscale 3 -pix_fmt yuv410p"
+do_video_decoding "" "-pix_fmt yuv420p"
fi
###################################
if [ -n "$do_mp2" ] ; then
-# mp2 encoding
+# mp2
do_audio_encoding mp2.mp2 "-ar 44100"
-
-# mp2 decoding
do_audio_decoding
$tiny_psnr $pcm_dst $pcm_ref 2 1924 >> $logfile
fi
###################################
if [ -n "$do_ac3" ] ; then
-# ac3 encoding
+# ac3
do_audio_encoding ac3.rm "" -vn
-
-# ac3 decoding
#do_audio_decoding
fi
###################################
if [ -n "$do_g726" ] ; then
-# g726 encoding
-do_audio_encoding g726.wav "-ar 44100" "-ab 32 -ac 1 -ar 8000 -acodec g726"
-
-# g726 decoding
+# g726
+do_audio_encoding g726.wav "-ar 44100" "-ab 32k -ac 1 -ar 8000 -acodec g726"
do_audio_decoding
fi
###################################
if [ -n "$do_adpcm_ima_wav" ] ; then
-# encoding
+# adpcm ima
do_audio_encoding adpcm_ima.wav "-ar 44100" "-acodec adpcm_ima_wav"
-
-# decoding
do_audio_decoding
fi
###################################
if [ -n "$do_adpcm_ms" ] ; then
-# encoding
+# adpcm ms
do_audio_encoding adpcm_ms.wav "-ar 44100" "-acodec adpcm_ms"
-
-# decoding
do_audio_decoding
fi
###################################
if [ -n "$do_adpcm_yam" ] ; then
-# encoding
+# adpcm yamaha
do_audio_encoding adpcm_yam.wav "-ar 44100" "-acodec adpcm_yamaha"
-
-# decoding
do_audio_decoding
fi
###################################
if [ -n "$do_flac" ] ; then
-# encoding
+# flac
do_audio_encoding flac.flac "-ar 44100" "-acodec flac -compression_level 2"
-
-# decoding
do_audio_decoding
fi
###################################
-# libav testing
+if [ -n "$do_wma" ] ; then
+# wmav1
+do_audio_encoding wmav1.asf "-ar 44100" "-acodec wmav1"
+do_ffmpeg_nomd5 $pcm_dst -y -i $file -f wav $pcm_dst
+$tiny_psnr $pcm_dst $pcm_ref 2 8192 >> $logfile
+# wmav2
+do_audio_encoding wmav2.asf "-ar 44100" "-acodec wmav2"
+do_ffmpeg_nomd5 $pcm_dst -y -i $file -f wav $pcm_dst
+$tiny_psnr $pcm_dst $pcm_ref 2 8192 >> $logfile
+fi
+
###################################
+#if [ -n "$do_vorbis" ] ; then
+# vorbis
+#disabled because its broken
+#do_audio_encoding vorbis.asf "-ar 44100" "-acodec vorbis"
+#do_audio_decoding
+#fi
-if [ -n "$do_libav" ] ; then
+###################################
+# libavformat testing
+###################################
+
+if [ -n "$do_libavtest" ] ; then
# avi
do_libav avi
@@ -675,8 +606,8 @@ do_libav mpg
# mpegts
do_libav ts
-# swf (decode audio only)
-do_libav swf "-acodec mp2"
+# swf
+do_libav swf -an
# ffm
do_libav ffm
@@ -724,13 +655,19 @@ do_ffmpeg $file -t 1 -y -qscale 10 -f pgmyuv -i $raw_src $file
####################
# image formats
-# pgm (we do not do md5 on image files yet)
+# pgm
do_image_formats pgm
-# ppm (we do not do md5 on image files yet)
+# ppm
do_image_formats ppm
-# jpeg (we do not do md5 on image files yet)
+# bmp
+do_image_formats bmp
+
+# tga
+do_image_formats tga
+
+# jpeg
do_image_formats jpg "-flags +bitexact -dct fastint -idct simple -pix_fmt yuvj420p" "-f image2"
####################
@@ -759,8 +696,8 @@ do_audio_only voc
####################
# pix_fmt conversions
-conversions="yuv420p yuv422p yuv444p yuv422 yuv410p yuv411p yuvj420p \
- yuvj422p yuvj444p rgb24 bgr24 rgba32 rgb565 rgb555 gray monow \
+conversions="yuv420p yuv422p yuv444p yuyv422 yuv410p yuv411p yuvj420p \
+ yuvj422p yuvj444p rgb24 bgr24 rgb32 rgb565 rgb555 gray monow \
monob pal8"
for pix_fmt in $conversions ; do
file=${outfile}libav-${pix_fmt}.yuv
@@ -770,7 +707,7 @@ for pix_fmt in $conversions ; do
-f rawvideo -s 352x288 -pix_fmt yuv444p $file
done
-fi
+fi # [ -n "$do_libavtest" ]
diff --git a/contrib/ffmpeg/tests/rotozoom.c b/contrib/ffmpeg/tests/rotozoom.c
index 5549d6ec2..52f5546a3 100644
--- a/contrib/ffmpeg/tests/rotozoom.c
+++ b/contrib/ffmpeg/tests/rotozoom.c
@@ -1,8 +1,25 @@
/*
* Generates a synthetic YUV video sequence suitable for codec testing.
- * GPLv2
- * rotozoom.c -> s.bechet@av7.net
+ *
+ * copyright (c) Sebastien Bechet <s.bechet@av7.net>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+
#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>
diff --git a/contrib/ffmpeg/tests/rotozoom.regression.ref b/contrib/ffmpeg/tests/rotozoom.regression.ref
index 91dbe27d9..94c4e1b72 100644
--- a/contrib/ffmpeg/tests/rotozoom.regression.ref
+++ b/contrib/ffmpeg/tests/rotozoom.regression.ref
@@ -7,10 +7,10 @@ stddev: 4.95 PSNR:34.21 bytes:7602176
198667 ./data/a-mpeg2.mpg
b7cae8a1f751b821cddcbe4d5dbc518c *./data/out.yuv
stddev: 4.96 PSNR:34.19 bytes:7602176
-6dc412b7972918b0c3be5b448c76cdbb *./data/a-mpeg2ivlc.mpg
-197869 ./data/a-mpeg2ivlc.mpg
-b7cae8a1f751b821cddcbe4d5dbc518c *./data/out.yuv
-stddev: 4.96 PSNR:34.19 bytes:7602176
+4dd6e884eeccfb5c0d9b5542349e3d62 *./data/a-mpeg2ivlc-qprd.mpg
+249692 ./data/a-mpeg2ivlc-qprd.mpg
+99214c2a75ece2a0bf4f5afebc0f8ed7 *./data/out.yuv
+stddev: 4.41 PSNR:35.22 bytes:7602176
f979bcca866e6e4cad5dc6cb06e56cfb *./data/a-mpeg2.mpg
198041 ./data/a-mpeg2.mpg
f6d9bf24ff8676a7f6076c05cd2c81a3 *./data/out.yuv
@@ -19,17 +19,17 @@ f90197a8b6e62ae25f82625337f27240 *./data/a-mpeg2i.mpg
204579 ./data/a-mpeg2i.mpg
ea5057b60146c06d40449cdfc686bf13 *./data/out.yuv
stddev: 4.98 PSNR:34.17 bytes:7602176
-dc359097986fc04df7541f720fa5da14 *./data/a-mpeg2thread.mpg
-183314 ./data/a-mpeg2thread.mpg
-354eb621a217e50252dbed937f9eab18 *./data/out.yuv
-stddev: 4.76 PSNR:34.57 bytes:7602176
-fb02afb5a0c79c7e99a32e60e19a86bc *./data/a-mpeg2threadivlc.mpg
-182460 ./data/a-mpeg2threadivlc.mpg
-354eb621a217e50252dbed937f9eab18 *./data/out.yuv
-stddev: 4.76 PSNR:34.57 bytes:7602176
-b567ce695c24fb1e08ff1c137a805e1a *./data/a-mpeg2reuse.mpg
-394759 ./data/a-mpeg2reuse.mpg
-c3a86762e97a8869ed3c969ee2e084b8 *./data/out.yuv
+c346717be44450e41d9d6e07f59d1490 *./data/a-mpeg2thread.mpg
+182959 ./data/a-mpeg2thread.mpg
+02b85a7f67ced2d146a5c4e8000712b6 *./data/out.yuv
+stddev: 4.75 PSNR:34.57 bytes:7602176
+ff30b3df75626398873ac4f30093a5ae *./data/a-mpeg2threadivlc.mpg
+182105 ./data/a-mpeg2threadivlc.mpg
+02b85a7f67ced2d146a5c4e8000712b6 *./data/out.yuv
+stddev: 4.75 PSNR:34.57 bytes:7602176
+3942f86a6aa6fe5aea586fedf210e33e *./data/a-mpeg2reuse.mpg
+394265 ./data/a-mpeg2reuse.mpg
+afbc483eaa769925259e6094cfda2c72 *./data/out.yuv
stddev: 4.76 PSNR:34.56 bytes:7602176
c09815e40a9d260628e1ebad8b2b3774 *./data/a-msmpeg4v2.avi
129918 ./data/a-msmpeg4v2.avi
@@ -67,22 +67,30 @@ a1323da0c8b437cd6961f8c90451880b *./data/a-huffyuv.avi
6455232 ./data/a-huffyuv.avi
dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv
stddev: 0.00 PSNR:99.99 bytes:7602176
-a418db8cc1410a50a154e8418d78e3d7 *./data/a-mpeg4-rc.avi
-227918 ./data/a-mpeg4-rc.avi
-56b327651c526538576fbc104f696dde *./data/out.yuv
-stddev: 4.24 PSNR:35.55 bytes:7602176
+968ca132d8cf46f84e657abcf8473b7c *./data/a-mpeg4-rc.avi
+227934 ./data/a-mpeg4-rc.avi
+895773fe8250c806a0d1592a6dd12401 *./data/out.yuv
+stddev: 4.24 PSNR:35.56 bytes:7602176
9001cf571eb7f26fa5592bdec6538583 *./data/a-mpeg4-adv.avi
173590 ./data/a-mpeg4-adv.avi
699edf05648fdc42196b7bebef9be269 *./data/out.yuv
stddev: 4.84 PSNR:34.41 bytes:7602176
-5d94ca237bd1ba1a6cdab6796485c6dc *./data/a-mpeg4-thread.avi
-254248 ./data/a-mpeg4-thread.avi
-1cb815783ab9dc787add51cdbc97e156 *./data/out.yuv
-stddev: 4.03 PSNR:36.01 bytes:7602176
-59e682efe457070d21170fdb117c1961 *./data/a-mpeg4-Q.avi
-165840 ./data/a-mpeg4-Q.avi
-f5838ffcf1dd6c538e27dbe906e5eadd *./data/out.yuv
+1e12bb209dae0ab4b64265b0a4262257 *./data/a-mpeg4-qprd.avi
+234048 ./data/a-mpeg4-qprd.avi
+1ec355ffb30d2adf302a550cf5812636 *./data/out.yuv
+stddev: 4.23 PSNR:35.58 bytes:7602176
+d581d6f4a331325905b8ffb05cd3bfd3 *./data/a-mpeg4-adap.avi
+204284 ./data/a-mpeg4-adap.avi
+c2c7f1c7844ab92d34247ccb70198c61 *./data/out.yuv
+stddev: 4.04 PSNR:35.99 bytes:7602176
+a5150067914ee1dee50f8fc8dcaee841 *./data/a-mpeg4-Q.avi
+165802 ./data/a-mpeg4-Q.avi
+4dcc71ad79bee90777cf5299044be362 *./data/out.yuv
stddev: 4.00 PSNR:36.08 bytes:7602176
+8cd8940d7451925784536fe9b2f2a5e3 *./data/a-mpeg4-thread.avi
+254260 ./data/a-mpeg4-thread.avi
+d160a4224ea1af66c85178912f8d3a7c *./data/out.yuv
+stddev: 4.03 PSNR:36.01 bytes:7602176
5b5b88ce610114e346a5df4f46995bb9 *./data/a-mpeg4-PSP.mp4
325006 ./data/a-mpeg4-PSP.mp4
90e65096aa9ebafa3fe3f44a5a47cdc4 *./data/a-error-mpeg4-adv.avi
@@ -93,9 +101,9 @@ c41187c99588fb7229ad330b2f80d28b *./data/a-mpeg4-nr.avi
155044 ./data/a-mpeg4-nr.avi
f7fc191308679f709405e62271f5c65f *./data/out.yuv
stddev: 4.73 PSNR:34.62 bytes:7602176
-1244f602a39b255ca676ca1e47617afd *./data/a-mpeg1b.mpg
-230033 ./data/a-mpeg1b.mpg
-df02ed235141aa229b47b91b28f71da5 *./data/out.yuv
+977f3caf286e8f36c6ab4c7464632f26 *./data/a-mpeg1b.mpg
+229806 ./data/a-mpeg1b.mpg
+f41c60846bfb8cb6dcf6071c846c82b4 *./data/out.yuv
stddev: 4.13 PSNR:35.79 bytes:7602176
b179402bba391073b5f5f9324a834061 *./data/a-mjpeg.avi
703564 ./data/a-mjpeg.avi
@@ -105,8 +113,8 @@ bc0d8c868c1a05db0ff03f41768f6c5e *./data/a-ljpeg.avi
4766558 ./data/a-ljpeg.avi
dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv
stddev: 0.00 PSNR:99.99 bytes:7602176
-8a2f3984a27a7513545cf98bc05fd066 *./data/a-jpegls.avi
-8334508 ./data/a-jpegls.avi
+f67cd488dfd06c03ad1d6d94d81b80c8 *./data/a-jpegls.avi
+8334488 ./data/a-jpegls.avi
a63d4e3ea1f0b0c0d44821da9e09b8f4 *./data/out.yuv
stddev: 0.67 PSNR:51.57 bytes:7602176
989a42671603dc1a7e6b156dccf0e820 *./data/a-rv10.rm
@@ -125,30 +133,30 @@ stddev: 10.47 PSNR:27.72 bytes:7602176
789072 ./data/a-asv2.avi
74a78015b64b2cf8cb9da2e44f508a69 *./data/out.yuv
stddev: 10.28 PSNR:27.88 bytes:7602176
-bd76377d9e167caff10ebaf381f01a82 *./data/a-flv.flv
-131337 ./data/a-flv.flv
+7163b470e93feb36b3f01e82168a3d31 *./data/a-flv.flv
+131360 ./data/a-flv.flv
8999c8264fb0941561f64c4a736e9d88 *./data/out.yuv
stddev: 5.33 PSNR:33.58 bytes:7602176
d72b0960e162d4998b9acbabb07e99ab *./data/a-ffv1.avi
3525804 ./data/a-ffv1.avi
dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv
stddev: 0.00 PSNR:99.99 bytes:7602176
-4b306a67e21771eba4c61b1cf0f56141 *./data/a-snow.avi
-68526 ./data/a-snow.avi
-d2914543504345fad6e5593f66f072bc *./data/out.yuv
-stddev: 10.93 PSNR:27.34 bytes:7602176
-892221ef4c1debf694a481a5e23e1136 *./data/a-snow53.avi
-2722066 ./data/a-snow53.avi
+40a6e938ac2bd92ee12cd57925e86454 *./data/a-snow.avi
+68758 ./data/a-snow.avi
+1e356854142898c7c4aab4bfedadf235 *./data/out.yuv
+stddev: 10.86 PSNR:27.40 bytes:7602176
+3d0da6aeec9b80c6ee0ff4b747bdd0f0 *./data/a-snow53.avi
+2721980 ./data/a-snow53.avi
dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv
stddev: 0.00 PSNR:99.99 bytes:7602176
-af9f474238c9c68cb32e389659ee25ab *./data/a-dv.dv
+54cdeaee32d1007666a1e487e739daf6 *./data/a-dv.dv
7200000 ./data/a-dv.dv
-bb69dda7a84a5b166434e28e1243d3d1 *./data/out.yuv
-stddev: 2.99 PSNR:38.59 bytes:7602176
-91dc1c1dc4a8cca72f27d85db6d7636f *./data/a-dv.dv
+75bf724e37f667f36af50e2051846574 *./data/out.yuv
+stddev: 3.11 PSNR:38.24 bytes:7602176
+ac6741e4c79e9ed18f179c4124ede29c *./data/a-dv.dv
14400000 ./data/a-dv.dv
-74b01209bb5e096d570dd4df112bb82d *./data/out.yuv
-stddev: 2.98 PSNR:38.61 bytes:7602176
+ad9907f4ef608f025f5fc38b4b067b37 *./data/out.yuv
+stddev: 3.11 PSNR:38.25 bytes:7602176
7ba9292d663819a9a1d1cdecc6f1b079 *./data/a-svq1.mov
768407 ./data/a-svq1.mov
6bc10518bc387c3bdf117997713ee69a *./data/out.yuv
@@ -158,25 +166,33 @@ stddev: 3.44 PSNR:37.39 bytes:7602176
83f8df5d5f84480566af548bb037fceb *./data/out.wav
stddev:9330.70 PSNR:16.92 bytes:1054720
stddev:4396.13 PSNR:23.46 bytes:1052672
-dd68110cb7e5388392f89d5160d3a825 *./data/a-ac3.rm
+aefe11ab5067621a1c674859d6413891 *./data/a-ac3.rm
98203 ./data/a-ac3.rm
-9e6e66847a568ef4f1f229b0939d2aae *./data/a-g726.wav
-24268 ./data/a-g726.wav
-a719ab6d47d8d601520edb13bf6136b4 *./data/out.wav
-stddev:8459.88 PSNR:17.77 bytes:96256
-ea2efb8ba20695a35ab0d71a7ee86f22 *./data/a-adpcm_ima.wav
-266288 ./data/a-adpcm_ima.wav
+39878597b1d65cce473639a7d8c93b02 *./data/a-g726.wav
+24279 ./data/a-g726.wav
+888f2f016e608d044a1bacbca5497ed2 *./data/out.wav
+stddev:8368.02 PSNR:17.87 bytes:96256
+de3f0e1f50b19bd8572fdd3dee2e72c4 *./data/a-adpcm_ima.wav
+266300 ./data/a-adpcm_ima.wav
60178d48204f5662d91776e36eddc82e *./data/out.wav
stddev:11441.89 PSNR:15.15 bytes:1054720
-d2eee867856d2bdb6d08e936d4ceec0c *./data/a-adpcm_ms.wav
-267308 ./data/a-adpcm_ms.wav
+628d4789cf9ee16a756ac54b7fd8650d *./data/a-adpcm_ms.wav
+267320 ./data/a-adpcm_ms.wav
91a84bb4f319a3a0bf0c0441b3d3a529 *./data/out.wav
stddev:1050.18 PSNR:35.89 bytes:1054720
-48ae9fcb043a44e316998b85043b61bc *./data/a-adpcm_yam.wav
-264236 ./data/a-adpcm_yam.wav
+ab11d9151644cbff27827b7e89f37aa9 *./data/a-adpcm_yam.wav
+264248 ./data/a-adpcm_yam.wav
e92cec8c07913ffb91ad2b11f79cdc00 *./data/out.wav
stddev:18312.68 PSNR:11.06 bytes:1056768
c3382f03ce2efb5d475240d288a33898 *./data/a-flac.flac
353368 ./data/a-flac.flac
c4228df189aad9567a037727d0e763e4 *./data/out.wav
stddev: 33.31 PSNR:65.87 bytes:1040384
+0c406c4e4586ca27064e28637b662631 *./data/a-wmav1.asf
+106004 ./data/a-wmav1.asf
+stddev:12251.50 PSNR:14.56 bytes:1056768
+stddev:2106.00 PSNR:29.85 bytes:1048576
+82442aaa5fdbd327769e4c4ad369147e *./data/a-wmav2.asf
+106044 ./data/a-wmav2.asf
+stddev:12255.92 PSNR:14.55 bytes:1056768
+stddev:2099.31 PSNR:29.88 bytes:1048576
diff --git a/contrib/ffmpeg/tests/seek_test.c b/contrib/ffmpeg/tests/seek_test.c
new file mode 100644
index 000000000..e17409439
--- /dev/null
+++ b/contrib/ffmpeg/tests/seek_test.c
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2003 Fabrice Bellard
+ * Copyright (c) 2007 Michael Niedermayer
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "avformat.h"
+
+int main(int argc, char **argv)
+{
+ const char *filename;
+ AVFormatContext *ic;
+ int i, ret, stream_id;
+ int64_t timestamp;
+
+ /* initialize libavcodec, and register all codecs and formats */
+ av_register_all();
+
+ if (argc != 2) {
+ printf("usage: %s input_file\n"
+ "\n", argv[0]);
+ exit(1);
+ }
+
+ filename = argv[1];
+
+ /* allocate the media context */
+ ic = av_alloc_format_context();
+ if (!ic) {
+ fprintf(stderr, "Memory error\n");
+ exit(1);
+ }
+
+ ret = av_open_input_file(&ic, filename, NULL, 0, NULL);
+ if (ret < 0) {
+ fprintf(stderr, "cant open %s\n", filename);
+ exit(1);
+ }
+
+ ret = av_find_stream_info(ic);
+ if (ret < 0) {
+ fprintf(stderr, "%s: could not find codec parameters\n", filename);
+ exit(1);
+ }
+
+ for(i=0; ; i++){
+ AVPacket pkt;
+ AVStream *st;
+
+ memset(&pkt, 0, sizeof(pkt));
+ if(ret>=0){
+ ret= av_read_frame(ic, &pkt);
+ printf("ret:%2d", ret);
+ if(ret>=0){
+ st= ic->streams[pkt.stream_index];
+ printf(" st:%2d dts:%f pts:%f pos:%Ld size:%d flags:%d", pkt.stream_index, pkt.dts*av_q2d(st->time_base), pkt.pts*av_q2d(st->time_base), pkt.pos, pkt.size, pkt.flags);
+ }
+ printf("\n");
+ }
+
+ if(i>25) break;
+
+ stream_id= (i>>1)%(ic->nb_streams+1) - 1;
+ timestamp= (i*19362894167LL) % (4*AV_TIME_BASE) - AV_TIME_BASE;
+ if(stream_id>=0){
+ st= ic->streams[stream_id];
+ timestamp= av_rescale_q(timestamp, AV_TIME_BASE_Q, st->time_base);
+ }
+ ret = av_seek_frame(ic, stream_id, timestamp, (i&1)*AVSEEK_FLAG_BACKWARD);
+ printf("ret:%2d st:%2d ts:%f flags:%d\n", ret, stream_id, timestamp*(stream_id<0 ? 1.0/AV_TIME_BASE : av_q2d(st->time_base)), i&1);
+ }
+
+ return 0;
+}
diff --git a/contrib/ffmpeg/tests/seek_test.sh b/contrib/ffmpeg/tests/seek_test.sh
new file mode 100755
index 000000000..eeac747b1
--- /dev/null
+++ b/contrib/ffmpeg/tests/seek_test.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+#feel free to clean this up ive made no attempt to write this overly portable ...
+
+datadir="./data"
+
+logfile="$datadir/seek.regression"
+reffile="$1"
+
+list=`ls data/a-* data/b-* | sort`
+rm $logfile
+for i in $list ; do
+ echo ---------------- >>$logfile
+ echo $i >>$logfile
+ ./seek_test $i >> $logfile
+done
+
+if diff -u "$logfile" "$reffile" ; then
+ echo
+ echo Regression test succeeded.
+ exit 0
+else
+ echo
+ echo Regression test: Error.
+ exit 1
+fi
diff --git a/contrib/ffmpeg/tests/server-regression.sh b/contrib/ffmpeg/tests/server-regression.sh
index fb28fbae8..1f561aa54 100755
--- a/contrib/ffmpeg/tests/server-regression.sh
+++ b/contrib/ffmpeg/tests/server-regression.sh
@@ -10,26 +10,28 @@ fi
# Make sure that the data directory exists
mkdir -p data
-cp "$2" data/test.conf
#perl -e 'chomp($wd = `pwd`); print map { s!data/!!; "<Stream $_>\nFile $wd/data/$_\n</Stream>\n\n" } @ARGV' data/a* >> data/test.conf
#perl -e 'chomp($wd = `pwd`); print map { s!data/!!; "<Stream $_.asf>\nFile $wd/data/$_\n</Stream>\n\n" } @ARGV' data/a* >> data/test.conf
-FILES=`sed -n 's/^[^#]*<Stream \(.*\)>.*/\1/p' data/test.conf | grep -v html`
+FILES=`sed -n 's/^[^#]*<Stream \(.*\)>.*/\1/p' test.conf | grep -v html`
-rm -f /tmp/feed.ffm
-../ffserver -d -f data/test.conf 2> /dev/null &
+rm -f feed1.ffm
+../ffserver -d -f test.conf 2> /dev/null &
FFSERVER_PID=$!
-echo "Waiting for feeds to startup..."
sleep 2
+echo "Waiting for feeds to startup..."
+../ffmpeg -loop_input -flags +bitexact -dct fastint -idct simple -y -f pgmyuv -i vsynth1/%02d.pgm http://localhost:9999/feed1.ffm 2> /dev/null &
+FFMPEG_PID=$!
+sleep 5
(
cd data || exit $?
rm -f ff-*;
WGET_OPTIONS="--user-agent=NSPlayer -q --proxy=off -e verbose=off -e server_response=off"
for file in $FILES; do
if [ `expr $file : "a-*"` != 0 ]; then
- wget $WGET_OPTIONS --output-document=- http://localhost:9999/$file > ff-$file &
+ wget $WGET_OPTIONS --output-document=- http://localhost:9999/$file > ff-$file
else
- wget $WGET_OPTIONS --output-document=- http://localhost:9999/$file?date=19700101T000000Z | dd bs=1 count=100000 > ff-$file 2>/dev/null &
+ wget $WGET_OPTIONS --output-document=- http://localhost:9999/$file?date=19700101T000000Z | dd bs=1 count=20000 > ff-$file 2>/dev/null
fi
MDFILES="$MDFILES ff-$file"
done
@@ -37,8 +39,10 @@ sleep 2
# the status page is always different
md5sum $MDFILES > ffserver.regression
)
+kill $FFMPEG_PID
kill $FFSERVER_PID
wait > /dev/null 2>&1
+rm -f feed1.ffm
if $diff_cmd data/ffserver.regression "$1" ; then
echo
echo Server regression test succeeded.
diff --git a/contrib/ffmpeg/tests/test.conf b/contrib/ffmpeg/tests/test.conf
index cc2038a60..afd4c16fb 100644
--- a/contrib/ffmpeg/tests/test.conf
+++ b/contrib/ffmpeg/tests/test.conf
@@ -52,13 +52,14 @@ CustomLog -
# maximum size of the feed (100M bytes here). Default:
# File=/tmp/feed_name.ffm FileMaxSize=5M
-File /tmp/feed.ffm
+File feed1.ffm
FileMaxSize 100M
# Fire up ffmpeg pointing at this stream
-Launch ../ffmpeg -loop_input -flags +bitexact -dct fastint -idct simple -y -f pgmyuv -i vsynth1/%02d.pgm
-acl allow localhost
+#Launch ../../ffmpeg -loop_input -flags +bitexact -dct fastint -idct simple -y -f pgmyuv -i vsynth1/%02d.pgm
+
+ACL allow localhost
</Feed>
##################################################################
diff --git a/contrib/ffmpeg/tests/videogen.c b/contrib/ffmpeg/tests/videogen.c
index a6b8ce167..39d85a26a 100644
--- a/contrib/ffmpeg/tests/videogen.c
+++ b/contrib/ffmpeg/tests/videogen.c
@@ -1,7 +1,26 @@
/*
* Generates a synthetic YUV video sequence suitable for codec testing.
* NOTE: no floats are used to guaranty a bit exact output.
+ *
+ * Copyright (c) 2002 Fabrice Bellard
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+
#include <stdlib.h>
#include <stdio.h>