#include <iostream>
#include <string>
#include <cstdint>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <memory>

class BufferedReader {
 private:
    PackageStream* d;
    int shift = 0;
    char s[10000];

 public:
    explicit BufferedReader(PackageStream* stream);
    int32_t Read(char* buf, int32_t bytes);
};

BufferedReader::BufferedReader(PackageStream* stream) : d(stream) {
}

int32_t BufferedReader::Read(char* buf, int32_t bytes) {
    int count = bytes / d->PackageLen(), len = 0;
    for (int i = 0; i <= count; ++i) {
        len += d->ReadPackage(s + len);
    }
    if (len <= bytes) {
        memcpy(buf, s + shift, size_t(len));
        shift += len;
        return shift;
    }
    if (len > bytes) {
    memcpy(buf, s + shift, size_t(bytes));
        shift += bytes;
        return bytes;
    }
    return bytes;
}