You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by gn...@apache.org on 2015/02/11 16:18:03 UTC

[2/2] mina-sshd git commit: [SSHD-393] Fix frozen ssh output stream on window adjust When server output stream delayed write it did not resume it after the window was adjusted Resume writes the same way client ssh channel does

[SSHD-393] Fix frozen ssh output stream on window adjust
When server output stream delayed write it did not resume it after the window was adjusted
Resume writes the same way client ssh channel does

Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/0ebd488d
Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/0ebd488d
Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/0ebd488d

Branch: refs/heads/master
Commit: 0ebd488da3030f553a1b82c0d14879044985a67a
Parents: 99145d7
Author: Guillaume Nodet <gn...@apache.org>
Authored: Wed Feb 11 16:11:45 2015 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Wed Feb 11 16:11:45 2015 +0100

----------------------------------------------------------------------
 pom.xml                                         |   1 +
 .../sshd/server/channel/ChannelSession.java     |   8 +
 .../java/org/apache/sshd/WindowAdjustTest.java  | 227 +++++++++++++++++++
 .../sshd/server/channel/ChannelSessionTest.java |  52 +++++
 sshd-core/src/test/resources/big-msg.txt        | 202 +++++++++++++++++
 5 files changed, 490 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/0ebd488d/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 85cdac9..ca326d2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -258,6 +258,7 @@
                                 <exclude>**/*.iml</exclude>
                                 <exclude>src/docs/**</exclude>
                                 <exclude>**/stty-output-*.txt</exclude>
