private long ReadBlocksInfoAndDirectory(EndianBinaryReader varReader)
        {
            byte[] blocksInfoBytes;
            if (HeaderInfo.version >= 7)
            {
                varReader.AlignStream(16);
            }
            if ((HeaderInfo.flags & (int)ArchiveFlags.kArchiveBlocksInfoAtTheEnd) != 0)
            {
                var tempPosition = varReader.Position;
                {
                    varReader.Position = varReader.BaseStream.Length - HeaderInfo.compressedBlocksInfoSize;
                    blocksInfoBytes    = varReader.ReadBytes((int)HeaderInfo.compressedBlocksInfoSize);
                }
                varReader.Position = tempPosition;
            }
            else //0x40 kArchiveBlocksAndDirectoryInfoCombined
            {
                blocksInfoBytes = varReader.ReadBytes((int)HeaderInfo.compressedBlocksInfoSize);
            }
            var          blocksInfoCompressedStream = new MemoryStream(blocksInfoBytes);
            MemoryStream blocksInfoUncompresseddStream;

            switch (HeaderInfo.GetBlocksInfoCompressionType())
            {
            default:     //None
            {
                blocksInfoUncompresseddStream = blocksInfoCompressedStream;
                break;
            }

            case Compression.CompressionType.kCompressionLzma:
            {
                blocksInfoUncompresseddStream = new MemoryStream((int)(HeaderInfo.uncompressedBlocksInfoSize));
                SevenZipHelper.StreamDecompress(blocksInfoCompressedStream, blocksInfoUncompresseddStream, HeaderInfo.compressedBlocksInfoSize, HeaderInfo.uncompressedBlocksInfoSize);
                blocksInfoUncompresseddStream.Position = 0;
                blocksInfoCompressedStream.Close();
                break;
            }

            case Compression.CompressionType.kCompressionLz4:
            case Compression.CompressionType.kCompressionLz4HC:
            {
                var uncompressedBytes = new byte[HeaderInfo.uncompressedBlocksInfoSize];
                using (var decoder = new Lz4DecoderStream(blocksInfoCompressedStream))
                {
                    decoder.Read(uncompressedBytes, 0, uncompressedBytes.Length);
                }
                blocksInfoUncompresseddStream = new MemoryStream(uncompressedBytes);
                break;
            }
            }
            using (var blocksInfoReader = new EndianBinaryReader(blocksInfoUncompresseddStream))
            {
                var uncompressedDataHash = blocksInfoReader.ReadBytes(16);
                var blocksInfoCount      = blocksInfoReader.ReadInt32();
                BlocksInfo = new List <StorageBlock>(blocksInfoCount);
                for (int i = 0; i < blocksInfoCount; i++)
                {
                    var tempBlock = new StorageBlock().Parse(blocksInfoReader);
                    BlocksInfo.Add(tempBlock);
                }

                var nodesCount = blocksInfoReader.ReadInt32();
                DirectoryInfo = new List <Node>(nodesCount);
                for (int i = 0; i < nodesCount; i++)
                {
                    var tempDirInfo = new Node().Parse(blocksInfoReader);
                    DirectoryInfo.Add(tempDirInfo);
                }
            }

            return(varReader.Position);
        }