aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorDoug Rabson <dfr@FreeBSD.org>1997-05-18 10:03:48 +0000
committerDoug Rabson <dfr@FreeBSD.org>1997-05-18 10:03:48 +0000
commit6527fda589c10916ebad5181dc40aeca4c5920fd (patch)
treedb87371825c844f243b6aa1015ebdab68d0d2b86 /tools
parentebcea1131c2ab243d8dbfeda3c8b0ffb36a27176 (diff)
downloadsrc-6527fda589c10916ebad5181dc40aeca4c5920fd.tar.gz
src-6527fda589c10916ebad5181dc40aeca4c5920fd.zip
Add a couple of test cases for mmap over NFS.
Notes
Notes: svn path=/head/; revision=25889
Diffstat (limited to 'tools')
-rw-r--r--tools/regression/README2
-rw-r--r--tools/regression/nfsmmap/Makefile3
-rw-r--r--tools/regression/nfsmmap/README20
-rw-r--r--tools/regression/nfsmmap/test1/Makefile25
-rw-r--r--tools/regression/nfsmmap/test1/test1.c46
-rw-r--r--tools/regression/nfsmmap/test1/test1.good.uu95
-rw-r--r--tools/regression/nfsmmap/test1/test1.zeros.uu95
-rw-r--r--tools/regression/nfsmmap/test2/Makefile25
-rw-r--r--tools/regression/nfsmmap/test2/test2.c44
-rw-r--r--tools/regression/nfsmmap/test2/test2.good.uu95
-rw-r--r--tools/regression/nfsmmap/test2/test2.zeros.uu95
11 files changed, 545 insertions, 0 deletions
diff --git a/tools/regression/README b/tools/regression/README
index 03342baa5cf0..d2a92edec392 100644
--- a/tools/regression/README
+++ b/tools/regression/README
@@ -4,3 +4,5 @@ A regression test program is one that will exercise a particular bit of the
system to check that we have not reintroduced an old bug.
Please make a subdir per program, and add a brief description to this file.
+
+nfsmmap Some tests to exercise some tricky cases in NFS and mmap
diff --git a/tools/regression/nfsmmap/Makefile b/tools/regression/nfsmmap/Makefile
new file mode 100644
index 000000000000..c731d428f7c1
--- /dev/null
+++ b/tools/regression/nfsmmap/Makefile
@@ -0,0 +1,3 @@
+SUBDIR= test1 test2
+
+.include <bsd.subdir.mk>
diff --git a/tools/regression/nfsmmap/README b/tools/regression/nfsmmap/README
new file mode 100644
index 000000000000..81c4ad5fe3ac
--- /dev/null
+++ b/tools/regression/nfsmmap/README
@@ -0,0 +1,20 @@
+These tests are intended to make sure that NFS's use of the
+b_{valid,dirty}{off,end} fields of struct buf is consistent with the
+VM system's use of the underlying VM pages.
+
+Test1:
+ Open the file and write into the file, creating a buf
+ with a valid range and a dirty range
+
+ Fsync, flushing the dirty range
+
+ Mmap and read the whole page. Since only part of the page is
+ valid, the VM system must re-read the invalid parts of the
+ page.
+
+Test2:
+ This is the same as test1 without the fsync. The VM system
+ should first write out the dirty range and then read the rest
+ of the page. This is currently broken since the vnode_pager
+ doesn't use the original buf for its i/o and therefore the
+ information in b_dirtyoff, b_dirtyend is not avalable.
diff --git a/tools/regression/nfsmmap/test1/Makefile b/tools/regression/nfsmmap/test1/Makefile
new file mode 100644
index 000000000000..54a7b9d0effa
--- /dev/null
+++ b/tools/regression/nfsmmap/test1/Makefile
@@ -0,0 +1,25 @@
+PROG= test1
+NOMAN= t
+NFSSERVER?= herring.nlsystems.com
+CLEANFILES= test1.zeros test1.good test1.data test1.scratch
+
+all: test1 test1.zeros test1.good
+ @cp ${.OBJDIR}/test1.zeros ${.OBJDIR}/test1.data
+ @if [ `hostname` != ${NFSSERVER} ] ; then \
+ ssh ${NFSSERVER} touch ${.OBJDIR}/test1.data; \
+ fi
+ @cd ${.OBJDIR}; ${.OBJDIR}/test1
+ @if cmp -s ${.OBJDIR}/test1.data ${.OBJDIR}/test1.good && \
+ cmp -s ${.OBJDIR}/test1.scratch ${.OBJDIR}/test1.good ; then \
+ echo passed; \
+ else \
+ echo failed; \
+ fi
+
+test1.zeros: test1.zeros.uu
+ uudecode $?
+
+test1.good: test1.good.uu
+ uudecode $?
+
+.include <bsd.prog.mk>
diff --git a/tools/regression/nfsmmap/test1/test1.c b/tools/regression/nfsmmap/test1/test1.c
new file mode 100644
index 000000000000..7a7e69f5694b
--- /dev/null
+++ b/tools/regression/nfsmmap/test1/test1.c
@@ -0,0 +1,46 @@
+#include <sys/types.h>
+#include <sys/fcntl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+int main(int argc, char** argv)
+{
+ int fd, fd2;
+ caddr_t addr;
+ char zeros[4096];
+ char ones[200];
+
+ memset(zeros, 0, sizeof zeros);
+ memset(ones, 1, sizeof ones);
+#if 0
+ unlink("test1.data");
+ fd = open("test1.data", O_RDWR|O_CREAT, 0666);
+ if (fd < 0)
+ err(1, "creating file");
+ if (write(fd, zeros, sizeof zeros) < 0)
+ err(1, "writing zeros");
+ close(fd);
+#endif
+
+ fd = open("test1.data", O_RDWR);
+ if (fd < 0)
+ err(1, "opening file");
+ if (lseek(fd, 600, SEEK_SET) < 0)
+ err(1, "seeking");
+
+ if (write(fd, ones, sizeof ones) < 0)
+ err(1, "writing ones");
+
+ fsync(fd);
+
+ addr = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
+ if (addr == MAP_FAILED)
+ err(1, "mapping");
+ unlink("test1.scratch");
+ fd2 = open("test1.scratch", O_RDWR|O_CREAT, 0666);
+ if (fd2 < 0)
+ err(1, "creating scratch");
+
+ if (write(fd2, addr, 4096) < 0)
+ err(1, "writing scratch");
+}
diff --git a/tools/regression/nfsmmap/test1/test1.good.uu b/tools/regression/nfsmmap/test1/test1.good.uu
new file mode 100644
index 000000000000..633d2d3893e8
--- /dev/null
+++ b/tools/regression/nfsmmap/test1/test1.good.uu
@@ -0,0 +1,95 @@
+begin 644 test1.good
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!
+M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!
+M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!
+M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!
+M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+!````
+`
+end
diff --git a/tools/regression/nfsmmap/test1/test1.zeros.uu b/tools/regression/nfsmmap/test1/test1.zeros.uu
new file mode 100644
index 000000000000..23322586dbd0
--- /dev/null
+++ b/tools/regression/nfsmmap/test1/test1.zeros.uu
@@ -0,0 +1,95 @@
+begin 644 test1.zeros
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+!````
+`
+end
diff --git a/tools/regression/nfsmmap/test2/Makefile b/tools/regression/nfsmmap/test2/Makefile
new file mode 100644
index 000000000000..460c0b231666
--- /dev/null
+++ b/tools/regression/nfsmmap/test2/Makefile
@@ -0,0 +1,25 @@
+PROG= test2
+NOMAN= t
+NFSSERVER?= herring.nlsystems.com
+CLEANFILES= test2.zeros test2.good test2.data test2.scratch
+
+all: test2 test2.zeros test2.good
+ @cp ${.OBJDIR}/test2.zeros ${.OBJDIR}/test2.data
+ @if [ `hostname` != ${NFSSERVER} ] ; then \
+ ssh ${NFSSERVER} touch ${.OBJDIR}/test2.data; \
+ fi
+ @cd ${.OBJDIR}; ${.OBJDIR}/test2
+ @if cmp -s ${.OBJDIR}/test2.data ${.OBJDIR}/test2.good && \
+ cmp -s ${.OBJDIR}/test2.scratch ${.OBJDIR}/test2.good ; then \
+ echo passed; \
+ else \
+ echo failed; \
+ fi
+
+test2.zeros: test2.zeros.uu
+ uudecode $?
+
+test2.good: test2.good.uu
+ uudecode $?
+
+.include <bsd.prog.mk>
diff --git a/tools/regression/nfsmmap/test2/test2.c b/tools/regression/nfsmmap/test2/test2.c
new file mode 100644
index 000000000000..b3a19e1a017c
--- /dev/null
+++ b/tools/regression/nfsmmap/test2/test2.c
@@ -0,0 +1,44 @@
+#include <sys/types.h>
+#include <sys/fcntl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+int main(int argc, char** argv)
+{
+ int fd, fd2;
+ caddr_t addr;
+ char zeros[4096];
+ char ones[200];
+
+ memset(zeros, 0, sizeof zeros);
+ memset(ones, 1, sizeof ones);
+#if 0
+ unlink("test2.data");
+ fd = open("test2.data", O_RDWR|O_CREAT, 0666);
+ if (fd < 0)
+ err(1, "creating file");
+ if (write(fd, zeros, sizeof zeros) < 0)
+ err(1, "writing zeros");
+ close(fd);
+#endif
+
+ fd = open("test2.data", O_RDWR);
+ if (fd < 0)
+ err(1, "opening file");
+ if (lseek(fd, 600, SEEK_SET) < 0)
+ err(1, "seeking");
+
+ if (write(fd, ones, sizeof ones) < 0)
+ err(1, "writing ones");
+
+ addr = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
+ if (addr == MAP_FAILED)
+ err(1, "mapping");
+ unlink("test2.scratch");
+ fd2 = open("test2.scratch", O_RDWR|O_CREAT, 0666);
+ if (fd2 < 0)
+ err(1, "creating scratch");
+
+ if (write(fd2, addr, 4096) < 0)
+ err(1, "writing scratch");
+}
diff --git a/tools/regression/nfsmmap/test2/test2.good.uu b/tools/regression/nfsmmap/test2/test2.good.uu
new file mode 100644
index 000000000000..2edf1557d3d3
--- /dev/null
+++ b/tools/regression/nfsmmap/test2/test2.good.uu
@@ -0,0 +1,95 @@
+begin 644 test2.good
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!
+M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!
+M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!
+M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!
+M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+!````
+`
+end
diff --git a/tools/regression/nfsmmap/test2/test2.zeros.uu b/tools/regression/nfsmmap/test2/test2.zeros.uu
new file mode 100644
index 000000000000..9be013a818c6
--- /dev/null
+++ b/tools/regression/nfsmmap/test2/test2.zeros.uu
@@ -0,0 +1,95 @@
+begin 644 test2.zeros
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+!````
+`
+end