Съхранява информацията за един многомандатен изборен район, зареден от MIRs.txt.
        /// <summary>
        /// Извършва разпределение на основните мандати на партии и коалиции в
        /// един многомандатен изборен район (по чл. 21, ал. 3).
        /// </summary>
        /// <param name="region">Многомандатният изборен район, в който да
        /// бъдат разпределени мандатите.</param>
        /// <param name="hareQuota">Предварително изчислената квота на
        /// Хеър.</param>
        private void AssignBaseRegionalMandates(Region region, decimal hareQuota)
        {
            ConsoleHelper.WriteSectionCaption("Партии и коалиции, които получават мандати по чл. 21, ал. 3");
            foreach (Party party in Parties.Values)
            {
                long partyVoteCount = region.GetVoteCount(party.PartyId);
                decimal partyQuotient = partyVoteCount / hareQuota;
                int baseMandateCount = (int)partyQuotient;

                var assignment = new MandateAssignment
                {
                    RegionId = region.RegionId,
                    PartyId = party.PartyId,
                    BaseMandateCount = baseMandateCount,
                    Remainder = partyQuotient - baseMandateCount,
                };

                party.MandateAssignments.Add(assignment);
                region.MandateAssignments.Add(party.PartyId, assignment);

                ConsoleHelper.WriteObject(assignment);
            }
        }
        /// <summary>
        /// Извършва разпределение на допълнителните мандати на партии и
        /// коалиции в един многомандатен изборен район (по чл. 21, ал. 5 и 6).
        /// </summary>
        /// <param name="region">Многомандатният изборен район, в който да
        /// бъдат разпределени мандатите.</param>
        private void AssignAdditionalRegionalMandates(Region region)
        {
            ConsoleHelper.WriteSectionCaption("Партии и коалиции, които получават допълнителен мандат по чл. 21, ал. 5 и 6");
            int assignedMandateCount = region.GetAssignedMandateCount();
            while (assignedMandateCount < region.MandateCount)
            {
                // Определят се партията/партиите с най-голям остатък, неудовлетворен с допълнителен мандат
                decimal maxRemainder = -1.0m;
                var partyIds = new List<int>();
                foreach (MandateAssignment assignment in region.MandateAssignments.Values)
                {
                    // Партии, които вече са получили допълнителен мандат на предишна стъпка, не участват в разпределянето
                    if (assignment.AdditionalMandate)
                        continue;

                    if (assignment.Remainder > maxRemainder)
                    {
                        partyIds.Clear();
                        partyIds.Add(assignment.PartyId);
                        maxRemainder = assignment.Remainder;
                    }
                    else if (assignment.Remainder == maxRemainder)
                        partyIds.Add(assignment.PartyId);
                }

                int remainingMandateCount = region.MandateCount - assignedMandateCount;
                if (partyIds.Count > remainingMandateCount)
                {
                    // Ако броят на определените партии е по-голям от броя на оставащите мандати
                    // за разпределяне, то допълнтелните мандати се разпределят по ред на нарастване
                    // поредния номер на партията или коалицията (чл. 21, ал. 6)
                    Console.WriteLine(
                        "Достигнат жребий при разпределяне на мандатите на партии и коалиции по чл. 21, ал. 6. Мандатите ще бъдат получени от първите {0} партии с най-малки номера.",
                        remainingMandateCount);
                    Console.WriteLine();

                    partyIds.Sort();
                    partyIds.RemoveRange(remainingMandateCount, partyIds.Count - remainingMandateCount);
                }

                // Определените партии получават по един допълнителен мандат и не участват в
                // по-нататъчното разпределение на допълнителни мандати
                foreach (int partyId in partyIds)
                {
                    MandateAssignment assignment = region.MandateAssignments[partyId];
                    assignment.AdditionalMandate = true;

                    ConsoleHelper.WriteObject(assignment);
                }

                assignedMandateCount = region.GetAssignedMandateCount();
            }
        }