/// <summary>
        /// Add a single allowlist entry to the list.
        /// </summary>
        public void Add(ValuePathFileAccessAllowlistEntry entry)
        {
            Contract.Requires(entry != null);

            m_valuePathEntries.Add(entry.OutputValue, entry);
            m_counts.AddOrUpdate(entry.Name, 0, (k, v) => v);
            HasEntries = true;
        }
        private static void DeserializeCore(BuildXLReader reader, FileAccessAllowlist allowlist)
        {
            var valuePathEntryCount = reader.ReadInt32Compact();

            for (int i = 0; i < valuePathEntryCount; i++)
            {
                allowlist.Add(ValuePathFileAccessAllowlistEntry.Deserialize(reader));
            }

            var executablePathEntryCount = reader.ReadInt32Compact();

            for (int i = 0; i < executablePathEntryCount; i++)
            {
                allowlist.Add(ExecutablePathAllowlistEntry.Deserialize(reader));
            }
        }
        private static void DeserializeCore(BuildXLReader reader, FileAccessAllowlist allowlist)
        {
            var valuePathEntryCount = reader.ReadInt32Compact();

            for (int i = 0; i < valuePathEntryCount; i++)
            {
                allowlist.Add(ValuePathFileAccessAllowlistEntry.Deserialize(reader));
            }

            // Execute this part twice, first time for m_executablePathEntries (Absolute Path) and a second time for m_executablePathAtomEntries (Path Atom)
            var executablePathEntryCount = reader.ReadInt32Compact();

            for (int j = 0; j < executablePathEntryCount; j++)
            {
                allowlist.Add(ExecutablePathAllowlistEntry.Deserialize(reader));
            }
        }