Initial checkin of personal version.
Signed-off-by: Thomas Hochstein <thh@inter.net>
This commit is contained in:
		
							parent
							
								
									ac7e2c541a
								
							
						
					
					
						commit
						a384e31e54
					
				
					 13 changed files with 271 additions and 46 deletions
				
			
		
							
								
								
									
										36
									
								
								UVrules.pm
									
										
									
									
									
								
							
							
						
						
									
										36
									
								
								UVrules.pm
									
										
									
									
									
								
							| 
						 | 
					@ -149,10 +149,10 @@ sub read_rulefile {
 | 
				
			||||||
      die $errortext . ": $_\n\n" if ($errortext);
 | 
					      die $errortext . ": $_\n\n" if ($errortext);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
      # check for correct characters in conditions
 | 
					      # check for correct characters in conditions
 | 
				
			||||||
      if ($if !~ /^[JjNnEeSsHhIi\.]+$/) {
 | 
					      if ($if !~ /^[JjNnEeSsIi\.]+$/) {
 | 
				
			||||||
        die UVmessage::get ("RULES_INVCHARS", (NUM=>$num+1, TYPE=>"if")) . ": $if\n\n";
 | 
					        die UVmessage::get ("RULES_INVCHARS", (NUM=>$num+1, TYPE=>"if")) . ": $if\n\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      } elsif ($then !~ /^[JjNnEeSsHhIi\.]+$/) {
 | 
					      } elsif ($then !~ /^[JjNnEeSsIi\.]+$/) {
 | 
				
			||||||
        die UVmessage::get ("RULES_INVCHARS",
 | 
					        die UVmessage::get ("RULES_INVCHARS",
 | 
				
			||||||
                            (NUM=>$num+1, TYPE=>"if")) . ": $then\n\n";
 | 
					                            (NUM=>$num+1, TYPE=>"if")) . ": $then\n\n";
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
| 
						 | 
					@ -194,9 +194,8 @@ sub read_rulefile {
 | 
				
			||||||
sub make_regex_pos {
 | 
					sub make_regex_pos {
 | 
				
			||||||
  my $pat = $_[0];
 | 
					  my $pat = $_[0];
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
  $pat =~ s/[hijens]/./g;
 | 
					  $pat =~ s/[jens]/./g;
 | 
				
			||||||
  $pat =~ s/S/[JN]/g;
 | 
					  $pat =~ s/S/[JN]/g;
 | 
				
			||||||
  $pat =~ s/H/[EJ]/g;
 | 
					 | 
				
			||||||
  $pat =~ s/I/[EN]/g;
 | 
					  $pat =~ s/I/[EN]/g;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
  return $pat;
 | 
					  return $pat;
 | 
				
			||||||
| 
						 | 
					@ -217,19 +216,22 @@ sub make_regex_neg {
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
  # upper case characters are replaced with dots
 | 
					  # upper case characters are replaced with dots
 | 
				
			||||||
  # (are covered by make_regex_pos)
 | 
					  # (are covered by make_regex_pos)
 | 
				
			||||||
  $pat =~ s/[HIJENS]/./g;
 | 
					  $pat =~ s/[JENS]/./g;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
  # reverse lower case characters
 | 
					  # reverse lower case characters
 | 
				
			||||||
  $pat =~ s/j/[NE]/g;
 | 
					  $pat =~ s/j/[NE]/g;
 | 
				
			||||||
  $pat =~ s/n/[JE]/g;
 | 
					  $pat =~ s/n/[JE]/g;
 | 
				
			||||||
  $pat =~ s/e/[JN]/g;
 | 
					  $pat =~ s/e/[JN]/g;
 | 
				
			||||||
  $pat =~ s/s/E/g;
 | 
					  $pat =~ s/s/E/g;
 | 
				
			||||||
  $pat =~ s/h/N/g;
 | 
					 | 
				
			||||||
  $pat =~ s/i/J/g;
 | 
					  $pat =~ s/i/J/g;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
  # If the string contained only upper case characters they are now all
 | 
					  # to be translated:
 | 
				
			||||||
  # replaced with dots and the RegEx would match everything, i.e. declare
 | 
					  # Falls keine Kleinbuchstaben vorkamen (es sind nur Punkte uebrig):
 | 
				
			||||||
  # every vote as invalid. In this case an empty pattern is returned.
 | 
					  # Wenn keine optionalen Forderungen vorhanden sind, wuerde der Regex
 | 
				
			||||||
 | 
					  # immer matchen und somit die Stimme immer als nicht passend erkannt
 | 
				
			||||||
 | 
					  # werden. Deswegen wird versucht auf den leeren String zu ueberpruefen,
 | 
				
			||||||
 | 
					  # was durch die Negation dazu fuehrt, dass die Stimme als passend 
 | 
				
			||||||
 | 
					  # gewertet wird.
 | 
				
			||||||
  $pat =~ s/^\.+$//;
 | 
					  $pat =~ s/^\.+$//;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
  return $pat;
 | 
					  return $pat;
 | 
				
			||||||
| 
						 | 
					@ -303,10 +305,6 @@ sub rule_print {
 | 
				
			||||||
      $fill = "    $and ";
 | 
					      $fill = "    $and ";
 | 
				
			||||||
      $text1 = UVmessage::get ("RULES_IFCLAUSE",
 | 
					      $text1 = UVmessage::get ("RULES_IFCLAUSE",
 | 
				
			||||||
                               (VOTE=>"$yes $or $no", GROUP=>$groups[$i]));
 | 
					                               (VOTE=>"$yes $or $no", GROUP=>$groups[$i]));
 | 
				
			||||||
    } elsif ($rule[$i] eq 'H') {
 | 
					 | 
				
			||||||
      $fill = "    $and ";
 | 
					 | 
				
			||||||
      $text1 = UVmessage::get ("RULES_IFCLAUSE",
 | 
					 | 
				
			||||||
                               (VOTE=>"$abst $or $yes", GROUP=>$groups[$i]));
 | 
					 | 
				
			||||||
    } elsif ($rule[$i] eq 'I') {
 | 
					    } elsif ($rule[$i] eq 'I') {
 | 
				
			||||||
      $fill = "    $and ";
 | 
					      $fill = "    $and ";
 | 
				
			||||||
      $text1 = UVmessage::get ("RULES_IFCLAUSE",
 | 
					      $text1 = UVmessage::get ("RULES_IFCLAUSE",
 | 
				
			||||||
| 
						 | 
					@ -324,10 +322,6 @@ sub rule_print {
 | 
				
			||||||
      $fill = "    $or ";
 | 
					      $fill = "    $or ";
 | 
				
			||||||
      $text1 = UVmessage::get ("RULES_IFCLAUSE",
 | 
					      $text1 = UVmessage::get ("RULES_IFCLAUSE",
 | 
				
			||||||
                               (VOTE=>"$yes $or $no", GROUP=>$groups[$i]));
 | 
					                               (VOTE=>"$yes $or $no", GROUP=>$groups[$i]));
 | 
				
			||||||
    } elsif ($rule[$i] eq 'h') {
 | 
					 | 
				
			||||||
      $fill = "    $or ";
 | 
					 | 
				
			||||||
      $text1 = UVmessage::get ("RULES_IFCLAUSE",
 | 
					 | 
				
			||||||
                               (VOTE=>"$abst $or $yes", GROUP=>$groups[$i]));
 | 
					 | 
				
			||||||
    } elsif ($rule[$i] eq 'i') {
 | 
					    } elsif ($rule[$i] eq 'i') {
 | 
				
			||||||
      $fill = "    $or ";
 | 
					      $fill = "    $or ";
 | 
				
			||||||
      $text1 = UVmessage::get ("RULES_IFCLAUSE",
 | 
					      $text1 = UVmessage::get ("RULES_IFCLAUSE",
 | 
				
			||||||
| 
						 | 
					@ -363,10 +357,6 @@ sub rule_print {
 | 
				
			||||||
      $fill = "    $and ";
 | 
					      $fill = "    $and ";
 | 
				
			||||||
      $text1 = UVmessage::get ("RULES_THENCLAUSE",
 | 
					      $text1 = UVmessage::get ("RULES_THENCLAUSE",
 | 
				
			||||||
                               (VOTE=>"$yes $or $no", GROUP=>$groups[$i]));
 | 
					                               (VOTE=>"$yes $or $no", GROUP=>$groups[$i]));
 | 
				
			||||||
    } elsif ($rule[$i] eq 'H') {
 | 
					 | 
				
			||||||
      $fill = "    $and ";
 | 
					 | 
				
			||||||
      $text1 = UVmessage::get ("RULES_THENCLAUSE",
 | 
					 | 
				
			||||||
                               (VOTE=>"$abst $or $yes", GROUP=>$groups[$i]));
 | 
					 | 
				
			||||||
    } elsif ($rule[$i] eq 'I') {
 | 
					    } elsif ($rule[$i] eq 'I') {
 | 
				
			||||||
      $fill = "    $and ";
 | 
					      $fill = "    $and ";
 | 
				
			||||||
      $text1 = UVmessage::get ("RULES_THENCLAUSE",
 | 
					      $text1 = UVmessage::get ("RULES_THENCLAUSE",
 | 
				
			||||||
| 
						 | 
					@ -384,10 +374,6 @@ sub rule_print {
 | 
				
			||||||
      $fill = "    $or ";
 | 
					      $fill = "    $or ";
 | 
				
			||||||
      $text1 = UVmessage::get ("RULES_THENCLAUSE",
 | 
					      $text1 = UVmessage::get ("RULES_THENCLAUSE",
 | 
				
			||||||
                               (VOTE=>"$yes $or $no", GROUP=>$groups[$i]));
 | 
					                               (VOTE=>"$yes $or $no", GROUP=>$groups[$i]));
 | 
				
			||||||
    } elsif ($rule[$i] eq 'h') {
 | 
					 | 
				
			||||||
      $fill = "    $or ";
 | 
					 | 
				
			||||||
      $text1 = UVmessage::get ("RULES_THENCLAUSE",
 | 
					 | 
				
			||||||
                               (VOTE=>"$abst $or $yes", GROUP=>$groups[$i]));
 | 
					 | 
				
			||||||
    } elsif ($rule[$i] eq 'i') {
 | 
					    } elsif ($rule[$i] eq 'i') {
 | 
				
			||||||
      $fill = "    $or ";
 | 
					      $fill = "    $or ";
 | 
				
			||||||
      $text1 = UVmessage::get ("RULES_THENCLAUSE",
 | 
					      $text1 = UVmessage::get ("RULES_THENCLAUSE",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -154,7 +154,6 @@ CFV_SUBJECT = Wahlschein
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
COUNT_ERR_OPEN = Kann Ergebnisdatei ${FILE} nicht oeffnen!
 | 
					COUNT_ERR_OPEN = Kann Ergebnisdatei ${FILE} nicht oeffnen!
 | 
				
			||||||
COUNT_ERR_RESULT = Fehler in ${FILE} Zeile ${LINE}
 | 
					COUNT_ERR_RESULT = Fehler in ${FILE} Zeile ${LINE}
 | 
				
			||||||
COUNT_ERR_GROUPCOUNT = Bei Stimme von <${ADDR}>: ${NUM1} statt ${NUM2} Stimmen gefunden (${RESULTFILE} kontrollieren!)
 | 
					 | 
				
			||||||
COUNT_DELETED = ${NUM} Stimme(n) geloescht.
 | 
					COUNT_DELETED = ${NUM} Stimme(n) geloescht.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# uvvote.pl
 | 
					# uvvote.pl
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,12 +11,13 @@ group-more            := value group | drop-words 40 | create-lines 40
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Ergebnisse [$votename-first]
 | 
					Ergebnisse [$votename-first]
 | 
				
			||||||
[@votename-more|           [$line]\n]
 | 
					[@votename-more|           [$line]\n]
 | 
				
			||||||
([$numvalid] gueltige Stimmen)
 | 
					
 | 
				
			||||||
 | 
					Es wurden [$numvalid] gueltige Stimmen abgegeben.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 Ja  Nein : 2/3? >=60? : ang.? : Gruppe
 | 
					 Ja  Nein : 2/3? >=60? : ang.? : Gruppe
 | 
				
			||||||
---- ---- : ---- ----- : ----- : ---------------------------------------
 | 
					---- ---- : ---- ----- : ----- : ---------------------------------------
 | 
				
			||||||
[@count|[$yes] [$no] : [?cond1| Ja |Nein] [?cond2| Ja |Nein]  : [?result| Ja |Nein]  : [$group-first]
 | 
					[@count|[$yes] [$no] : [?cond1| Ja |Nein] [?cond2| Ja |Nein]  : [?result| Ja |Nein]  : [$group-first]
 | 
				
			||||||
[@group-more|          :            :       : [$line]\n]\n]
 | 
					[@group-more|          :            :       : [$line]|\n]\n]
 | 
				
			||||||
[?numabstain|[$numabstain-formatted] Enthaltungen]
 | 
					[?numabstain|[$numabstain-formatted] Enthaltungen]
 | 
				
			||||||
[?numinvalid|[$numinvalid] ungueltige Stimme(n)]
 | 
					[?numinvalid|[$numinvalid] ungueltige Stimme(n)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,8 +14,8 @@ Es gab [$yes] Ja-Stimmen und [$no] Nein-Stimmen[?numabstain| bei [$numabstain] E
 | 
				
			||||||
[?numinvalid|[$numinvalid] Stimme(n) wurden als ungueltig gewertet.]
 | 
					[?numinvalid|[$numinvalid] Stimme(n) wurden als ungueltig gewertet.]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Es wurde [?cond1|die|keine] 2/3-Mehrheit erreicht und es gingen [?cond2|mehr|weniger] als
 | 
					Es wurde [?cond1|die|keine] 2/3-Mehrheit erreicht und es gingen [?cond2|mehr|weniger] als
 | 
				
			||||||
60 Ja-Stimmen ein. Damit ist die [$votename-text-first]
 | 
					60 Ja-Stimmen ein. Damit ist die [$votename-first]
 | 
				
			||||||
[@votename-text-more|[$line] |\n][?cond1|[?cond2|angenommen|abgelehnt]|abgelehnt].
 | 
					[@votename-more|[$line]|\n] [?cond1|[?cond2|angenommen|abgelehnt]|abgelehnt].
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Gegen dieses Ergebnis kann innerhalb einer Woche nach seiner
 | 
					Gegen dieses Ergebnis kann innerhalb einer Woche nach seiner
 | 
				
			||||||
Veroeffentlichung Einspruch erhoben werden. Der Einspruch ist per
 | 
					Veroeffentlichung Einspruch erhoben werden. Der Einspruch ist per
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										165
									
								
								usevote.global.cfg
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								usevote.global.cfg
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,165 @@
 | 
				
			||||||
 | 
					########################################################################
 | 
				
			||||||
 | 
					# Alles ab hier braucht i.d.R. nur einmal festgelegt werden.
 | 
				
			||||||
 | 
					# Es ist moeglich, diese Einstellungen in eine globale Konfigurations-
 | 
				
			||||||
 | 
					# datei auszulagern. Das Einbinden erfolgt mit der Zeile
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# include /pfad/zur/globalen_datei
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Falls Einstellungen aus der globalen Konfigurationsdatei hier
 | 
				
			||||||
 | 
					# fuer einzelne Abstimmungen ueberschrieben werden sollen, muessen
 | 
				
			||||||
 | 
					# diese *hinter* dem Include-Befehl stehen!
 | 
				
			||||||
 | 
					# (der letzte Wert ueberschreibt vorhergehende Definitionen)
 | 
				
			||||||
 | 
					########################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# SMTP benutzen? (falls nicht, wird der weiter unten einstellbare
 | 
				
			||||||
 | 
					# MTA direkt aufgerufen; unter Windows kann nur SMTP benutzt werden!)
 | 
				
			||||||
 | 
					smtp = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# SMTP-Server (falls smtp = 1)
 | 
				
			||||||
 | 
					smtpserver = localhost
 | 
				
			||||||
 | 
					smtpport = 25
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# SMTP-Authentifizierung benutzen? (RFC 2554)
 | 
				
			||||||
 | 
					# Das entsprechende Perlmodul (Net::SMTP) kann derzeit nur AUTH PLAIN,
 | 
				
			||||||
 | 
					# funktioniert also moeglicherweise nicht mit jedem Server
 | 
				
			||||||
 | 
					#smtpauth = 0
 | 
				
			||||||
 | 
					#smtpuser = 
 | 
				
			||||||
 | 
					#smtppass = 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Falls als HELO etwas anderes als der Hostname verwendet werden soll:
 | 
				
			||||||
 | 
					#smtphelo = greenmeadow.szaf.org
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Falls ein anderer Fully Qualified Domain Name als der Hostname fuer
 | 
				
			||||||
 | 
					# die Message-ID verwendet werden soll:
 | 
				
			||||||
 | 
					fqdn = gvv.th-h.de
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Verzeichnis fuer fertig verarbeitete Mails und Ergebnisse
 | 
				
			||||||
 | 
					archivedir = done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Temporaeres Verzeichnis
 | 
				
			||||||
 | 
					tmpdir = tmp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Pfad zu den Templates (kommaseparierte Liste mit Verzeichnissen)
 | 
				
			||||||
 | 
					templatedir = /home/gvv/usevote/templates
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Konvertierungsfunktionen f黵 die Templates
 | 
				
			||||||
 | 
					# (kommaseparierte Liste mit Funktions-Modulen)
 | 
				
			||||||
 | 
					formats   = /home/gvv/usevote/UVformats.pm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Dateiname der Steuerungsdatei fuer den Mailversandt
 | 
				
			||||||
 | 
					controlfile = tmp/ack.control
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Dateiname des Shellscripts zum Versenden der Bestaetigungsmails (falls smtp=0)
 | 
				
			||||||
 | 
					domailfile = tmp/domail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# MTA-Aufruf zum Verschicken der Bestaetigungsmails
 | 
				
			||||||
 | 
					# nuetzlich ist die Sendmail-Option -f zum Setzen des Absenders
 | 
				
			||||||
 | 
					#mailcmd = sendmail -oi -oem -femail@adresse
 | 
				
			||||||
 | 
					mailcmd = /usr/sbin/sendmail -oi -oem -fvote-bounces@gvv.th-h.de 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Weiteres Kommando, welches nach jeder Mail aufgerufen werden soll (falls smtp=0).
 | 
				
			||||||
 | 
					# Sinnvoll ist ein "sleep x", wobei x bei langsamen Systemen hoeher
 | 
				
			||||||
 | 
					# gewaehlt werden sollte, um die Belastung gering zu halten.
 | 
				
			||||||
 | 
					sleepcmd = sleep 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Shellbefehl zum Loeschen des Bildschirms
 | 
				
			||||||
 | 
					# Unix: i.d.R. "clear"
 | 
				
			||||||
 | 
					# Windows: "cls"
 | 
				
			||||||
 | 
					# Falls das Betriebssystem bzw. die Shell keinen solchen Befehl zur Verfuegung
 | 
				
			||||||
 | 
					# stellt, sollte ein Kommando verwendet werden, welches eine Trennlinie
 | 
				
			||||||
 | 
					# oder aehnliches auf dem Bildschirm ausgibt, z.B. mit "echo"
 | 
				
			||||||
 | 
					clearcmd = clear
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Shellbefehl zum seitenweisen Darstellen von Mails auf dem Bildschirm
 | 
				
			||||||
 | 
					# Empfohlene Einstellung: "less", da more Probleme mit der Umleitung von
 | 
				
			||||||
 | 
					# STDERR in eine Datei Probleme hat. Unter Windows ist "less" nicht
 | 
				
			||||||
 | 
					# vorinstallirt, kann man sich aber herunterladen und einfach in das
 | 
				
			||||||
 | 
					# Windows-Verzeichnis kopieren (URL siehe README-Datei)
 | 
				
			||||||
 | 
					pager = less
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Datei mit diversen Meldungen und Textfragmenten (Resourcendatei)
 | 
				
			||||||
 | 
					messagefile = /home/gvv/usevote/messages.cfg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Datei mit Wahlregeln
 | 
				
			||||||
 | 
					rulefile = /home/gvv/usevote/usevote.rul
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Datei mit verdaechtigen Mailadressen
 | 
				
			||||||
 | 
					badaddrfile = /home/gvv/usevote/mailpatterns.cfg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Datei fuer Fehlermeldungen beim Programmlauf
 | 
				
			||||||
 | 
					errorfile = errors.log
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Lockdatei (Verhinderung von mehrfachen Programmstarts)
 | 
				
			||||||
 | 
					lockfile = usevote.lock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Einleitungszeile fuer naechste Mail (RegExp)
 | 
				
			||||||
 | 
					mailstart = "^From "
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Trennlinien vor und nach dem Wahlschein
 | 
				
			||||||
 | 
					begin_divider = Alles vor dieser Zeile bitte loeschen
 | 
				
			||||||
 | 
					end_divider = Alles nach dieser Zeile bitte loeschen
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Text fuer die Namens-Angabe im Wahlschein. Achtung, muss im
 | 
				
			||||||
 | 
					# Wahlschein genauso stehen!
 | 
				
			||||||
 | 
					nametext = Dein Realname, falls nicht im FROM-Header:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Text fuer Namens-Angabe in Bestaetigungsmails
 | 
				
			||||||
 | 
					nametext2 = Waehlername:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Text fuer die Adress-Angabe im Wahlschein
 | 
				
			||||||
 | 
					addresstext = Waehleradresse:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Text f黵 die Angabe der Wahlscheinkennung (siehe Option "personal")
 | 
				
			||||||
 | 
					ballotidtext = Wahlscheinkennung:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Text fuer Datenschutzklausel (siehe Option "bdsg"), erscheint als Abstimmungspunkt
 | 
				
			||||||
 | 
					bdsgtext = Datenschutzklausel - Zustimmung: Ich bin mit der Verarbeitung meiner Daten wie oben beschrieben einverstanden
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Datei mit Erklaerungstext fuer BDSG-Klausel
 | 
				
			||||||
 | 
					bdsgfile = /home/gvv/usevote/bdsgtext.cfg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Rechter Rand fuer einige Bildschirmausgaben (Terminalbreite)
 | 
				
			||||||
 | 
					rightmargin = 72
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Regular Expression fuer Erkennung eines gueltigen Realnamens
 | 
				
			||||||
 | 
					name_re = [-a-zA-Z漩<5A>噔殍觏祛篁酊<E7AF81>闹芰谅扇释涛右在氽遌{2,} +.*[a-zA-Z漩<5A>噔殍觏祛篁酊<E7AF81>闹芰谅扇释涛右在氽遌{2,}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# RegExp fuer JA-Stimmen (case-insensitive)
 | 
				
			||||||
 | 
					# Standardmaessig wird J, JA, FUER und DAFUER erkannt
 | 
				
			||||||
 | 
					ja_stimme = (J\s*A|J|(D\s*A\s*)?F\s*U\s*E\s*R)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# RegExp fuer NEIN-Stimmen (case-insensitive)
 | 
				
			||||||
 | 
					# Standardmaessig wird N, NEIN, GEGEN und DAGEGEN erkannt
 | 
				
			||||||
 | 
					nein_stimme = (N\s*E\s*I\s*N|N|(D\s*A\s*)?G\s*E\s*G\s*E\s*N)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# RegExp fuer ENTHALTUNG (case-insensitive)
 | 
				
			||||||
 | 
					enth_stimme = (E|E\s*N\s*T\s*H\s*A\s*L\s*T\s*U\s*N\s*G)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# RegExp fuer ANNULLIERUNG (case-insensitive)
 | 
				
			||||||
 | 
					# Achtung, sollte auch in den Templates im Bestaetigungstext angepasst werden
 | 
				
			||||||
 | 
					ann_stimme = A\s*N\s*N\s*U\s*L\s*L\s*I\s*E\s*R\s*U\s*N\s*G
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Template files (these files are in the template directory defined above)
 | 
				
			||||||
 | 
					tpl_mailheader = "mailheader"            # generally used mail header
 | 
				
			||||||
 | 
					tpl_bouncelist = "bouncelist"            # used by uvbounce.pl
 | 
				
			||||||
 | 
					tpl_result_multi = "result-multi"        # used by uvcount.pl -r -m
 | 
				
			||||||
 | 
					tpl_result_single = "result-single"      # used by uvcount.pl -r -o
 | 
				
			||||||
 | 
					tpl_result_prop = "result-proportional"  # used by uvcount.pl -r (proportional = 1)
 | 
				
			||||||
 | 
					tpl_votes_multi = "votes-multi"          # used by uvcount.pl -v (multiple groups)
 | 
				
			||||||
 | 
					tpl_votes_single = "votes-single"        # used by uvcount.pl -v (single group only)
 | 
				
			||||||
 | 
					tpl_voterlist = "voterlist"              # used by uvcount.pl -l (2nd CfV) 
 | 
				
			||||||
 | 
					tpl_ballot = "ballot"                    # used by uvballot.pl (personal = 0)
 | 
				
			||||||
 | 
					tpl_ballot_request = "ballot-request"    # used by uvballot.pl (personal = 1)
 | 
				
			||||||
 | 
					tpl_ballot_personal = "ballot-personal"  # used by uvcfv.pl    (personal = 1)
 | 
				
			||||||
 | 
					tpl_addr_reg = "address-not-registered"  # used by uvvote.pl   (personal = 1)
 | 
				
			||||||
 | 
					tpl_no_ballotid = "no-ballotid"          # used by uvvote.pl   (personal = 1)
 | 
				
			||||||
 | 
					tpl_wrong_ballotid = "wrong-ballotid"    # used by uvvote.pl   (personal = 1)
 | 
				
			||||||
 | 
					tpl_bdsg_error = "bdsg-error"            # used by uvvote.pl   (bdsg = 1)
 | 
				
			||||||
 | 
					tpl_ack_mail = "ack-mail"                # used by uvvote.pl   (voteack = 1)
 | 
				
			||||||
 | 
					tpl_cancelled = "cancelled"              # used by uvvote.pl
 | 
				
			||||||
 | 
					tpl_invalid_account = "invalid-account"  # used by uvvote.pl
 | 
				
			||||||
 | 
					tpl_invalid_name = "invalid-name"        # used by uvvote.pl
 | 
				
			||||||
 | 
					tpl_multiple_votes = "multiple-votes"    # used by uvvote.pl
 | 
				
			||||||
 | 
					tpl_no_ballot = "no-ballot"              # used by uvvote.pl
 | 
				
			||||||
 | 
					tpl_no_votes = "no-votes"                # used by uvvote.pl
 | 
				
			||||||
 | 
					tpl_rule_violated = "rule-violated"      # used by uvvote.pl   (c.f. usevote.rul)
 | 
				
			||||||
| 
						 | 
					@ -30,14 +30,12 @@
 | 
				
			||||||
#   N	eine NEIN-Stimme
 | 
					#   N	eine NEIN-Stimme
 | 
				
			||||||
#   E	eine Enthaltung
 | 
					#   E	eine Enthaltung
 | 
				
			||||||
#   S	eine JA- oder NEIN-Stimme
 | 
					#   S	eine JA- oder NEIN-Stimme
 | 
				
			||||||
#   H   eine Enthaltung oder JA-Stimme
 | 
					 | 
				
			||||||
#   I   eine Enthaltung oder NEIN-Stimme
 | 
					#   I   eine Enthaltung oder NEIN-Stimme
 | 
				
			||||||
#   .	egal (Ja, nein oder Enthaltung)
 | 
					#   .	egal (Ja, nein oder Enthaltung)
 | 
				
			||||||
#   j	eine oder mehrere der markierten Gruppen hat JA-Stimme
 | 
					#   j	eine oder mehrere der markierten Gruppen hat JA-Stimme
 | 
				
			||||||
#   n	 ""   ""    ""     ""     ""       ""    ""  NEIN-Stimme
 | 
					#   n	 ""   ""    ""     ""     ""       ""    ""  NEIN-Stimme
 | 
				
			||||||
#   e	 ""   ""    ""     ""     ""       ""    ""  Enthaltung
 | 
					#   e	 ""   ""    ""     ""     ""       ""    ""  Enthaltung
 | 
				
			||||||
#   s	 ""   ""    ""     ""     ""       ""    ""  Ja- oder Nein-Stimme
 | 
					#   s	 ""   ""    ""     ""     ""       ""    ""  Ja- oder Nein-Stimme
 | 
				
			||||||
#   h	 ""   ""    ""     ""     ""       ""    ""  Enthaltung oder Ja-Stimme
 | 
					 | 
				
			||||||
#   i	 ""   ""    ""     ""     ""       ""    ""  Enthaltung oder Nein-Stimme
 | 
					#   i	 ""   ""    ""     ""     ""       ""    ""  Enthaltung oder Nein-Stimme
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Alles klar?  Jede Stimme wird mit den Symbolen verglichen, und wenn alle
 | 
					# Alles klar?  Jede Stimme wird mit den Symbolen verglichen, und wenn alle
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										76
									
								
								usevote.tpl.cfg
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								usevote.tpl.cfg
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,76 @@
 | 
				
			||||||
 | 
					include /home/gvv/usevote/usevote.global.cfg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					########################################################################
 | 
				
			||||||
 | 
					# Diese Einstellungen muessen fuer jede Abstimmung angepasst werden
 | 
				
			||||||
 | 
					########################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Name der Abstimmung
 | 
				
			||||||
 | 
					votename = [INSERT_HERE]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Abstimmungsgegenstaende (beliebig viele groupX moeglich,
 | 
				
			||||||
 | 
					# von 1 an durchzunummerieren)
 | 
				
			||||||
 | 
					group1 = [INSERT_HERE]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Mailbox, in der die zu verarbeitenden Mails liegen (falls smtp=0)
 | 
				
			||||||
 | 
					votefile = votes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Bei den folgenden Fragen bedeutet jeweils:
 | 
				
			||||||
 | 
					# 0: nein
 | 
				
			||||||
 | 
					# 1: ja
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Persoenliche Wahlscheine generieren und Scheinkennung erzwingen?
 | 
				
			||||||
 | 
					personal = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Verhaeltniswahl durchfuehren? (z.B. fuer Moderationsnachwahlen)
 | 
				
			||||||
 | 
					proportional = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Formel fuer die Berechnung des Verhaeltnisses. Kann z.B.
 | 
				
			||||||
 | 
					# $yes/$no oder $yes-$no sein, letzteres wird bei Moderationsnachwahlen
 | 
				
			||||||
 | 
					# verwendet. Als Variablen sind $yes und $no zulaessig, es kann
 | 
				
			||||||
 | 
					# beliebiger Perlcode angegeben werden, dessen Rueckgabewert im 
 | 
				
			||||||
 | 
					# Result erscheinen soll. Ausserdem wird bei der Auswertung die
 | 
				
			||||||
 | 
					# Bedingung aus "condition1" weiter unten in dieser Datei ausgewertet.
 | 
				
			||||||
 | 
					prop_formula = $yes/$no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Vote-Account (diese Adresse muss unbedingt korrekt sein, wird
 | 
				
			||||||
 | 
					# in das Reply-To uebernommen)
 | 
				
			||||||
 | 
					voteaccount = [INSERT_HERE]@gvv.th-h.de
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Absender fuer den From-Header der Bestaetigungsmails
 | 
				
			||||||
 | 
					mailfrom = Thomas Hochstein <votetaker@gvv.th-h.de>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Absender fuer den Envelope (Return-Path) der Bestaetigungsmails
 | 
				
			||||||
 | 
					# (bitte einfach nur die Adresse eintragen, ohne Klammern und Zusaetze)
 | 
				
			||||||
 | 
					envelopefrom = [INSERT_HERE]@gvv.th-h.de
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Nur bei persoenlichen Wahlscheinen: Datei mit Anforderungsmails
 | 
				
			||||||
 | 
					# requestfile = anforderung
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Datenschutzklausel generieren und auf deren Existenz pruefen?
 | 
				
			||||||
 | 
					# Konfiguration siehe unten (bdsgtext)
 | 
				
			||||||
 | 
					bdsg = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Reply-To beachten?
 | 
				
			||||||
 | 
					# Nicht empfohlen, da jemand fuer andere Personen abstimmen und
 | 
				
			||||||
 | 
					# die Bestaetigungen zu sich umlenken koennte.
 | 
				
			||||||
 | 
					replyto = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Stimmen einzeln bestaetigen? Empfohlen!
 | 
				
			||||||
 | 
					voteack = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Bcc-Adresse fuer alle Mails (Backup fuer alle Faelle)
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					mailcc = gvv@greenmeadow.szaf.org
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Bedingungen fuer einen Erfolg der Abstimmung (genau zwei erforderlich).
 | 
				
			||||||
 | 
					# Es muss sich jeweils um gueltigen Perl-Code handeln, Rueckgabewert
 | 
				
			||||||
 | 
					# wird boolesch ausgewertet (true/false). Als Variablen sind $yes
 | 
				
			||||||
 | 
					# und $no zugelassen. Falls oben "proportional = 1" gesetzt wurde,
 | 
				
			||||||
 | 
					# wird nur Bedingung 1 ausgewertet und kann z.B. auf "$yes>$no" gesetzt
 | 
				
			||||||
 | 
					# werden.
 | 
				
			||||||
 | 
					# condition1 = $yes>=2*$no
 | 
				
			||||||
 | 
					# condition2 = $yes>=60
 | 
				
			||||||
 | 
					condition1 = $yes>=2*$no
 | 
				
			||||||
 | 
					condition2 = $yes>=60
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mailcmd = /usr/sbin/sendmail -oi -oem -f[INSERT_HERE]@gvv.th-h.de
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,8 @@
 | 
				
			||||||
#!/usr/bin/perl -w
 | 
					#!/usr/bin/perl -w
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###############################################################################
 | 
					###############################################################################
 | 
				
			||||||
# UseVoteGer 4.09 Wahlscheingenerierung
 | 
					# UseVoteGer 4.07 Wahlscheingenerierung
 | 
				
			||||||
# (c) 2001-2005 Marc Langer <uv@marclanger.de>
 | 
					# (c) 2001-2004 Marc Langer <uv@marclanger.de>
 | 
				
			||||||
# 
 | 
					# 
 | 
				
			||||||
# This script package is free software; you can redistribute it and/or
 | 
					# This script package is free software; you can redistribute it and/or
 | 
				
			||||||
# modify it under the terms of the GNU Public License as published by the
 | 
					# modify it under the terms of the GNU Public License as published by the
 | 
				
			||||||
| 
						 | 
					@ -31,7 +31,7 @@ use UVtemplate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
my %opt_ctl = ();
 | 
					my %opt_ctl = ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
print STDERR "\n$usevote_version Wahlscheingenerierung - (c) 2001-2005 Marc Langer\n\n";
 | 
					print STDERR "\n$usevote_version Wahlscheingenerierung - (c) 2001-2004 Marc Langer\n\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# unknown parameters remain in @ARGV (for "help")
 | 
					# unknown parameters remain in @ARGV (for "help")
 | 
				
			||||||
Getopt::Long::Configure(qw(pass_through bundling));
 | 
					Getopt::Long::Configure(qw(pass_through bundling));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,8 @@
 | 
				
			||||||
#!/usr/bin/perl -w
 | 
					#!/usr/bin/perl -w
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###############################################################################
 | 
					###############################################################################
 | 
				
			||||||
# UseVoteGer 4.09 Bounce-Verarbeitung
 | 
					# UseVoteGer 4.07 Bounce-Verarbeitung
 | 
				
			||||||
# (c) 2001-2005 Marc Langer <uv@marclanger.de>
 | 
					# (c) 2001-2004 Marc Langer <uv@marclanger.de>
 | 
				
			||||||
# 
 | 
					# 
 | 
				
			||||||
# This script package is free software; you can redistribute it and/or
 | 
					# This script package is free software; you can redistribute it and/or
 | 
				
			||||||
# modify it under the terms of the GNU Public License as published by the
 | 
					# modify it under the terms of the GNU Public License as published by the
 | 
				
			||||||
| 
						 | 
					@ -33,7 +33,7 @@ my %opt_ctl = ();
 | 
				
			||||||
my %bounces = ();
 | 
					my %bounces = ();
 | 
				
			||||||
my $pop3 = 0;
 | 
					my $pop3 = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
print STDERR "\n$usevote_version Bounce-Verarbeitung - (c) 2001-2005 Marc Langer\n\n";
 | 
					print STDERR "\n$usevote_version Bounce-Verarbeitung - (c) 2001-2004 Marc Langer\n\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# unknown parameters remain in @ARGV (for "help")
 | 
					# unknown parameters remain in @ARGV (for "help")
 | 
				
			||||||
Getopt::Long::Configure(qw(pass_through bundling));
 | 
					Getopt::Long::Configure(qw(pass_through bundling));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								uvcfv.pl
									
										
									
									
									
								
							
							
						
						
									
										6
									
								
								uvcfv.pl
									
										
									
									
									
								
							| 
						 | 
					@ -1,8 +1,8 @@
 | 
				
			||||||
#!/usr/bin/perl -w
 | 
					#!/usr/bin/perl -w
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###############################################################################
 | 
					###############################################################################
 | 
				
			||||||
# UseVoteGer 4.09 Personalisierte Wahlscheine
 | 
					# UseVoteGer 4.07 Personalisierte Wahlscheine
 | 
				
			||||||
# (c) 2001-2005 Marc Langer <uv@marclanger.de>
 | 
					# (c) 2001-2004 Marc Langer <uv@marclanger.de>
 | 
				
			||||||
# 
 | 
					# 
 | 
				
			||||||
# This script package is free software; you can redistribute it and/or
 | 
					# This script package is free software; you can redistribute it and/or
 | 
				
			||||||
# modify it under the terms of the GNU Public License as published by the
 | 
					# modify it under the terms of the GNU Public License as published by the
 | 
				
			||||||
| 
						 | 
					@ -35,7 +35,7 @@ use UVtemplate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
my %opt_ctl = ();
 | 
					my %opt_ctl = ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
print "\n$usevote_version Personalisierte Wahlscheine - (c) 2001-2005 Marc Langer\n\n";
 | 
					print "\n$usevote_version Personalisierte Wahlscheine - (c) 2001-2004 Marc Langer\n\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# unknown parameters remain in @ARGV (for "help")
 | 
					# unknown parameters remain in @ARGV (for "help")
 | 
				
			||||||
Getopt::Long::Configure(qw(pass_through bundling));
 | 
					Getopt::Long::Configure(qw(pass_through bundling));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								uvvote.pl
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								uvvote.pl
									
										
									
									
									
								
							| 
						 | 
					@ -1,8 +1,8 @@
 | 
				
			||||||
#!/usr/bin/perl -w
 | 
					#!/usr/bin/perl -w
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###############################################################################
 | 
					###############################################################################
 | 
				
			||||||
# UseVoteGer 4.09 Wahldurchfuehrung
 | 
					# UseVoteGer 4.07 Wahldurchfuehrung
 | 
				
			||||||
# (c) 2001-2005 Marc Langer <uv@marclanger.de>
 | 
					# (c) 2001-2004 Marc Langer <uv@marclanger.de>
 | 
				
			||||||
# 
 | 
					# 
 | 
				
			||||||
# This script package is free software; you can redistribute it and/or
 | 
					# This script package is free software; you can redistribute it and/or
 | 
				
			||||||
# modify it under the terms of the GNU Public License as published by the
 | 
					# modify it under the terms of the GNU Public License as published by the
 | 
				
			||||||
| 
						 | 
					@ -37,7 +37,7 @@ use UVtemplate;
 | 
				
			||||||
my $clean = 0;
 | 
					my $clean = 0;
 | 
				
			||||||
my %opt_ctl = ();
 | 
					my %opt_ctl = ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
print "\n$usevote_version Wahldurchfuehrung - (c) 2001-2005 Marc Langer\n\n";
 | 
					print "\n$usevote_version Wahldurchfuehrung - (c) 2001-2004 Marc Langer\n\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# unknown parameters remain in @ARGV (for "help")
 | 
					# unknown parameters remain in @ARGV (for "help")
 | 
				
			||||||
Getopt::Long::Configure(qw(pass_through bundling));
 | 
					Getopt::Long::Configure(qw(pass_through bundling));
 | 
				
			||||||
| 
						 | 
					@ -123,7 +123,7 @@ if ($clean) {
 | 
				
			||||||
  my $ext = time;
 | 
					  my $ext = time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  opendir (TMP, $config{tmpdir});
 | 
					  opendir (TMP, $config{tmpdir});
 | 
				
			||||||
  my @tmpfiles = readdir (DIR);
 | 
					  my @tmpfiles = readdir (TMP);
 | 
				
			||||||
  closedir (TMP);
 | 
					  closedir (TMP);
 | 
				
			||||||
  opendir (FERTIG, $config{archivedir});
 | 
					  opendir (FERTIG, $config{archivedir});
 | 
				
			||||||
  my @fertigfiles = readdir (FERTIG);
 | 
					  my @fertigfiles = readdir (FERTIG);
 | 
				
			||||||
| 
						 | 
					@ -216,7 +216,7 @@ sub process_vote {
 | 
				
			||||||
  my @header = split(/\n/, $entity->stringify_header);
 | 
					  my @header = split(/\n/, $entity->stringify_header);
 | 
				
			||||||
  my $head = $entity->head;
 | 
					  my $head = $entity->head;
 | 
				
			||||||
  my $msgid = $head->get('Message-ID');
 | 
					  my $msgid = $head->get('Message-ID');
 | 
				
			||||||
  chomp($msgid) if ($msgid);
 | 
					  chomp($msgid) if defined($msgid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  my @votes = ();              # the votes
 | 
					  my @votes = ();              # the votes
 | 
				
			||||||
  my @set;                     # interactively changed fields
 | 
					  my @set;                     # interactively changed fields
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue