private void Load(ChunkLookup.IChunkVariantInfo chunkVariantInfo, Stream output)
        {
            using (var file = MemoryMappedFile.CreateFromFile(chunkVariantInfo.DataPath, FileMode.Open))
                using (var input = file.CreateViewStream(chunkVariantInfo.Offset, chunkVariantInfo.Size.Align(16)))
                {
                    if (chunkVariantInfo.CryptoInfo.HasValue == false)
                    {
                        output.WriteFromStream(input, chunkVariantInfo.Size);
                        return;
                    }

                    var    keyId = chunkVariantInfo.CryptoInfo.Value.KeyId;
                    byte[] keyBytes;
                    if (this._CryptoKeys.TryGetValue(keyId, out keyBytes) == false)
                    {
                        throw new ChunkCryptoKeyMissingException(keyId);
                    }

                    using (var aes = Aes.Create())
                    {
                        aes.Key     = keyBytes;
                        aes.IV      = keyBytes; // yes, it's that stupid
                        aes.Mode    = CipherMode.CBC;
                        aes.Padding = PaddingMode.PKCS7;
                        using (var decryptor = aes.CreateDecryptor())
                            using (var cryptoStream = new CryptoStream(input, decryptor, CryptoStreamMode.Read))
                            {
                                output.WriteFromStream(cryptoStream, chunkVariantInfo.Size);
                            }
                    }
                }
        }
        public void Load(ChunkLookup.IChunkVariantInfo chunkVariantInfo, long size, Stream output)
        {
            if (chunkVariantInfo == null)
            {
                throw new ArgumentNullException("chunkVariantInfo");
            }

            if (chunkVariantInfo.Size == size)
            {
                Load(chunkVariantInfo, output);
            }
            else
            {
                using (var temp = new MemoryStream())
                {
                    Load(chunkVariantInfo, temp);
                    if (temp.Length != chunkVariantInfo.Size)
                    {
                        throw new InvalidOperationException();
                    }
                    temp.Position = 0;
                    Decompress(temp, output, size);
                }
            }
        }