Gfxprim
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
August 2012
- 1 participants
- 17 discussions
[repo.or.cz] gfxprim.git branch master updated: c6ff6eadd9601eb33b28a9999b5fab6d3221ed44
by metan 11 Aug '12
by metan 11 Aug '12
11 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via c6ff6eadd9601eb33b28a9999b5fab6d3221ed44 (commit)
from a962dc8dcd50368da71a96ace478630c55d7401c (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/c6ff6eadd9601eb33b28a9999b5fab6d3221…
commit c6ff6eadd9601eb33b28a9999b5fab6d3221ed44
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Sat Aug 11 22:15:02 2012 +0200
tests: More work on the test framework.
Added message passing layer + few fixes.
diff --git a/tests/framework/Makefile b/tests/framework/Makefile
index 6be6899..901a4fe 100644
--- a/tests/framework/Makefile
+++ b/tests/framework/Makefile
@@ -8,7 +8,7 @@ LDFLAGS+=-L.
LDLIBS+=-ltst_preload -ldl
CFLAGS+=
-test: tst_test.o tst_job.o
+test: tst_test.o tst_job.o tst_msg.o
APPS=test
diff --git a/tests/framework/test.c b/tests/framework/test.c
index da3f13e..f3d5356 100644
--- a/tests/framework/test.c
+++ b/tests/framework/test.c
@@ -28,6 +28,9 @@
int success_fn(void)
{
+ tst_report(0, "This test does nothing");
+ tst_report(0, "But successfully");
+
return TST_SUCCESS;
}
@@ -50,12 +53,19 @@ int stack_overflow_fn(void)
int timeout_fn(void)
{
- sleep(10000);
+ tst_report(0, "Sleeping for ten seconds");
+ sleep(10);
return TST_SUCCESS;
}
int temp_dir_fn(void)
{
+ char buf[256], *res;
+
+ /* log current working directory */
+ res = getcwd(buf, sizeof(buf));
+ tst_report(0, "CWD is '%s'", res);
+
return TST_SUCCESS;
}
@@ -63,9 +73,13 @@ int malloc_leak_fn(void)
{
void *p;
- p = malloc(1);
+ p = malloc(4);
p = malloc(3);
+ free(p);
+
+ tst_report(0, "Leaking 1 chunks 4 bytes total");
+
return TST_SUCCESS;
}
diff --git a/tests/framework/tst_job.c b/tests/framework/tst_job.c
index 17166a7..34e0357 100644
--- a/tests/framework/tst_job.c
+++ b/tests/framework/tst_job.c
@@ -29,11 +29,17 @@
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
+#include <stdarg.h>
#include "tst_preload.h"
#include "tst_test.h"
#include "tst_job.h"
+/*
+ * Once we child forks to do a job, this points to its job structure.
+ */
+static struct tst_job *my_job = NULL;
+
static void start_test(struct tst_job *job)
{
(void)job;
@@ -56,41 +62,42 @@ static void stop_test(struct tst_job *job)
{
const char *name = job->test->name;
int sec, nsec;
+ const char *result = "";
to_time(&sec, &nsec, &job->start_time, &job->stop_time);
switch (job->result) {
case TST_SUCCESS:
- fprintf(stderr, "Test e[1;37m%se[0m finished with "
- "e[1;32mSUCCESSe[0m (duration %i.%05is)n",
- name, sec, nsec);
+ result = "e[1;32mSUCCESSe[0m";
break;
case TST_INTERR:
- fprintf(stderr, "Test e[1;37m%se[0m finished with "
- "e[1;31mINTERNAL ERRORe[0m (duration %i.%05is)n",
- name, sec, nsec);
+ result = "e[1;31mINTERNAL ERRORe[0m";
break;
case TST_SIGSEGV:
- fprintf(stderr, "Test e[1;37m%se[0m finished with "
- "e[1;31mSEGFAULTe[0m (duration %i.%05is)n",
- name, sec, nsec);
+ result = "e[1;31mSEGFAULTe[0m";
break;
case TST_TIMEOUT:
- fprintf(stderr, "Test e[1;37m%se[0m finished with "
- "e[1;35mTIMEOUTe[0m (duration %i.%05is}n",
- name, sec, nsec);
+ result = "e[1;35mTIMEOUTe[0m";
break;
case TST_MEMLEAK:
- fprintf(stderr, "Test e[1;37m%se[0m finished with "
- "e[1;33mMEMLEAKe[0m (duration %i.%05is}n",
- name, sec, nsec);
+ result = "e[1;33mMEMLEAKe[0m";
break;
case TST_FAILED:
- fprintf(stderr, "Test e[1;37m%se[0m finished with "
- "e[1;31mFAILUREe[0m (duration %i.%05is)n",
- name, sec, nsec);
+ result = "e[1;31mFAILUREe[0m";
break;
}
+
+ fprintf(stderr, "Test e[1;37m%se[0m finished with %s "
+ "(duration %i.%09is, cputime %i.%09is)n",
+ name, result, sec, nsec,
+ (int)job->cpu_time.tv_sec,
+ (int)job->cpu_time.tv_nsec);
+
+ if (job->result == TST_MEMLEAK)
+ tst_malloc_print(&job->malloc_stats);
+
+ /* Now print test message store */
+ tst_msg_print(&job->store);
}
/*
@@ -176,10 +183,35 @@ static void read_timespec(struct tst_job *job, struct timespec *time)
time->tv_nsec = *(long*)(ptr);
}
-static void child_write(struct tst_job *job, char ch)
+static void child_write(struct tst_job *job, char ch, void *ptr, ssize_t size)
{
if (write(job->pipefd, &ch, 1) != 1)
tst_warn("child write() failed: %s", strerror(errno));
+
+ if (ptr != NULL) {
+ if (write(job->pipefd, ptr, size) != size)
+ tst_warn("child write() failed: %s", strerror(errno));
+ }
+}
+
+int tst_report(int level, const char *fmt, ...)
+{
+ va_list va;
+ int ret;
+ char buf[258];
+
+ va_start(va, fmt);
+ ret = vsnprintf(buf+3, sizeof(buf) - 3, fmt, va);
+ va_end(va);
+
+ buf[0] = 'm';
+ buf[1] = level;
+ ((unsigned char*)buf)[2] = ret > 255 ? 255 : ret + 1;
+
+ if (my_job != NULL)
+ write(my_job->pipefd, buf, (int)buf[2] + 3);
+
+ return ret;
}
void tst_job_run(struct tst_job *job)
@@ -187,10 +219,13 @@ void tst_job_run(struct tst_job *job)
int ret;
char template[256];
int pipefd[2];
-
+
/* Write down starting time of the test */
clock_gettime(CLOCK_MONOTONIC, &job->start_time);
+ /* Prepare the test message store */
+ tst_msg_init(&job->store);
+
start_test(job);
if (pipe(pipefd)) {
@@ -211,6 +246,7 @@ void tst_job_run(struct tst_job *job)
case 0:
close(pipefd[0]);
job->pipefd = pipefd[1];
+ my_job = job;
break;
default:
close(pipefd[1]);
@@ -243,17 +279,13 @@ void tst_job_run(struct tst_job *job)
ret = job->test->tst_fn();
if (job->test->flags & TST_MALLOC_CHECK) {
- size_t size;
- unsigned int chunks;
-
tst_malloc_check_stop();
-
- tst_malloc_check_report(&size, &chunks);
-
- if (size != 0 && ret == TST_SUCCESS)
+ tst_malloc_check_report(&job->malloc_stats);
+
+ child_write(job, 's', &job->malloc_stats, sizeof(job->malloc_stats));
+
+ if (job->malloc_stats.lost_chunks != 0 && ret == TST_SUCCESS)
ret = TST_MEMLEAK;
-
- //TODO message?
}
/* Send process cpu time to parent */
@@ -265,13 +297,38 @@ void tst_job_run(struct tst_job *job)
remove_tmpdir(template);
/* Send the parent we are done */
- child_write(job, 'x');
+ child_write(job, 'x', NULL, 0);
close(job->pipefd);
exit(ret);
}
+static void parent_read_msg(struct tst_job *job)
+{
+ unsigned char header[2];
+
+ if (read(job->pipefd, header, sizeof(header)) != sizeof(header))
+ tst_warn("parent: read(message header) failed: %s",
+ strerror(errno));
+
+ char buf[header[1]];
+
+ if (read(job->pipefd, buf, sizeof(buf)) != sizeof(buf))
+ tst_warn("parent: read(message) failed: %s", strerror(errno));
+
+ /* null-terminated the string, to be extra sure */
+ buf[header[1] - 1] = '0';
+
+ tst_msg_append(&job->store, header[0], buf);
+}
+
+static void parent_read(struct tst_job *job, void *ptr, ssize_t size)
+{
+ if (read(job->pipefd, ptr, size) != size)
+ tst_warn("parent: read(): %s", strerror(errno));
+}
+
void tst_job_wait(struct tst_job *job)
{
int status, ret;
@@ -309,6 +366,18 @@ void tst_job_wait(struct tst_job *job)
case 'C':
read_timespec(job, &job->cpu_time);
break;
+ /* test message as generated by tst_report() */
+ case 'm':
+ parent_read_msg(job);
+ break;
+ /* malloc stats */
+ case 's':
+ parent_read(job, &job->malloc_stats,
+ sizeof(job->malloc_stats));
+ break;
+ default:
+ //TODO: internal error
+ break;
}
}
diff --git a/tests/framework/tst_job.h b/tests/framework/tst_job.h
index 28ec869..c18cae8 100644
--- a/tests/framework/tst_job.h
+++ b/tests/framework/tst_job.h
@@ -22,7 +22,7 @@
/*
- Test job is instance of running test.
+ Test job is an instance of running test.
*/
@@ -31,6 +31,9 @@
#include <time.h>
+#include "tst_msg.h"
+#include "tst_preload.h"
+
struct tst_test;
struct tst_job {
@@ -58,8 +61,17 @@ struct tst_job {
/* test pid */
int pid;
- /* result */
- int result;
+
+ /* test result */
+ int result;
+
+ /*
+ * test malloc statistics, filled if TST_MALLOC_CHECK was set.
+ */
+ struct malloc_stats malloc_stats;
+
+ /* store for test messages */
+ struct tst_msg_store store;
};
/*
diff --git a/tests/framework/tst_job.h b/tests/framework/tst_msg.c
similarity index 62%
copy from tests/framework/tst_job.h
copy to tests/framework/tst_msg.c
index 28ec869..2d46338 100644
--- a/tests/framework/tst_job.h
+++ b/tests/framework/tst_msg.c
@@ -20,58 +20,61 @@
* *
*****************************************************************************/
- /*
-
- Test job is instance of running test.
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
- */
+#include "tst_test.h"
-#ifndef TST_JOB_H
-#define TST_JOB_H
+#include "tst_msg.h"
-#include <time.h>
+void tst_msg_clear(struct tst_msg_store *self)
+{
+ struct tst_msg *msg, *prev = NULL;
-struct tst_test;
+ for (msg = self->first; msg != NULL; msg = msg->next) {
+ free(prev);
+ prev = msg;
+ }
-struct tst_job {
- const struct tst_test *test;
-
- /*
- * Pipe fd.
- *
- * In parent this points to the read side of the pipe so the parent
- * recieves data from child.
- *
- * In child this points to the write side of the pipe so child can
- * send data to parent.
- */
- int pipefd;
-
- int running:1;
-
- /* test execution time */
- struct timespec start_time;
- struct timespec stop_time;
+ free(prev);
+
+ self->first = NULL;
+ self->last = NULL;
+}
+
+int tst_msg_append(struct tst_msg_store *self, int type, const char *msg_text)
+{
+ size_t len = strlen(msg_text);
+ struct tst_msg *msg;
- /* test cpu time */
- struct timespec cpu_time;
+ msg = malloc(sizeof(struct tst_msg) + len + 1);
+
+ if (msg == NULL) {
+ tst_warn("tst_msg: malloc() failed: %s", strerror(errno));
+ return 1;
+ }
+
+ msg->type = type;
+ msg->next = NULL;
+ strcpy(msg->msg, msg_text);
- /* test pid */
- int pid;
- /* result */
- int result;
-};
+ if (self->last == NULL) {
+ self->first = msg;
+ self->last = msg;
+ } else {
+ self->last->next = msg;
+ self->last = msg;
+ }
-/*
- * Runs a test job as a separate process.
- *
- * The test field must point to correct test.
- */
-void tst_job_run(struct tst_job *job);
+ return 0;
+}
-/*
- * Waits for the test to finish.
- */
-void tst_job_wait(struct tst_job *job);
+void tst_msg_print(struct tst_msg_store *self)
+{
+ struct tst_msg *msg;
-#endif /* TST_JOB_H */
+ for (msg = self->first; msg != NULL; msg = msg->next)
+ fprintf(stderr, "%i: %sn", msg->type, msg->msg);
+}
diff --git a/tests/framework/tst_preload.h b/tests/framework/tst_msg.h
similarity index 71%
copy from tests/framework/tst_preload.h
copy to tests/framework/tst_msg.h
index d1eca76..a6a290a 100644
--- a/tests/framework/tst_preload.h
+++ b/tests/framework/tst_msg.h
@@ -20,22 +20,48 @@
* *
*****************************************************************************/
-#ifndef TST_PRELOAD_H
-#define TST_PRELOAD_H
+ /*
+
+ Code to store test messages into a data structure.
+
+ */
+
+#ifndef TST_MSG_H
+#define TST_MSG_H
+
+struct tst_msg {
+ struct tst_msg *next;
+ int type;
+ char msg[];
+};
+
+struct tst_msg_store {
+ struct tst_msg *first;
+ struct tst_msg *last;
+};
+
+/*
+ * Initalize message store.
+ */
+static inline void tst_msg_init(struct tst_msg_store *self)
+{
+ self->first = NULL;
+ self->last = NULL;
+}
/*
- * Starts malloc check.
+ * Cleans msg store, frees memory.
*/
-void tst_malloc_check_start(void);
+void tst_msg_clear(struct tst_msg_store *self);
/*
- * Stops malloc check.
+ * Appends test message to the store.
*/
-void tst_malloc_check_stop(void);
+int tst_msg_append(struct tst_msg_store *self, int type, const char *msg);
/*
- * Reports current malloc status.
+ * Prints messages in the store.
*/
-void tst_malloc_check_report(size_t *size, unsigned int *chunks);
+void tst_msg_print(struct tst_msg_store *self);
-#endif /* TST_PRELOAD_H */
+#endif /* TST_MSG_H */
diff --git a/tests/framework/tst_preload.c b/tests/framework/tst_preload.c
index 4a8f9bb..1ba320e 100644
--- a/tests/framework/tst_preload.c
+++ b/tests/framework/tst_preload.c
@@ -49,13 +49,17 @@ struct chunk {
};
struct chunk chunks[MAX_CHUNKS + 1];
-static size_t total_size;
-static unsigned int total_chunks;
+static size_t cur_size = 0;
+static unsigned int cur_chunks = 0;
+static size_t total_size = 0;
+static unsigned int total_chunks = 0;
-void tst_malloc_check_report(size_t *size, unsigned int *chunks)
+void tst_malloc_check_report(struct malloc_stats *stats)
{
- *size = total_size;
- *chunks = total_chunks;
+ stats->lost_size = cur_size;
+ stats->lost_chunks = cur_chunks;
+ stats->total_size = total_size;
+ stats->total_chunks = total_chunks;
}
static void add_chunk(size_t size, void *ptr)
@@ -66,8 +70,10 @@ static void add_chunk(size_t size, void *ptr)
if (chunks[i].size == 0) {
chunks[i].size = size;
chunks[i].ptr = ptr;
+ cur_size += size;
+ cur_chunks++;
total_size += size;
- total_chunks += 1;
+ total_chunks++;
return;
}
}
@@ -85,8 +91,8 @@ static void rem_chunk(void *ptr)
break;
if (chunks[i].ptr == ptr) {
- total_size -= chunks[i].size;
- total_chunks -= 1;
+ cur_size -= chunks[i].size;
+ cur_chunks--;
chunks[i].size = 0;
chunks[i].ptr = NULL;
@@ -127,3 +133,10 @@ void free(void *ptr)
real_free(ptr);
}
+
+void tst_malloc_print(struct malloc_stats *stats)
+{
+ fprintf(stderr, "Total size %zu chunks %u, lost size %zu chunks %un",
+ stats->total_size, stats->total_chunks,
+ stats->lost_size, stats->lost_chunks);
+}
diff --git a/tests/framework/tst_preload.h b/tests/framework/tst_preload.h
index d1eca76..36bb41a 100644
--- a/tests/framework/tst_preload.h
+++ b/tests/framework/tst_preload.h
@@ -33,9 +33,26 @@ void tst_malloc_check_start(void);
*/
void tst_malloc_check_stop(void);
+struct malloc_stats {
+ size_t total_size;
+ unsigned int total_chunks;
+
+ size_t lost_size;
+ unsigned int lost_chunks;
+};
+
/*
* Reports current malloc status.
+ *
+ * Size and chunks are filled with sum and number of currently allocated
+ * chunks, i.e, chunks that were allocated but not freed. The allocs is
+ * filled with number of allocations done.
+ */
+void tst_malloc_check_report(struct malloc_stats *stats);
+
+/*
+ * Prints malloc statistics.
*/
-void tst_malloc_check_report(size_t *size, unsigned int *chunks);
+void tst_malloc_print(struct malloc_stats *stats);
#endif /* TST_PRELOAD_H */
diff --git a/tests/framework/tst_test.c b/tests/framework/tst_test.c
index 9359f1c..d04caf5 100644
--- a/tests/framework/tst_test.c
+++ b/tests/framework/tst_test.c
@@ -23,29 +23,13 @@
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
-#include <stdarg.h>
#include <errno.h>
#include <string.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <ctype.h>
-#include <dirent.h>
+#include <stdarg.h>
#include "tst_job.h"
#include "tst_test.h"
-int tst_report(int level, const char *fmt, ...)
-{
- va_list va;
- int ret;
-
- va_start(va, fmt);
- ret = vfprintf(stderr, fmt, va);
- va_end(va);
-
- return ret;
-}
-
int tst_warn(const char *fmt, ...)
{
va_list va;
@@ -66,7 +50,10 @@ static int run_test(const struct tst_test *test)
tst_job_run(&job);
tst_job_wait(&job);
-
+
+ /* Free the test message store */
+ tst_msg_clear(&job.store);
+
return job.result;
}
-----------------------------------------------------------------------
Summary of changes:
tests/framework/Makefile | 2 +-
tests/framework/test.c | 18 +++-
tests/framework/tst_job.c | 129 +++++++++++++++-----
tests/framework/tst_job.h | 18 +++-
.../loaders_example.c => tests/framework/tst_msg.c | 65 +++++++----
.../GP_Backends.h => tests/framework/tst_msg.h | 47 +++++---
tests/framework/tst_preload.c | 29 +++--
tests/framework/tst_preload.h | 19 +++-
tests/framework/tst_test.c | 23 +---
9 files changed, 249 insertions(+), 101 deletions(-)
copy demos/c_simple/loaders_example.c => tests/framework/tst_msg.c (65%)
copy include/backends/GP_Backends.h => tests/framework/tst_msg.h (71%)
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos(a)gmail.com
if you want to unsubscribe, or site admin admin(a)repo.or.cz if you receive
no reply.
--
gfxprim.git ("A simple 2D graphics library with emphasis on correctness and well-defined operation.")
1
0
[repo.or.cz] gfxprim.git branch master updated: ded09ff77c3cb7e8a5f0666434806f7be8aebf63
by metan 10 Aug '12
by metan 10 Aug '12
10 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via ded09ff77c3cb7e8a5f0666434806f7be8aebf63 (commit)
from a9450959b372c0d3c47b09b1714c7563808756ee (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/ded09ff77c3cb7e8a5f0666434806f7be8ae…
commit ded09ff77c3cb7e8a5f0666434806f7be8aebf63
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Fri Aug 10 22:43:02 2012 +0200
tests: Remove SDL based showimage.
Similar test already exists.
diff --git a/tests/SDL/Makefile b/tests/SDL/Makefile
index 6f83335..c11568d 100644
--- a/tests/SDL/Makefile
+++ b/tests/SDL/Makefile
@@ -8,7 +8,7 @@ ifeq ($(HAVE_LIBSDL),yes)
CSOURCES=$(shell echo *.c)
APPS=pixeltest fonttest linetest randomshapetest- symbolstest textaligntest trianglefps blittest subcontext showimage+ symbolstest textaligntest trianglefps blittest subcontext aatest mixpixeltest
endif
diff --git a/tests/SDL/showimage.c b/tests/SDL/showimage.c
deleted file mode 100644
index a63ba78..0000000
--- a/tests/SDL/showimage.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/*****************************************************************************
- * This file is part of gfxprim library. *
- * *
- * Gfxprim 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. *
- * *
- * Gfxprim is distributed in the hope that 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 gfxprim; if not, write to the Free Software *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
- * Boston, MA 02110-1301 USA *
- * *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
- * *
- *****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <SDL/SDL.h>
-
-#include "GP.h"
-#include "GP_SDL.h"
-
-SDL_Surface *display = NULL;
-GP_Context context, *bitmap;
-
-int brightness = 0;
-
-void event_loop(void)
-{
- SDL_Event event;
- GP_Context *res;
-
- while (SDL_WaitEvent(&event) > 0) {
-
- switch (event.type) {
-
- case SDL_KEYDOWN:
- switch (event.key.keysym.sym) {
- case SDLK_ESCAPE:
- return;
- case SDLK_UP:
- brightness+=2;
- case SDLK_DOWN: {
- brightness-=1;
-
- GP_FILTER_PARAMS(bitmap->pixel_type, param);
- GP_FilterParamSetIntAll(param, brightness);
- res = GP_FilterBrightness(bitmap, NULL, param, NULL);
-
- printf("brightness = %i %ux%un", brightness, res->w, res->h);
-
- GP_Blit(res, 0, 0, res->w, res->h, &context, 0, 0);
- SDL_Flip(display);
- GP_ContextFree(res);
- } break;
- default:
- break;
- }
- break;
- case SDL_QUIT:
- return;
- default:
- break;
- }
- }
-}
-
-int main(int argc, char *argv[])
-{
- /* Bits per pixel to be set for the display surface. */
- int display_bpp = 0;
-
- int i;
- for (i = 1; i < argc; i++) {
- if (strcmp(argv[i], "-16") == 0) {
- display_bpp = 16;
- }
- else if (strcmp(argv[i], "-24") == 0) {
- display_bpp = 24;
- }
- else if (strcmp(argv[i], "-32") == 0) {
- display_bpp = 32;
- }
- }
-
- GP_SetDebugLevel(10);
-
- if ((bitmap = GP_LoadImage(argv[1], NULL)) == NULL) {
- fprintf(stderr, "Failed to load bitmap: %sn", strerror(errno));
- return 1;
- }
-
- /* Initialize SDL */
- if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) {
- fprintf(stderr, "Could not initialize SDL: %sn", SDL_GetError());
- return 1;
- }
-
- /* Create a window with a software back surface */
- display = SDL_SetVideoMode(bitmap->w, bitmap->h, display_bpp, SDL_SWSURFACE);
- if (display == NULL) {
- fprintf(stderr, "Could not open display: %sn", SDL_GetError());
- goto fail;
- }
-
- GP_SDL_ContextFromSurface(&context, display);
-
- GP_Blit(bitmap, 0, 0, bitmap->w, bitmap->h, &context, 0, 0);
- SDL_Flip(display);
-
- event_loop();
-
- SDL_Quit();
- return 0;
-fail:
- SDL_Quit();
- return 1;
-}
-
-----------------------------------------------------------------------
Summary of changes:
tests/SDL/Makefile | 2 +-
tests/SDL/showimage.c | 127 -------------------------------------------------
2 files changed, 1 insertions(+), 128 deletions(-)
delete mode 100644 tests/SDL/showimage.c
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos(a)gmail.com
if you want to unsubscribe, or site admin admin(a)repo.or.cz if you receive
no reply.
--
gfxprim.git ("A simple 2D graphics library with emphasis on correctness and well-defined operation.")
1
0
[repo.or.cz] gfxprim.git branch master updated: a9450959b372c0d3c47b09b1714c7563808756ee
by metan 10 Aug '12
by metan 10 Aug '12
10 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via a9450959b372c0d3c47b09b1714c7563808756ee (commit)
via e53339e37a3317890519f1cce213d9af4165997b (commit)
via 08617b71bbfd0c8e85eb7201a9e65ed227b711ae (commit)
from 1cb6c5439748776bff0baa03e9be4d5ceea9dbbc (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/a9450959b372c0d3c47b09b1714c75638087…
commit a9450959b372c0d3c47b09b1714c7563808756ee
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Fri Aug 10 19:56:26 2012 +0200
tests: Port fileview to backends.
diff --git a/demos/c_simple/Makefile b/demos/c_simple/Makefile
index 99af986..2c03ec8 100644
--- a/demos/c_simple/Makefile
+++ b/demos/c_simple/Makefile
@@ -8,7 +8,8 @@ LDLIBS+=-lrt `$(TOPDIR)/gfxprim-config --libs --libs-backends`
APPS=backend_example loaders_example loaders filters_symmetry gfx_koch virtual_backend_example meta_data meta_data_dump tmp_file showimage- v4l2_show v4l2_grab convolution weighted_median shapetest koch input
+ v4l2_show v4l2_grab convolution weighted_median shapetest koch input+ fileview
v4l2_show: LDLIBS+=-lGP_grabbers
v4l2_grab: LDLIBS+=-lGP_grabbers
diff --git a/tests/SDL/fileview.c b/demos/c_simple/fileview.c
similarity index 70%
rename from tests/SDL/fileview.c
rename to demos/c_simple/fileview.c
index d1c8008..66c2925 100644
--- a/tests/SDL/fileview.c
+++ b/demos/c_simple/fileview.c
@@ -25,13 +25,12 @@
#include <stdio.h>
#include <stdlib.h>
-#include <SDL/SDL.h>
+#include <string.h>
#include "GP.h"
-#include "GP_SDL.h"
-SDL_Surface *display = NULL;
-GP_Context context;
+static GP_Context *win;
+static GP_Backend *backend;
static GP_Pixel white_pixel, gray_pixel, dark_gray_pixel, black_pixel,
red_pixel, blue_pixel;
@@ -52,9 +51,7 @@ struct FileLine *last_line = NULL;
void redraw_screen(void)
{
- SDL_LockSurface(display);
-
- GP_Fill(&context, gray_pixel);
+ GP_Fill(win, gray_pixel);
GP_TextStyle style = GP_DEFAULT_TEXT_STYLE;
@@ -83,15 +80,13 @@ void redraw_screen(void)
struct FileLine *line = first_line;
unsigned int i;
- for (i = 0; i < context.h/GP_TextHeight(&style); i++) {
+ for (i = 0; i < win->h/GP_TextHeight(&style); i++) {
if (line == NULL)
break;
- GP_Text(&context, &style, 16, 16 + (1.0 * GP_TextHeight(&style))*i,
+ GP_Text(win, &style, 16, 16 + (1.0 * GP_TextHeight(&style))*i,
align, black_pixel, gray_pixel, line->text);
line = line->next;
}
-
- SDL_UnlockSurface(display);
}
static void warp_up(int lines)
@@ -101,7 +96,7 @@ static void warp_up(int lines)
first_line = first_line->prev;
redraw_screen();
- SDL_Flip(display);
+ GP_BackendFlip(backend);
}
static void warp_down(int lines)
@@ -111,63 +106,65 @@ static void warp_down(int lines)
first_line = first_line->next;
redraw_screen();
- SDL_Flip(display);
+ GP_BackendFlip(backend);
}
void event_loop(void)
{
- SDL_Event event;
-
- while (SDL_WaitEvent(&event) > 0) {
- switch (event.type) {
-
- case SDL_VIDEOEXPOSE:
- redraw_screen();
- SDL_Flip(display);
- break;
-
- case SDL_KEYDOWN:
- switch (event.key.keysym.sym) {
- case SDLK_SPACE:
+ GP_Event ev;
+
+ while (GP_EventGet(&ev)) {
+ switch (ev.type) {
+ case GP_EV_KEY:
+ if (ev.code != GP_EV_KEY_DOWN)
+ continue;
+
+ switch (ev.val.key.key) {
+ case GP_KEY_SPACE:
if (font)
font_flag = (font_flag + 1) % 3;
else
font_flag = (font_flag + 1) % 2;
redraw_screen();
- SDL_Flip(display);
+ GP_BackendFlip(backend);
break;
- case SDLK_RIGHT:
+ case GP_KEY_RIGHT:
tracking++;
redraw_screen();
- SDL_Flip(display);
+ GP_BackendFlip(backend);
break;
- case SDLK_LEFT:
+ case GP_KEY_LEFT:
tracking--;
redraw_screen();
- SDL_Flip(display);
+ GP_BackendFlip(backend);
break;
- case SDLK_ESCAPE:
- return;
- case SDLK_UP:
+ case GP_KEY_UP:
warp_up(1);
break;
- case SDLK_PAGEUP:
- warp_up(29);
- break;
- case SDLK_DOWN:
+ case GP_KEY_DOWN:
warp_down(1);
break;
- case SDLK_PAGEDOWN:
- warp_down(29);
+ case GP_KEY_PAGE_UP:
+ warp_up(30);
break;
- default:
+ case GP_KEY_PAGE_DOWN:
+ warp_down(30);
+ break;
+ case GP_KEY_ESC:
+ GP_BackendExit(backend);
+ exit(0);
+ break;
+ }
+ break;
+ case GP_EV_SYS:
+ switch(ev.code) {
+ case GP_EV_SYS_QUIT:
+ GP_BackendExit(backend);
+ exit(0);
break;
}
break;
-
- case SDL_QUIT:
- return;
}
}
}
@@ -208,52 +205,43 @@ static int read_file_head(const char *filename)
int main(int argc, char *argv[])
{
+ const char *backend_opts = "X11";
+
if (argc == 1) {
fprintf(stderr, "No file specifiedn");
return 1;
}
-
if (argc > 2)
font = GP_FontFaceLoad(argv[2], 0, 16);
if (!read_file_head(argv[1]))
return 1;
+
+ backend = GP_BackendInit(backend_opts, "File View", stderr);
- /* Initialize SDL */
- if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) {
- fprintf(stderr, "Could not initialize SDL: %sn", SDL_GetError());
+ if (backend == NULL) {
+ fprintf(stderr, "Failed to initalize backend '%s'n",
+ backend_opts);
return 1;
}
+
+ win = backend->context;
- /* Create a window with a software back surface */
- display = SDL_SetVideoMode(800, 480, 0, SDL_SWSURFACE);
- if (display == NULL) {
- fprintf(stderr, "Could not open display: %sn", SDL_GetError());
- goto fail;
- }
-
- /* Initialize a GP context from the SDL display */
- GP_SDL_ContextFromSurface(&context, display);
-
- /* Load colors suitable for the display */
- white_pixel = GP_ColorToContextPixel(GP_COL_WHITE, &context);
- gray_pixel = GP_ColorToContextPixel(GP_COL_GRAY_LIGHT, &context);
- dark_gray_pixel = GP_ColorToContextPixel(GP_COL_GRAY_DARK, &context);
- black_pixel = GP_ColorToContextPixel(GP_COL_BLACK, &context);
- red_pixel = GP_ColorToContextPixel(GP_COL_RED, &context);
- blue_pixel = GP_ColorToContextPixel(GP_COL_BLUE, &context);
+ white_pixel = GP_ColorToContextPixel(GP_COL_WHITE, win);
+ gray_pixel = GP_ColorToContextPixel(GP_COL_GRAY_LIGHT, win);
+ dark_gray_pixel = GP_ColorToContextPixel(GP_COL_GRAY_DARK, win);
+ black_pixel = GP_ColorToContextPixel(GP_COL_BLACK, win);
+ red_pixel = GP_ColorToContextPixel(GP_COL_RED, win);
+ blue_pixel = GP_ColorToContextPixel(GP_COL_BLUE, win);
redraw_screen();
- SDL_Flip(display);
-
- event_loop();
+ GP_BackendFlip(backend);
+
+ for (;;) {
+ GP_BackendWait(backend);
+ event_loop();
+ }
- SDL_Quit();
return 0;
-
-fail:
- SDL_Quit();
- return 1;
}
-
diff --git a/demos/c_simple/shapetest.c b/demos/c_simple/shapetest.c
index ef33b04..702b210 100644
--- a/demos/c_simple/shapetest.c
+++ b/demos/c_simple/shapetest.c
@@ -398,7 +398,7 @@ void event_loop(void)
switch(ev.code) {
case GP_EV_SYS_QUIT:
GP_BackendExit(backend);
- exit(1);
+ exit(0);
break;
}
break;
diff --git a/tests/SDL/Makefile b/tests/SDL/Makefile
index 4455172..6f83335 100644
--- a/tests/SDL/Makefile
+++ b/tests/SDL/Makefile
@@ -7,7 +7,7 @@ LDLIBS+=-lGP -L$(TOPDIR)/build/ -lGP_SDL -lSDL
ifeq ($(HAVE_LIBSDL),yes)
CSOURCES=$(shell echo *.c)
-APPS=pixeltest fileview fonttest linetest randomshapetest+APPS=pixeltest fonttest linetest randomshapetest symbolstest textaligntest trianglefps blittest subcontext showimage aatest mixpixeltest
endif
http://repo.or.cz/w/gfxprim.git/commit/e53339e37a3317890519f1cce213d9af4165…
commit e53339e37a3317890519f1cce213d9af4165997b
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Fri Aug 10 19:38:29 2012 +0200
tests: Remove another obsolete tests.
diff --git a/tests/filters/Makefile b/tests/filters/Makefile
deleted file mode 100644
index 7e43d98..0000000
--- a/tests/filters/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-TOPDIR=../..
-
-CSOURCES=$(shell echo *.c)
-
-INCLUDE=filters loaders
-LDLIBS+=-lGP -L$(TOPDIR)/build/
-
-APPS=PGM_rotate rotate_test
-
-include $(TOPDIR)/include.mk
-include $(TOPDIR)/app.mk
diff --git a/tests/filters/PGM_rotate.c b/tests/filters/PGM_rotate.c
deleted file mode 100644
index de7abf1..0000000
--- a/tests/filters/PGM_rotate.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*****************************************************************************
- * This file is part of gfxprim library. *
- * *
- * Gfxprim 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. *
- * *
- * Gfxprim is distributed in the hope that 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 gfxprim; if not, write to the Free Software *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
- * Boston, MA 02110-1301 USA *
- * *
- * Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
- * <jiri.bluebear.dluhos(a)gmail.com> *
- * *
- * Copyright (C) 2009-2010 Cyril Hrubis <metan(a)ucw.cz> *
- * *
- *****************************************************************************/
-
-#include <GP.h>
-#include <GP_PGM.h>
-#include <GP_Rotate.h>
-
-int main(int argc, char *argv[])
-{
- GP_Context *context, *copy;
-
- if (argc < 2)
- fprintf(stderr, "Takes one parameter, filenamen");
-
- if (GP_LoadPGM(argv[1], &context)) {
- fprintf(stderr, "Can't load contextn");
- return 1;
- }
-
- printf("Loaded PGM %u bpp w %u h %u, bpr %un",
- context->bpp, context->w, context->h, context->bytes_per_row);
-
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
- GP_MirrorH(copy);
-
- if (GP_SavePGM("test-mh.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
-
- GP_MirrorV(copy);
-
- if (GP_SavePGM("test-mv.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
-
- GP_RotateCW(copy);
-
- if (GP_SavePGM("test-cw.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
-
- GP_RotateCCW(copy);
-
- if (GP_SavePGM("test-ccw.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- GP_ContextFree(context);
-
- return 0;
-}
diff --git a/tests/filters/rotate_test.c b/tests/filters/rotate_test.c
deleted file mode 100644
index aacb235..0000000
--- a/tests/filters/rotate_test.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/*****************************************************************************
- * This file is part of gfxprim library. *
- * *
- * Gfxprim 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. *
- * *
- * Gfxprim is distributed in the hope that 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 gfxprim; if not, write to the Free Software *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
- * Boston, MA 02110-1301 USA *
- * *
- * Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
- * <jiri.bluebear.dluhos(a)gmail.com> *
- * *
- * Copyright (C) 2009-2010 Cyril Hrubis <metan(a)ucw.cz> *
- * *
- *****************************************************************************/
-
-#include <GP.h>
-#include <GP_PGM.h>
-#include <GP_Rotate.h>
-
-#define W 221
-#define H 160
-
-int main(void)
-{
- int i;
-
- GP_Context *context = GP_ContextAlloc(W, H, GP_PIXEL_G2), *copy;
-
- if (context == NULL) {
- fprintf(stderr, "Couldn't allocate contextn");
- return 1;
- }
-
- for (i = 0; i < 20; i++)
- GP_HLineXYW(context, 0, i, i, 3);
-
- for (i = 0; i < 20; i++)
- GP_HLineXYW(context, 1, i + 20, i, 2);
-
- for (i = 0; i < 20; i++)
- GP_HLineXYW(context, 2, i + 40, i, 1);
-
- for (i = 0; i < 20; i++)
- GP_HLineXYW(context, 3, i + 60, i, 3);
-
- for (i = 0; i < 20; i++)
- GP_HLineXYW(context, 4, i + 80, i, 2);
-
- GP_Line(context, 0, 0, W, H, 3);
- GP_Line(context, 0, H, W, 0, 3);
-
- GP_FillCircle(context, W/2, H/2, 19, 3);
- GP_FillCircle(context, W/2, H/2, 7, 2);
- GP_FillCircle(context, W/2, H/2, 5, 1);
- GP_FillCircle(context, W/2, H/2, 2, 0);
- GP_Text(context, NULL, 60, 10, GP_VALIGN_BELOW | GP_ALIGN_RIGHT, "Test", 3);
- GP_Text(context, NULL, 60, 20, GP_VALIGN_BELOW | GP_ALIGN_RIGHT, "Test", 2);
- GP_Text(context, NULL, 60, 30, GP_VALIGN_BELOW | GP_ALIGN_RIGHT, "Test", 1);
-
- if (GP_SavePGM("test.pgm", context)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
- GP_MirrorH(copy);
-
- if (GP_SavePGM("test-mh.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
-
- GP_MirrorV(copy);
-
- if (GP_SavePGM("test-mv.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
-
- GP_RotateCW(copy);
-
- if (GP_SavePGM("test-cw.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
-
- GP_RotateCCW(copy);
-
- if (GP_SavePGM("test-ccw.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- GP_ContextFree(context);
-
- return 0;
-}
diff --git a/tests/filters/runtest.sh b/tests/filters/runtest.sh
deleted file mode 100755
index 3d8bf71..0000000
--- a/tests/filters/runtest.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-#
-# Run dynamically linked test.
-#
-
-PROG="$1"
-shift
-
-echo "LD_LIBRARY_PATH=../:../../core/:../../loaders/ ./$PROG $@"
-LD_LIBRARY_PATH="../:../../core/:../../loaders/" ./$PROG $@
diff --git a/tests/filters/test-big.pgm b/tests/filters/test-big.pgm
deleted file mode 100644
index 6a8f07f..0000000
--- a/tests/filters/test-big.pgm
+++ /dev/null
@@ -1,480004 +0,0 @@
-P2
-800 600
-255
-# CREATOR: GIMP PNM Filter Version 1.1
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-238
-238
-238
-238
-238
-238
-230
-230
-230
-230
-230
-230
-230
-230
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-238
-238
-238
-238
-238
-238
-238
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-238
-238
-238
-238
-238
-238
-238
-230
-223
-223
-223
-223
-223
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-238
-238
-238
-238
-238
-238
-238
-230
-230
-213
-202
-213
-213
-202
-132
-213
-223
-223
-223
-230
-230
-230
-230
-230
-230
-230
-230
-230
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
...e-mail trimmed, has been too large.
1
0
[repo.or.cz] gfxprim.git branch master updated: 1cb6c5439748776bff0baa03e9be4d5ceea9dbbc
by metan 10 Aug '12
by metan 10 Aug '12
10 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via 1cb6c5439748776bff0baa03e9be4d5ceea9dbbc (commit)
from 1b13c9d73865b69c4c52c27a5328fd7aea68b805 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/1cb6c5439748776bff0baa03e9be4d5ceea9…
commit 1cb6c5439748776bff0baa03e9be4d5ceea9dbbc
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Fri Aug 10 18:37:58 2012 +0200
pywrap: Add error checks for PXM loaders.
diff --git a/pylib/gfxprim/loaders/loaders.i b/pylib/gfxprim/loaders/loaders.i
index 2e54d41..9561176 100644
--- a/pylib/gfxprim/loaders/loaders.i
+++ b/pylib/gfxprim/loaders/loaders.i
@@ -44,9 +44,14 @@ ERROR_ON_NONZERO(GP_SavePNG);
%include "GP_PNG.h"
-/* TODO: No error checking - legacy GP_RetCode form */
+ERROR_ON_NULL(GP_LoadPBM);
+ERROR_ON_NULL(GP_LoadPGM);
+ERROR_ON_NULL(GP_LoadPPM);
+ERROR_ON_NONZERO(GP_SavePBM);
+ERROR_ON_NONZERO(GP_SavePGM);
+ERROR_ON_NONZERO(GP_SavePPM);
+
%include "GP_PBM.h"
%include "GP_PGM.h"
%include "GP_PPM.h"
-
-----------------------------------------------------------------------
Summary of changes:
pylib/gfxprim/loaders/loaders.i | 9 +++++++--
1 files changed, 7 insertions(+), 2 deletions(-)
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos(a)gmail.com
if you want to unsubscribe, or site admin admin(a)repo.or.cz if you receive
no reply.
--
gfxprim.git ("A simple 2D graphics library with emphasis on correctness and well-defined operation.")
1
0
[repo.or.cz] gfxprim.git branch master updated: 1b13c9d73865b69c4c52c27a5328fd7aea68b805
by metan 10 Aug '12
by metan 10 Aug '12
10 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via 1b13c9d73865b69c4c52c27a5328fd7aea68b805 (commit)
from 4337959cd59402d875d9e155659602c1c549676b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/1b13c9d73865b69c4c52c27a5328fd7aea68…
commit 1b13c9d73865b69c4c52c27a5328fd7aea68b805
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Fri Aug 10 18:25:32 2012 +0200
loaders: Now GP_RetCode free + fixes.
diff --git a/demos/grinder/grinder.c b/demos/grinder/grinder.c
index 5434e65..758804b 100644
--- a/demos/grinder/grinder.c
+++ b/demos/grinder/grinder.c
@@ -238,7 +238,7 @@ static int rotate(GP_Context **c, const char *params)
}
if (res == NULL)
- return GP_ENOMEM;
+ return ENOMEM;
GP_ContextFree(*c);
*c = res;
@@ -408,7 +408,7 @@ static int blur(GP_Context **c, const char *params)
float sigma_y = 0;
if (param_parse(params, blur_params, "blur", param_err, &sigma, &sigma_x, &sigma_y))
- return GP_EINVAL;
+ return EINVAL;
if (sigma > 0) {
sigma_x = sigma;
@@ -983,7 +983,7 @@ static void save_by_fmt(struct GP_Context *bitmap, const char *name, const char
progress_prefix = "Saving Image";
if (!strcmp(fmt, "ppm"))
- ret = GP_SavePPM(name, bitmap, "b");
+ ret = GP_SavePPM(name, bitmap, "b", progress_callback);
else if (!strcmp(fmt, "jpg"))
ret = GP_SaveJPG(bitmap, name, progress_callback);
else if (!strcmp(fmt, "png"))
diff --git a/include/SDL/GP_SDL_Context.h b/include/SDL/GP_SDL_Context.h
index 3963824..af53f54 100644
--- a/include/SDL/GP_SDL_Context.h
+++ b/include/SDL/GP_SDL_Context.h
@@ -27,6 +27,7 @@
#define GP_SDL_CONTEXT_H
#include "GP.h"
+#include "core/GP_RetCode.h"
GP_RetCode GP_SDL_ContextFromSurface(GP_Context *context, SDL_Surface *surf);
diff --git a/include/SDL/GP_SDL_VideoInit.h b/include/SDL/GP_SDL_VideoInit.h
index fbb388d..99927b6 100644
--- a/include/SDL/GP_SDL_VideoInit.h
+++ b/include/SDL/GP_SDL_VideoInit.h
@@ -27,6 +27,7 @@
#define GP_SDL_VIDEOINIT_H
#include "GP.h"
+#include "core/GP_RetCode.h"
GP_RetCode GP_SDL_VideoInit(GP_Context *context, int width, int height,
int argc, char **argv);
diff --git a/include/loaders/GP_Loaders.h b/include/loaders/GP_Loaders.h
index 286e372..ab0f4ef 100644
--- a/include/loaders/GP_Loaders.h
+++ b/include/loaders/GP_Loaders.h
@@ -34,7 +34,6 @@
#include "core/GP_Context.h"
#include "core/GP_ProgressCallback.h"
-#include "core/GP_RetCode.h"
#include "GP_PBM.h"
#include "GP_PGM.h"
diff --git a/include/loaders/GP_PGM.h b/include/loaders/GP_PGM.h
index 54fd546..f949cde 100644
--- a/include/loaders/GP_PGM.h
+++ b/include/loaders/GP_PGM.h
@@ -19,18 +19,19 @@
* Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
* <jiri.bluebear.dluhos(a)gmail.com> *
* *
- * Copyright (C) 2009-2010 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
-#ifndef GP_PGM_H
-#define GP_PGM_H
+#ifndef LOADERS_GP_PGM_H
+#define LOADERS_GP_PGM_H
#include "core/GP_Context.h"
-#include "core/GP_RetCode.h"
-GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res);
+GP_Context *GP_LoadPGM(const char *src_path,
+ GP_ProgressCallback *callback);
-GP_RetCode GP_SavePGM(const char *res_path, GP_Context *src);
+int GP_SavePGM(const char *res_path, GP_Context *src,
+ GP_ProgressCallback *callback);
-#endif /* GP_PGM_H */
+#endif /* LOADERS_GP_PGM_H */
diff --git a/include/loaders/GP_PPM.h b/include/loaders/GP_PPM.h
index b7d71d7..4ac1bf1 100644
--- a/include/loaders/GP_PPM.h
+++ b/include/loaders/GP_PPM.h
@@ -16,21 +16,22 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301 USA *
* *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
-#ifndef GP_PPM_H
-#define GP_PPM_H
+#ifndef LOADERS_GP_PPM_H
+#define LOADERS_GP_PPM_H
#include "core/GP_Context.h"
-#include "core/GP_RetCode.h"
+#include "core/GP_ProgressCallback.h"
-GP_RetCode GP_LoadPPM(const char *src_path, GP_Context **res);
+GP_Context *GP_LoadPPM(const char *src_path, GP_ProgressCallback *callback);
/*
* The fmt may be either "a" for ASCII or "b" for BINARY.
*/
-GP_RetCode GP_SavePPM(const char *res_path, GP_Context *src, char *fmt);
+int GP_SavePPM(const char *res_path, GP_Context *src, char *fmt,
+ GP_ProgressCallback *callback);
-#endif /* GP_PPM_H */
+#endif /* LOADERS_GP_PPM_H */
diff --git a/libs/loaders/GP_Loaders.c b/libs/loaders/GP_Loaders.c
index 3d19e1a..5700aa4 100644
--- a/libs/loaders/GP_Loaders.c
+++ b/libs/loaders/GP_Loaders.c
@@ -37,7 +37,6 @@
GP_Context *GP_LoadImage(const char *src_path, GP_ProgressCallback *callback)
{
int len, saved_errno;
- GP_Context *res = NULL;
if (access(src_path, R_OK)) {
@@ -96,19 +95,16 @@ GP_Context *GP_LoadImage(const char *src_path, GP_ProgressCallback *callback)
break;
case 'g':
case 'G':
- //TODO: Fix this!!!
if (src_path[len - 3] == 'p' ||
src_path[len - 3] == 'P') {
- GP_LoadPGM(src_path, &res);
- return res;
+ return GP_LoadPGM(src_path, callback);
}
break;
case 'p':
case 'P':
if (src_path[len - 3] == 'p' ||
src_path[len - 3] == 'P') {
- GP_LoadPPM(src_path, &res);
- return res;
+ return GP_LoadPPM(src_path, callback);
}
break;
}
diff --git a/libs/loaders/GP_PGM.c b/libs/loaders/GP_PGM.c
index 1e0d10f..9ae8c64 100644
--- a/libs/loaders/GP_PGM.c
+++ b/libs/loaders/GP_PGM.c
@@ -19,7 +19,7 @@
* Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
* <jiri.bluebear.dluhos(a)gmail.com> *
* *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
@@ -71,17 +71,22 @@ static void try_read_comments(FILE *f)
ungetc(c1, f);
}
-GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res)
+GP_Context *GP_LoadPGM(const char *src_path, GP_ProgressCallback *callback)
{
- FILE *f = fopen(src_path, "r");
+ FILE *f;
+ GP_Context *ret;
uint32_t w, h, gray;
GP_PixelType type;
char h1, h2;
+ int err = EIO;
+
+ f = fopen(src_path, "r");
if (f == NULL) {
+ err = errno;
GP_DEBUG(1, "Failed to open file '%s': %s",
src_path, strerror(errno));
- return GP_EBADFILE;
+ goto err0;
}
h1 = fgetc(f);
@@ -91,12 +96,14 @@ GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res)
GP_DEBUG(1, "Invalid PGM header '%c%c' (0x%2x 0x%2x)",
isprint(h1) ? h1 : ' ', isprint(h2) ? h2 : ' ',
h1, h2);
+ err = EINVAL;
goto err1;
}
try_read_comments(f);
if (fscanf(f, "%"PRIu32, &w) < 1) {
+ err = errno;
GP_DEBUG(1, "Failed to read PGM header width");
goto err1;
}
@@ -104,6 +111,7 @@ GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res)
try_read_comments(f);
if (fscanf(f, "%"PRIu32, &h) < 1) {
+ err = errno;
GP_DEBUG(1, "Failed to read PGM header height");
goto err1;
}
@@ -111,6 +119,7 @@ GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res)
try_read_comments(f);
if (fscanf(f, "%"PRIu32, &gray) < 1) {
+ err = errno;
GP_DEBUG(1, "Failed to read PGM header gray");
goto err1;
}
@@ -129,46 +138,55 @@ GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res)
type = GP_PIXEL_G8;
break;
default:
+ GP_DEBUG(1, "Invalid number of grays %u", gray);
+ err = EINVAL;
goto err1;
}
- *res = GP_ContextAlloc(w, h, type);
+ ret = GP_ContextAlloc(w, h, type);
- if (res == NULL)
+ if (ret == NULL) {
+ err = ENOMEM;
goto err1;
+ }
+ //TODO: errno here
switch (gray) {
case 1:
- if (GP_PXMLoad1bpp(f, *res))
+ if (GP_PXMLoad1bpp(f, ret))
goto err2;
break;
case 3:
- if (GP_PXMLoad2bpp(f, *res))
+ if (GP_PXMLoad2bpp(f, ret))
goto err2;
break;
case 15:
- if (GP_PXMLoad4bpp(f, *res))
+ if (GP_PXMLoad4bpp(f, ret))
goto err2;
break;
case 255:
- if (GP_PXMLoad8bpp(f, *res))
+ if (GP_PXMLoad8bpp(f, ret))
goto err2;
break;
}
fclose(f);
- return GP_ESUCCESS;
+ return ret;
err2:
- free(*res);
+ GP_ContextFree(ret);
err1:
fclose(f);
- return GP_EBADFILE;
+err0:
+ errno = err;
+ return NULL;
}
-GP_RetCode GP_SavePGM(const char *res_path, GP_Context *src)
+int GP_SavePGM(const char *res_path, GP_Context *src,
+ GP_ProgressCallback *callback)
{
FILE *f;
uint32_t gray;
+ int err = EIO;
switch (src->pixel_type) {
case GP_PIXEL_G1:
@@ -184,44 +202,56 @@ GP_RetCode GP_SavePGM(const char *res_path, GP_Context *src)
gray = 255;
break;
default:
- return GP_ENOIMPL;
+ GP_DEBUG(1, "Invalid pixel type '%s'",
+ GP_PixelTypeName(src->pixel_type));
+ errno = EINVAL;
+ return 1;
}
f = fopen(res_path, "w");
if (f == NULL) {
+ err = errno;
GP_DEBUG(1, "Failed to open file '%s': %s",
res_path, strerror(errno));
- return GP_EBADFILE;
+ goto err0;
}
if (fprintf(f, "P2n%u %un%un# Generated by gfxprimn",
(unsigned int) src->w, (unsigned int) src->h, gray) < 3)
- goto err;
+ goto err1;
+ //TODO: errno
switch (gray) {
case 1:
if (GP_PXMSave1bpp(f, src))
- goto err;
+ goto err1;
break;
case 3:
if (GP_PXMSave2bpp(f, src))
- goto err;
+ goto err1;
break;
//TODO
case 255:
if (GP_PXMSave8bpp(f, src))
- goto err;
+ goto err1;
break;
default:
- return GP_ENOIMPL;
+ err = ENOSYS;
+ goto err1;
}
- if (fclose(f))
- return GP_EBADFILE;
+ if (fclose(f)) {
+ err = errno;
+ GP_DEBUG(1, "Failed to close file '%s': %s",
+ res_path, strerror(errno));
+ goto err0;
+ }
- return GP_ESUCCESS;
-err:
+ return 0;
+err1:
fclose(f);
- return GP_EBADFILE;
+err0:
+ errno = err;
+ return 1;
}
diff --git a/libs/loaders/GP_PPM.c b/libs/loaders/GP_PPM.c
index 13a0fa3..04dc472 100644
--- a/libs/loaders/GP_PPM.c
+++ b/libs/loaders/GP_PPM.c
@@ -16,7 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301 USA *
* *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
@@ -64,51 +64,61 @@ int load_binary_ppm(FILE *f, uint32_t depth __attribute__((unused)),
return 0;
}
-GP_RetCode GP_LoadPPM(const char *src_path, GP_Context **res)
+GP_Context *GP_LoadPPM(const char *src_path, GP_ProgressCallback *callback)
{
uint32_t w, h, depth;
char fmt;
FILE *f;
+ GP_Context *ret;
+ int err;
f = GP_ReadPNM(src_path, &fmt, &w, &h, &depth);
- if (f == NULL)
- return GP_EBADFILE;
+ if (f == NULL) {
+ err = errno;
+ goto err0;
+ }
if (fmt != '3' && fmt != '6') {
GP_DEBUG(1, "Asked to load PPM but header is 'P%c'", fmt);
+ err = EINVAL;
goto err1;
}
if (depth != 255) {
GP_DEBUG(1, "Unsupported depth %"PRIu32, depth);
+ err = ENOSYS;
goto err1;
}
- *res = GP_ContextAlloc(w, h, GP_PIXEL_RGB888);
+ ret = GP_ContextAlloc(w, h, GP_PIXEL_RGB888);
- if (res == NULL)
+ if (ret == NULL) {
+ err = ENOMEM;
goto err1;
+ }
switch (fmt) {
case '3':
//TODO
- fclose(f);
- free(res);
- return GP_ENOIMPL;
+ err = ENOSYS;
+ goto err2;
case '6':
- if (load_binary_ppm(f, depth, *res))
+ //TODO: errno
+ if (load_binary_ppm(f, depth, ret))
goto err2;
break;
}
fclose(f);
- return GP_ESUCCESS;
+ return ret;
err2:
- free(*res);
+ GP_ContextFree(ret);
err1:
fclose(f);
- return GP_EBADFILE;
+err0:
+ errno = err;
+ return NULL;
}
static int write_binary_ppm(FILE *f, GP_Context *src)
@@ -130,18 +140,23 @@ static int write_binary_ppm(FILE *f, GP_Context *src)
return 0;
}
-GP_RetCode GP_SavePPM(const char *res_path, GP_Context *src, char *fmt)
+int GP_SavePPM(const char *res_path, GP_Context *src, char *fmt,
+ GP_ProgressCallback *callback)
{
char hfmt;
FILE *f;
+ int err;
- if (src->pixel_type != GP_PIXEL_RGB888)
- return GP_ENOIMPL;
+ if (src->pixel_type != GP_PIXEL_RGB888) {
+ errno = EINVAL;
+ return 1;
+ }
switch (*fmt) {
/* ASCII */
case 'a':
- return GP_ENOIMPL;
+ errno = ENOSYS;
+ return 1;
break;
/* binary */
case 'b':
@@ -150,22 +165,32 @@ GP_RetCode GP_SavePPM(const char *res_path, GP_Context *src, char *fmt)
src->w, src->h, res_path);
break;
default:
- return GP_ENOIMPL;
+ errno = EINVAL;
+ return 1;
}
f = GP_WritePNM(res_path, hfmt, src->w, src->h, 255);
-
+
+ if (f == NULL)
+ return 1;
+
if (write_binary_ppm(f, src)) {
GP_DEBUG(1, "Failed to write buffer");
- fclose(f);
- return GP_EBADFILE;
+ err = EIO;
+ goto err1;
}
if (fclose(f) < 0) {
+ err = errno;
GP_DEBUG(1, "Failed to close file '%s' : %s",
res_path, strerror(errno));
- return GP_EBADFILE;
+ goto err0;
}
- return GP_ESUCCESS;
+ return 0;
+err1:
+ fclose(f);
+err0:
+ errno = err;
+ return 1;
}
diff --git a/libs/loaders/GP_PXMCommon.c b/libs/loaders/GP_PXMCommon.c
index 0add2f0..48bc361 100644
--- a/libs/loaders/GP_PXMCommon.c
+++ b/libs/loaders/GP_PXMCommon.c
@@ -19,7 +19,7 @@
* Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
* <jiri.bluebear.dluhos(a)gmail.com> *
* *
- * Copyright (C) 2009-2010 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
@@ -46,7 +46,7 @@ static int read_comment(FILE *f)
}
}
-GP_RetCode GP_PXMLoad1bpp(FILE *f, GP_Context *context)
+int GP_PXMLoad1bpp(FILE *f, GP_Context *context)
{
uint8_t *pixel = context->pixels;
uint32_t x, y;
@@ -58,10 +58,10 @@ GP_RetCode GP_PXMLoad1bpp(FILE *f, GP_Context *context)
while (run) {
switch (fgetc(f)) {
case EOF:
- return GP_EBADFILE;
+ return EIO;
case '#':
if (read_comment(f))
- return GP_EBADFILE;
+ return EIO;
break;
case '0':
*pixel &= ~(0x80>>(x%8));
@@ -86,10 +86,10 @@ GP_RetCode GP_PXMLoad1bpp(FILE *f, GP_Context *context)
pixel++;
}
- return GP_ESUCCESS;
+ return 0;
}
-GP_RetCode GP_PXMLoad2bpp(FILE *f, GP_Context *context)
+int GP_PXMLoad2bpp(FILE *f, GP_Context *context)
{
uint8_t *pixel = context->pixels;
uint32_t x, y;
@@ -101,10 +101,10 @@ GP_RetCode GP_PXMLoad2bpp(FILE *f, GP_Context *context)
while (run) {
switch (fgetc(f)) {
case EOF:
- return GP_EBADFILE;
+ return EIO;
case '#':
if (read_comment(f))
- return GP_EBADFILE;
+ return EIO;
break;
case '0':
*pixel &= ~(0xc0>>(2*(x%4)));
@@ -139,10 +139,10 @@ GP_RetCode GP_PXMLoad2bpp(FILE *f, GP_Context *context)
pixel++;
}
- return GP_ESUCCESS;
+ return 0;
}
-GP_RetCode GP_PXMLoad4bpp(FILE *f, GP_Context *context)
+int GP_PXMLoad4bpp(FILE *f, GP_Context *context)
{
uint8_t *pixel = context->pixels;
uint32_t x, y;
@@ -156,10 +156,10 @@ GP_RetCode GP_PXMLoad4bpp(FILE *f, GP_Context *context)
while (run) {
switch (fgetc(f)) {
case EOF:
- return GP_EBADFILE;
+ return EIO;
case '#':
if (read_comment(f))
- return GP_EBADFILE;
+ return EIO;
break;
case '1':
ch = fgetc(f);
@@ -185,10 +185,10 @@ GP_RetCode GP_PXMLoad4bpp(FILE *f, GP_Context *context)
pixel++;
}
- return GP_ESUCCESS;
+ return 0;
}
-GP_RetCode GP_PXMLoad8bpp(FILE *f, GP_Context *context)
+int GP_PXMLoad8bpp(FILE *f, GP_Context *context)
{
uint8_t *pixel = context->pixels;
uint32_t x, y;
@@ -202,10 +202,10 @@ GP_RetCode GP_PXMLoad8bpp(FILE *f, GP_Context *context)
while (run) {
switch (ch = fgetc(f)) {
case EOF:
- return GP_EBADFILE;
+ return EIO;
case '#':
if (read_comment(f))
- return GP_EBADFILE;
+ return EIO;
break;
case '1' ... '9':
val = ch - '0';
@@ -218,7 +218,7 @@ GP_RetCode GP_PXMLoad8bpp(FILE *f, GP_Context *context)
}
if (val > 255)
- return GP_EBADFILE;
+ return EIO;
case '0':
run = 0;
@@ -233,12 +233,12 @@ GP_RetCode GP_PXMLoad8bpp(FILE *f, GP_Context *context)
}
}
- return GP_ESUCCESS;
+ return 0;
}
#define BITMASK(byte, bit) (!!((byte)&(0x80>>(bit))))
-static GP_RetCode write_line_1bpp(FILE *f, const uint8_t *data, GP_Context *src)
+static int write_line_1bpp(FILE *f, const uint8_t *data, GP_Context *src)
{
uint32_t x, max = src->bytes_per_row;
int ret;
@@ -250,7 +250,7 @@ static GP_RetCode write_line_1bpp(FILE *f, const uint8_t *data, GP_Context *src)
if (x != 0)
if (fprintf(f, " ") < 0)
- return GP_EBADFILE;
+ return EIO;
ret = fprintf(f, "%u %u %u %u %u %u %u %u",
BITMASK(data[x], 0),
@@ -262,26 +262,26 @@ static GP_RetCode write_line_1bpp(FILE *f, const uint8_t *data, GP_Context *src)
BITMASK(data[x], 6),
BITMASK(data[x], 7));
if (ret < 0)
- return GP_EBADFILE;
+ return EIO;
}
for (x = 0; x < (src->w % 8); x++) {
ret = fprintf(f, " %u", BITMASK(data[max], x));
if (ret < 0)
- return GP_EBADFILE;
+ return EIO;
}
if (fprintf(f, "n") < 0)
- return GP_EBADFILE;
+ return EIO;
- return GP_ESUCCESS;
+ return 0;
}
-GP_RetCode GP_PXMSave1bpp(FILE *f, GP_Context *context)
+int GP_PXMSave1bpp(FILE *f, GP_Context *context)
{
uint32_t y;
- GP_RetCode ret;
+ int ret;
for (y = 0; y < context->h; y++) {
ret = write_line_1bpp(f, context->pixels + context->bytes_per_row * y,
@@ -291,12 +291,12 @@ GP_RetCode GP_PXMSave1bpp(FILE *f, GP_Context *context)
return ret;
}
- return GP_ESUCCESS;
+ return 0;
}
#define MASK_2BPP(byte, pix) (0x03 & (byte>>((3 - pix)<<1)))
-static GP_RetCode write_line_2bpp(FILE *f, const uint8_t *data, GP_Context *src)
+static int write_line_2bpp(FILE *f, const uint8_t *data, GP_Context *src)
{
uint32_t x, max = src->bytes_per_row;
int ret;
@@ -308,7 +308,7 @@ static GP_RetCode write_line_2bpp(FILE *f, const uint8_t *data, GP_Context *src)
if (x != 0)
if (fprintf(f, " ") < 0)
- return GP_EBADFILE;
+ return EIO;
ret = fprintf(f, "%u %u %u %u",
MASK_2BPP(data[x], 0),
@@ -316,26 +316,26 @@ static GP_RetCode write_line_2bpp(FILE *f, const uint8_t *data, GP_Context *src)
MASK_2BPP(data[x], 2),
MASK_2BPP(data[x], 3));
if (ret < 0)
- return GP_EBADFILE;
+ return EIO;
}
for (x = 0; x < (src->w % 4); x++) {
ret = fprintf(f, " %u", MASK_2BPP(data[max], x));
if (ret < 0)
- return GP_EBADFILE;
+ return EIO;
}
if (fprintf(f, "n") < 0)
- return GP_EBADFILE;
+ return EIO;
- return GP_ESUCCESS;
+ return EIO;
}
-GP_RetCode GP_PXMSave2bpp(FILE *f, GP_Context *context)
+int GP_PXMSave2bpp(FILE *f, GP_Context *context)
{
uint32_t y;
- GP_RetCode ret;
+ int ret;
for (y = 0; y < context->h; y++) {
ret = write_line_2bpp(f, context->pixels + context->bytes_per_row * y,
@@ -345,10 +345,10 @@ GP_RetCode GP_PXMSave2bpp(FILE *f, GP_Context *context)
return ret;
}
- return GP_ESUCCESS;
+ return EIO;
}
-static GP_RetCode write_line_8bpp(FILE *f, const uint8_t *data, GP_Context *src)
+static int write_line_8bpp(FILE *f, const uint8_t *data, GP_Context *src)
{
uint32_t x;
int ret;
@@ -357,24 +357,24 @@ static GP_RetCode write_line_8bpp(FILE *f, const uint8_t *data, GP_Context *src)
if (x != 0)
if (fprintf(f, " ") < 0)
- return GP_EBADFILE;
+ return EIO;
ret = fprintf(f, "%u", data[x]);
if (ret < 0)
- return GP_EBADFILE;
+ return EIO;
}
if (fprintf(f, "n") < 0)
- return GP_EBADFILE;
+ return EIO;
- return GP_ESUCCESS;
+ return 0;
}
-GP_RetCode GP_PXMSave8bpp(FILE *f, GP_Context *context)
+int GP_PXMSave8bpp(FILE *f, GP_Context *context)
{
uint32_t y;
- GP_RetCode ret;
+ int ret;
for (y = 0; y < context->h; y++) {
ret = write_line_8bpp(f, context->pixels + context->bytes_per_row * y,
@@ -384,5 +384,5 @@ GP_RetCode GP_PXMSave8bpp(FILE *f, GP_Context *context)
return ret;
}
- return GP_ESUCCESS;
+ return 0;
}
diff --git a/libs/loaders/GP_PXMCommon.h b/libs/loaders/GP_PXMCommon.h
index 39e7d02..7ed531e 100644
--- a/libs/loaders/GP_PXMCommon.h
+++ b/libs/loaders/GP_PXMCommon.h
@@ -29,30 +29,29 @@
*/
-#ifndef GP_PXM_COMMON_H
-#define GP_PXM_COMMON_H
+#ifndef LOADERS_GP_PXM_COMMON_H
+#define LOADERS_GP_PXM_COMMON_H
#include <stdio.h>
#include "core/GP_Core.h"
-#include "core/GP_RetCode.h"
/*
* Save context to ascii file.
*
* The pixel type is not checked here as these are internal funcitons.
*/
-GP_RetCode GP_PXMSave1bpp(FILE *f, GP_Context *context);
-GP_RetCode GP_PXMSave2bpp(FILE *f, GP_Context *context);
-GP_RetCode GP_PXMSave4bpp(FILE *f, GP_Context *context);
-GP_RetCode GP_PXMSave8bpp(FILE *f, GP_Context *context);
+int GP_PXMSave1bpp(FILE *f, GP_Context *context);
+int GP_PXMSave2bpp(FILE *f, GP_Context *context);
+int GP_PXMSave4bpp(FILE *f, GP_Context *context);
+int GP_PXMSave8bpp(FILE *f, GP_Context *context);
/*
* Load context from ascii file.
*/
-GP_RetCode GP_PXMLoad1bpp(FILE *f, GP_Context *context);
-GP_RetCode GP_PXMLoad2bpp(FILE *f, GP_Context *context);
-GP_RetCode GP_PXMLoad4bpp(FILE *f, GP_Context *context);
-GP_RetCode GP_PXMLoad8bpp(FILE *f, GP_Context *context);
+int GP_PXMLoad1bpp(FILE *f, GP_Context *context);
+int GP_PXMLoad2bpp(FILE *f, GP_Context *context);
+int GP_PXMLoad4bpp(FILE *f, GP_Context *context);
+int GP_PXMLoad8bpp(FILE *f, GP_Context *context);
/*
* Loads image header, returns pointer to FILE* on success, fills image
@@ -65,4 +64,4 @@ FILE *GP_WriteHeaderPNM(const char *dst_path, char *fmt,
uint32_t w, uint32_t h, uint32_t depth);
-#endif /* GP_PXM_COMMON_H */
+#endif /* LOADERS_GP_PXM_COMMON_H */
-----------------------------------------------------------------------
Summary of changes:
demos/grinder/grinder.c | 6 +-
include/SDL/GP_SDL_Context.h | 1 +
include/SDL/GP_SDL_VideoInit.h | 1 +
include/loaders/GP_Loaders.h | 1 -
include/loaders/GP_PGM.h | 15 ++++---
include/loaders/GP_PPM.h | 15 ++++---
libs/loaders/GP_Loaders.c | 8 +---
libs/loaders/GP_PGM.c | 82 +++++++++++++++++++++++++------------
libs/loaders/GP_PPM.c | 71 ++++++++++++++++++++++----------
libs/loaders/GP_PXMCommon.c | 88 ++++++++++++++++++++--------------------
libs/loaders/GP_PXMCommon.h | 23 +++++-----
11 files changed, 182 insertions(+), 129 deletions(-)
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos(a)gmail.com
if you want to unsubscribe, or site admin admin(a)repo.or.cz if you receive
no reply.
--
gfxprim.git ("A simple 2D graphics library with emphasis on correctness and well-defined operation.")
1
0
[repo.or.cz] gfxprim.git branch master updated: 4337959cd59402d875d9e155659602c1c549676b
by metan 10 Aug '12
by metan 10 Aug '12
10 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via 4337959cd59402d875d9e155659602c1c549676b (commit)
via a7ef27e782e440e2c0c0e215e5180d16b4a07b84 (commit)
from c7be9d64e221992b3205a65b1007653b408ba574 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/4337959cd59402d875d9e155659602c1c549…
commit 4337959cd59402d875d9e155659602c1c549676b
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Fri Aug 10 17:16:49 2012 +0200
core,loaders: Continue on removing the GP_RetCode.
diff --git a/include/core/GP_Pixel.h b/include/core/GP_Pixel.h
index 8fb84a2..f40c8a6 100644
--- a/include/core/GP_Pixel.h
+++ b/include/core/GP_Pixel.h
@@ -32,7 +32,6 @@
#include <stdint.h>
#include "GP_Common.h"
-#include "GP_RetCode.h"
#include "GP_FnPerBpp.h"
struct GP_Context;
diff --git a/include/loaders/GP_Loaders.h b/include/loaders/GP_Loaders.h
index ab0f4ef..286e372 100644
--- a/include/loaders/GP_Loaders.h
+++ b/include/loaders/GP_Loaders.h
@@ -34,6 +34,7 @@
#include "core/GP_Context.h"
#include "core/GP_ProgressCallback.h"
+#include "core/GP_RetCode.h"
#include "GP_PBM.h"
#include "GP_PGM.h"
diff --git a/include/loaders/GP_PBM.h b/include/loaders/GP_PBM.h
index 46b8c3e..82cd45b 100644
--- a/include/loaders/GP_PBM.h
+++ b/include/loaders/GP_PBM.h
@@ -19,17 +19,31 @@
* Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
* <jiri.bluebear.dluhos(a)gmail.com> *
* *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
-#ifndef GP_PBM_H
-#define GP_PBM_H
+#ifndef LOADERS_GP_PBM_H
+#define LOADERS_GP_PBM_H
#include "core/GP_Context.h"
+#include "core/GP_ProgressCallback.h"
-GP_RetCode GP_LoadPBM(const char *src_path, GP_Context **res);
+/*
+ * Loads 1-bit Grayscale image from portable bitmap format.
+ */
+GP_Context *GP_LoadPBM(const char *src_path, GP_ProgressCallback *callback);
-GP_RetCode GP_SavePBM(const char *res_path, GP_Context *src);
+/*
+ * Save 1-bit Grayscale image into portable bitmap format.
+ *
+ * On success zero is returned, otherwise non-zero is returned and errno is
+ * filled:
+ *
+ * EINVAL - context pixel type was not 1 bit grayscale.
+ *
+ */
+int GP_SavePBM(const char *res_path, GP_Context *src,
+ GP_ProgressCallback *callback);
-#endif /* GP_PBM_H */
+#endif /* LOADERS_GP_PBM_H */
diff --git a/include/loaders/GP_PGM.h b/include/loaders/GP_PGM.h
index e3420f9..54fd546 100644
--- a/include/loaders/GP_PGM.h
+++ b/include/loaders/GP_PGM.h
@@ -27,6 +27,7 @@
#define GP_PGM_H
#include "core/GP_Context.h"
+#include "core/GP_RetCode.h"
GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res);
diff --git a/include/loaders/GP_PPM.h b/include/loaders/GP_PPM.h
index 8b57e61..b7d71d7 100644
--- a/include/loaders/GP_PPM.h
+++ b/include/loaders/GP_PPM.h
@@ -24,6 +24,7 @@
#define GP_PPM_H
#include "core/GP_Context.h"
+#include "core/GP_RetCode.h"
GP_RetCode GP_LoadPPM(const char *src_path, GP_Context **res);
diff --git a/libs/loaders/GP_Loaders.c b/libs/loaders/GP_Loaders.c
index f298983..3d19e1a 100644
--- a/libs/loaders/GP_Loaders.c
+++ b/libs/loaders/GP_Loaders.c
@@ -89,11 +89,9 @@ GP_Context *GP_LoadImage(const char *src_path, GP_ProgressCallback *callback)
switch (src_path[len - 2]) {
case 'b':
case 'B':
- //TODO: Fix this!!!
if (src_path[len - 3] == 'p' ||
src_path[len - 3] == 'P') {
- GP_LoadPBM(src_path, &res);
- return res;
+ return GP_LoadPBM(src_path, callback);
}
break;
case 'g':
diff --git a/libs/loaders/GP_PBM.c b/libs/loaders/GP_PBM.c
index 5b09153..ac7dc30 100644
--- a/libs/loaders/GP_PBM.c
+++ b/libs/loaders/GP_PBM.c
@@ -19,7 +19,7 @@
* Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
* <jiri.bluebear.dluhos(a)gmail.com> *
* *
- * Copyright (C) 2009-2010 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
@@ -44,17 +44,21 @@
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
+#include <errno.h>
#include "GP_PXMCommon.h"
#include "GP_PBM.h"
-GP_RetCode GP_LoadPBM(const char *src_path, GP_Context **res)
+GP_Context *GP_LoadPBM(const char *src_path, GP_ProgressCallback *callback)
{
- FILE *f = fopen(src_path, "r");
+ FILE *f;
+ GP_Context *ret;
uint32_t w, h;
+ f = fopen(src_path, "r");
+
if (f == NULL)
- return GP_EBADFILE;
+ return NULL;
if (fgetc(f) != 'P' || fgetc(f) != '1')
goto err1;
@@ -62,36 +66,40 @@ GP_RetCode GP_LoadPBM(const char *src_path, GP_Context **res)
if (fscanf(f, "%"PRIu32"%"PRIu32, &w, &h) < 2)
goto err1;
- *res = GP_ContextAlloc(w, h, GP_PIXEL_G1);
+ ret = GP_ContextAlloc(w, h, GP_PIXEL_G1);
- if (*res == NULL) {
+ if (ret == NULL) {
fclose(f);
- return GP_ENOMEM;
+ errno = ENOMEM;
+ return NULL;
}
- if (GP_PXMLoad1bpp(f, *res))
+ if (GP_PXMLoad1bpp(f, ret))
goto err2;
fclose(f);
- return GP_ESUCCESS;
+ return ret;
err2:
- free(*res);
+ free(ret);
err1:
fclose(f);
- return GP_EBADFILE;
+ return NULL;
}
-GP_RetCode GP_SavePBM(const char *res_path, GP_Context *src)
+int GP_SavePBM(const char *res_path, GP_Context *src,
+ GP_ProgressCallback *callback)
{
FILE *f;
- if (src->pixel_type != GP_PIXEL_G1)
- return GP_ENOIMPL;
+ if (src->pixel_type != GP_PIXEL_G1) {
+ errno = EINVAL;
+ return 1;
+ }
f = fopen(res_path, "w");
if (f == NULL)
- return GP_EBADFILE;
+ return 1;
if (fprintf(f, "P1n%u %un# Generated by gfxprimn",
(unsigned int) src->w, (unsigned int) src->h) < 2)
@@ -101,10 +109,12 @@ GP_RetCode GP_SavePBM(const char *res_path, GP_Context *src)
goto err;
if (fclose(f))
- return GP_EBADFILE;
+ return 1;
- return GP_ESUCCESS;
+ return 0;
err:
fclose(f);
- return GP_EBADFILE;
+ //TODO: better errors
+ errno = EIO;
+ return 1;
}
diff --git a/libs/loaders/GP_PPM.c b/libs/loaders/GP_PPM.c
index e84b71b..13a0fa3 100644
--- a/libs/loaders/GP_PPM.c
+++ b/libs/loaders/GP_PPM.c
@@ -37,6 +37,7 @@
#include <GP_GetPutPixel.h>
#include "GP_PNM.h"
+#include "GP_PPM.h"
int load_binary_ppm(FILE *f, uint32_t depth __attribute__((unused)),
GP_Context *res)
diff --git a/libs/loaders/GP_PXMCommon.h b/libs/loaders/GP_PXMCommon.h
index 1a3fc04..39e7d02 100644
--- a/libs/loaders/GP_PXMCommon.h
+++ b/libs/loaders/GP_PXMCommon.h
@@ -19,7 +19,7 @@
* Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
* <jiri.bluebear.dluhos(a)gmail.com> *
* *
- * Copyright (C) 2009-2010 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
@@ -34,6 +34,7 @@
#include <stdio.h>
#include "core/GP_Core.h"
+#include "core/GP_RetCode.h"
/*
* Save context to ascii file.
diff --git a/pylib/gfxprim/core/core.i b/pylib/gfxprim/core/core.i
index bfd4649..67777dd 100644
--- a/pylib/gfxprim/core/core.i
+++ b/pylib/gfxprim/core/core.i
@@ -20,7 +20,6 @@ ERROR_ON_NULL(GP_GetCounter);
%include "GP_GetSetBits.h"
%include "GP_Transform.h"
%include "GP_ProgressCallback.h"
-%include "GP_RetCode.h"
/*
http://repo.or.cz/w/gfxprim.git/commit/a7ef27e782e440e2c0c0e215e5180d16b4a0…
commit a7ef27e782e440e2c0c0e215e5180d16b4a07b84
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Fri Aug 10 14:33:55 2012 +0200
tests: Remove obsolete font test.
diff --git a/tests/text/font.test.c b/tests/text/font.test.c
deleted file mode 100644
index 7775ab8..0000000
--- a/tests/text/font.test.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/*****************************************************************************
- * This file is part of gfxprim library. *
- * *
- * Gfxprim 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. *
- * *
- * Gfxprim is distributed in the hope that 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 gfxprim; if not, write to the Free Software *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
- * Boston, MA 02110-1301 USA *
- * *
- * Copyright (C) 2011 Tomas Gavenciak <gavento(a)ucw.cz> *
- * *
- *****************************************************************************/
-
-/*
-
- Font load/save tests.
-
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <GP.h>
-
-#include "GP_Tests.h"
-
-#define FONT_FILE "test_font.tmp"
-
-GP_SUITE(font)
-
-GP_TEST(load_save)
-{
- GP_Font *loaded;
- int dd_size, ld_size;
-
- fail_unless(GP_FontSave(&GP_default_console_font, FONT_FILE) == GP_ESUCCESS);
- fail_unless(GP_FontLoad(&loaded, FONT_FILE) == GP_ESUCCESS);
-
- dd_size = GP_GetFontDataSize(&GP_default_console_font);
- ld_size = GP_GetFontDataSize(loaded);
-
- fail_unless(dd_size == ld_size);
-
- fail_unless(memcmp(GP_default_console_font.data, loaded->data, dd_size) == 0);
-
- /* cleanup */
- fail_unless(unlink(FONT_FILE) == 0);
-}
-GP_ENDTEST
-
-----------------------------------------------------------------------
Summary of changes:
include/core/GP_Pixel.h | 1 -
include/loaders/GP_Loaders.h | 1 +
include/loaders/GP_PBM.h | 26 ++++++++++++++----
include/loaders/GP_PGM.h | 1 +
include/loaders/GP_PPM.h | 1 +
libs/loaders/GP_Loaders.c | 4 +--
libs/loaders/GP_PBM.c | 46 ++++++++++++++++++++-------------
libs/loaders/GP_PPM.c | 1 +
libs/loaders/GP_PXMCommon.h | 3 +-
pylib/gfxprim/core/core.i | 1 -
tests/text/font.test.c | 58 ------------------------------------------
11 files changed, 55 insertions(+), 88 deletions(-)
delete mode 100644 tests/text/font.test.c
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos(a)gmail.com
if you want to unsubscribe, or site admin admin(a)repo.or.cz if you receive
no reply.
--
gfxprim.git ("A simple 2D graphics library with emphasis on correctness and well-defined operation.")
1
0
[repo.or.cz] gfxprim.git branch master updated: c7be9d64e221992b3205a65b1007653b408ba574
by metan 03 Aug '12
by metan 03 Aug '12
03 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via c7be9d64e221992b3205a65b1007653b408ba574 (commit)
via 85ff7a0aeccbddfdd69611f6dd3128162aff6996 (commit)
via e086670095af025857270b996b7a5d2deec42820 (commit)
via 7dc5026aa07022e0b17da3b5fd173eaa900ec3b2 (commit)
via dff4c0ec8bdcc90fab43fe7cc627d8d164cde641 (commit)
from faaba1897920ea54344ca36ec8c6633d0a6ebf1d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/c7be9d64e221992b3205a65b1007653b408b…
commit c7be9d64e221992b3205a65b1007653b408ba574
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Thu Aug 2 16:05:56 2012 +0200
filters: Add gaussian additive noise filter.
diff --git a/demos/grinder/grinder.c b/demos/grinder/grinder.c
index 648e950..5434e65 100644
--- a/demos/grinder/grinder.c
+++ b/demos/grinder/grinder.c
@@ -692,6 +692,27 @@ static int sharpen(GP_Context **c, const char *params)
return 0;
}
+/* gaussian additive noise filter */
+
+static struct param gauss_noise_params[] = {
+ {"sigma", PARAM_FLOAT, "sigma: amount of noise between [0,1]", NULL, NULL},
+ {"mu", PARAM_FLOAT, "mu: offset of noise between [0,1]", NULL, NULL},
+ {NULL, 0, NULL, NULL, NULL}
+};
+
+static int gauss_noise(GP_Context **c, const char *params)
+{
+ float sigma = 0.1;
+ float mu = 0;
+
+ if (param_parse(params, gauss_noise_params, "gaussian noise", param_err, &sigma, &mu))
+ return EINVAL;
+
+ GP_FilterGaussianNoiseAdd(*c, *c, sigma, mu, progress_callback);
+
+ return 0;
+}
+
/* arithmetics */
static const char *arithmetic_ops[] = {
@@ -806,6 +827,7 @@ static struct filter filter_table[] = {
{"median", "median filter", median_params, median},
{"sigma", "sigma (mean) filter", sigma_mean_params, sigma_mean},
{"sharpen", "laplacian edge sharpening", sharpen_params, sharpen},
+ {"gauss_noise", "additive gaussian (normaly distributed) noise", gauss_noise_params, gauss_noise},
{"jpg", "save jpg image", save_jpg_params, save_jpg},
{"png", "save png image", save_png_params, save_png},
{NULL, NULL, NULL, NULL}
diff --git a/include/filters/GP_Filters.h b/include/filters/GP_Filters.h
index e685ec3..cd06035 100644
--- a/include/filters/GP_Filters.h
+++ b/include/filters/GP_Filters.h
@@ -74,4 +74,7 @@
/* Sigma Mean filter */
#include "filters/GP_Sigma.h"
+/* Gaussian noise filter */
+#include "filters/GP_GaussianNoise.h"
+
#endif /* GP_FILTERS_H */
diff --git a/include/filters/GP_GaussianNoise.h b/include/filters/GP_GaussianNoise.h
new file mode 100644
index 0000000..59d9d35
--- /dev/null
+++ b/include/filters/GP_GaussianNoise.h
@@ -0,0 +1,70 @@
+/*****************************************************************************
+ * This file is part of gfxprim library. *
+ * *
+ * Gfxprim 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. *
+ * *
+ * Gfxprim is distributed in the hope that 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 gfxprim; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
+ * Boston, MA 02110-1301 USA *
+ * *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
+ * *
+ *****************************************************************************/
+
+ /*
+
+ Additive Gaussian noise filters.
+
+ The sigma and mu parameters define the noise parameters. The sigma defines
+ amount of randomness, the mu defines offset. Both are defined as a ratio of
+ the particular channel size.
+
+ */
+
+#ifndef GP_FILTERS_GAUSSIAN_NOISE_H
+#define GP_FILTERS_GAUSSIAN_NOISE_H
+
+#include "GP_Filter.h"
+
+int GP_FilterGaussianNoiseAddEx(const GP_Context *src,
+ GP_Coord x_src, GP_Coord y_src,
+ GP_Size w_src, GP_Size h_src,
+ GP_Context *dst,
+ GP_Coord x_dst, GP_Coord y_dst,
+ float sigma, float mu,
+ GP_ProgressCallback *callback);
+
+GP_Context *GP_FilterGaussianNoiseAddExAlloc(const GP_Context *src,
+ GP_Coord x_src, GP_Coord y_src,
+ GP_Size w_src, GP_Size h_src,
+ float sigma, float mu,
+ GP_ProgressCallback *callback);
+
+static inline int GP_FilterGaussianNoiseAdd(const GP_Context *src,
+ GP_Context *dst,
+ float sigma, float mu,
+ GP_ProgressCallback *callback)
+{
+ return GP_FilterGaussianNoiseAddEx(src, 0, 0, src->w, src->h,
+ dst, 0, 0, sigma, mu, callback);
+}
+
+static inline GP_Context *
+GP_FilterGaussianNoiseAddAlloc(const GP_Context *src,
+ float sigma, float mu,
+ GP_ProgressCallback *callback)
+{
+ return GP_FilterGaussianNoiseAddExAlloc(src, 0, 0, src->w, src->h,
+ sigma, mu, callback);
+}
+
+#endif /* GP_FILTERS_GAUSSIAN_NOISE_H */
diff --git a/include/filters/GP_Filters.h b/include/filters/GP_Rand.h
similarity index 55%
copy from include/filters/GP_Filters.h
copy to include/filters/GP_Rand.h
index e685ec3..0fc7e18 100644
--- a/include/filters/GP_Filters.h
+++ b/include/filters/GP_Rand.h
@@ -16,62 +16,25 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301 USA *
* *
- * Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
- * <jiri.bluebear.dluhos(a)gmail.com> *
- * *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
/*
- GP_Context filters.
+ Functions to generate random numbers.
*/
-#ifndef GP_FILTERS_H
-#define GP_FILTERS_H
-
-/* Filter per channel parameter passing interface */
-#include "filters/GP_FilterParam.h"
-
-/* Point filters, brightness, contrast ... */
-#include "filters/GP_Point.h"
-
-/* Addition, difference, min, max ... */
-#include "filters/GP_Arithmetic.h"
-
-/* Histograms, ... */
-#include "filters/GP_Stats.h"
-
-/* Image rotations (90 180 270 grads) and mirroring */
-#include "filters/GP_Rotate.h"
-
-/* Linear convolution Raw API */
-#include "filters/GP_Linear.h"
-
-/* Convolution filters */
-#include "filters/GP_Convolution.h"
+#ifndef FILTERS_GP_RAND_H
+#define FILTERS_GP_RAND_H
-/* Blur filters */
-#include "filters/GP_Blur.h"
-
-/* Image scaling (resampling) */
-#include "filters/GP_Resize.h"
-
-/* Bitmap dithering */
-#include "filters/GP_Dither.h"
-
-/* Laplace based filters */
-#include "filters/GP_Laplace.h"
-
-/* Median filter */
-#include "filters/GP_Median.h"
-
-/* Weighted Median filter */
-#include "filters/GP_WeightedMedian.h"
-
-/* Sigma Mean filter */
-#include "filters/GP_Sigma.h"
+/*
+ * Fills the array with size integers with Normal (Gaussian) distribution
+ * defined by sigma and mu parameters.
+ *
+ * The size _MUST_ be odd.
+ */
+void GP_NormInt(int *arr, unsigned int size, int sigma, int mu);
-#endif /* GP_FILTERS_H */
+#endif /* FILTERS_GP_RAND_H */
diff --git a/libs/filters/GP_GaussianNoise.gen.c.t b/libs/filters/GP_GaussianNoise.gen.c.t
new file mode 100644
index 0000000..1d8c8a6
--- /dev/null
+++ b/libs/filters/GP_GaussianNoise.gen.c.t
@@ -0,0 +1,149 @@
+%% extends "filter.c.t"
+
+{% block descr %}Gaussian Noise{% endblock %}
+
+%% block body
+
+#include "core/GP_Context.h"
+#include "core/GP_GetPutPixel.h"
+#include "core/GP_TempAlloc.h"
+//#include "core/GP_Gamma.h"
+#include "core/GP_Clamp.h"
+#include "core/GP_Debug.h"
+
+#include "GP_Rand.h"
+#include "GP_GaussianNoise.h"
+
+%% for pt in pixeltypes
+%% if not pt.is_unknown() and not pt.is_palette()
+static int GP_FilterGaussianNoiseAdd_{{ pt.name }}_Raw(const GP_Context *src,
+ GP_Coord x_src, GP_Coord y_src,
+ GP_Size w_src, GP_Size h_src,
+ GP_Context *dst,
+ GP_Coord x_dst, GP_Coord y_dst,
+ float sigma, float mu,
+ GP_ProgressCallback *callback)
+{
+ GP_DEBUG(1, "Additive Gaussian noise filter %ux%u sigma=%f mu=%f",
+ w_src, h_src, sigma, mu);
+
+ %% for c in pt.chanslist
+ int sigma_{{ c[0] }} = {{ 2 ** c[2] - 1 }} * sigma;
+ int mu_{{ c[0] }} = {{ 2 ** c[2] - 1 }} * mu;
+ %% endfor
+
+ unsigned int size = w_src + w_src%2;
+
+ /* Create temporary buffers */
+ GP_TempAllocCreate(temp, sizeof(int) * size * {{ len(pt.chanslist) }});
+
+ %% for c in pt.chanslist
+ int *{{ c[0] }} = GP_TempAllocGet(temp, size * sizeof(int));
+ %% endfor
+
+ /* Apply the additive noise filter */
+ unsigned int x, y;
+
+ for (y = 0; y < h_src; y++) {
+ %% for c in pt.chanslist
+ GP_NormInt({{ c[0] }}, size, sigma_{{ c[0] }}, mu_{{ c[0] }});
+ %% endfor
+
+ for (x = 0; x < w_src; x++) {
+ GP_Pixel pix = GP_GetPixel_Raw_{{ pt.pixelsize.suffix }}(src, x + x_src, y + y_src);
+
+ %% for c in pt.chanslist
+ {{ c[0] }}[x] += GP_Pixel_GET_{{ c[0] }}_{{ pt.name }}(pix);
+ {{ c[0] }}[x] = GP_CLAMP({{ c[0] }}[x], 0, {{ 2 ** c[2] - 1 }});
+ %% endfor
+
+ pix = GP_Pixel_CREATE_{{ pt.name }}({{ expand_chanslist(pt, "", "[x]") }});
+ GP_PutPixel_Raw_{{ pt.pixelsize.suffix }}(dst, x + x_dst, y + y_dst, pix);
+ }
+
+ if (GP_ProgressCallbackReport(callback, y, h_src, w_src)) {
+ GP_TempAllocFree(temp);
+ return 1;
+ }
+ }
+
+ GP_TempAllocFree(temp);
+ GP_ProgressCallbackDone(callback);
+
+ return 0;
+}
+
+%% endif
+%% endfor
+
+int GP_FilterGaussianNoiseAdd_Raw(const GP_Context *src,
+ GP_Coord x_src, GP_Coord y_src,
+ GP_Size w_src, GP_Size h_src,
+ GP_Context *dst,
+ GP_Coord x_dst, GP_Coord y_dst,
+ float sigma, float mu,
+ GP_ProgressCallback *callback)
+{
+ switch (src->pixel_type) {
+ %% for pt in pixeltypes
+ %% if not pt.is_unknown() and not pt.is_palette()
+ case GP_PIXEL_{{ pt.name }}:
+ return GP_FilterGaussianNoiseAdd_{{ pt.name }}_Raw(src, x_src,
+ y_src, w_src, h_src, dst, x_dst, y_dst,
+ sigma, mu, callback);
+ break;
+ %% endif
+ %% endfor
+ default:
+ return -1;
+ }
+}
+
+int GP_FilterGaussianNoiseAddEx(const GP_Context *src,
+ GP_Coord x_src, GP_Coord y_src,
+ GP_Size w_src, GP_Size h_src,
+ GP_Context *dst,
+ GP_Coord x_dst, GP_Coord y_dst,
+ float sigma, float mu,
+ GP_ProgressCallback *callback)
+{
+ GP_CHECK(src->pixel_type == dst->pixel_type);
+
+ /* Check that destination is large enough */
+ GP_CHECK(x_dst + (GP_Coord)w_src <= (GP_Coord)dst->w);
+ GP_CHECK(y_dst + (GP_Coord)h_src <= (GP_Coord)dst->h);
+
+ /* Source is large enough */
+ GP_CHECK(x_src + w_src <= src->w);
+ GP_CHECK(y_src + h_src <= src->h);
+
+ return GP_FilterGaussianNoiseAdd_Raw(src, x_src, y_src, w_src, h_src,
+ dst, x_dst, y_dst,
+ sigma, mu, callback);
+}
+
+GP_Context *GP_FilterGaussianNoiseAddExAlloc(const GP_Context *src,
+ GP_Coord x_src, GP_Coord y_src,
+ GP_Size w_src, GP_Size h_src,
+ float sigma, float mu,
+ GP_ProgressCallback *callback)
+{
+ int ret;
+
+ GP_Context *dst = GP_ContextAlloc(w_src, h_src, src->pixel_type);
+
+ if (dst == NULL)
+ return NULL;
+
+ ret = GP_FilterGaussianNoiseAdd_Raw(src, x_src, y_src, w_src, h_src,
+ dst, 0, 0, sigma, mu, callback);
+
+ if (ret) {
+ GP_ContextFree(dst);
+ return NULL;
+ }
+
+ return dst;
+}
+
+%% endblock body
diff --git a/include/filters/GP_Filters.h b/libs/filters/GP_Rand.c
similarity index 55%
copy from include/filters/GP_Filters.h
copy to libs/filters/GP_Rand.c
index e685ec3..f571585 100644
--- a/include/filters/GP_Filters.h
+++ b/libs/filters/GP_Rand.c
@@ -16,62 +16,37 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301 USA *
* *
- * Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
- * <jiri.bluebear.dluhos(a)gmail.com> *
- * *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
-/*
-
- GP_Context filters.
-
- */
-
-#ifndef GP_FILTERS_H
-#define GP_FILTERS_H
-
-/* Filter per channel parameter passing interface */
-#include "filters/GP_FilterParam.h"
-
-/* Point filters, brightness, contrast ... */
-#include "filters/GP_Point.h"
-
-/* Addition, difference, min, max ... */
-#include "filters/GP_Arithmetic.h"
-
-/* Histograms, ... */
-#include "filters/GP_Stats.h"
-
-/* Image rotations (90 180 270 grads) and mirroring */
-#include "filters/GP_Rotate.h"
-
-/* Linear convolution Raw API */
-#include "filters/GP_Linear.h"
+#include <math.h>
-/* Convolution filters */
-#include "filters/GP_Convolution.h"
+#include "core/GP_Common.h"
-/* Blur filters */
-#include "filters/GP_Blur.h"
+#include "GP_Rand.h"
-/* Image scaling (resampling) */
-#include "filters/GP_Resize.h"
+void GP_NormInt(int *arr, unsigned int size, int sigma, int mu)
+{
+ unsigned int i = 0;
+ float a, b, rsq;
-/* Bitmap dithering */
-#include "filters/GP_Dither.h"
+ GP_ASSERT(size%2 == 0);
-/* Laplace based filters */
-#include "filters/GP_Laplace.h"
+ while (i < size) {
+ /* Sample two point inside of the unit circle */
+ do {
+ a = (float)random() / (RAND_MAX/2) - 1;
+ b = (float)random() / (RAND_MAX/2) - 1;
-/* Median filter */
-#include "filters/GP_Median.h"
+ rsq = a * a + b * b;
-/* Weighted Median filter */
-#include "filters/GP_WeightedMedian.h"
+ } while (rsq >= 1 || rsq == 0);
-/* Sigma Mean filter */
-#include "filters/GP_Sigma.h"
+ /* Polar form of the Box-Muller transformation */
+ float mul = sqrtf(-2.0 * logf(rsq)/rsq);
-#endif /* GP_FILTERS_H */
+ arr[i++] = mu + sigma * a * mul;
+ arr[i++] = mu + sigma * b * mul;
+ }
+}
diff --git a/libs/filters/Makefile b/libs/filters/Makefile
index c9661e6..cedc55a 100644
--- a/libs/filters/Makefile
+++ b/libs/filters/Makefile
@@ -3,7 +3,7 @@ TOPDIR=../..
STATS_FILTERS=GP_Histogram.gen.c
POINT_FILTERS=GP_Contrast.gen.c GP_Brightness.gen.c GP_Invert.gen.c- GP_Point.gen.c GP_Noise.gen.c
+ GP_Point.gen.c GP_Noise.gen.c GP_GaussianNoise.gen.c
ARITHMETIC_FILTERS=GP_Difference.gen.c GP_Addition.gen.c GP_Min.gen.c GP_Max.gen.c GP_Multiply.gen.c
http://repo.or.cz/w/gfxprim.git/commit/85ff7a0aeccbddfdd69611f6dd3128162aff…
commit 85ff7a0aeccbddfdd69611f6dd3128162aff6996
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Thu Aug 2 14:47:34 2012 +0200
demos: c_simple: Ported input test from SDL.
diff --git a/demos/c_simple/Makefile b/demos/c_simple/Makefile
index ec6ac66..99af986 100644
--- a/demos/c_simple/Makefile
+++ b/demos/c_simple/Makefile
@@ -8,7 +8,7 @@ LDLIBS+=-lrt `$(TOPDIR)/gfxprim-config --libs --libs-backends`
APPS=backend_example loaders_example loaders filters_symmetry gfx_koch virtual_backend_example meta_data meta_data_dump tmp_file showimage- v4l2_show v4l2_grab convolution weighted_median shapetest koch
+ v4l2_show v4l2_grab convolution weighted_median shapetest koch input
v4l2_show: LDLIBS+=-lGP_grabbers
v4l2_grab: LDLIBS+=-lGP_grabbers
diff --git a/tests/SDL/input.c b/demos/c_simple/input.c
similarity index 54%
rename from tests/SDL/input.c
rename to demos/c_simple/input.c
index c2b1cde..6a083e2 100644
--- a/tests/SDL/input.c
+++ b/demos/c_simple/input.c
@@ -19,32 +19,20 @@
* Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
* <jiri.bluebear.dluhos(a)gmail.com> *
* *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
-#include <SDL/SDL.h>
+#include <unistd.h>
#include "GP.h"
-#include "GP_SDL.h"
-SDL_Surface *display = NULL;
-GP_Context context;
+static GP_Context *win;
+static GP_Backend *backend;
-SDL_TimerID timer;
-SDL_UserEvent timer_event;
-
-GP_Pixel black_pixel, red_pixel, green_pixel, white_pixel;
-
-Uint32 timer_callback(__attribute__((unused)) Uint32 interval,
- __attribute__((unused)) void *param)
-{
- timer_event.type = SDL_USEREVENT;
- SDL_PushEvent((SDL_Event *) &timer_event);
- return 30;
-}
+static GP_Pixel red, green, white, black;
static void draw_event(GP_Event *ev)
{
@@ -55,20 +43,19 @@ static void draw_event(GP_Event *ev)
int align = GP_ALIGN_RIGHT|GP_VALIGN_BOTTOM;
- GP_TextClear(&context, NULL, 20, 20, align, black_pixel, size);
- size = GP_Print(&context, NULL, 20, 20, align,
- white_pixel, black_pixel, "Key=%s",
+ GP_TextClear(win, NULL, 20, 20, align, black, size);
+ size = GP_Print(win, NULL, 20, 20, align,
+ white, black, "Key=%s",
GP_EventKeyName(ev->val.key.key));
- SDL_Flip(display);
+
+ GP_BackendFlip(backend);
}
static void event_loop(void)
{
- SDL_Event event;
-
- while (SDL_WaitEvent(&event) > 0) {
- GP_InputDriverSDLEventPut(&event);
-
+ for (;;) {
+ GP_BackendWait(backend);
+
while (GP_EventQueued()) {
GP_Event ev;
@@ -81,17 +68,17 @@ static void event_loop(void)
switch (ev.val.key.key) {
case GP_KEY_ESC:
- SDL_Quit();
+ GP_BackendExit(backend);
exit(0);
break;
case GP_BTN_LEFT:
- GP_HLineXXY(&context, ev.cursor_x - 3,
+ GP_HLineXXY(win, ev.cursor_x - 3,
ev.cursor_x + 3,
- ev.cursor_y, red_pixel);
- GP_VLineXYY(&context, ev.cursor_x,
+ ev.cursor_y, red);
+ GP_VLineXYY(win, ev.cursor_x,
ev.cursor_y - 3,
- ev.cursor_y + 3, red_pixel);
- SDL_Flip(display);
+ ev.cursor_y + 3, red);
+ GP_BackendFlip(backend);
break;
default:
break;
@@ -102,18 +89,17 @@ static void event_loop(void)
static int size = 0;
case GP_EV_REL_POS:
if (GP_EventGetKey(&ev, GP_BTN_LEFT)) {
- GP_PutPixel(&context, ev.cursor_x,
- ev.cursor_y, green_pixel);
- SDL_Flip(display);
+ GP_PutPixel(win, ev.cursor_x,
+ ev.cursor_y, green);
}
int align = GP_ALIGN_RIGHT|GP_VALIGN_BOTTOM;
- GP_TextClear(&context, NULL, 20, 40, align,
- black_pixel, size);
- size = GP_Print(&context, NULL, 20, 40, align,
- white_pixel, black_pixel, "X=%3u Y=%3u",
+ GP_TextClear(win, NULL, 20, 40, align,
+ black, size);
+ size = GP_Print(win, NULL, 20, 40, align,
+ white, black, "X=%3u Y=%3u",
ev.cursor_x, ev.cursor_y);
- SDL_Flip(display);
+ GP_BackendFlip(backend);
break;
}
break;
@@ -124,49 +110,48 @@ static void event_loop(void)
int main(int argc, char *argv[])
{
- int display_bpp = 0;
-
- int i;
- for (i = 1; i < argc; i++) {
- if (strcmp(argv[i], "-16") == 0) {
- display_bpp = 16;
- } else if (strcmp(argv[i], "-24") == 0) {
- display_bpp = 24;
+ const char *backend_opts = "X11";
+ int opt;
+
+ while ((opt = getopt(argc, argv, "b:h")) != -1) {
+ switch (opt) {
+ case 'b':
+ backend_opts = optarg;
+ break;
+ case 'h':
+ GP_BackendInit(NULL, NULL, stderr);
+ return 0;
+ break;
+ default:
+ fprintf(stderr, "Invalid paramter '%c'n", opt);
+ return 1;
}
}
- /* Initialize SDL */
- if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) {
- fprintf(stderr, "Could not initialize SDL: %sn", SDL_GetError());
- return 1;
- }
+// GP_SetDebugLevel(10);
- display = SDL_SetVideoMode(480, 640, display_bpp, SDL_SWSURFACE);
- if (display == NULL) {
- fprintf(stderr, "Could not open display: %sn", SDL_GetError());
- goto fail;
+ backend = GP_BackendInit(backend_opts, "Input Test", stderr);
+
+ if (backend == NULL) {
+ fprintf(stderr, "Failed to initalize backend '%s'n",
+ backend_opts);
+ return 1;
}
+
+ win = backend->context;
- GP_EventSetScreenSize(480, 640);
+ red = GP_ColorToContextPixel(GP_COL_RED, win);
+ green = GP_ColorToContextPixel(GP_COL_GREEN, win);
+ white = GP_ColorToContextPixel(GP_COL_WHITE, win);
+ black = GP_ColorToContextPixel(GP_COL_BLACK, win);
- GP_SDL_ContextFromSurface(&context, display);
+ GP_Fill(win, black);
+ GP_BackendFlip(backend);
- red_pixel = GP_ColorToContextPixel(GP_COL_RED, &context);
- green_pixel = GP_ColorToContextPixel(GP_COL_GREEN, &context);
- white_pixel = GP_ColorToContextPixel(GP_COL_WHITE, &context);
- black_pixel = GP_ColorToContextPixel(GP_COL_BLACK, &context);
+ GP_EventSetScreenSize(win->w, win->h);
- timer = SDL_AddTimer(30, timer_callback, NULL);
- if (timer == 0) {
- fprintf(stderr, "Could not set up timer: %sn", SDL_GetError());
- goto fail;
+ for (;;) {
+ GP_BackendWait(backend);
+ event_loop();
}
-
- event_loop();
- SDL_Quit();
- return 0;
-
-fail:
- SDL_Quit();
- return 1;
}
diff --git a/tests/SDL/Makefile b/tests/SDL/Makefile
index 228df9e..4455172 100644
--- a/tests/SDL/Makefile
+++ b/tests/SDL/Makefile
@@ -8,7 +8,7 @@ ifeq ($(HAVE_LIBSDL),yes)
CSOURCES=$(shell echo *.c)
APPS=pixeltest fileview fonttest linetest randomshapetest- symbolstest textaligntest trianglefps input blittest subcontext showimage+ symbolstest textaligntest trianglefps blittest subcontext showimage aatest mixpixeltest
endif
http://repo.or.cz/w/gfxprim.git/commit/e086670095af025857270b996b7a5d2deec4…
commit e086670095af025857270b996b7a5d2deec42820
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Thu Aug 2 14:25:44 2012 +0200
demos: grinder: Get rid of GP_RetCode.
diff --git a/demos/grinder/grinder.c b/demos/grinder/grinder.c
index fbf0e21..648e950 100644
--- a/demos/grinder/grinder.c
+++ b/demos/grinder/grinder.c
@@ -106,18 +106,18 @@ static struct param resize_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode resize(GP_Context **c, const char *params)
+static int resize(GP_Context **c, const char *params)
{
int alg = 1;
float ratio = -1;
if (param_parse(params, resize_params, "resize", param_err,
&alg, &ratio))
- return GP_EINVAL;
+ return EINVAL;
if (ratio == -1) {
print_error("resize: ratio parameter is missing");
- return GP_EINVAL;
+ return EINVAL;
}
GP_Size w = ratio * (*c)->w;
@@ -127,12 +127,12 @@ static GP_RetCode resize(GP_Context **c, const char *params)
res = GP_FilterResize(*c, NULL, alg, w, h, progress_callback);
if (res == NULL)
- return GP_EINVAL;
+ return EINVAL;
GP_ContextFree(*c);
*c = res;
- return GP_ESUCCESS;
+ return 0;
}
/* scale filter */
@@ -164,7 +164,7 @@ static struct param scale_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode scale(GP_Context **c, const char *params)
+static int scale(GP_Context **c, const char *params)
{
int alg = 1;
int w = -1;
@@ -172,11 +172,11 @@ static GP_RetCode scale(GP_Context **c, const char *params)
if (param_parse(params, scale_params, "scale", param_err,
&alg, &w, &h))
- return GP_EINVAL;
+ return EINVAL;
if (w == -1 && h == -1) {
print_error("scale: w and/or h missing");
- return GP_EINVAL;
+ return EINVAL;
}
if (w == -1)
@@ -190,12 +190,12 @@ static GP_RetCode scale(GP_Context **c, const char *params)
res = GP_FilterResize(*c, NULL, alg, w, h, progress_callback);
if (res == NULL)
- return GP_EINVAL;
+ return EINVAL;
GP_ContextFree(*c);
*c = res;
- return GP_ESUCCESS;
+ return 0;
}
/* rotate filter */
@@ -211,16 +211,16 @@ static struct param rotate_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode rotate(GP_Context **c, const char *params)
+static int rotate(GP_Context **c, const char *params)
{
int rot = -1;
if (param_parse(params, rotate_params, "rotate", param_err, &rot))
- return GP_EINVAL;
+ return EINVAL;
if (rot == -1) {
print_error("rotate: rot parameter is missing");
- return GP_EINVAL;
+ return EINVAL;
}
GP_Context *res = NULL;
@@ -243,7 +243,7 @@ static GP_RetCode rotate(GP_Context **c, const char *params)
GP_ContextFree(*c);
*c = res;
- return GP_ESUCCESS;
+ return 0;
}
/* mirror filter */
@@ -254,12 +254,12 @@ static struct param mirror_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode mirror(GP_Context **c, const char *params)
+static int mirror(GP_Context **c, const char *params)
{
int vert = 0, horiz = 0;
if (param_parse(params, mirror_params, "mirror", param_err, &vert, &horiz))
- return GP_EINVAL;
+ return EINVAL;
if (vert)
GP_FilterMirrorV(*c, *c, progress_callback);
@@ -267,7 +267,7 @@ static GP_RetCode mirror(GP_Context **c, const char *params)
if (horiz)
GP_FilterMirrorH(*c, *c, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* brightness filter */
@@ -278,17 +278,17 @@ static struct param bright_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode bright(GP_Context **c, const char *params)
+static int bright(GP_Context **c, const char *params)
{
int bright = 0;
char *chann = NULL;
if (param_parse(params, bright_params, "bright", param_err, &bright, &chann))
- return GP_EINVAL;
+ return EINVAL;
if (bright == 0) {
print_error("bright: bright parameter is zero or missing");
- return GP_EINVAL;
+ return EINVAL;
}
GP_FILTER_PARAMS((*c)->pixel_type, filter_params);
@@ -300,7 +300,7 @@ static GP_RetCode bright(GP_Context **c, const char *params)
if (param == NULL) {
print_error("bright: Invalid channel name");
- return GP_EINVAL;
+ return EINVAL;
}
GP_FilterParamSetIntAll(filter_params, 0);
@@ -309,7 +309,7 @@ static GP_RetCode bright(GP_Context **c, const char *params)
GP_FilterBrightness(*c, *c, filter_params, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* contrast */
@@ -320,17 +320,17 @@ static struct param contrast_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode contrast(GP_Context **c, const char *params)
+static int contrast(GP_Context **c, const char *params)
{
float mul = 0;
char *chann = NULL;
if (param_parse(params, contrast_params, "contrast", param_err, &mul, &chann))
- return GP_EINVAL;
+ return EINVAL;
if (mul <= 0) {
print_error("contrast: mul parameter must be >= 0");
- return GP_EINVAL;
+ return EINVAL;
}
GP_FILTER_PARAMS((*c)->pixel_type, filter_params);
@@ -342,7 +342,7 @@ static GP_RetCode contrast(GP_Context **c, const char *params)
if (param == NULL) {
print_error("contrast: Invalid channel name");
- return GP_EINVAL;
+ return EINVAL;
}
GP_FilterParamSetFloatAll(filter_params, 1);
@@ -351,7 +351,7 @@ static GP_RetCode contrast(GP_Context **c, const char *params)
GP_FilterContrast(*c, *c, filter_params, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* noise */
@@ -360,12 +360,12 @@ static struct param noise_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode noise(GP_Context **c, const char *params)
+static int noise(GP_Context **c, const char *params)
{
float rat;
if (param_parse(params, noise_params, "noise", param_err, &rat))
- return GP_EINVAL;
+ return EINVAL;
GP_FILTER_PARAMS((*c)->pixel_type, filter_params);
@@ -373,7 +373,7 @@ static GP_RetCode noise(GP_Context **c, const char *params)
GP_FilterNoise(*c, *c, filter_params, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* invert */
@@ -382,14 +382,14 @@ static struct param invert_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode invert(GP_Context **c, const char *params)
+static int invert(GP_Context **c, const char *params)
{
if (param_parse(params, invert_params, "invert", param_err))
- return GP_EINVAL;
+ return EINVAL;
GP_FilterInvert(*c, *c, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* blur */
@@ -401,7 +401,7 @@ static struct param blur_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode blur(GP_Context **c, const char *params)
+static int blur(GP_Context **c, const char *params)
{
float sigma = 0;
float sigma_x = 0;
@@ -417,12 +417,12 @@ static GP_RetCode blur(GP_Context **c, const char *params)
if (sigma_x <= 0 && sigma_y <= 0) {
print_error("blur: at least one of sigma_x and sigma_y must be >= 0");
- return GP_EINVAL;
+ return EINVAL;
}
GP_FilterGaussianBlur(*c, *c, sigma_x, sigma_y, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* dithering */
@@ -454,16 +454,16 @@ static struct param dither_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode dither(GP_Context **c, const char *params)
+static int dither(GP_Context **c, const char *params)
{
int fmt = -1;
if (param_parse(params, dither_params, "dither", param_err, &fmt))
- return GP_EINVAL;
+ return EINVAL;
if (fmt == -1) {
print_error("dither: invalid format or format param missing");
- return GP_EINVAL;
+ return EINVAL;
}
GP_Context *bw;
@@ -476,7 +476,7 @@ static GP_RetCode dither(GP_Context **c, const char *params)
GP_ContextFree(bw);
- return GP_ESUCCESS;
+ return 0;
}
/* jpg save filter */
@@ -486,21 +486,21 @@ static struct param save_jpg_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode save_jpg(GP_Context **c, const char *params)
+static int save_jpg(GP_Context **c, const char *params)
{
char *file = NULL;
if (param_parse(params, save_jpg_params, "jpg", param_err, &file))
- return GP_EINVAL;
+ return EINVAL;
if (file == NULL) {
print_error("jpg: filename missing");
- return GP_EINVAL;
+ return EINVAL;
}
GP_SaveJPG(*c, file, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* png save filter */
@@ -510,21 +510,21 @@ static struct param save_png_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode save_png(GP_Context **c, const char *params)
+static int save_png(GP_Context **c, const char *params)
{
char *file = NULL;
if (param_parse(params, save_png_params, "png", param_err, &file))
- return GP_EINVAL;
+ return EINVAL;
if (file == NULL) {
print_error("png: filename missing");
- return GP_EINVAL;
+ return EINVAL;
}
GP_SavePNG(*c, file, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* noise filter */
@@ -559,13 +559,13 @@ static uint32_t no_op(uint32_t val)
return val;
}
-static GP_RetCode add_noise(GP_Context **c, const char *params)
+static int add_noise(GP_Context **c, const char *params)
{
float percents = 0;
char *chann = NULL;
if (param_parse(params, add_noise_params, "add_noise", param_err, &percents, &chann))
- return GP_EINVAL;
+ return EINVAL;
GP_FILTER_PARAMS((*c)->pixel_type, priv);
GP_FilterParamSetFloatAll(priv, percents/100);
@@ -578,7 +578,7 @@ static GP_RetCode add_noise(GP_Context **c, const char *params)
if (param == NULL) {
print_error("add_noise: Invalid channel name");
- return GP_EINVAL;
+ return EINVAL;
}
@@ -588,7 +588,7 @@ static GP_RetCode add_noise(GP_Context **c, const char *params)
GP_FilterPoint(*c, *c, op_callbacks, priv, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* median filter */
@@ -600,12 +600,12 @@ static struct param median_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode median(GP_Context **c, const char *params)
+static int median(GP_Context **c, const char *params)
{
int rad = -1, rad_x, rad_y;
if (param_parse(params, median_params, "median", param_err, &rad, &rad_x, &rad_y))
- return GP_EINVAL;
+ return EINVAL;
if (rad != -1) {
rad_x = rad;
@@ -613,17 +613,17 @@ static GP_RetCode median(GP_Context **c, const char *params)
}
if (rad_x < 0 || rad_y < 0)
- return GP_EINVAL;
+ return EINVAL;
GP_Context *ret = GP_FilterMedianAlloc(*c, rad_x, rad_y, progress_callback);
if (ret == NULL)
- return GP_ENOMEM;
+ return ENOMEM;
GP_ContextFree(*c);
*c = ret;
- return GP_ESUCCESS;
+ return 0;
}
/* sigma mean filter */
@@ -637,14 +637,14 @@ static struct param sigma_mean_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode sigma_mean(GP_Context **c, const char *params)
+static int sigma_mean(GP_Context **c, const char *params)
{
int rad = -1, rad_x, rad_y, min = 0;
float sigma = 0.1;
if (param_parse(params, sigma_mean_params, "sigma", param_err,
&rad, &min, &sigma, &rad_x, &rad_y))
- return GP_EINVAL;
+ return EINVAL;
if (rad != -1) {
rad_x = rad;
@@ -652,19 +652,19 @@ static GP_RetCode sigma_mean(GP_Context **c, const char *params)
}
if (rad_x < 0 || rad_y < 0)
- return GP_EINVAL;
+ return EINVAL;
(*c)->gamma = GP_GammaAcquire((*c)->pixel_type, 1.2);
GP_Context *ret = GP_FilterSigmaAlloc(*c, rad_x, rad_y, min, sigma, progress_callback);
if (ret == NULL)
- return GP_ENOMEM;
+ return ENOMEM;
GP_ContextFree(*c);
*c = ret;
- return GP_ESUCCESS;
+ return 0;
}
/* laplacian edge sharpening filter */
@@ -674,22 +674,22 @@ static struct param sharpen_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode sharpen(GP_Context **c, const char *params)
+static int sharpen(GP_Context **c, const char *params)
{
float weight = 0.1;
if (param_parse(params, sharpen_params, "sigma", param_err, &weight))
- return GP_EINVAL;
+ return EINVAL;
GP_Context *ret = GP_FilterEdgeSharpeningAlloc(*c, weight, progress_callback);
if (ret == NULL)
- return GP_ENOMEM;
+ return ENOMEM;
GP_ContextFree(*c);
*c = ret;
- return GP_ESUCCESS;
+ return 0;
}
/* arithmetics */
@@ -709,24 +709,24 @@ static struct param arithmetic_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode arithmetic(GP_Context **c, const char *params)
+static int arithmetic(GP_Context **c, const char *params)
{
char *file = NULL;
int op = -1;
if (param_parse(params, arithmetic_params, "arithmetic", param_err, &file, &op))
- return GP_EINVAL;
+ return EINVAL;
if (file == NULL) {
print_error("arithmetic: Filename missing");
- return GP_EINVAL;
+ return EINVAL;
}
GP_Context *img, *res = NULL;
if ((img = GP_LoadImage(file, progress_callback)) == NULL) {
print_error("arithmetic: Invalid image.");
- return GP_EINVAL;
+ return EINVAL;
}
switch (op) {
@@ -748,13 +748,13 @@ static GP_RetCode arithmetic(GP_Context **c, const char *params)
}
if (res == NULL)
- return GP_EINVAL;
+ return ENOMEM;
GP_ContextFree(*c);
*c = res;
- return GP_ESUCCESS;
+ return 0;
}
/* histogram */
@@ -764,20 +764,20 @@ static struct param histogram_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode histogram(GP_Context **c, const char *params)
+static int histogram(GP_Context **c, const char *params)
{
char *file = "histogram.png";
if (param_parse(params, histogram_params, "histogram", param_err, &file))
- return GP_EINVAL;
+ return EINVAL;
if (file == NULL) {
print_error("histogram: Filename missing");
- return GP_EINVAL;
+ return EINVAL;
}
histogram_to_png(*c, file);
- return GP_ESUCCESS;
+ return 0;
}
/* filters */
@@ -786,7 +786,7 @@ struct filter {
const char *name;
const char *desc;
struct param *param_desc;
- GP_RetCode (*apply)(GP_Context **c, const char *params);
+ int (*apply)(GP_Context **c, const char *params);
};
static struct filter filter_table[] = {
@@ -875,7 +875,7 @@ static void add_filter(char *params)
static void apply_filters(GP_Context **src)
{
unsigned int i;
- GP_RetCode ret;
+ int ret;
for (i = 0; i < filter_cnt; i++) {
char buf[255];
@@ -885,7 +885,7 @@ static void apply_filters(GP_Context **src)
progress_prefix = buf;
if ((ret = filters[i]->apply(src, filter_params[i]))) {
- fprintf(stderr, "Error: %sn", GP_RetCodeName(ret));
+ fprintf(stderr, "Error: %sn", strerror(ret));
exit(1);
}
@@ -956,7 +956,7 @@ static void check_fmt(const char *fmt)
static void save_by_fmt(struct GP_Context *bitmap, const char *name, const char *fmt)
{
- GP_RetCode ret;
+ int ret;
progress_prefix = "Saving Image";
@@ -968,7 +968,8 @@ static void save_by_fmt(struct GP_Context *bitmap, const char *name, const char
ret = GP_SavePNG(bitmap, name, progress_callback);
if (ret) {
- fprintf(stderr, "Failed to save bitmap: %sn", GP_RetCodeName(ret));
+ fprintf(stderr, "Failed to save bitmap: %sn",
+ strerror(errno));
exit(1);
}
http://repo.or.cz/w/gfxprim.git/commit/7dc5026aa07022e0b17da3b5fd173eaa900e…
commit 7dc5026aa07022e0b17da3b5fd173eaa900ec3b2
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Thu Aug 2 14:10:04 2012 +0200
doc: Add debug env variable docs.
diff --git a/doc/debug.txt b/doc/debug.txt
index c86e8a9..3f1cc69 100644
--- a/doc/debug.txt
+++ b/doc/debug.txt
@@ -27,6 +27,9 @@ or destroyed or when particular algorithm has been started.
Setting debug level to value higher than 1 would expose even more verbose
messages the current maximum used by debug messages is 4.
+The debug level may also be set by setting the 'GP_DEBUG' environment
+variable. In such case the debug level is set accordingly to its value when
+first debug message is about to be printed.
[source,c]
-------------------------------------------------------------------------------
diff --git a/doc/environment_variables.txt b/doc/environment_variables.txt
index c120528..71e3b91 100644
--- a/doc/environment_variables.txt
+++ b/doc/environment_variables.txt
@@ -21,3 +21,10 @@ bellow:
| >=2 | Use N threads unless the image buffer is too small.
|=============================================================================
+GP_DEBUG
+~~~~~~~~
+
+The 'GP_DEBUG' environment variable may be used to set library debug level.
+The variable and its value is used only once a the time first debug message is
+about to be printed.
+
http://repo.or.cz/w/gfxprim.git/commit/dff4c0ec8bdcc90fab43fe7cc627d8d164cd…
commit dff4c0ec8bdcc90fab43fe7cc627d8d164cde641
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Thu Aug 2 13:53:04 2012 +0200
core: debug: Add debug level env variable.
Add support for setting debug level from
GP_DEBUG environment variable. The environment
variable is used exactly once at a time
first debug message is about to be printed.
diff --git a/libs/core/GP_Debug.c b/libs/core/GP_Debug.c
index ecef216..9332828 100644
--- a/libs/core/GP_Debug.c
+++ b/libs/core/GP_Debug.c
@@ -25,6 +25,7 @@
#include "GP_Debug.h"
static unsigned int debug_level = GP_DEFAULT_DEBUG_LEVEL;
+static int env_used = 0;
void GP_SetDebugLevel(unsigned int level)
{
@@ -44,6 +45,24 @@ void GP_DebugPrint(int level, const char *file, const char *function, int line,
if (level > (int)debug_level)
return;
+ if (!env_used) {
+ char *level = getenv("GP_DEBUG");
+
+ env_used = 1;
+
+ if (level != NULL) {
+ int new_level = atoi(level);
+
+ if (new_level >= 0) {
+ debug_level = new_level;
+
+ GP_DEBUG(1, "Using debug level GP_DEBUG=%i "
+ "from enviroment variable",
+ debug_level);
+ }
+ }
+ }
+
for (i = 1; i < level; i++)
fputc(' ', stderr);
-----------------------------------------------------------------------
Summary of changes:
demos/c_simple/Makefile | 2 +-
{tests/SDL => demos/c_simple}/input.c | 135 +++++++--------
demos/grinder/grinder.c | 185 +++++++++++---------
doc/debug.txt | 3 +
doc/environment_variables.txt | 7 +
include/filters/GP_Filters.h | 3 +
include/filters/GP_GaussianNoise.h | 70 ++++++++
.../GP_InputDriverX11.h => filters/GP_Rand.h} | 17 +-
libs/core/GP_Debug.c | 19 ++
libs/filters/GP_GaussianNoise.gen.c.t | 149 ++++++++++++++++
.../loaders_example.c => libs/filters/GP_Rand.c | 47 ++---
libs/filters/Makefile | 2 +-
tests/SDL/Makefile | 2 +-
13 files changed, 446 insertions(+), 195 deletions(-)
rename {tests/SDL => demos/c_simple}/input.c (54%)
create mode 100644 include/filters/GP_GaussianNoise.h
copy include/{input/GP_InputDriverX11.h => filters/GP_Rand.h} (83%)
create mode 100644 libs/filters/GP_GaussianNoise.gen.c.t
copy demos/c_simple/loaders_example.c => libs/filters/GP_Rand.c (73%)
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos(a)gmail.com
if you want to unsubscribe, or site admin admin(a)repo.or.cz if you receive
no reply.
--
gfxprim.git ("A simple 2D graphics library with emphasis on correctness and well-defined operation.")
1
0