public static List <GHFileSystem> LoadFromString(string input)
        {
            List <GHFileSystem> output = new List <GHFileSystem>();
            Queue <char>        queue  = new Queue <char>(input);

            while (queue.Count > 0)
            {
                StringBuilder sb = new StringBuilder();
                while (queue.Peek() != ';')
                {
                    sb.Append(queue.Dequeue());
                }

                queue.Dequeue();
                string publicIp = sb.ToString();

                sb.Clear();
                while (queue.Peek() != ';')
                {
                    sb.Append(queue.Dequeue());
                }

                queue.Dequeue();
                string localIp = sb.ToString();
                sb.Clear();
                Queue <char> imageQueue = GHTextConvertor.HexToUtf16(queue);

                output.Add(LoadFromCompressedString(publicIp, localIp, imageQueue, sb));
                queue.Dequeue();
            }

            return(output);
        }
        public static GHFileSystem LoadFromCompressedString(string publicIp, string localIp, Queue <char> imageQueue, StringBuilder sb)
        {
            GHFileSystem fileSystem = new GHFileSystem()
            {
                PublicIp = publicIp, LocalIp = localIp
            };
            GHFileSystemNode activeNode = null;

            while (imageQueue.Count > 0)
            {
                sb.Clear();
                while (imageQueue.Peek() < 32768)
                {
                    sb.Append(GHTextConvertor.Utf14ToDoubleUtf7(imageQueue.Dequeue()));
                }

                if (imageQueue.Peek() == (char)Depth.Up)
                {
                    activeNode = activeNode.Parent;
                    imageQueue.Dequeue();
                    continue;
                }

                var tmp = new GHFileSystemNode(activeNode, sb.ToString())
                {
                    FileSystem = fileSystem
                };
                tmp.FileFlags = (FileFlag)imageQueue.Dequeue() - 32768;
                if (activeNode != null)
                {
                    activeNode.AddChild(tmp);
                    if (activeNode.IsHomeFolder && !fileSystem.Users.ContainsKey(tmp.Name))
                    {
                        fileSystem.Users.Add(tmp.Name, new GHFileSystemUser()
                        {
                            FileSystem = fileSystem, HomeFolder = tmp
                        });
                    }
                    else if (tmp.IsRootUserFolder)
                    {
                        fileSystem.Users.Add(tmp.Name, new GHFileSystemUser()
                        {
                            FileSystem = fileSystem, HomeFolder = tmp
                        });
                    }
                }

                if (imageQueue.Peek() == (char)Depth.Down)
                {
                    imageQueue.Dequeue();
                    activeNode = tmp;
                }
            }

            fileSystem.RootNode = activeNode;
            return(fileSystem);
        }