+                                <exclude>**/big-msg.txt</exclude>
                                 <exclude>sshd-sftp/**</exclude>
                                 <exclude>sshd-pam/**</exclude>
                             </excludes>

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/0ebd488d/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java b/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
index e8c0481..ab10ef4 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
@@ -190,6 +190,14 @@ public class ChannelSession extends AbstractServerChannel {
     }
 
     @Override
+    public void handleWindowAdjust(Buffer buffer) throws IOException {
+        super.handleWindowAdjust(buffer);
+        if (asyncOut != null) {
+            asyncOut.onWindowExpanded();
+        }
+    }
+
+    @Override
     protected Closeable getInnerCloseable() {
         return builder()
                 .sequential(new CommandCloseable(), new GracefulChannelCloseable())

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/0ebd488d/sshd-core/src/test/java/org/apache/sshd/WindowAdjustTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/WindowAdjustTest.java b/sshd-core/src/test/java/org/apache/sshd/WindowAdjustTest.java
new file mode 100644
index 0000000..51b92d5
--- /dev/null
+++ b/sshd-core/src/test/java/org/apache/sshd/WindowAdjustTest.java
@@ -0,0 +1,227 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sshd;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Deque;
+import java.util.LinkedList;
+import org.apache.sshd.common.Factory;
+import org.apache.sshd.common.future.SshFutureListener;
+import org.apache.sshd.common.io.IoInputStream;
+import org.apache.sshd.common.io.IoOutputStream;
+import org.apache.sshd.common.io.IoWriteFuture;
+import org.apache.sshd.common.io.WritePendingException;
+import org.apache.sshd.common.util.Buffer;
+import org.apache.sshd.common.util.NoCloseOutputStream;
+import org.apache.sshd.server.AsyncCommand;
+import org.apache.sshd.server.Command;
+import org.apache.sshd.server.Environment;
+import org.apache.sshd.server.ExitCallback;
+import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
+import org.apache.sshd.util.BogusPasswordAuthenticator;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * This test simulates heavy traffic coming from the server towards the client making sure the traffic does not get stuck.
+ * Especially if the server receives window adjust message while it tries to transfer all the data.
+ *
+ * AsyncInPendingWrapper in this test serves as a handler for WritePendingException, which can occur when sending too many messages one after another.
+ */
+public class WindowAdjustTest {
+
+    public static final String END_FILE = "#";
+
+    private SshServer sshServer;
+    private int port;
+
+    @Before
+    public void setUp() throws Exception {
+        sshServer = SshServer.setUpDefaultServer();
+        final byte[] msg = Files.readAllBytes(
+                Paths.get(getClass().getResource("/big-msg.txt").toURI()));
+
+        sshServer.setShellFactory(new Factory<Command>() {
+            public Command create() {
+                return new FloodingAsyncCommand(msg, 10000, END_FILE);
+            }
+        });
+
+        sshServer.setPasswordAuthenticator(new BogusPasswordAuthenticator());
+        sshServer.setKeyPairProvider(new SimpleGeneratorHostKeyProvider());
+        sshServer.start();
+        port = sshServer.getPort();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        sshServer.stop();
+        sshServer.close(true);
+    }
+
+    @Test(timeout=60*1000L)
+    public void testTrafficHeavyLoad() throws Exception {
+        SshClient client = SshClient.setUpDefaultClient();
+        client.start();
+
+        final ClientSession session = client.connect("admin", "localhost", port).await().getSession();
+        session.addPasswordIdentity("admin");
+        session.auth().verify();
+
+        final ClientChannel channel = session.createShellChannel();
+
+        channel.setOut(new VerifyingOutputStream(channel, END_FILE));
+        channel.setErr(new NoCloseOutputStream(System.err));
+        channel.open();
+
+        channel.waitFor(ClientChannel.CLOSED, 0);
+        session.close(true);
+    }
+
+    /**
+     * Read all incoming data and if END_FILE symbol is detected, kill client session to end test
+     */
+    private static class VerifyingOutputStream extends OutputStream {
+
+        private final ClientChannel channel;
+        private String endFile;
+
+        public VerifyingOutputStream(ClientChannel channel, final String lastMsg) {
+            this.channel = channel;
+            this.endFile = lastMsg;
+        }
+
+        @Override
+        public void write(int b) throws IOException {
+            if(String.valueOf((char)b).equals(endFile)) {
+                channel.close(true);
+            }
+        }
+    }
+
+    public static final class FloodingAsyncCommand implements AsyncCommand {
+
+        private byte[] msg;
+        private int sendCount;
+        private String lastMsg;
+
+        public FloodingAsyncCommand(final byte[] msg, final int sendCount, final String lastMsg) {
+            this.msg = msg;
+            this.sendCount = sendCount;
+            this.lastMsg = lastMsg;
+        }
+
+        public void setIoInputStream(IoInputStream in) {}
+
+        public void setIoOutputStream(IoOutputStream out) {
+            final AsyncInPendingWrapper a = new AsyncInPendingWrapper(out);
+
+            new Thread(new Runnable() {
+                public void run() {
+                    for (int i = 0; i < sendCount; i++) {
+                        a.write(new Buffer(msg));
+                    }
+                    a.write(new Buffer((lastMsg.getBytes())));
+                }
+            }).start();
+        }
+
+        public void setIoErrorStream(IoOutputStream err) {}
+
+        public void setInputStream(InputStream in) {}
+
+        public void setOutputStream(OutputStream out) {}
+
+        public void setErrorStream(OutputStream err) {}
+
+        public void setExitCallback(ExitCallback callback) {}
+
+        public void start(Environment env) throws IOException {}
+
+        public void destroy() {}
+    }
+
+    /**
+     * Wrapper for asyncIn stream that catches Pending exception and queues the pending messages for later retry (send after previous messages were fully transfered)
+     */
+    private static class AsyncInPendingWrapper {
+        private IoOutputStream asyncIn;
+
+        // Order has to be preserved for queued writes
+        private final Deque<Buffer> pending = new LinkedList<Buffer>() {
+            @Override
+            public boolean add(Buffer o) {
+                return super.add(o);
+            }
+        };
+
+        public AsyncInPendingWrapper(IoOutputStream out) {
+            this.asyncIn = out;
+        }
+
+        public synchronized void write(final Object msg) {
+            if (asyncIn != null && !asyncIn.isClosed() && !asyncIn.isClosing()) {
+
+                final Buffer ByteBufferMsg = (Buffer) msg;
+                if (!pending.isEmpty()) {
+                    queueRequest(ByteBufferMsg);
+                    return;
+                }
+
+                writeWithPendingDetection(ByteBufferMsg, false);
+            }
+        }
+
+        private void writeWithPendingDetection(final Buffer msg, final boolean wasPending) {
+            try {
+                asyncIn.write(msg).addListener(new SshFutureListener<IoWriteFuture>() {
+                    public void operationComplete(final IoWriteFuture future) {
+                        if(wasPending) {
+                            pending.remove();
+                        }
+                        writePendingIfAny();
+                    }
+                });
+            } catch (final WritePendingException e) {
+                if(!wasPending){
+                    queueRequest(msg);
+                }
+            }
+        }
+
+        private synchronized void writePendingIfAny() {
+            if (pending.peek() == null) {
+                return;
+            }
+
+            final Buffer msg = pending.peek();
+            writeWithPendingDetection( msg, true);
+        }
+
+        private void queueRequest(final Buffer msg) {
+            msg.rpos(0);
+            pending.add(msg);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/0ebd488d/sshd-core/src/test/java/org/apache/sshd/server/channel/ChannelSessionTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/server/channel/ChannelSessionTest.java b/sshd-core/src/test/java/org/apache/sshd/server/channel/ChannelSessionTest.java
new file mode 100644
index 0000000..54dac0a
--- /dev/null
+++ b/sshd-core/src/test/java/org/apache/sshd/server/channel/ChannelSessionTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sshd.server.channel;
+
+import static junit.framework.Assert.assertTrue;
+
+import java.io.IOException;
+import org.apache.sshd.common.channel.ChannelAsyncOutputStream;
+import org.apache.sshd.common.util.Buffer;
+import org.apache.sshd.util.BogusChannel;
+import org.junit.Test;
+
+public class ChannelSessionTest {
+
+    private boolean expanded = false;
+
+    /**
+     * Test whether onWindowExpanded is called from server session
+     */
+    @Test
+    public void testHandleWindowAdjust() throws Exception {
+        final Buffer buffer = new Buffer();
+        buffer.putInt(1234);
+
+        final ChannelSession channelSession = new ChannelSession();
+        channelSession.asyncOut = new ChannelAsyncOutputStream(new BogusChannel(), (byte) 0) {
+            @Override
+            public void onWindowExpanded() throws IOException {
+                expanded = true;
+                super.onWindowExpanded();
+            }
+        };
+        channelSession.handleWindowAdjust(buffer);
+        assertTrue(expanded);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/0ebd488d/sshd-core/src/test/resources/big-msg.txt
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/resources/big-msg.txt b/sshd-core/src/test/resources/big-msg.txt
new file mode 100644
index 0000000..b791ea1
--- /dev/null
+++ b/sshd-core/src/test/resources/big-msg.txt
@@ -0,0 +1,202 @@
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+big-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msgbig-msg
+
+