summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoe <joe@jerkface.net>2013-07-13 18:38:08 -0400
committerjoe <joe@jerkface.net>2013-07-13 18:38:08 -0400
commit9c52669ffde25a15066df74666fd2d8eb0bf0438 (patch)
tree6acb9047cd2b14b454714c829f862a376839032a
parent546e0fea7060e40f70e3b723ef32ed9aa941d804 (diff)
refactored, more layering
-rw-r--r--Presence/XMLToByteStrings.hs16
-rw-r--r--Presence/XMPP.hs12
-rw-r--r--Presence/XMPPTypes.hs5
-rw-r--r--modules.svg311
4 files changed, 175 insertions, 169 deletions
diff --git a/Presence/XMLToByteStrings.hs b/Presence/XMLToByteStrings.hs
index d8d2e965..92ac05cd 100644
--- a/Presence/XMLToByteStrings.hs
+++ b/Presence/XMLToByteStrings.hs
@@ -1,5 +1,7 @@
1{-# LANGUAGE CPP #-} 1{-# LANGUAGE CPP #-}
2module XMLToByteStrings (xmlToByteStrings) where 2module XMLToByteStrings
3 ( xmlToByteStrings
4 , prettyPrint ) where
3 5
4import Control.Monad.IO.Class 6import Control.Monad.IO.Class
5import Control.Monad.Trans.Class 7import Control.Monad.Trans.Class
@@ -8,13 +10,15 @@ import Control.Monad.Fix
8import Control.Monad (when) 10import Control.Monad (when)
9import Data.Conduit 11import Data.Conduit
10import qualified Data.Conduit.List as CL 12import qualified Data.Conduit.List as CL
13import qualified Data.Conduit.Binary as CB
11import Data.XML.Types as XML (Event) 14import Data.XML.Types as XML (Event)
12import qualified Data.ByteString as S (ByteString) 15import qualified Data.ByteString as S (ByteString,append)
16import qualified Data.ByteString.Char8 as S (putStrLn)
13#ifdef RENDERFLUSH 17#ifdef RENDERFLUSH
14import Data.Conduit.Blaze (builderToByteStringFlush) 18import Data.Conduit.Blaze (builderToByteStringFlush)
15import Text.XML.Stream.Render (def,renderBuilderFlush) 19import Text.XML.Stream.Render (def,renderBuilderFlush,renderBytes,rsPretty)
16#else 20#else
17import Text.XML.Stream.Render (def,renderBytes) 21import Text.XML.Stream.Render (def,renderBytes,rsPretty)
18#endif 22#endif
19 23
20fixMaybeT f = (>> return ()) . runMaybeT . fix $ f 24fixMaybeT f = (>> return ()) . runMaybeT . fix $ f
@@ -62,3 +66,7 @@ renderChunks = fixMaybeT $ \loop -> do
62 loop 66 loop
63#endif 67#endif
64 68
69
70prettyPrint prefix xs =
71 liftIO $ do
72 CL.sourceList xs $= renderBytes (def { rsPretty=True }) =$= CB.lines $$ CL.mapM_ (S.putStrLn . (prefix `S.append`))
diff --git a/Presence/XMPP.hs b/Presence/XMPP.hs
index ec2feb3a..a469c08e 100644
--- a/Presence/XMPP.hs
+++ b/Presence/XMPP.hs
@@ -3,7 +3,6 @@
3{-# LANGUAGE ViewPatterns #-} 3{-# LANGUAGE ViewPatterns #-}
4module XMPP 4module XMPP
5 ( module XMPPTypes 5 ( module XMPPTypes
6 , module SocketLike
7 , listenForXmppClients 6 , listenForXmppClients
8 , listenForRemotePeers 7 , listenForRemotePeers
9 , newServerConnections 8 , newServerConnections
@@ -15,7 +14,6 @@ module XMPP
15 14
16import ServerC 15import ServerC
17import XMPPTypes 16import XMPPTypes
18import SocketLike
19import ByteStringOperators 17import ByteStringOperators
20import ControlMaybe 18import ControlMaybe
21import XMLToByteStrings 19import XMLToByteStrings
@@ -42,10 +40,7 @@ import System.IO
42 ) 40 )
43import Control.Concurrent.STM 41import Control.Concurrent.STM
44import Data.Conduit 42import Data.Conduit
45import qualified Data.Conduit.List as CL
46import qualified Data.Conduit.Binary as CB
47import Data.ByteString (ByteString) 43import Data.ByteString (ByteString)
48import qualified Data.ByteString.Char8 as S (putStrLn,append)
49import qualified Data.ByteString.Lazy.Char8 as L 44import qualified Data.ByteString.Lazy.Char8 as L
50 ( putStrLn 45 ( putStrLn
51 , fromChunks 46 , fromChunks
@@ -62,8 +57,7 @@ import System.IO.Error (isDoesNotExistError)
62import Control.Monad.IO.Class 57import Control.Monad.IO.Class
63import Control.Monad.Trans.Class 58import Control.Monad.Trans.Class
64import Control.Monad.Trans.Maybe 59import Control.Monad.Trans.Maybe
65import Text.XML.Stream.Parse (parseBytes,content) 60import Text.XML.Stream.Parse (def,parseBytes,content)
66import Text.XML.Stream.Render
67import Data.XML.Types as XML 61import Data.XML.Types as XML
68import qualified Data.Text as S (takeWhile) 62import qualified Data.Text as S (takeWhile)
69import Data.Text.Encoding as S (decodeUtf8,encodeUtf8) 63import Data.Text.Encoding as S (decodeUtf8,encodeUtf8)
@@ -458,10 +452,6 @@ fromClient session cmdChan = doNestingXML $ do
458 withXML $ \xml -> do 452 withXML $ \xml -> do
459 log $ "end-of-document: " <++> bshow xml 453 log $ "end-of-document: " <++> bshow xml
460 454
461prettyPrint prefix xs =
462 liftIO $ do
463 CL.sourceList xs $= renderBytes (def { rsPretty=True }) =$= CB.lines $$ CL.mapM_ (S.putStrLn . (prefix `S.append`))
464
465 455
466rosterPush to contact attrs = do 456rosterPush to contact attrs = do
467 let n = name to 457 let n = name to
diff --git a/Presence/XMPPTypes.hs b/Presence/XMPPTypes.hs
index 4802002c..a44f7fb1 100644
--- a/Presence/XMPPTypes.hs
+++ b/Presence/XMPPTypes.hs
@@ -1,6 +1,9 @@
1{-# LANGUAGE OverloadedStrings #-} 1{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE TypeFamilies #-} 2{-# LANGUAGE TypeFamilies #-}
3module XMPPTypes where 3module XMPPTypes
4 ( module XMPPTypes
5 , module SocketLike
6 ) where
4 7
5import Network.Socket 8import Network.Socket
6 ( Family(..) 9 ( Family(..)
diff --git a/modules.svg b/modules.svg
index 350ab062..c1f004fb 100644
--- a/modules.svg
+++ b/modules.svg
@@ -4,259 +4,264 @@
4<!-- Generated by graphviz version 2.26.3 (20100126.1600) 4<!-- Generated by graphviz version 2.26.3 (20100126.1600)
5 --> 5 -->
6<!-- Title: G Pages: 1 --> 6<!-- Title: G Pages: 1 -->
7<svg width="932pt" height="576pt" 7<svg width="933pt" height="576pt"
8 viewBox="0.00 0.00 932.21 576.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 8 viewBox="0.00 0.00 932.68 576.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9<g id="graph1" class="graph" transform="scale(0.757895 0.757895) rotate(0) translate(4 756)"> 9<g id="graph1" class="graph" transform="scale(0.664301 0.664301) rotate(0) translate(4 863.077)">
10<title>G</title> 10<title>G</title>
11<polygon fill="white" stroke="white" points="-4,5 -4,-756 1227,-756 1227,5 -4,5"/> 11<polygon fill="white" stroke="white" points="-4,5 -4,-863.077 1401,-863.077 1401,5 -4,5"/>
12<g id="graph2" class="cluster"><title>cluster_0</title> 12<g id="graph2" class="cluster"><title>cluster_0</title>
13<polygon fill="#ccffcc" stroke="#ccffcc" points="1080,-176.509 1080,-318.083 1214,-318.083 1214,-176.509 1080,-176.509"/> 13<polygon fill="#ccffcc" stroke="#ccffcc" points="1074,-429.538 1074,-563.443 1208,-563.443 1208,-429.538 1074,-429.538"/>
14<text text-anchor="middle" x="1147" y="-301.483" font-family="Times Roman,serif" font-size="14.00">Data</text> 14<text text-anchor="middle" x="1141" y="-546.843" font-family="Times Roman,serif" font-size="14.00">Data</text>
15</g> 15</g>
16<g id="graph3" class="cluster"><title>cluster_1</title> 16<g id="graph3" class="cluster"><title>cluster_1</title>
17<polygon fill="#ccffcc" stroke="#ccffcc" points="1030,-454.142 1030,-671.1 1172,-671.1 1172,-454.142 1030,-454.142"/> 17<polygon fill="#ccffcc" stroke="#ccffcc" points="1246,-577.355 1246,-782.56 1388,-782.56 1388,-577.355 1246,-577.355"/>
18<text text-anchor="middle" x="1101" y="-654.5" font-family="Times Roman,serif" font-size="14.00">Holumbus</text> 18<text text-anchor="middle" x="1317" y="-765.96" font-family="Times Roman,serif" font-size="14.00">Holumbus</text>
19</g> 19</g>
20<g id="graph4" class="cluster"><title>cluster_2</title> 20<g id="graph4" class="cluster"><title>cluster_2</title>
21<polygon fill="#99ff99" stroke="#99ff99" points="1038,-468.851 1038,-610.425 1164,-610.425 1164,-468.851 1038,-468.851"/> 21<polygon fill="#99ff99" stroke="#99ff99" points="1254,-591.268 1254,-725.172 1380,-725.172 1380,-591.268 1254,-591.268"/>
22<text text-anchor="middle" x="1101" y="-593.825" font-family="Times Roman,serif" font-size="14.00">Data</text> 22<text text-anchor="middle" x="1317" y="-708.572" font-family="Times Roman,serif" font-size="14.00">Data</text>
23</g> 23</g>
24<g id="graph5" class="cluster"><title>cluster_3</title> 24<g id="graph5" class="cluster"><title>cluster_3</title>
25<polygon fill="#ccffcc" stroke="#ccffcc" points="934,-14.709 934,-439.433 1072,-439.433 1072,-14.709 934,-14.709"/> 25<polygon fill="#ccffcc" stroke="#ccffcc" points="185,-13.9122 185,-415.626 323,-415.626 323,-13.9122 185,-13.9122"/>
26<text text-anchor="middle" x="1003" y="-422.833" font-family="Times Roman,serif" font-size="14.00">Text</text> 26<text text-anchor="middle" x="254" y="-399.026" font-family="Times Roman,serif" font-size="14.00">Text</text>
27</g> 27</g>
28<g id="graph6" class="cluster"><title>cluster_4</title> 28<g id="graph6" class="cluster"><title>cluster_4</title>
29<polygon fill="#99ff99" stroke="#99ff99" points="942,-29.4181 942,-378.758 1064,-378.758 1064,-29.4181 942,-29.4181"/> 29<polygon fill="#99ff99" stroke="#99ff99" points="193,-27.8244 193,-358.239 315,-358.239 315,-27.8244 193,-27.8244"/>
30<text text-anchor="middle" x="1003" y="-362.158" font-family="Times Roman,serif" font-size="14.00">XML</text> 30<text text-anchor="middle" x="254" y="-341.639" font-family="Times Roman,serif" font-size="14.00">XML</text>
31</g> 31</g>
32<g id="graph7" class="cluster"><title>cluster_5</title> 32<g id="graph7" class="cluster"><title>cluster_5</title>
33<polygon fill="#66ff66" stroke="#66ff66" points="950,-44.1271 950,-318.083 1056,-318.083 1056,-44.1271 950,-44.1271"/> 33<polygon fill="#66ff66" stroke="#66ff66" points="201,-41.7365 201,-300.851 307,-300.851 307,-41.7365 201,-41.7365"/>
34<text text-anchor="middle" x="1003" y="-301.483" font-family="Times Roman,serif" font-size="14.00">Stream</text> 34<text text-anchor="middle" x="254" y="-284.251" font-family="Times Roman,serif" font-size="14.00">Stream</text>
35</g> 35</g>
36<!-- u6 --> 36<!-- u6 -->
37<g id="node1" class="node"><title>u6</title> 37<g id="node1" class="node"><title>u6</title>
38<ellipse fill="none" stroke="black" cx="219" cy="-516.709" rx="62.0391" ry="18"/> 38<ellipse fill="none" stroke="black" cx="327" cy="-636.912" rx="62.0391" ry="18"/>
39<text text-anchor="middle" x="219" y="-512.609" font-family="Times Roman,serif" font-size="14.00">FGConsole</text> 39<text text-anchor="middle" x="327" y="-632.812" font-family="Times Roman,serif" font-size="14.00">FGConsole</text>
40</g> 40</g>
41<!-- monitortty --> 41<!-- monitortty -->
42<g id="node3" class="node"><title>monitortty</title> 42<g id="node3" class="node"><title>monitortty</title>
43<ellipse fill="none" stroke="black" cx="69" cy="-224.709" rx="68.9883" ry="18"/> 43<ellipse fill="none" stroke="black" cx="69" cy="-474.912" rx="68.9883" ry="18"/>
44<text text-anchor="middle" x="69" y="-220.609" font-family="Times Roman,serif" font-size="14.00">monitortty.c</text> 44<text text-anchor="middle" x="69" y="-470.812" font-family="Times Roman,serif" font-size="14.00">monitortty.c</text>
45</g> 45</g>
46<!-- u6&#45;&gt;monitortty --> 46<!-- u6&#45;&gt;monitortty -->
47<g id="edge2" class="edge"><title>u6&#45;&gt;monitortty</title> 47<g id="edge2" class="edge"><title>u6&#45;&gt;monitortty</title>
48<path fill="none" stroke="black" d="M209.843,-498.883C184.476,-449.502 113.178,-310.708 82.8901,-251.749"/> 48<path fill="none" stroke="black" d="M300.025,-620.584C264.702,-599.132 200.926,-560.161 147,-525.912 132.547,-516.733 116.715,-506.429 103.114,-497.497"/>
49<polygon fill="black" stroke="black" points="85.9108,-249.969 78.2281,-242.673 79.6843,-253.167 85.9108,-249.969"/> 49<polygon fill="black" stroke="black" points="104.812,-494.425 94.5348,-491.852 100.965,-500.273 104.812,-494.425"/>
50</g> 50</g>
51<!-- u15 --> 51<!-- u16 -->
52<g id="node4" class="node"><title>u15</title> 52<g id="node4" class="node"><title>u16</title>
53<ellipse fill="none" stroke="black" cx="529" cy="-516.709" rx="79.9115" ry="18"/> 53<ellipse fill="none" stroke="black" cx="840" cy="-636.912" rx="79.9115" ry="18"/>
54<text text-anchor="middle" x="529" y="-512.609" font-family="Times Roman,serif" font-size="14.00">LocalPeerCred</text> 54<text text-anchor="middle" x="840" y="-632.812" font-family="Times Roman,serif" font-size="14.00">LocalPeerCred</text>
55</g> 55</g>
56<!-- u9 --> 56<!-- u9 -->
57<g id="node8" class="node"><title>u9</title> 57<g id="node9" class="node"><title>u9</title>
58<ellipse fill="none" stroke="black" cx="324" cy="-91.709" rx="62.0391" ry="18"/> 58<ellipse fill="none" stroke="black" cx="689" cy="-211.912" rx="62.0391" ry="18"/>
59<text text-anchor="middle" x="324" y="-87.609" font-family="Times Roman,serif" font-size="14.00">SocketLike</text> 59<text text-anchor="middle" x="689" y="-207.812" font-family="Times Roman,serif" font-size="14.00">SocketLike</text>
60</g> 60</g>
61<!-- u15&#45;&gt;u9 --> 61<!-- u16&#45;&gt;u9 -->
62<g id="edge60" class="edge"><title>u15&#45;&gt;u9</title> 62<g id="edge60" class="edge"><title>u16&#45;&gt;u9</title>
63<path fill="none" stroke="black" d="M466.584,-505.417C385.334,-487.001 246.476,-441.956 185,-341.709 151.775,-287.53 156.934,-255.732 185,-198.709 204.791,-158.499 247.762,-129.159 280.723,-111.48"/> 63<path fill="none" stroke="black" d="M835.359,-618.837C826.557,-585.107 806.394,-510.421 785,-448.912 758.143,-371.697 720.248,-282.931 701.093,-239.189"/>
64<polygon fill="black" stroke="black" points="282.465,-114.519 289.726,-106.804 279.239,-108.307 282.465,-114.519"/> 64<polygon fill="black" stroke="black" points="704.2,-237.56 696.972,-229.814 697.792,-240.377 704.2,-237.56"/>
65</g> 65</g>
66<!-- u3 --> 66<!-- u3 -->
67<g id="node12" class="node"><title>u3</title> 67<g id="node13" class="node"><title>u3</title>
68<ellipse fill="none" stroke="black" cx="772" cy="-224.709" rx="78.0216" ry="18"/> 68<ellipse fill="none" stroke="black" cx="948" cy="-474.912" rx="78.0216" ry="18"/>
69<text text-anchor="middle" x="772" y="-220.609" font-family="Times Roman,serif" font-size="14.00">ControlMaybe</text> 69<text text-anchor="middle" x="948" y="-470.812" font-family="Times Roman,serif" font-size="14.00">ControlMaybe</text>
70</g> 70</g>
71<!-- u15&#45;&gt;u3 --> 71<!-- u16&#45;&gt;u3 -->
72<g id="edge58" class="edge"><title>u15&#45;&gt;u3</title> 72<g id="edge58" class="edge"><title>u16&#45;&gt;u3</title>
73<path fill="none" stroke="black" d="M543.835,-498.883C585.183,-449.197 701.864,-308.988 750.401,-250.664"/> 73<path fill="none" stroke="black" d="M851.971,-618.956C870.946,-590.493 908.043,-534.848 930.162,-501.669"/>
74<polygon fill="black" stroke="black" points="753.344,-252.599 757.05,-242.673 747.963,-248.121 753.344,-252.599"/> 74<polygon fill="black" stroke="black" points="933.341,-503.21 935.976,-492.948 927.517,-499.327 933.341,-503.21"/>
75</g> 75</g>
76<!-- u14 --> 76<!-- u15 -->
77<g id="node5" class="node"><title>u14</title> 77<g id="node5" class="node"><title>u15</title>
78<ellipse fill="none" stroke="black" cx="263" cy="-224.709" rx="68.9883" ry="18"/> 78<ellipse fill="none" stroke="black" cx="589" cy="-474.912" rx="68.9883" ry="18"/>
79<text text-anchor="middle" x="263" y="-220.609" font-family="Times Roman,serif" font-size="14.00">NestingXML</text> 79<text text-anchor="middle" x="589" y="-470.812" font-family="Times Roman,serif" font-size="14.00">NestingXML</text>
80</g>
81<!-- u12 -->
82<g id="node6" class="node"><title>u12</title>
83<ellipse fill="none" stroke="black" cx="254" cy="-474.912" rx="97.9784" ry="18"/>
84<text text-anchor="middle" x="254" y="-470.812" font-family="Times Roman,serif" font-size="14.00">XMLToByteStrings</text>
85</g>
86<!-- u13 -->
87<g id="node26" class="node"><title>u13</title>
88<ellipse fill="none" stroke="black" cx="254" cy="-211.912" rx="45.1673" ry="18"/>
89<text text-anchor="middle" x="254" y="-207.812" font-family="Times Roman,serif" font-size="14.00">Render</text>
90</g>
91<!-- u12&#45;&gt;u13 -->
92<g id="edge54" class="edge"><title>u12&#45;&gt;u13</title>
93<path fill="none" stroke="black" d="M254,-456.835C254,-411.886 254,-294.784 254,-240.415"/>
94<polygon fill="black" stroke="black" points="257.5,-240.116 254,-230.116 250.5,-240.116 257.5,-240.116"/>
80</g> 95</g>
81<!-- u11 --> 96<!-- u11 -->
82<g id="node6" class="node"><title>u11</title> 97<g id="node7" class="node"><title>u11</title>
83<ellipse fill="none" stroke="black" cx="490" cy="-91.709" rx="86.1654" ry="18"/> 98<ellipse fill="none" stroke="black" cx="436" cy="-211.912" rx="86.1654" ry="18"/>
84<text text-anchor="middle" x="490" y="-87.609" font-family="Times Roman,serif" font-size="14.00">GetHostByAddr</text> 99<text text-anchor="middle" x="436" y="-207.812" font-family="Times Roman,serif" font-size="14.00">GetHostByAddr</text>
85</g> 100</g>
86<!-- u10 --> 101<!-- u10 -->
87<g id="node7" class="node"><title>u10</title> 102<g id="node8" class="node"><title>u10</title>
88<ellipse fill="none" stroke="black" cx="454" cy="-224.709" rx="66.0138" ry="18"/> 103<ellipse fill="none" stroke="black" cx="436" cy="-474.912" rx="66.0138" ry="18"/>
89<text text-anchor="middle" x="454" y="-220.609" font-family="Times Roman,serif" font-size="14.00">XMPPTypes</text> 104<text text-anchor="middle" x="436" y="-470.812" font-family="Times Roman,serif" font-size="14.00">XMPPTypes</text>
90</g> 105</g>
91<!-- u10&#45;&gt;u11 --> 106<!-- u10&#45;&gt;u11 -->
92<g id="edge54" class="edge"><title>u10&#45;&gt;u11</title> 107<g id="edge52" class="edge"><title>u10&#45;&gt;u11</title>
93<path fill="none" stroke="black" d="M458.93,-206.495C465.016,-184.01 475.427,-145.547 482.505,-119.399"/> 108<path fill="none" stroke="black" d="M436,-456.835C436,-411.886 436,-294.784 436,-240.415"/>
94<polygon fill="black" stroke="black" points="485.895,-120.27 485.129,-109.703 479.138,-118.441 485.895,-120.27"/> 109<polygon fill="black" stroke="black" points="439.5,-240.116 436,-230.116 432.5,-240.116 439.5,-240.116"/>
95</g> 110</g>
96<!-- u10&#45;&gt;u9 --> 111<!-- u10&#45;&gt;u9 -->
97<g id="edge52" class="edge"><title>u10&#45;&gt;u9</title> 112<g id="edge50" class="edge"><title>u10&#45;&gt;u9</title>
98<path fill="none" stroke="black" d="M436.737,-207.048C414.107,-183.895 374.271,-143.14 348.519,-116.794"/> 113<path fill="none" stroke="black" d="M452.993,-457.248C496.922,-411.582 614.35,-289.513 665.095,-236.762"/>
99<polygon fill="black" stroke="black" points="350.827,-114.148 341.334,-109.443 345.821,-119.041 350.827,-114.148"/> 114<polygon fill="black" stroke="black" points="667.671,-239.133 672.081,-229.5 662.626,-234.28 667.671,-239.133"/>
100</g> 115</g>
101<!-- u2 --> 116<!-- u2 -->
102<g id="node13" class="node"><title>u2</title> 117<g id="node14" class="node"><title>u2</title>
103<ellipse fill="none" stroke="black" cx="705" cy="-91.709" rx="111.181" ry="18"/> 118<ellipse fill="none" stroke="black" cx="880" cy="-211.912" rx="111.181" ry="18"/>
104<text text-anchor="middle" x="705" y="-87.609" font-family="Times Roman,serif" font-size="14.00">ByteStringOperators</text> 119<text text-anchor="middle" x="880" y="-207.812" font-family="Times Roman,serif" font-size="14.00">ByteStringOperators</text>
105</g> 120</g>
106<!-- u10&#45;&gt;u2 --> 121<!-- u10&#45;&gt;u2 -->
107<g id="edge50" class="edge"><title>u10&#45;&gt;u2</title> 122<g id="edge48" class="edge"><title>u10&#45;&gt;u2</title>
108<path fill="none" stroke="black" d="M484.276,-208.666C528.957,-184.991 612.7,-140.617 663.204,-113.856"/> 123<path fill="none" stroke="black" d="M473.383,-459.993C547.487,-430.108 710.159,-362.868 760,-328.912 798.623,-302.599 836.018,-263.248 858.523,-237.577"/>
109<polygon fill="black" stroke="black" points="665.033,-116.848 672.23,-109.073 661.755,-110.663 665.033,-116.848"/> 124<polygon fill="black" stroke="black" points="861.393,-239.609 865.289,-229.757 856.099,-235.029 861.393,-239.609"/>
110</g> 125</g>
111<!-- u8 --> 126<!-- u8 -->
112<g id="node9" class="node"><title>u8</title> 127<g id="node10" class="node"><title>u8</title>
113<ellipse fill="none" stroke="black" cx="588" cy="-224.709" rx="50.0315" ry="18"/> 128<ellipse fill="none" stroke="black" cx="726" cy="-474.912" rx="50.0315" ry="18"/>
114<text text-anchor="middle" x="588" y="-220.609" font-family="Times Roman,serif" font-size="14.00">ServerC</text> 129<text text-anchor="middle" x="726" y="-470.812" font-family="Times Roman,serif" font-size="14.00">ServerC</text>
115</g> 130</g>
116<!-- u8&#45;&gt;u9 --> 131<!-- u8&#45;&gt;u9 -->
117<g id="edge48" class="edge"><title>u8&#45;&gt;u9</title> 132<g id="edge46" class="edge"><title>u8&#45;&gt;u9</title>
118<path fill="none" stroke="black" d="M558.739,-209.968C511.373,-186.105 417.82,-138.975 364.227,-111.975"/> 133<path fill="none" stroke="black" d="M723.457,-456.835C717.12,-411.792 700.59,-294.294 692.962,-240.076"/>
119<polygon fill="black" stroke="black" points="365.529,-108.712 355.024,-107.339 362.38,-114.963 365.529,-108.712"/> 134<polygon fill="black" stroke="black" points="696.42,-239.531 691.561,-230.116 689.488,-240.506 696.42,-239.531"/>
120</g> 135</g>
121<!-- u8&#45;&gt;u2 --> 136<!-- u8&#45;&gt;u2 -->
122<g id="edge46" class="edge"><title>u8&#45;&gt;u2</title> 137<g id="edge44" class="edge"><title>u8&#45;&gt;u2</title>
123<path fill="none" stroke="black" d="M603.296,-207.322C623.392,-184.477 658.857,-144.162 682.145,-117.69"/> 138<path fill="none" stroke="black" d="M736.344,-457.248C762.745,-412.159 832.763,-292.583 864.26,-238.793"/>
124<polygon fill="black" stroke="black" points="684.973,-119.774 688.95,-109.954 679.717,-115.15 684.973,-119.774"/> 139<polygon fill="black" stroke="black" points="867.466,-240.244 869.499,-229.846 861.425,-236.707 867.466,-240.244"/>
125</g> 140</g>
126<!-- u7 --> 141<!-- u7 -->
127<g id="node10" class="node"><title>u7</title> 142<g id="node11" class="node"><title>u7</title>
128<ellipse fill="none" stroke="black" cx="666" cy="-516.709" rx="39.1069" ry="18"/> 143<ellipse fill="none" stroke="black" cx="703" cy="-636.912" rx="39.1069" ry="18"/>
129<text text-anchor="middle" x="666" y="-512.609" font-family="Times Roman,serif" font-size="14.00">XMPP</text> 144<text text-anchor="middle" x="703" y="-632.812" font-family="Times Roman,serif" font-size="14.00">XMPP</text>
130</g> 145</g>
131<!-- u7&#45;&gt;u14 --> 146<!-- u7&#45;&gt;u15 -->
132<g id="edge44" class="edge"><title>u7&#45;&gt;u14</title> 147<g id="edge42" class="edge"><title>u7&#45;&gt;u15</title>
133<path fill="none" stroke="black" d="M645.394,-501.171C637.062,-495.139 627.244,-488.342 618,-482.709 501.721,-411.854 448.727,-431.086 346,-341.709 316.214,-315.794 291.489,-277.107 276.98,-251.405"/> 148<path fill="none" stroke="black" d="M690.8,-619.575C670.869,-591.252 631.196,-534.875 607.695,-501.478"/>
134<polygon fill="black" stroke="black" points="280.001,-249.636 272.106,-242.571 273.872,-253.018 280.001,-249.636"/> 149<polygon fill="black" stroke="black" points="610.425,-499.276 601.807,-493.112 604.7,-503.304 610.425,-499.276"/>
135</g> 150</g>
136<!-- u7&#45;&gt;u10 --> 151<!-- u7&#45;&gt;u12 -->
137<g id="edge40" class="edge"><title>u7&#45;&gt;u10</title> 152<g id="edge40" class="edge"><title>u7&#45;&gt;u12</title>
138<path fill="none" stroke="black" d="M651.837,-499.733C626.34,-468.935 571.424,-401.498 529,-341.709 507.458,-311.349 484.639,-275.086 469.908,-251.063"/> 153<path fill="none" stroke="black" d="M669.472,-627.617C607.619,-610.12 471.755,-570.06 361,-525.912 339.151,-517.203 315.483,-506.104 295.975,-496.486"/>
139<polygon fill="black" stroke="black" points="472.875,-249.205 464.678,-242.493 466.9,-252.852 472.875,-249.205"/> 154<polygon fill="black" stroke="black" points="297.271,-493.222 286.759,-491.9 294.153,-499.489 297.271,-493.222"/>
140</g> 155</g>
141<!-- u7&#45;&gt;u9 --> 156<!-- u7&#45;&gt;u10 -->
142<g id="edge38" class="edge"><title>u7&#45;&gt;u9</title> 157<g id="edge38" class="edge"><title>u7&#45;&gt;u10</title>
143<path fill="none" stroke="black" d="M645.232,-501.429C636.877,-495.433 627.086,-488.593 618,-482.709 514.479,-415.674 451.377,-441.568 379,-341.709 365.991,-323.761 339.851,-181.932 328.95,-120.225"/> 158<path fill="none" stroke="black" d="M677.801,-623.116C640.772,-602.671 569.694,-562.766 511,-525.912 496.779,-516.983 481.392,-506.643 468.277,-497.617"/>
144<polygon fill="black" stroke="black" points="332.335,-119.264 327.158,-110.02 325.441,-120.475 332.335,-119.264"/> 159<polygon fill="black" stroke="black" points="470.237,-494.717 460.022,-491.904 466.253,-500.473 470.237,-494.717"/>
145</g> 160</g>
146<!-- u7&#45;&gt;u8 --> 161<!-- u7&#45;&gt;u8 -->
147<g id="edge36" class="edge"><title>u7&#45;&gt;u8</title> 162<g id="edge36" class="edge"><title>u7&#45;&gt;u8</title>
148<path fill="none" stroke="black" d="M661.121,-498.443C647.906,-448.974 611.356,-312.144 595.5,-252.786"/> 163<path fill="none" stroke="black" d="M705.594,-618.644C709.58,-590.569 717.244,-536.587 721.961,-503.362"/>
149<polygon fill="black" stroke="black" points="598.84,-251.726 592.877,-242.968 592.077,-253.533 598.84,-251.726"/> 164<polygon fill="black" stroke="black" points="725.44,-503.755 723.381,-493.363 718.51,-502.771 725.44,-503.755"/>
150</g> 165</g>
151<!-- u7&#45;&gt;u3 --> 166<!-- u7&#45;&gt;u3 -->
152<g id="edge34" class="edge"><title>u7&#45;&gt;u3</title> 167<g id="edge34" class="edge"><title>u7&#45;&gt;u3</title>
153<path fill="none" stroke="black" d="M672.471,-498.883C690.36,-449.604 740.573,-311.28 762.052,-252.114"/> 168<path fill="none" stroke="black" d="M724.377,-621.494C732.642,-615.606 742.212,-608.876 751,-602.912 806.849,-565.011 872.813,-522.623 912.477,-497.388"/>
154<polygon fill="black" stroke="black" points="765.356,-253.267 765.479,-242.673 758.777,-250.879 765.356,-253.267"/> 169<polygon fill="black" stroke="black" points="914.447,-500.283 921.01,-491.965 910.693,-494.375 914.447,-500.283"/>
155</g> 170</g>
156<!-- u7&#45;&gt;u2 --> 171<!-- u7&#45;&gt;u2 -->
157<g id="edge32" class="edge"><title>u7&#45;&gt;u2</title> 172<g id="edge32" class="edge"><title>u7&#45;&gt;u2</title>
158<path fill="none" stroke="black" d="M666.288,-498.707C667.234,-450.124 671.041,-312.34 685,-198.709 688.312,-171.752 694.208,-141.339 698.744,-119.846"/> 173<path fill="none" stroke="black" d="M718.361,-620.074C736.568,-599.321 766.735,-562.317 785,-525.912 834.788,-426.677 863.837,-296.502 874.861,-240.047"/>
159<polygon fill="black" stroke="black" points="702.229,-120.289 700.907,-109.777 695.385,-118.818 702.229,-120.289"/> 174<polygon fill="black" stroke="black" points="878.327,-240.558 876.769,-230.078 871.452,-239.242 878.327,-240.558"/>
160</g>
161<!-- u12 -->
162<g id="node25" class="node"><title>u12</title>
163<ellipse fill="none" stroke="black" cx="1003" cy="-224.709" rx="45.1673" ry="18"/>
164<text text-anchor="middle" x="1003" y="-220.609" font-family="Times Roman,serif" font-size="14.00">Render</text>
165</g>
166<!-- u7&#45;&gt;u12 -->
167<g id="edge42" class="edge"><title>u7&#45;&gt;u12</title>
168<path fill="none" stroke="black" d="M696.807,-505.505C754.706,-483.007 880.527,-427.069 954,-341.709 976.349,-315.744 989.63,-278.131 996.612,-252.614"/>
169<polygon fill="black" stroke="black" points="1000.03,-253.376 999.146,-242.818 993.253,-251.623 1000.03,-253.376"/>
170</g> 175</g>
171<!-- u4 --> 176<!-- u4 -->
172<g id="node11" class="node"><title>u4</title> 177<g id="node12" class="node"><title>u4</title>
173<ellipse fill="none" stroke="black" cx="983" cy="-516.709" rx="39.1069" ry="18"/> 178<ellipse fill="none" stroke="black" cx="1157" cy="-636.912" rx="39.1069" ry="18"/>
174<text text-anchor="middle" x="983" y="-512.609" font-family="Times Roman,serif" font-size="14.00">UTmp</text> 179<text text-anchor="middle" x="1157" y="-632.812" font-family="Times Roman,serif" font-size="14.00">UTmp</text>
175</g> 180</g>
176<!-- u5 --> 181<!-- u5 -->
177<g id="node17" class="node"><title>u5</title> 182<g id="node18" class="node"><title>u5</title>
178<ellipse fill="none" stroke="black" cx="1147" cy="-224.709" rx="59.065" ry="18"/> 183<ellipse fill="none" stroke="black" cx="1141" cy="-474.912" rx="59.065" ry="18"/>
179<text text-anchor="middle" x="1147" y="-220.609" font-family="Times Roman,serif" font-size="14.00">BitSyntax</text> 184<text text-anchor="middle" x="1141" y="-470.812" font-family="Times Roman,serif" font-size="14.00">BitSyntax</text>
180</g> 185</g>
181<!-- u4&#45;&gt;u5 --> 186<!-- u4&#45;&gt;u5 -->
182<g id="edge30" class="edge"><title>u4&#45;&gt;u5</title> 187<g id="edge30" class="edge"><title>u4&#45;&gt;u5</title>
183<path fill="none" stroke="black" d="M993.012,-498.883C1020.75,-449.502 1098.7,-310.708 1131.81,-251.749"/> 188<path fill="none" stroke="black" d="M1155.2,-618.644C1152.42,-590.569 1147.09,-536.587 1143.81,-503.362"/>
184<polygon fill="black" stroke="black" points="1135.07,-253.106 1136.91,-242.673 1128.96,-249.678 1135.07,-253.106"/> 189<polygon fill="black" stroke="black" points="1147.29,-502.97 1142.82,-493.363 1140.32,-503.658 1147.29,-502.97"/>
185</g> 190</g>
186<!-- u1 --> 191<!-- u1 -->
187<g id="node14" class="node"><title>u1</title> 192<g id="node15" class="node"><title>u1</title>
188<ellipse fill="none" stroke="black" cx="826" cy="-516.709" rx="62.0391" ry="18"/> 193<ellipse fill="none" stroke="black" cx="1038" cy="-636.912" rx="62.0391" ry="18"/>
189<text text-anchor="middle" x="826" y="-512.609" font-family="Times Roman,serif" font-size="14.00">ConfigFiles</text> 194<text text-anchor="middle" x="1038" y="-632.812" font-family="Times Roman,serif" font-size="14.00">ConfigFiles</text>
190</g> 195</g>
191<!-- u1&#45;&gt;u3 --> 196<!-- u1&#45;&gt;u3 -->
192<g id="edge28" class="edge"><title>u1&#45;&gt;u3</title> 197<g id="edge28" class="edge"><title>u1&#45;&gt;u3</title>
193<path fill="none" stroke="black" d="M822.622,-498.443C813.493,-449.077 788.274,-312.711 777.261,-253.156"/> 198<path fill="none" stroke="black" d="M1028.02,-618.956C1012.28,-590.614 981.561,-535.323 963.102,-502.096"/>
194<polygon fill="black" stroke="black" points="780.637,-252.165 775.377,-242.968 773.754,-253.438 780.637,-252.165"/> 199<polygon fill="black" stroke="black" points="965.936,-499.99 958.02,-492.948 959.817,-503.39 965.936,-499.99"/>
195</g> 200</g>
196<!-- u1&#45;&gt;u2 --> 201<!-- u1&#45;&gt;u2 -->
197<g id="edge26" class="edge"><title>u1&#45;&gt;u2</title> 202<g id="edge26" class="edge"><title>u1&#45;&gt;u2</title>
198<path fill="none" stroke="black" d="M834.525,-498.52C857.009,-447.706 912.623,-301.263 859,-198.709 837.813,-158.189 793.52,-129.924 757.852,-112.663"/> 203<path fill="none" stroke="black" d="M1040.98,-618.772C1045.88,-584.622 1053.38,-508.832 1035,-448.912 1008.58,-362.764 940.542,-278.49 904.02,-237.564"/>
199<polygon fill="black" stroke="black" points="759.061,-109.364 748.519,-108.298 756.095,-115.705 759.061,-109.364"/> 204<polygon fill="black" stroke="black" points="906.458,-235.042 897.157,-229.969 901.264,-239.735 906.458,-235.042"/>
200</g> 205</g>
201<!-- u0 --> 206<!-- u0 -->
202<g id="node15" class="node"><title>u0</title> 207<g id="node16" class="node"><title>u0</title>
203<ellipse fill="none" stroke="black" cx="781" cy="-718.709" rx="34.2406" ry="18"/> 208<ellipse fill="none" stroke="black" cx="993" cy="-827.912" rx="34.2406" ry="18"/>
204<text text-anchor="middle" x="781" y="-714.609" font-family="Times Roman,serif" font-size="14.00">Main</text> 209<text text-anchor="middle" x="993" y="-823.812" font-family="Times Roman,serif" font-size="14.00">Main</text>
205</g> 210</g>
206<!-- u0&#45;&gt;u6 --> 211<!-- u0&#45;&gt;u6 -->
207<g id="edge18" class="edge"><title>u0&#45;&gt;u6</title> 212<g id="edge18" class="edge"><title>u0&#45;&gt;u6</title>
208<path fill="none" stroke="black" d="M752.156,-709.054C693.283,-689.277 555.123,-642.496 440,-600.709 379.432,-578.724 310.044,-552.116 265.428,-534.821"/> 213<path fill="none" stroke="black" d="M963.09,-819.334C859.502,-789.627 515.098,-690.856 381.048,-652.412"/>
209<polygon fill="black" stroke="black" points="266.609,-531.525 256.021,-531.17 264.077,-538.051 266.609,-531.525"/> 214<polygon fill="black" stroke="black" points="381.964,-649.034 371.386,-649.642 380.034,-655.763 381.964,-649.034"/>
210</g> 215</g>
211<!-- u0&#45;&gt;u15 --> 216<!-- u0&#45;&gt;u16 -->
212<g id="edge22" class="edge"><title>u0&#45;&gt;u15</title> 217<g id="edge22" class="edge"><title>u0&#45;&gt;u16</title>
213<path fill="none" stroke="black" d="M759.768,-704.643C728.021,-683.325 666.706,-641.035 618,-600.709 595.435,-582.026 571.359,-559.101 553.945,-541.923"/> 218<path fill="none" stroke="black" d="M979.69,-811.296C952.947,-777.912 892.53,-702.489 860.627,-662.663"/>
214<polygon fill="black" stroke="black" points="556.004,-539.034 546.443,-534.47 551.071,-544.001 556.004,-539.034"/> 219<polygon fill="black" stroke="black" points="863.258,-660.349 854.275,-654.732 857.795,-664.725 863.258,-660.349"/>
215</g> 220</g>
216<!-- u0&#45;&gt;u7 --> 221<!-- u0&#45;&gt;u7 -->
217<g id="edge20" class="edge"><title>u0&#45;&gt;u7</title> 222<g id="edge20" class="edge"><title>u0&#45;&gt;u7</title>
218<path fill="none" stroke="black" d="M770.996,-701.136C750.776,-665.62 704.944,-585.116 681.08,-543.198"/> 223<path fill="none" stroke="black" d="M961.639,-820.82C911.851,-808.201 813.932,-777.683 751,-720.912 733.848,-705.439 721.271,-682.347 713.305,-664.289"/>
219<polygon fill="black" stroke="black" points="684.052,-541.344 676.063,-534.385 677.969,-544.807 684.052,-541.344"/> 224<polygon fill="black" stroke="black" points="716.445,-662.726 709.353,-654.854 709.988,-665.43 716.445,-662.726"/>
220</g> 225</g>
221<!-- u0&#45;&gt;u4 --> 226<!-- u0&#45;&gt;u4 -->
222<g id="edge16" class="edge"><title>u0&#45;&gt;u4</title> 227<g id="edge16" class="edge"><title>u0&#45;&gt;u4</title>
223<path fill="none" stroke="black" d="M802.876,-704.86C833.726,-684.607 890.636,-644.524 930,-600.709 945.655,-583.284 959.619,-560.699 969.279,-543.337"/> 228<path fill="none" stroke="black" d="M1012.79,-812.819C1037.37,-793.407 1079.65,-757.778 1109,-720.912 1123.12,-703.173 1135.7,-680.784 1144.43,-663.582"/>
224<polygon fill="black" stroke="black" points="972.492,-544.753 974.186,-534.295 966.34,-541.414 972.492,-544.753"/> 229<polygon fill="black" stroke="black" points="1147.57,-665.135 1148.87,-654.621 1141.3,-662.026 1147.57,-665.135"/>
225</g> 230</g>
226<!-- u0&#45;&gt;u3 --> 231<!-- u0&#45;&gt;u3 -->
227<g id="edge14" class="edge"><title>u0&#45;&gt;u3</title> 232<g id="edge14" class="edge"><title>u0&#45;&gt;u3</title>
228<path fill="none" stroke="black" d="M775.812,-700.918C769.42,-677.992 758.928,-636.787 755,-600.709 740.924,-471.406 759.014,-315.863 767.76,-253.057"/> 233<path fill="none" stroke="black" d="M987.684,-809.918C981.665,-788.799 972.045,-752.63 967,-720.912 954.542,-642.584 950.166,-548.874 948.698,-503.007"/>
229<polygon fill="black" stroke="black" points="771.28,-253.167 769.226,-242.773 764.35,-252.179 771.28,-253.167"/> 234<polygon fill="black" stroke="black" points="952.194,-502.822 948.398,-492.931 945.197,-503.03 952.194,-502.822"/>
230</g> 235</g>
231<!-- u0&#45;&gt;u2 --> 236<!-- u0&#45;&gt;u2 -->
232<g id="edge12" class="edge"><title>u0&#45;&gt;u2</title> 237<g id="edge12" class="edge"><title>u0&#45;&gt;u2</title>
233<path fill="none" stroke="black" d="M802.772,-704.719C830.744,-685.294 877.96,-647.237 897,-600.709 925.504,-531.054 935.45,-283.188 885,-198.709 859.147,-155.419 808.473,-127.629 767.461,-111.25"/> 238<path fill="none" stroke="black" d="M1025.36,-822.185C1073.96,-811.674 1164.42,-784.272 1205,-720.912 1237.61,-669.995 1239.68,-502.671 1212,-448.912 1153.72,-335.696 1013.52,-264.6 935.23,-232.31"/>
234<polygon fill="black" stroke="black" points="768.659,-107.961 758.069,-107.629 766.14,-114.492 768.659,-107.961"/> 239<polygon fill="black" stroke="black" points="936.119,-228.893 925.536,-228.379 933.488,-235.38 936.119,-228.893"/>
235</g> 240</g>
236<!-- u0&#45;&gt;u1 --> 241<!-- u0&#45;&gt;u1 -->
237<g id="edge10" class="edge"><title>u0&#45;&gt;u1</title> 242<g id="edge10" class="edge"><title>u0&#45;&gt;u1</title>
238<path fill="none" stroke="black" d="M784.993,-700.783C792.846,-665.534 810.348,-586.97 819.747,-544.78"/> 243<path fill="none" stroke="black" d="M997.233,-809.943C1005.11,-776.527 1022.05,-704.612 1031.42,-664.82"/>
239<polygon fill="black" stroke="black" points="823.193,-545.407 821.951,-534.885 816.36,-543.885 823.193,-545.407"/> 244<polygon fill="black" stroke="black" points="1034.86,-665.509 1033.74,-654.972 1028.04,-663.903 1034.86,-665.509"/>
240</g> 245</g>
241<!-- u16 --> 246<!-- u17 -->
242<g id="node20" class="node"><title>u16</title> 247<g id="node21" class="node"><title>u17</title>
243<ellipse fill="none" stroke="black" cx="1101" cy="-516.709" rx="55.0898" ry="18"/> 248<ellipse fill="none" stroke="black" cx="1317" cy="-636.912" rx="55.0898" ry="18"/>
244<text text-anchor="middle" x="1101" y="-512.609" font-family="Times Roman,serif" font-size="14.00">MultiMap</text> 249<text text-anchor="middle" x="1317" y="-632.812" font-family="Times Roman,serif" font-size="14.00">MultiMap</text>
245</g>
246<!-- u0&#45;&gt;u16 -->
247<g id="edge24" class="edge"><title>u0&#45;&gt;u16</title>
248<path fill="none" stroke="black" d="M811.634,-710.657C863.554,-695.83 970.18,-660.171 1042,-600.709 1061.05,-584.934 1076.79,-561.571 1087.21,-543.486"/>
249<polygon fill="black" stroke="black" points="1090.36,-545.018 1092.16,-534.577 1084.24,-541.618 1090.36,-545.018"/>
250</g> 250</g>
251<!-- u13 --> 251<!-- u0&#45;&gt;u17 -->
252<g id="node24" class="node"><title>u13</title> 252<g id="edge24" class="edge"><title>u0&#45;&gt;u17</title>
253<ellipse fill="none" stroke="black" cx="1003" cy="-91.709" rx="38.9134" ry="18"/> 253<path fill="none" stroke="black" d="M1024.97,-821.259C1078.01,-808.945 1185.53,-778.455 1258,-720.912 1277.37,-705.529 1293.08,-682.133 1303.41,-663.935"/>
254<text text-anchor="middle" x="1003" y="-87.609" font-family="Times Roman,serif" font-size="14.00">Token</text> 254<polygon fill="black" stroke="black" points="1306.58,-665.417 1308.3,-654.963 1300.44,-662.063 1306.58,-665.417"/>
255</g> 255</g>
256<!-- u12&#45;&gt;u13 --> 256<!-- u14 -->
257<g id="edge56" class="edge"><title>u12&#45;&gt;u13</title> 257<g id="node25" class="node"><title>u14</title>
258<path fill="none" stroke="black" d="M1003,-206.495C1003,-184.235 1003,-146.314 1003,-120.186"/> 258<ellipse fill="none" stroke="black" cx="254" cy="-86.9122" rx="38.9134" ry="18"/>
259<polygon fill="black" stroke="black" points="1006.5,-120.13 1003,-110.13 999.5,-120.13 1006.5,-120.13"/> 259<text text-anchor="middle" x="254" y="-82.8122" font-family="Times Roman,serif" font-size="14.00">Token</text>
260</g>
261<!-- u13&#45;&gt;u14 -->
262<g id="edge56" class="edge"><title>u13&#45;&gt;u14</title>
263<path fill="none" stroke="black" d="M254,-193.736C254,-173.185 254,-139.459 254,-115.401"/>
264<polygon fill="black" stroke="black" points="257.5,-115.11 254,-105.11 250.5,-115.11 257.5,-115.11"/>
260</g> 265</g>
261</g> 266</g>
262</svg> 267</svg>