public ReleaseManifest GetReleaseManifest()
        {
            byte[] data;
            using (WebClient wc = new WebClient())
            {
                data = wc.DownloadData($"{Program.API_BASE}projects/{this.Name}/releases/{this.Version}/releasemanifest");
            }

            var m = new ReleaseManifest();

            using (MemoryStream ms = new MemoryStream(data))
            {
                m.BranchName = this.Name;

                m.MagicHeaderInt = GetInt(ms);
                m.FileType = GetInt(ms);
                m.ItemCount = GetInt(ms);
                m.ReleaseVersion = GetInt(ms);
                m.ReleaseName = GetReleaseName(m.ReleaseVersion);

                DirectoryMetaData[] directoryMetaDatas = new DirectoryMetaData[GetInt(ms)];

                for (int i = 0; i < directoryMetaDatas.Length; i++)
                {
                    directoryMetaDatas[i] = new DirectoryMetaData(GetInt(ms),
                            GetInt(ms),
                            GetInt(ms),
                            GetInt(ms),
                            GetInt(ms));
                }

                FileMetaData[] fileMetaDatas = new FileMetaData[GetInt(ms)];
                for (int i = 0; i < fileMetaDatas.Length; i++)
                {
                    fileMetaDatas[i] = new FileMetaData(GetInt(ms),
                            GetInt(ms),
                            GetBytes(ms, 16),
                            GetInt(ms),
                            GetInt(ms),
                            GetInt(ms),
                            GetInt(ms),
                            GetInt(ms));
                }
                String[] strs = new String[GetInt(ms)];
                int datasize = GetInt(ms); // ignored

                int c;
                int idx = 0;
                StringBuilder sb = new StringBuilder();
                while ((c = ms.ReadByte()) != -1)
                {
                    if (c == '\0')
                    {
                        strs[idx] = sb.ToString();
                        sb = new StringBuilder();
                        idx++;
                        continue;
                    }
                    sb.Append((char)c);
                }
                //assert(component.equals(strs[strs.length - 1]));

                // creating proper objects
                m.Directories = new Directory[directoryMetaDatas.Length];
                for (int i = 0; i < directoryMetaDatas.Length; i++)
                {
                    m.Directories[i] = new Directory(strs[directoryMetaDatas[i].nameindex]);
                }
                // linking subdirectories
                for (int i = 0; i < directoryMetaDatas.Length; i++)
                {
                    int start = directoryMetaDatas[i].subdirFirstIndex;
                    if (start == i) start++;
                    m.Directories[i].subdirs = new Directory[directoryMetaDatas[i].nsubdirs];

                    for (int j = 0; j < directoryMetaDatas[i].nsubdirs; j++)
                    {
                        m.Directories[i].subdirs[j] = m.Directories[start + j];
                        m.Directories[start + j].path = m.Directories[i].path + m.Directories[start + j].path;
                    }
                }
                m.Files = new ManifestFile[fileMetaDatas.Length];
                for (int i = 0; i < fileMetaDatas.Length; i++)
                {
                    FileMetaData meta = fileMetaDatas[i];
                    m.Files[i] = new ManifestFile(GetReleaseName(meta.release),
                            meta.release,
                            strs[meta.nameindex],
                            meta.checksum, meta.sizeCompressed,
                            meta.fileType, meta.sizeUncompressed,
                            meta.unknownInt3, meta.unknownInt4);
                }
                // linking files to directories
                for (int i = 0; i < directoryMetaDatas.Length; i++)
                {
                    int start = directoryMetaDatas[i].firstfileIndex;
                    m.Directories[i].files = new ManifestFile[directoryMetaDatas[i].fileCount];

                    for (int j = 0; j < directoryMetaDatas[i].fileCount; j++)
                    {
                        m.Directories[i].files[j] = m.Files[start + j];
                        m.Files[start + j].path = m.Directories[i].path;
                    }
                }
                m.FileDictionary = new Dictionary<string, ManifestFile>();
                foreach (ManifestFile fi in m.Files)
                {
                    m.FileDictionary[fi.path + fi.name] =  fi;
                }
            }

        

            return m;

            

        }
        public ReleaseManifest GetReleaseManifest()
        {
            byte[] data;
            using (WebClient wc = new WebClient())
            {
                data = wc.DownloadData($"{Program.API_BASE}projects/{this.Name}/releases/{this.Version}/releasemanifest");
            }

            var m = new ReleaseManifest();

            using (MemoryStream ms = new MemoryStream(data))
            {
                m.BranchName = this.Name;

                m.MagicHeaderInt = GetInt(ms);
                m.FileType       = GetInt(ms);
                m.ItemCount      = GetInt(ms);
                m.ReleaseVersion = GetInt(ms);
                m.ReleaseName    = GetReleaseName(m.ReleaseVersion);

                DirectoryMetaData[] directoryMetaDatas = new DirectoryMetaData[GetInt(ms)];

                for (int i = 0; i < directoryMetaDatas.Length; i++)
                {
                    directoryMetaDatas[i] = new DirectoryMetaData(GetInt(ms),
                                                                  GetInt(ms),
                                                                  GetInt(ms),
                                                                  GetInt(ms),
                                                                  GetInt(ms));
                }

                FileMetaData[] fileMetaDatas = new FileMetaData[GetInt(ms)];
                for (int i = 0; i < fileMetaDatas.Length; i++)
                {
                    fileMetaDatas[i] = new FileMetaData(GetInt(ms),
                                                        GetInt(ms),
                                                        GetBytes(ms, 16),
                                                        GetInt(ms),
                                                        GetInt(ms),
                                                        GetInt(ms),
                                                        GetInt(ms),
                                                        GetInt(ms));
                }
                String[] strs     = new String[GetInt(ms)];
                int      datasize = GetInt(ms); // ignored

                int           c;
                int           idx = 0;
                StringBuilder sb  = new StringBuilder();
                while ((c = ms.ReadByte()) != -1)
                {
                    if (c == '\0')
                    {
                        strs[idx] = sb.ToString();
                        sb        = new StringBuilder();
                        idx++;
                        continue;
                    }
                    sb.Append((char)c);
                }
                //assert(component.equals(strs[strs.length - 1]));

                // creating proper objects
                m.Directories = new Directory[directoryMetaDatas.Length];
                for (int i = 0; i < directoryMetaDatas.Length; i++)
                {
                    m.Directories[i] = new Directory(strs[directoryMetaDatas[i].nameindex]);
                }
                // linking subdirectories
                for (int i = 0; i < directoryMetaDatas.Length; i++)
                {
                    int start = directoryMetaDatas[i].subdirFirstIndex;
                    if (start == i)
                    {
                        start++;
                    }
                    m.Directories[i].subdirs = new Directory[directoryMetaDatas[i].nsubdirs];

                    for (int j = 0; j < directoryMetaDatas[i].nsubdirs; j++)
                    {
                        m.Directories[i].subdirs[j]   = m.Directories[start + j];
                        m.Directories[start + j].path = m.Directories[i].path + m.Directories[start + j].path;
                    }
                }
                m.Files = new ManifestFile[fileMetaDatas.Length];
                for (int i = 0; i < fileMetaDatas.Length; i++)
                {
                    FileMetaData meta = fileMetaDatas[i];
                    m.Files[i] = new ManifestFile(GetReleaseName(meta.release),
                                                  meta.release,
                                                  strs[meta.nameindex],
                                                  meta.checksum, meta.sizeCompressed,
                                                  meta.fileType, meta.sizeUncompressed,
                                                  meta.unknownInt3, meta.unknownInt4);
                }
                // linking files to directories
                for (int i = 0; i < directoryMetaDatas.Length; i++)
                {
                    int start = directoryMetaDatas[i].firstfileIndex;
                    m.Directories[i].files = new ManifestFile[directoryMetaDatas[i].fileCount];

                    for (int j = 0; j < directoryMetaDatas[i].fileCount; j++)
                    {
                        m.Directories[i].files[j] = m.Files[start + j];
                        m.Files[start + j].path   = m.Directories[i].path;
                    }
                }
                m.FileDictionary = new Dictionary <string, ManifestFile>();
                foreach (ManifestFile fi in m.Files)
                {
                    m.FileDictionary[fi.path + fi.name] = fi;
                }
            }



            return(m);
        }