v20200113
authorkilian (ksmachome) <ksaffran@dks.lu>
Mon, 13 Jan 2020 06:49:26 +0000 (07:49 +0100)
committerkilian (ksmachome) <ksaffran@dks.lu>
Mon, 13 Jan 2020 06:49:26 +0000 (07:49 +0100)
69 files changed:
CGI/api/createPDF [new file with mode: 0755]
CGI/api/lib/pdfreport.pm [new file with mode: 0644]
CGI/api/report.cgi [new file with mode: 0755]
CGI/api/sendEmail [new file with mode: 0644]
CGI/tmpl/app/invoicejournal/index.tt
CGI/tmpl/app/invoicejournal/module/accounts/accounts.js [new file with mode: 0644]
CGI/tmpl/app/invoicejournal/module/accounts/index.js
CGI/tmpl/app/invoicejournal/module/accounts/index.tt
CGI/tmpl/app/invoicejournal/module/bankaccount/index.js
CGI/tmpl/app/invoicejournal/module/bankaccount/transactions.js [new file with mode: 0644]
CGI/tmpl/app/invoicejournal/module/invoicejournal/booking.js
CGI/tmpl/app/invoicejournal/module/invoicejournal/index.js
CGI/tmpl/app/invoicejournal/module/invoicejournal/index.tt
CGI/tmpl/app/invoicejournal/module/invoicejournal/invoice.js
CGI/tmpl/app/invoicejournal/module/invoicejournal/journal.js [deleted file]
CGI/tmpl/app/invoicejournal/module/invoices/index.tt
bin/wkhtmltopdf/createpdf.pl
bin/wkhtmltopdf/output/textinvoice.pdf
bin/wkhtmltopdf/pdfreport.pm
bin/wkhtmltopdf/report/invoice.header.html
bin/wkhtmltopdf/report/invoice.html
bin/wkhtmltopdf/report/ttinvoice.conf
bin/wkhtmltopdf/report/ttinvoice.footer.tt
bin/wkhtmltopdf/report/ttinvoice.header.tt
bin/wkhtmltopdf/report/ttinvoice.tt
bin/wkhtmltopdf/report/ttinvoice/ttinvoice.conf [new file with mode: 0644]
bin/wkhtmltopdf/report/ttinvoice/ttinvoice.footer.tt [moved from bin/wkhtmltopdf/tmp/ttinvoice2805.footer.html with 79% similarity]
bin/wkhtmltopdf/report/ttinvoice/ttinvoice.header.tt [moved from bin/wkhtmltopdf/tmp/ttinvoice2981.header.html with 76% similarity]
bin/wkhtmltopdf/report/ttinvoice/ttinvoice.tt [new file with mode: 0644]
bin/wkhtmltopdf/tmp/ttinvoice/ttinvoice.css [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2386.footer.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2386.header.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2386.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2529.footer.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2529.header.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2529.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2649.footer.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2649.header.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2649.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2720.footer.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2720.header.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2720.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2750.footer.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2750.header.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2750.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2805.header.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2805.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2823.header.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2823.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2853.footer.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2853.header.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2853.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2981.footer.html [deleted file]
bin/wkhtmltopdf/tmp/ttinvoice2981.html [deleted file]
data/invoicejournal/dksbuchhaltung.sqlite
data/invoicejournal/templates/invoices/dks-deutsch.conf [new file with mode: 0644]
data/invoicejournal/templates/invoices/dks-deutsch.footer.tt [moved from bin/wkhtmltopdf/tmp/ttinvoice2823.footer.html with 79% similarity]
data/invoicejournal/templates/invoices/dks-deutsch.header.tt [new file with mode: 0644]
data/invoicejournal/templates/invoices/dks-deutsch.tt [new file with mode: 0644]
data/invoicejournal/templates/invoices/dks-deutsch/dks_500.png [moved from bin/wkhtmltopdf/tmp/ttinvoice/dks_500.png with 100% similarity]
data/invoicejournal/templates/invoices/dks-deutsch/sitc.png [moved from bin/wkhtmltopdf/tmp/ttinvoice/sitc.png with 100% similarity]
data2/dksbuchhaltung.sqlite [new file with mode: 0755]
dksnas.pl
htdocs/css/invoicejournal.epic.css [deleted file]
htdocs/css/w3pro.css
htdocs/js/formsave.js
htdocs/js/module_global.js
htdocs/js/request.js
icons.txt [new file with mode: 0644]

diff --git a/CGI/api/createPDF b/CGI/api/createPDF
new file mode 100755 (executable)
index 0000000..573336c
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/local/bin/perl
+
+use strict;
+use FindBin qw($RealBin);
+use lib ($RealBin.'/lib');
+use Getopt::Long;
+use pdfreport;
+my $strdata = "";
+my $cfgfile = "";
+GetOptions("data|d=s"=>\$strdata,"config|c=s" => $cfgfile);
+open(CFG,$cfgfile);
+  while (my $l = <CFG>){
+    chomp($l);
+    $l =~ s/^\s+//;
+    if (($l =~ /^#/) || ($l eq "")) {next;}
+    if ($l =~ /\w+=.+/){
+      my ($k1,$k2,$v) = $l =~ m/^(\w+)_(\w+)=\"(.+)\"$/;
+      $self->{lc($k1)}->{lc($k2)} = $v;
+  }
+}
+close(CFG);
+
+my $dbpath = $ENV{HOME}.'/Workspace/dksnas/data';
+my $data = {
+  id_invoice => "469",
+  dsn => 'DBI:SQLite:dbname='.$dbpath.'/invoicejournal/dksbuchhaltung.sqlite'
+};
+my $rep = pdfreport->new({tmplpath => $RealBin.'/report', tmp => $RealBin.'/tmp'});
+my ($result,$file) = $rep->createpdf('ttinvoice',$RealBin.'/output/textinvoice.pdf',$data);
+print "$result: $file\n";
+
+
diff --git a/CGI/api/lib/pdfreport.pm b/CGI/api/lib/pdfreport.pm
new file mode 100644 (file)
index 0000000..7c1b7ca
--- /dev/null
@@ -0,0 +1,112 @@
+package pdfreport;
+
+use strict;
+use Template;
+use File::Basename qw/dirname basename/;
+use Data::Dumper;
+use File::Copy::Recursive qw(dircopy);
+sub new {
+    my $class = shift;
+    my $p = shift;
+    my $self = bless {}, $class;
+    $self->{tmplpath} =$p->{tmplpath};
+    $self->{tmp} =$p->{tmp};
+    $self->{pdf} = undef;
+    $self->{template} = undef;
+    #$self->{template} = $p->{template};
+    $self->{pdf}->{app} = "/usr/local/bin/wkhtmltopdf";
+    return $self;
+}
+
+sub createpdf(){
+  my $self = shift;
+  my $template = shift;
+  my $output = shift;
+  my $inputdata = shift;
+  my $r = -1;
+  print $self->{tmplpath}.'/'.$template.'.conf'."\n";
+  if (-e $self->{tmplpath}.'/'.$template.'.conf'){
+    $self->readpdfconfig($template,$inputdata);
+    print Dumper($self->{template});
+  }
+  print Dumper($self->{pdf});
+  print Dumper($self->{template});
+  my $tmpreportpath=$self->{tmplpath};
+  if (exists($self->{pdf}->{engine}) && ($self->{pdf}->{engine} eq "Template::Toolkit")){
+    $template = $self->createTTReport($template);
+    $tmpreportpath = $self->{tmp};
+  }
+  if ((keys(%{$self}) > 0) && (-e $tmpreportpath.'/'.$template.'.html')){
+    my $cmd = '"'.$self->{pdf}->{app}.'"';
+    if ($self->{pdf}->{bottom}){ $cmd .= " -B ".$self->{pdf}->{bottom}; }
+    if ($self->{pdf}->{left}){ $cmd .= " -L ".$self->{pdf}->{left}; }
+    if ($self->{pdf}->{right}){ $cmd .= " -R ".$self->{pdf}->{right}; }
+    if ($self->{pdf}->{top}){ $cmd .= " -T ".$self->{pdf}->{top}; }
+    if ($self->{pdf}->{orientation}){ $cmd .= " -O ".$self->{pdf}->{orientation}; }
+    if ($self->{pdf}->{size}){ $cmd .= " -s ".$self->{pdf}->{size}; }
+    if ($self->{pdf}->{encoding}){ $cmd .= " --encoding '".$self->{pdf}->{encoding}."'"; }
+    if (-e $tmpreportpath.'/'.$template.'.header.html'){
+      $cmd .= ' --header-html "'.$tmpreportpath.'/'.$template.'.header.html"';
+    }
+    if (-e $tmpreportpath.'/'.$template.'.footer.html'){
+      $cmd .= ' --footer-html "'.$tmpreportpath.'/'.$template.'.footer.html"';
+    }
+    $cmd .= ' "'.$tmpreportpath.'/'.$template.'.html"';
+    $cmd .= ' "'.$output.'"';
+    print $cmd."\n";
+    $r = system($cmd);
+  }
+  if (-e $output){
+    return ($r,$output);
+  }
+  return ($r,undef);
+}
+
+sub createTTReport(){
+  my $self = shift;
+  my $template = shift;
+  my $uniquekey = $$;
+  if (-e $self->{tmplpath}.'/'.$template.".tt"){
+    $self->TTtoHTML($self->{tmplpath}.'/'.$template.".tt",$self->{tmp}.'/'.$template.$$.".html");
+  }
+  if (-e $self->{tmplpath}.'/'.$template.".header.tt"){
+    $self->TTtoHTML($self->{tmplpath}.'/'.$template.".header.tt",$self->{tmp}.'/'.$template.$$.".header.html");
+  }
+  if (-e $self->{tmplpath}.'/'.$template.".footer.tt"){
+    $self->TTtoHTML($self->{tmplpath}.'/'.$template.".footer.tt",$self->{tmp}.'/'.$template.$$.".footer.html");
+  }
+  if (-d $self->{tmplpath}.'/'.$template){
+    dircopy($self->{tmplpath}.'/'.$template,$self->{tmp}.'/'.$template);
+  }
+  return $template.$$;
+}
+
+sub TTtoHTML(){
+  my $self = shift;
+  my $ttfile = shift;
+  my $outfile = shift;
+  my $template = Template->new({INCLUDE_PATH => [dirname($ttfile)]});#,ENCODING => 'utf8'
+  $template->process(basename($ttfile),$self->{template},$outfile) || die "Template process failed: ", $template->error(), "\n";#,{binmode => ':utf8'}
+}
+
+sub readpdfconfig(){
+  my $self = shift;
+  my $template = shift;
+  my $inputdata = shift;
+  open(CFG,$self->{tmplpath}.'/'.$template.'.conf');
+  while (my $l = <CFG>){
+    chomp($l);
+    print $l."\n";
+    $l =~ s/^\s+//;
+    if (($l =~ /^#/) || ($l eq "")) {next;}
+    if ($l =~ /\w+=.+/){
+      my ($k1,$k2,$v) = $l =~ m/^(\w+)_(\w+)=\"(.+)\"$/;
+      $self->{lc($k1)}->{lc($k2)} = $v;
+    }
+  }
+  close(CFG);
+  foreach my $ik (keys(%{$inputdata})){
+    $self->{template}->{lc($ik)} = $inputdata->{$ik};
+  }
+}
+1;
\ No newline at end of file
diff --git a/CGI/api/report.cgi b/CGI/api/report.cgi
new file mode 100755 (executable)
index 0000000..d00a63d
--- /dev/null
@@ -0,0 +1,118 @@
+#!/Users/kilian/perl5/perlbrew/perls/perl-5.24.1/bin/perl
+use strict;
+use FindBin qw($RealBin $Bin);
+# use lib ('CGI/api/lib/perl5');
+# use lib ('CGI/api/lib');
+use lib ($Bin.'/CGI/api/lib/perl5');
+use lib ($Bin.'/CGI/api/lib');
+use lib ($RealBin.'/lib/perl5');
+use lib ($RealBin.'/lib');
+use CGI;
+use CGI::Cookie;
+# use CGI::Carp qw/fatalsToBrowser/;
+use File::Basename;
+use JSON::PP;
+use MIME::Type::FileName;
+use dksconfig qw/$sitecfg/;
+use dksdb;
+
+# use session;
+#use sendemail;
+my $cgi = new CGI();
+my $scriptpath = $cgi->url(-absolute => 1); 
+my $p = ();
+my @params = $cgi->param();
+foreach my $pe (@params){
+  $p->{$pe} = $cgi->param($pe);
+}
+my $html->{result} = ();
+# $p->{sid} = $cgi->cookie($sitecfg->{cookiename});
+# my $se = session->new();
+# my $sess = $se->getsession($p->{sid});
+print $cgi->header(-type=>"application/json", -charset => "utf-8");
+my $dbredirect = {};
+if ($sitecfg->{dbtype} eq "SQLite"){
+  if (exists($p->{db})){
+    $dbredirect->{dsn} = "DBI:SQLite:dbname=".$sitecfg->{datapath}.'/'.$p->{db}.'.sqlite';
+  }
+}
+#$html->{conn} = $dbredirect;
+# if ($sess == undef){
+#   $html->{error} = "No Authorisation";
+#   print JSON::PP::encode_json($html);
+#   exit(0);
+# }
+# $html->{p} = $p;
+# $html->{sess} =$sess;
+#my $datapath = $ENV{"DOCUMENT_ROOT"}.dirname(dirname($scriptpath)).'/data/';
+if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){
+  
+  # my @params = $cgi->param();
+  # foreach my $pp (@params){
+       #   $p->{$pp} = $cgi->param($pp);
+  # }
+  
+  if (exists($p->{list})){
+    #$html->{param} = $p;
+    my $reppath = $sitecfg->{datapath}.'/'.$p->{app}.'/templates/'.$p->{list};
+    #$html->{path} = $reppath;
+    if (-d $reppath){
+      #print "OK!";
+      my @allreps = ();
+      opendir(REP,$reppath);
+      while (my $f = readdir(REP)){
+        if ($f =~ /\.conf$/){
+          my $rep->{name}= $f;
+          $rep->{name} =~ s/\.conf$//; 
+          $rep->{label} = $rep->{name};
+          
+          open(RTPL,$reppath.'/'.$f);
+          while (my $l = <RTPL>){
+            chomp($l);
+            if ($l =~ /^REPORT_NAME/){
+              my ($k1,$k2,$v) = $l =~ m/^(\w+)_(\w+)=\"(.+)\"$/;
+              $rep->{label} = $v;
+            }
+          }
+          close(RTPL);
+          push(@allreps,$rep);
+        }
+      }
+      closedir(REP);
+      $html->{result}->{reports} = \@allreps; 
+    }
+  }
+  elsif (exists($p->{generate})){
+    # my $data = {
+    #   id_invoice => "469",
+    #   dsn => 'DBI:SQLite:dbname='.$dbpath.'/invoicejournal/dksbuchhaltung.sqlite'
+    # };
+    # my $rep = pdfreport->new({tmplpath => $RealBin.'/report', tmp => $RealBin.'/tmp'});
+    # my ($result,$file) = $rep->createpdf('ttinvoice',$RealBin.'/output/textinvoice.pdf',$data);
+    # print "$result: $file\n";
+  }
+  elsif (exists($p->{open})){
+    if (exists($p->{file}) && -e ){
+      
+      my $mimetype = MIME::Type::FileName::guess ($sitecfg->{data}.'/'.$p->{file});
+      my @stat = stat($sitecfg->{data}.'/'.$p->{file});
+      print $cgi->header(  
+        -type => $mimetype,
+        -target => basename($p->{file}),
+        -attachment => basename($p->{file})
+      );
+      open(DLD,$sitecfg->{data}.'/'.$p->{file});
+      binmode(DLD);
+      local $/ = \1024;
+      while (<DLD>){
+        print $_;
+      }
+      close(DLD);
+      exit(0);
+    }
+  }
+}
+print JSON::PP::encode_json($html);
+# for my $e ( keys %ENV ) {
+#     print "$e: $ENV{$e}<br/>";
+# }
\ No newline at end of file
diff --git a/CGI/api/sendEmail b/CGI/api/sendEmail
new file mode 100644 (file)
index 0000000..c639439
--- /dev/null
@@ -0,0 +1,2235 @@
+#!/usr/bin/perl -w
+##############################################################################
+## sendEmail
+## Written by: Brandon Zehm <caspian@dotconf.net>
+##
+## License:
+##  sendEmail (hereafter referred to as "program") is free software;
+##  you can redistribute it and/or modify it under the terms of the GNU General
+##  Public License as published by the Free Software Foundation; either version
+##  2 of the License, or (at your option) any later version.
+##  When redistributing modified versions of this source code it is recommended
+##  that that this disclaimer and the above coder's names are included in the
+##  modified code.
+##
+## Disclaimer:
+##  This program is provided with no warranty of any kind, either expressed or
+##  implied.  It is the responsibility of the user (you) to fully research and
+##  comprehend the usage of this program.  As with any tool, it can be misused,
+##  either intentionally (you're a vandal) or unintentionally (you're a moron).
+##  THE AUTHOR(S) IS(ARE) NOT RESPONSIBLE FOR ANYTHING YOU DO WITH THIS PROGRAM
+##  or anything that happens because of your use (or misuse) of this program,
+##  including but not limited to anything you, your lawyers, or anyone else
+##  can dream up.  And now, a relevant quote directly from the GPL:
+##
+## NO WARRANTY
+##
+##  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+##  FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+##  OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+##  PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+##  OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+##  TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+##  PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+##  REPAIR OR CORRECTION.
+##
+##############################################################################
+use strict;
+use IO::Socket;
+
+
+########################
+##  Global Variables  ##
+########################
+
+my %conf = (
+    ## General
+    "programName"          => $0,                                  ## The name of this program
+    "version"              => '1.56',                              ## The version of this program
+    "authorName"           => 'Brandon Zehm',                      ## Author's Name
+    "authorEmail"          => 'caspian@dotconf.net',               ## Author's Email Address
+    "timezone"             => '+0000',                             ## We always use +0000 for the time zone
+    "hostname"             => 'changeme',                          ## Used in printmsg() for all output (is updated later in the script).
+    "debug"                => 0,                                   ## Default debug level
+    "error"                => '',                                  ## Error messages will often be stored here
+    
+    ## Logging
+    "stdout"               => 1,
+    "logging"              => 0,                                   ## If this is true the printmsg function prints to the log file
+    "logFile"              => '',                                  ## If this is specified (form the command line via -l) this file will be used for logging.
+    
+    ## Network
+    "server"               => 'localhost',                         ## Default SMTP server
+    "port"                 => 25,                                  ## Default port
+    "bindaddr"             => '',                                  ## Default local bind address
+    "alarm"                => '',                                  ## Default timeout for connects and reads, this gets set from $opt{'timeout'}
+    "tls_client"           => 0,                                   ## If TLS is supported by the client (us)
+    "tls_server"           => 0,                                   ## If TLS is supported by the remote SMTP server
+    
+    ## Email
+    "delimiter"            => "----MIME delimiter for sendEmail-"  ## MIME Delimiter
+                              . rand(1000000),                     ## Add some randomness to the delimiter
+    "Message-ID"           => rand(1000000) . "-sendEmail",        ## Message-ID for email header
+    
+);
+
+
+## This hash stores the options passed on the command line via the -o option.
+my %opt = (
+    ## Addressing
+    "reply-to"             => '',                                  ## Reply-To field
+    
+    ## Message
+    "message-file"         => '',                                  ## File to read message body from
+    "message-header"       => '',                                  ## Additional email header line(s)
+    "message-format"       => 'normal',                            ## If "raw" is specified the message is sent unmodified
+    "message-charset"      => 'iso-8859-1',                        ## Message character-set
+    "message-content-type" => 'auto',                              ## auto, text, html or an actual string to put into the content-type header.
+    
+    ## Network
+    "timeout"              => 60,                                  ## Default timeout for connects and reads, this is copied to $conf{'alarm'} later.
+    "fqdn"                 => 'changeme',                          ## FQDN of this machine, used during SMTP communication (is updated later in the script).
+    
+    ## eSMTP
+    "username"             => '',                                  ## Username used in SMTP Auth
+    "password"             => '',                                  ## Password used in SMTP Auth
+    "tls"                  => 'auto',                              ## Enable or disable TLS support.  Options: auto, yes, no
+    
+);
+
+## More variables used later in the program
+my $SERVER;
+my $CRLF        = "\015\012";
+my $subject     = '';
+my $header      = '';
+my $message     = '';
+my $from        = '';
+my @to          = ();
+my @cc          = ();
+my @bcc         = ();
+my @attachments = ();
+my @attachments_names = ();
+
+## For printing colors to the console
+my ${colorRed}    = "\033[31;1m";
+my ${colorGreen}  = "\033[32;1m";
+my ${colorCyan}   = "\033[36;1m";
+my ${colorWhite}  = "\033[37;1m";
+my ${colorNormal} = "\033[m";
+my ${colorBold}   = "\033[1m";
+my ${colorNoBold} = "\033[0m";
+
+## Don't use shell escape codes on Windows systems
+if ($^O =~ /win/i) {
+    ${colorRed} = ${colorGreen} = ${colorCyan} = ${colorWhite} = ${colorNormal} = ${colorBold} = ${colorNoBold} = "";
+}
+
+## Load IO::Socket::SSL if it's available
+eval    { require IO::Socket::SSL; };
+if ($@) { $conf{'tls_client'} = 0; }
+else    { $conf{'tls_client'} = 1; }
+
+
+
+
+
+
+#############################
+##                          ##
+##      FUNCTIONS            ##
+##                          ##
+#############################
+
+
+
+
+
+###############################################################################################
+##  Function: initialize ()
+##  
+##  Does all the script startup jibberish.
+##  
+###############################################################################################
+sub initialize {
+
+    ## Set STDOUT to flush immediatly after each print  
+    $| = 1;
+    
+    ## Intercept signals
+    $SIG{'QUIT'}  = sub { quit("EXITING: Received SIG$_[0]", 1); };
+    $SIG{'INT'}   = sub { quit("EXITING: Received SIG$_[0]", 1); };
+    $SIG{'KILL'}  = sub { quit("EXITING: Received SIG$_[0]", 1); };
+    $SIG{'TERM'}  = sub { quit("EXITING: Received SIG$_[0]", 1); };
+  
+    ## ALARM and HUP signals are not supported in Win32
+    unless ($^O =~ /win/i) {
+        $SIG{'HUP'}   = sub { quit("EXITING: Received SIG$_[0]", 1); };
+        $SIG{'ALRM'}  = sub { quit("EXITING: Received SIG$_[0]", 1); };
+    }
+    
+    ## Fixup $conf{'programName'}
+    $conf{'programName'} =~ s/(.)*[\/,\\]//;
+    $0 = $conf{'programName'} . " " . join(" ", @ARGV);
+    
+    ## Fixup $conf{'hostname'} and $opt{'fqdn'}
+    if ($opt{'fqdn'} eq 'changeme') { $opt{'fqdn'} = get_hostname(1); }
+    if ($conf{'hostname'} eq 'changeme') { $conf{'hostname'} = $opt{'fqdn'}; $conf{'hostname'} =~ s/\..*//; }
+    
+    return(1);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+###############################################################################################
+##  Function: processCommandLine ()
+##  
+##  Processes command line storing important data in global vars (usually %conf)
+##  
+###############################################################################################
+sub processCommandLine {
+    
+    
+    ############################
+    ##  Process command line  ##
+    ############################
+    
+    my @ARGS = @ARGV;  ## This is so later we can re-parse the command line args later if we need to
+    my $numargv = @ARGS;
+    help() unless ($numargv);
+    my $counter = 0;
+    
+    for ($counter = 0; $counter < $numargv; $counter++) {
+  
+        if ($ARGS[$counter] =~ /^-h$/i) {                    ## Help ##
+            help();
+        }
+        
+        elsif ($ARGS[$counter] eq "") {                      ## Ignore null arguments
+            ## Do nothing
+        }
+        
+        elsif ($ARGS[$counter] =~ /^--help/) {               ## Topical Help ##
+            $counter++;
+            if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+                helpTopic($ARGS[$counter]);
+            }
+            else {
+                help();
+            }
+        }
+        
+        elsif ($ARGS[$counter] =~ /^-o$/i) {                 ## Options specified with -o ##
+            $counter++;
+            ## Loop through each option passed after the -o
+            while ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+                
+                if ($ARGS[$counter] !~ /(\S+)=(\S.*)/) {
+                    printmsg("WARNING => Name/Value pair [$ARGS[$counter]] is not properly formatted", 0);
+                    printmsg("WARNING => Arguments proceeding -o should be in the form of \"name=value\"", 0);
+                }
+                else {
+                    if (exists($opt{$1})) {
+                        if ($1 eq 'message-header') {
+                            $opt{$1} .= $2 . $CRLF;
+                        }
+                        else {
+                            $opt{$1} = $2;
+                        }
+                        printmsg("DEBUG => Assigned \$opt{} key/value: $1 => $2", 3);
+                    }
+                    else {
+                        printmsg("WARNING => Name/Value pair [$ARGS[$counter]] will be ignored: unknown key [$1]", 0);
+                        printmsg("HINT => Try the --help option to find valid command line arguments", 1);
+                    }
+                }
+                $counter++;
+            }   $counter--;
+        }
+        
+        elsif ($ARGS[$counter] =~ /^-f$/) {                  ## From ##
+            $counter++;
+            if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $from = $ARGS[$counter]; }
+            else { printmsg("WARNING => The argument after -f was not an email address!", 0); $counter--; }
+        }
+        
+        elsif ($ARGS[$counter] =~ /^-t$/) {                  ## To ##
+            $counter++;
+            while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) {
+                if ($ARGS[$counter] =~ /[;,]/) {
+                    push (@to, split(/[;,]/, $ARGS[$counter]));
+                }
+                else {
+                    push (@to,$ARGS[$counter]);
+                }
+                $counter++;
+            }   $counter--;
+        }
+        
+        elsif ($ARGS[$counter] =~ /^-cc$/) {                 ## Cc ##
+            $counter++;
+            while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) {
+                if ($ARGS[$counter] =~ /[;,]/) {
+                    push (@cc, split(/[;,]/, $ARGS[$counter]));
+                }
+                else {
+                    push (@cc,$ARGS[$counter]);
+                }
+                $counter++;
+            }   $counter--;
+        }
+        
+        elsif ($ARGS[$counter] =~ /^-bcc$/) {                ## Bcc ##
+            $counter++;
+            while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) {
+                if ($ARGS[$counter] =~ /[;,]/) {
+                    push (@bcc, split(/[;,]/, $ARGS[$counter]));
+                }
+                else {
+                    push (@bcc,$ARGS[$counter]);
+                }
+                $counter++;
+            }   $counter--;
+        }
+        
+        elsif ($ARGS[$counter] =~ /^-m$/) {                  ## Message ##
+            $counter++;
+            $message = "";
+            while ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+                if ($message) { $message .= " "; }
+                $message .= $ARGS[$counter];
+                $counter++;
+            }   $counter--;
+            
+            ## Replace '\n' with $CRLF.
+            ## This allows newlines with messages sent on the command line
+            $message =~ s/\\n/$CRLF/g;
+        }
+        
+        elsif ($ARGS[$counter] =~ /^-u$/) {                  ## Subject ##
+            $counter++;
+            $subject = "";
+            while ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+                if ($subject) { $subject .= " "; }
+                $subject .= $ARGS[$counter];
+                $counter++;
+            }   $counter--;
+        }
+        
+        elsif ($ARGS[$counter] =~ /^-s$/) {                  ## Server ##
+            $counter++;
+            if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+                $conf{'server'} = $ARGS[$counter];
+                if ($conf{'server'} =~ /:/) {                ## Port ##
+                    ($conf{'server'},$conf{'port'}) = split(":",$conf{'server'});
+                }
+            }
+            else { printmsg("WARNING - The argument after -s was not the server!", 0); $counter--; }
+        }
+
+        elsif ($ARGS[$counter] =~ /^-b$/) {                  ## Bind Address ##
+            $counter++;
+            if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+                $conf{'bindaddr'} = $ARGS[$counter];
+            }
+            else { printmsg("WARNING - The argument after -b was not the bindaddr!", 0); $counter--; }
+        }
+        
+        elsif ($ARGS[$counter] =~ /^-a$/) {                  ## Attachments ##
+            $counter++;
+            while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) {
+                push (@attachments,$ARGS[$counter]);
+                $counter++;
+            }   $counter--;
+        }
+        
+        elsif ($ARGS[$counter] =~ /^-xu$/) {                  ## AuthSMTP Username ##
+            $counter++;
+            if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+               $opt{'username'} = $ARGS[$counter];
+            }
+            else {
+                printmsg("WARNING => The argument after -xu was not valid username!", 0);
+                $counter--;
+            }
+        }
+        
+        elsif ($ARGS[$counter] =~ /^-xp$/) {                  ## AuthSMTP Password ##
+            $counter++;
+            if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) {
+               $opt{'password'} = $ARGS[$counter];
+            }
+            else {
+                printmsg("WARNING => The argument after -xp was not valid password!", 0);
+                $counter--;
+            }
+        }
+        
+        elsif ($ARGS[$counter] =~ /^-l$/) {                  ## Logging ##
+            $counter++;
+            $conf{'logging'} = 1;
+            if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $conf{'logFile'} = $ARGS[$counter]; }
+            else { printmsg("WARNING - The argument after -l was not the log file!", 0); $counter--; }
+        }
+        
+        elsif ($ARGS[$counter] =~ s/^-v+//i) {               ## Verbosity ##
+            my $tmp = (length($&) - 1);
+            $conf{'debug'} += $tmp;
+        }
+        
+        elsif ($ARGS[$counter] =~ /^-q$/) {                  ## Quiet ##
+            $conf{'stdout'} = 0;
+        }
+        
+        else {
+            printmsg("Error: \"$ARGS[$counter]\" is not a recognized option!", 0);
+            help();
+        }
+        
+    }
+
+
+
+
+
+
+    
+    
+    ###################################################
+    ##  Verify required variables are set correctly  ##
+    ###################################################
+    
+    ## Make sure we have something in $conf{hostname} and $opt{fqdn}
+    if ($opt{'fqdn'} =~ /\./) {
+        $conf{'hostname'} = $opt{'fqdn'};
+        $conf{'hostname'} =~ s/\..*//;
+    }
+    
+    if (!$conf{'server'}) { $conf{'server'} = 'localhost'; }
+    if (!$conf{'port'})   { $conf{'port'} = 25; }
+    if (!$from) {
+        quit("ERROR => You must specify a 'from' field!  Try --help.", 1);
+    }
+    if ( ((scalar(@to)) + (scalar(@cc)) + (scalar(@bcc))) <= 0) {
+        quit("ERROR => You must specify at least one recipient via -t, -cc, or -bcc", 1);
+    }
+    
+    ## Make sure email addresses look OK.
+    foreach my $addr (@to, @cc, @bcc, $from, $opt{'reply-to'}) {
+        if ($addr) {
+            if (!returnAddressParts($addr)) {
+                printmsg("ERROR => Can't use improperly formatted email address: $addr", 0);
+                printmsg("HINT => Try viewing the extended help on addressing with \"--help addressing\"", 1);
+                quit("", 1);
+            }
+        }
+    }
+    
+    ## Make sure all attachments exist.
+    foreach my $file (@attachments) {
+        if ( (! -f $file) or (! -r $file) ) {
+            printmsg("ERROR => The attachment [$file] doesn't exist!", 0);
+            printmsg("HINT => Try specifying the full path to the file or reading extended help with \"--help message\"", 1);
+            quit("", 1);
+        }
+    }
+    
+    if ($conf{'logging'} and (!$conf{'logFile'})) {
+        quit("ERROR => You used -l to enable logging but didn't specify a log file!", 1);
+    }    
+    
+    if ( $opt{'username'} ) {
+        if (!$opt{'password'}) {
+            ## Prompt for a password since one wasn't specified with the -xp option.
+            $SIG{'ALRM'} = sub { quit("ERROR => Timeout waiting for password inpupt", 1); };
+            alarm(60) if ($^O !~ /win/i);  ## alarm() doesn't work in win32
+            print "Password: ";
+            $opt{'password'} = <STDIN>; chomp $opt{'password'};
+            if (!$opt{'password'}) {
+                quit("ERROR => A username for SMTP authentication was specified, but no password!", 1);
+            }
+        }
+    }
+    
+    ## Validate the TLS setting
+    $opt{'tls'} = lc($opt{'tls'});
+    if ($opt{'tls'} !~ /^(auto|yes|no)$/) {
+        quit("ERROR => Invalid TLS setting ($opt{'tls'}). Must be one of auto, yes, or no.", 1);
+    }
+    
+    ## If TLS is set to "yes", make sure sendEmail loaded the libraries needed.
+    if ($opt{'tls'} eq 'yes' and $conf{'tls_client'} == 0) {
+        quit("ERROR => No TLS support!  SendEmail can't load required libraries. (try installing Net::SSLeay and IO::Socket::SSL)", 1);
+    }
+    
+    ## Return 0 errors
+    return(0);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## getline($socketRef)
+sub getline {
+    my ($socketRef) = @_;
+    local ($/) = "\r\n";
+    return $$socketRef->getline;
+}
+
+
+
+
+## Receive a (multiline?) SMTP response from ($socketRef)
+sub getResponse {
+    my ($socketRef) = @_;
+    my ($tmp, $reply);
+    local ($/) = "\r\n";
+    return undef unless defined($tmp = getline($socketRef));
+    return("getResponse() socket is not open") unless ($$socketRef->opened);
+    ## Keep reading lines if it's a multi-line response
+    while ($tmp =~ /^\d{3}-/o) {
+        $reply .= $tmp;
+        return undef unless defined($tmp = getline($socketRef));
+    }
+    $reply .= $tmp;
+    $reply =~ s/\r?\n$//o;
+    return $reply;
+}
+
+
+
+
+###############################################################################################
+##  Function:    SMTPchat ( [string $command] )
+##
+##  Description: Sends $command to the SMTP server (on SERVER) and awaits a successful
+##               reply form the server.  If the server returns an error, or does not reply
+##               within $conf{'alarm'} seconds an error is generated.
+##               NOTE: $command is optional, if no command is specified then nothing will
+##               be sent to the server, but a valid response is still required from the server.
+##
+##  Input:       [$command]          A (optional) valid SMTP command (ex. "HELO")
+##  
+##  
+##  Output:      Returns zero on success, or non-zero on error.  
+##               Error messages will be stored in $conf{'error'}
+##               A copy of the last SMTP response is stored in the global variable
+##               $conf{'SMTPchat_response'}
+##               
+##  
+##  Example:     SMTPchat ("HELO mail.isp.net");
+###############################################################################################
+sub SMTPchat {
+    my ($command) = @_;
+    
+    printmsg("INFO => Sending: \t$command", 1) if ($command);
+    
+    ## Send our command
+    print $SERVER "$command$CRLF" if ($command);
+    
+    ## Read a response from the server
+    $SIG{'ALRM'} = sub { $conf{'error'} = "alarm"; $SERVER->close(); };
+    alarm($conf{'alarm'}) if ($^O !~ /win/i);  ## alarm() doesn't work in win32;
+    my $result = $conf{'SMTPchat_response'} = getResponse(\$SERVER); 
+    alarm(0) if ($^O !~ /win/i);  ## alarm() doesn't work in win32;
+    
+    ## Generate an alert if we timed out
+    if ($conf{'error'} eq "alarm") {
+        $conf{'error'} = "ERROR => Timeout while reading from $conf{'server'}:$conf{'port'} There was no response after $conf{'alarm'} seconds.";
+        return(1);
+    }
+    
+    ## Make sure the server actually responded
+    if (!$result) {
+        $conf{'error'} = "ERROR => $conf{'server'}:$conf{'port'} returned a zero byte response to our query.";
+        return(2);
+    }
+    
+    ## Validate the response
+    if (evalSMTPresponse($result)) {
+        ## conf{'error'} will already be set here
+        return(2);
+    }
+    
+    ## Print the success messsage
+    printmsg($conf{'error'}, 1);
+    
+    ## Return Success
+    return(0);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+###############################################################################################
+##  Function:    evalSMTPresponse (string $message )
+##
+##  Description: Searches $message for either an  SMTP success or error code, and returns
+##               0 on success, and the actual error code on error.
+##               
+##
+##  Input:       $message          Data received from a SMTP server (ex. "220 
+##                                
+##  
+##  Output:      Returns zero on success, or non-zero on error.  
+##               Error messages will be stored in $conf{'error'}
+##               
+##  
+##  Example:     SMTPchat ("HELO mail.isp.net");
+###############################################################################################
+sub evalSMTPresponse {
+    my ($message) = @_;
+    
+    ## Validate input
+    if (!$message) { 
+        $conf{'error'} = "ERROR => No message was passed to evalSMTPresponse().  What happened?";
+        return(1)
+    }
+    
+    printmsg("DEBUG => evalSMTPresponse() - Checking for SMTP success or error status in the message: $message ", 3);
+    
+    ## Look for a SMTP success code
+    if ($message =~ /^([23]\d\d)/) {
+        printmsg("DEBUG => evalSMTPresponse() - Found SMTP success code: $1", 2);
+        $conf{'error'} = "SUCCESS => Received: \t$message";
+        return(0);
+    }
+    
+    ## Look for a SMTP error code
+    if ($message =~ /^([45]\d\d)/) {
+        printmsg("DEBUG => evalSMTPresponse() - Found SMTP error code: $1", 2);
+        $conf{'error'} = "ERROR => Received: \t$message";
+        return($1);
+    }
+    
+    ## If no SMTP codes were found return an error of 1
+    $conf{'error'} = "ERROR => Received a message with no success or error code. The message received was: $message";
+    return(2);
+    
+}
+
+
+
+
+
+
+
+
+
+
+#########################################################
+# SUB: &return_month(0,1,etc)
+#  returns the name of the month that corrosponds
+#  with the number.  returns 0 on error.
+#########################################################
+sub return_month {
+    my $x = $_[0];
+    if ($x == 0)  { return 'Jan'; }
+    if ($x == 1)  { return 'Feb'; }
+    if ($x == 2)  { return 'Mar'; }
+    if ($x == 3)  { return 'Apr'; }
+    if ($x == 4)  { return 'May'; }
+    if ($x == 5)  { return 'Jun'; }
+    if ($x == 6)  { return 'Jul'; }
+    if ($x == 7)  { return 'Aug'; }
+    if ($x == 8)  { return 'Sep'; }
+    if ($x == 9)  { return 'Oct'; }
+    if ($x == 10) { return 'Nov'; }
+    if ($x == 11) { return 'Dec'; }
+    return (0);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#########################################################
+# SUB: &return_day(0,1,etc)
+#  returns the name of the day that corrosponds
+#  with the number.  returns 0 on error.
+#########################################################
+sub return_day {
+    my $x = $_[0];
+    if ($x == 0)  { return 'Sun'; }
+    if ($x == 1)  { return 'Mon'; }
+    if ($x == 2)  { return 'Tue'; }
+    if ($x == 3)  { return 'Wed'; }
+    if ($x == 4)  { return 'Thu'; }
+    if ($x == 5)  { return 'Fri'; }
+    if ($x == 6)  { return 'Sat'; }
+    return (0);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+###############################################################################################
+##  Function:    returnAddressParts(string $address)
+##
+##  Description: Returns a two element array containing the "Name" and "Address" parts of 
+##               an email address.
+##  
+## Example:      "Brandon Zehm <caspian@dotconf.net>"
+##               would return: ("Brandon Zehm", "caspian@dotconf.net");
+## 
+##               "caspian@dotconf.net"
+##               would return: ("caspian@dotconf.net", "caspian@dotconf.net")
+###############################################################################################
+sub returnAddressParts {
+    my $input = $_[0];
+    my $name = "";
+    my $address = "";
+    
+    ## Make sure to fail if it looks totally invalid
+    if ($input !~ /(\S+\@\S+)/) {
+        $conf{'error'} = "ERROR => The address [$input] doesn't look like a valid email address, ignoring it";
+        return(undef());
+    }
+    
+    ## Check 1, should find addresses like: "Brandon Zehm <caspian@dotconf.net>"
+    elsif ($input =~ /^\s*(\S(.*\S)?)\s*<(\S+\@\S+)>/o) {
+        ($name, $address) = ($1, $3);
+    }
+    
+    ## Otherwise if that failed, just get the address: <caspian@dotconf.net>
+    elsif ($input =~ /<(\S+\@\S+)>/o) {
+        $name = $address = $1;
+    }
+    
+    ## Or maybe it was formatted this way: caspian@dotconf.net
+    elsif ($input =~ /(\S+\@\S+)/o) {
+        $name = $address = $1;
+    }
+    
+    ## Something stupid happened, just return an error.
+    unless ($name and $address) {
+        printmsg("ERROR => Couldn't parse the address: $input", 0);
+        printmsg("HINT => If you think this should work, consider reporting this as a bug to $conf{'authorEmail'}", 1);
+        return(undef());
+    }
+    
+    ## Make sure there aren't invalid characters in the address, and return it.
+    my $ctrl        = '\000-\037';
+    my $nonASCII    = '\x80-\xff';
+    if ($address =~ /[<> ,;:"'\[\]\\$ctrl$nonASCII]/) {
+        printmsg("WARNING => The address [$address] seems to contain invalid characters: continuing anyway", 0);
+    }
+    return($name, $address);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+###############################################################################################
+##  Function:    base64_encode(string $data, bool $chunk)
+##
+##  Description: Returns $data as a base64 encoded string.
+##               If $chunk is true, the encoded data is returned in 76 character long lines
+##               with the final \CR\LF removed.
+##
+##  Note: This is only used from the smtp auth section of code.
+##        At some point it would be nice to merge the code that encodes attachments and this.
+###############################################################################################
+sub base64_encode {
+    my $data = $_[0];
+    my $chunk = $_[1];
+    my $tmp = '';
+    my $base64 = '';
+    my $CRLF = "\r\n";
+    
+    ###################################
+    ## Convert binary data to base64 ##
+    ###################################
+    while ($data =~ s/(.{45})//s) {        ## Get 45 bytes from the binary string
+        $tmp = substr(pack('u', $&), 1);   ## Convert the binary to uuencoded text
+        chop($tmp);
+        $tmp =~ tr|` -_|AA-Za-z0-9+/|;     ## Translate from uuencode to base64
+        $base64 .= $tmp;
+    }
+    
+    ##########################
+    ## Encode the leftovers ##
+    ##########################
+    my $padding = "";
+    if ( ($data) and (length($data) > 0) ) {
+        $padding = (3 - length($data) % 3) % 3;    ## Set flag if binary data isn't divisible by 3
+        $tmp = substr(pack('u', $data), 1);        ## Convert the binary to uuencoded text
+        chop($tmp);
+        $tmp =~ tr|` -_|AA-Za-z0-9+/|;             ## Translate from uuencode to base64
+        $base64 .= $tmp;
+    }
+    
+    ############################
+    ## Fix padding at the end ##
+    ############################
+    $data = '';
+    $base64 =~ s/.{$padding}$/'=' x $padding/e if $padding; ## Fix the end padding if flag (from above) is set
+    if ($chunk) {
+        while ($base64 =~ s/(.{1,76})//s) {                     ## Put $CRLF after each 76 characters
+            $data .= "$1$CRLF";
+        }
+    }
+    else {
+        $data = $base64;
+    }
+    
+    ## Remove any trailing CRLF's
+    $data =~ s/(\r|\n)*$//s;
+    return($data);
+}
+
+
+
+
+
+
+
+
+
+#########################################################
+# SUB: send_attachment("/path/filename")
+# Sends the mime headers and base64 encoded file
+# to the email server.
+#########################################################
+sub send_attachment {
+    my ($filename) = @_;                             ## Get filename passed
+    my (@fields, $y, $filename_name, $encoding,      ## Local variables
+        @attachlines, $content_type);
+    my $bin = 1;
+    
+    @fields = split(/\/|\\/, $filename);             ## Get the actual filename without the path  
+    $filename_name = pop(@fields);       
+    push @attachments_names, $filename_name;         ## FIXME: This is only used later for putting in the log file
+    
+    ##########################
+    ## Autodetect Mime Type ##
+    ##########################
+    
+    @fields = split(/\./, $filename_name);
+    $encoding = $fields[$#fields];
+    
+    if ($encoding =~ /txt|text|log|conf|^c$|cpp|^h$|inc|m3u/i) {   $content_type = 'text/plain';                      }
+    elsif ($encoding =~ /html|htm|shtml|shtm|asp|php|cfm/i) {      $content_type = 'text/html';                       }
+    elsif ($encoding =~ /sh$/i) {                                  $content_type = 'application/x-sh';                }
+    elsif ($encoding =~ /tcl/i) {                                  $content_type = 'application/x-tcl';               }
+    elsif ($encoding =~ /pl$/i) {                                  $content_type = 'application/x-perl';              }
+    elsif ($encoding =~ /js$/i) {                                  $content_type = 'application/x-javascript';        }
+    elsif ($encoding =~ /man/i) {                                  $content_type = 'application/x-troff-man';         }
+    elsif ($encoding =~ /gif/i) {                                  $content_type = 'image/gif';                       }
+    elsif ($encoding =~ /jpg|jpeg|jpe|jfif|pjpeg|pjp/i) {          $content_type = 'image/jpeg';                      }
+    elsif ($encoding =~ /tif|tiff/i) {                             $content_type = 'image/tiff';                      }
+    elsif ($encoding =~ /xpm/i) {                                  $content_type = 'image/x-xpixmap';                 }
+    elsif ($encoding =~ /bmp/i) {                                  $content_type = 'image/x-MS-bmp';                  }
+    elsif ($encoding =~ /pcd/i) {                                  $content_type = 'image/x-photo-cd';                }
+    elsif ($encoding =~ /png/i) {                                  $content_type = 'image/png';                       }
+    elsif ($encoding =~ /aif|aiff/i) {                             $content_type = 'audio/x-aiff';                    }
+    elsif ($encoding =~ /wav/i) {                                  $content_type = 'audio/x-wav';                     }
+    elsif ($encoding =~ /mp2|mp3|mpa/i) {                          $content_type = 'audio/x-mpeg';                    }
+    elsif ($encoding =~ /ra$|ram/i) {                              $content_type = 'audio/x-pn-realaudio';            }
+    elsif ($encoding =~ /mpeg|mpg/i) {                             $content_type = 'video/mpeg';                      }
+    elsif ($encoding =~ /mov|qt$/i) {                              $content_type = 'video/quicktime';                 }
+    elsif ($encoding =~ /avi/i) {                                  $content_type = 'video/x-msvideo';                 }
+    elsif ($encoding =~ /zip/i) {                                  $content_type = 'application/x-zip-compressed';    }
+    elsif ($encoding =~ /tar/i) {                                  $content_type = 'application/x-tar';               }
+    elsif ($encoding =~ /jar/i) {                                  $content_type = 'application/java-archive';        }
+    elsif ($encoding =~ /exe|bin/i) {                              $content_type = 'application/octet-stream';        }
+    elsif ($encoding =~ /ppt|pot|ppa|pps|pwz/i) {                  $content_type = 'application/vnd.ms-powerpoint';   }
+    elsif ($encoding =~ /mdb|mda|mde/i) {                          $content_type = 'application/vnd.ms-access';       }
+    elsif ($encoding =~ /xls|xlt|xlm|xld|xla|xlc|xlw|xll/i) {      $content_type = 'application/vnd.ms-excel';        }
+    elsif ($encoding =~ /doc|dot/i) {                              $content_type = 'application/msword';              }
+    elsif ($encoding =~ /rtf/i) {                                  $content_type = 'application/rtf';                 }
+    elsif ($encoding =~ /pdf/i) {                                  $content_type = 'application/pdf';                 }
+    elsif ($encoding =~ /tex/i) {                                  $content_type = 'application/x-tex';               }
+    elsif ($encoding =~ /latex/i) {                                $content_type = 'application/x-latex';             }
+    elsif ($encoding =~ /vcf/i) {                                  $content_type = 'application/x-vcard';             }
+    else { $content_type = 'application/octet-stream';  }
+  
+  
+  ############################
+  ## Process the attachment ##
+  ############################
+    
+    #####################################
+    ## Generate and print MIME headers ##
+    #####################################
+    
+    $y  = "$CRLF--$conf{'delimiter'}$CRLF";
+    $y .= "Content-Type: $content_type;$CRLF";
+    $y .= "        name=\"$filename_name\"$CRLF";
+    $y .= "Content-Transfer-Encoding: base64$CRLF";
+    $y .= "Content-Disposition: attachment; filename=\"$filename_name\"$CRLF";
+    $y .= "$CRLF";
+    print $SERVER $y;
+    
+    
+    ###########################################################
+    ## Convert the file to base64 and print it to the server ##
+    ###########################################################
+    
+    open (FILETOATTACH, $filename) || do {
+        printmsg("ERROR => Opening the file [$filename] for attachment failed with the error: $!", 0);
+        return(1);
+    };
+    binmode(FILETOATTACH);                 ## Hack to make Win32 work
+    
+    my $res = "";
+    my $tmp = "";
+    my $base64 = "";
+    while (<FILETOATTACH>) {               ## Read a line from the (binary) file
+        $res .= $_;
+        
+        ###################################
+        ## Convert binary data to base64 ##
+        ###################################
+        while ($res =~ s/(.{45})//s) {         ## Get 45 bytes from the binary string
+            $tmp = substr(pack('u', $&), 1);   ## Convert the binary to uuencoded text
+            chop($tmp);
+            $tmp =~ tr|` -_|AA-Za-z0-9+/|;     ## Translate from uuencode to base64
+            $base64 .= $tmp;
+        }
+        
+        ################################
+        ## Print chunks to the server ##
+        ################################
+        while ($base64 =~ s/(.{76})//s) {
+            print $SERVER "$1$CRLF";
+        }
+      
+    }
+    
+    ###################################
+    ## Encode and send the leftovers ##
+    ###################################
+    my $padding = "";
+    if ( ($res) and (length($res) >= 1) ) {
+        $padding = (3 - length($res) % 3) % 3;  ## Set flag if binary data isn't divisible by 3
+        $res = substr(pack('u', $res), 1);      ## Convert the binary to uuencoded text
+        chop($res);
+        $res =~ tr|` -_|AA-Za-z0-9+/|;          ## Translate from uuencode to base64
+    }
+    
+    ############################
+    ## Fix padding at the end ##
+    ############################
+    $res = $base64 . $res;                               ## Get left overs from above
+    $res =~ s/.{$padding}$/'=' x $padding/e if $padding; ## Fix the end padding if flag (from above) is set
+    if ($res) {
+        while ($res =~ s/(.{1,76})//s) {                 ## Send it to the email server.
+            print $SERVER "$1$CRLF";
+        }
+    }
+    
+    close (FILETOATTACH) || do {
+        printmsg("ERROR - Closing the filehandle for file [$filename] failed with the error: $!", 0);
+        return(2);
+    };
+    
+    ## Return 0 errors
+    return(0);
+
+}
+
+
+
+
+
+
+
+
+
+###############################################################################################
+##  Function:    $string = get_hostname (boot $fqdn)
+##  
+##  Description: Tries really hard to returns the short (or FQDN) hostname of the current
+##               system.  Uses techniques and code from the  Sys-Hostname module.
+##  
+##  Input:       $fqdn     A true value (1) will cause this function to return a FQDN hostname
+##                         rather than a short hostname.
+##  
+##  Output:      Returns a string
+###############################################################################################
+sub get_hostname {
+    ## Assign incoming parameters to variables
+    my ( $fqdn ) = @_;
+    my $hostname = "";
+    
+    ## STEP 1: Get short hostname
+    
+    ## Load Sys::Hostname if it's available
+    eval { require Sys::Hostname; };
+    unless ($@) {
+        $hostname = Sys::Hostname::hostname(); 
+    }
+    
+    ## If that didn't get us a hostname, try a few other things
+    else {
+        ## Windows systems
+        if ($^O !~ /win/i) {
+            if ($ENV{'COMPUTERNAME'}) { $hostname = $ENV{'COMPUTERNAME'}; }
+            if (!$hostname) { $hostname = gethostbyname('localhost'); }
+            if (!$hostname) { chomp($hostname = `hostname 2> NUL`) };
+        }
+        
+        ## Unix systems
+        else {
+            local $ENV{PATH} = '/usr/bin:/bin:/usr/sbin:/sbin';  ## Paranoia
+            
+            ## Try the environment first (Help!  What other variables could/should I be checking here?)
+            if ($ENV{'HOSTNAME'}) { $hostname = $ENV{'HOSTNAME'}; }
+            
+            ## Try the hostname command
+            eval { local $SIG{__DIE__}; local $SIG{CHLD}; $hostname = `hostname 2>/dev/null`; chomp($hostname); } ||
+            
+            ## Try POSIX::uname(), which strictly can't be expected to be correct
+            eval { local $SIG{__DIE__}; require POSIX; $hostname = (POSIX::uname())[1]; } ||
+            
+            ## Try the uname command
+            eval { local $SIG{__DIE__}; $hostname = `uname -n 2>/dev/null`; chomp($hostname); };
+            
+        }
+        
+        ## If we can't find anything else, return ""
+        if (!$hostname) {
+            print "WARNING => No hostname could be determined, please specify one with -o fqdn=FQDN option!\n";
+            return("unknown");
+        }
+    }
+    
+    ## Return the short hostname
+    unless ($fqdn) {
+        $hostname =~ s/\..*//;
+        return(lc($hostname));
+    }
+    
+    ## STEP 2: Determine the FQDN
+    
+    ## First, if we already have one return it.
+    if ($hostname =~ /\w\.\w/) { return(lc($hostname)); }
+    
+    ## Next try using 
+    eval { $fqdn = (gethostbyname($hostname))[0]; };
+    if ($fqdn) { return(lc($fqdn)); }
+    return(lc($hostname));
+}
+
+
+
+
+
+
+
+
+###############################################################################################
+##  Function:    printmsg (string $message, int $level)
+##
+##  Description: Handles all messages - printing them to the screen only if the messages
+##               $level is >= the global debug level.  If $conf{'logFile'} is defined it
+##               will also log the message to that file.
+##
+##  Input:       $message          A message to be printed, logged, etc.
+##               $level            The debug level of the message. If
+##                                 not defined 0 will be assumed.  0 is
+##                                 considered a normal message, 1 and 
+##                                 higher is considered a debug message.
+##  
+##  Output:      Prints to STDOUT
+##
+##  Assumptions: $conf{'hostname'} should be the name of the computer we're running on.
+##               $conf{'stdout'} should be set to 1 if you want to print to stdout
+##               $conf{'logFile'} should be a full path to a log file if you want that
+##               $conf{'debug'} should be an integer between 0 and 10.
+##
+##  Example:     printmsg("WARNING: We believe in generic error messages... NOT!", 0);
+###############################################################################################
+sub printmsg {
+    ## Assign incoming parameters to variables
+    my ( $message, $level ) = @_;
+    
+    ## Make sure input is sane
+    $level = 0 if (!defined($level));
+    $message =~ s/\s+$//sgo;
+    $message =~ s/\r?\n/, /sgo;
+    
+    ## Continue only if the debug level of the program is >= message debug level.
+    if ($conf{'debug'} >= $level) {
+        
+        ## Get the date in the format: Dec  3 11:14:04
+        my ($sec, $min, $hour, $mday, $mon) = localtime();
+        $mon = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')[$mon];
+        my $date = sprintf("%s %02d %02d:%02d:%02d", $mon, $mday, $hour, $min, $sec);
+        
+        ## Print to STDOUT always if debugging is enabled, or if conf{stdout} is true.
+        if ( ($conf{'debug'} >= 1) or ($conf{'stdout'} == 1) ) {
+            print "$date $conf{'hostname'} $conf{'programName'}\[$$\]: $message\n";
+        }
+        
+        ## Print to the log file if $conf{'logging'} is true
+        if ($conf{'logFile'}) {
+            if (openLogFile($conf{'logFile'})) { $conf{'logFile'} = ""; printmsg("ERROR => Opening the file [$conf{'logFile'}] for appending returned the error: $!", 1); }
+            print LOGFILE "$date $conf{'hostname'} $conf{'programName'}\[$$\]: $message\n";
+        }
+        
+    }
+    
+    ## Return 0 errors
+    return(0);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+###############################################################################################
+## FUNCTION:
+##   openLogFile ( $filename )
+## 
+## 
+## DESCRIPTION: 
+##   Opens the file $filename and attaches it to the filehandle "LOGFILE".  Returns 0 on success
+##   and non-zero on failure.  Error codes are listed below, and the error message gets set in
+##   global variable $!.
+##   
+##   
+## Example:
+##   openFile ("/var/log/sendEmail.log");
+##
+###############################################################################################
+sub openLogFile {
+    ## Get the incoming filename
+    my $filename = $_[0];
+    
+    ## Make sure our file exists, and if the file doesn't exist then create it
+    if ( ! -f $filename ) {
+        print STDERR "NOTICE: The log file [$filename] does not exist.  Creating it now with mode [0600].\n" if ($conf{'stdout'});
+        open (LOGFILE, ">>$filename");
+        close LOGFILE;
+        chmod (0600, $filename);
+    }
+    
+    ## Now open the file and attach it to a filehandle
+    open (LOGFILE,">>$filename") or return (1);
+    
+    ## Put the file into non-buffering mode
+    select LOGFILE;
+    $| = 1;
+    select STDOUT;
+    
+    ## Return success
+    return(0);
+}
+
+
+
+
+
+
+
+
+###############################################################################################
+##  Function:    read_file (string $filename)
+##  
+##  Description: Reads the contents of a file and returns a two part array:
+##               ($status, $file-contents)
+##               $status is 0 on success, non-zero on error.
+##               
+##  Example:     ($status, $file) = read_file("/etc/passwd");
+###############################################################################################
+sub read_file {
+    my ( $filename ) = @_;
+    
+    ## If the value specified is a file, load the file's contents
+    if ( (-e $filename and -r $filename) ) {
+        my $FILE;
+        if(!open($FILE, ' ' . $filename)) {
+            return((1, ""));
+        }
+        my $file = '';
+        while (<$FILE>) {
+            $file .= $_;
+        }
+        ## Strip an ending \r\n
+        $file =~ s/\r?\n$//os;
+    }
+    return((1, ""));
+}
+
+
+
+
+
+
+
+
+
+###############################################################################################
+##  Function:    quit (string $message, int $errorLevel)
+##  
+##  Description: Exits the program, optionally printing $message.  It 
+##               returns an exit error level of $errorLevel to the 
+##               system  (0 means no errors, and is assumed if empty.)
+##
+##  Example:     quit("Exiting program normally", 0);
+###############################################################################################
+sub quit {
+    my ( $message, $errorLevel ) = @_;
+    $errorLevel = 0 if (!defined($errorLevel));
+    
+    ## Print exit message
+    if ($message) { 
+        printmsg($message, 0);
+    }
+    
+    ## Exit
+    exit($errorLevel);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+###############################################################################################
+## Function:    help ()
+##
+## Description: For all those newbies ;)
+##              Prints a help message and exits the program.
+##
+###############################################################################################
+sub help {
+exit(1) if (!$conf{'stdout'});
+print <<EOM;
+
+${colorBold}$conf{'programName'}-$conf{'version'} by $conf{'authorName'} <$conf{'authorEmail'}>${colorNoBold}
+
+Synopsis:  $conf{'programName'} -f ADDRESS [options]
+
+  ${colorRed}Required:${colorNormal}
+    -f ADDRESS                from (sender) email address
+    * At least one recipient required via -t, -cc, or -bcc
+    * Message body required via -m, STDIN, or -o message-file=FILE
+
+  ${colorGreen}Common:${colorNormal}
+    -t ADDRESS [ADDR ...]     to email address(es)
+    -u SUBJECT                message subject
+    -m MESSAGE                message body
+    -s SERVER[:PORT]          smtp mail relay, default is $conf{'server'}:$conf{'port'}
+
+  ${colorGreen}Optional:${colorNormal}
+    -a   FILE [FILE ...]      file attachment(s)
+    -cc  ADDRESS [ADDR ...]   cc  email address(es)
+    -bcc ADDRESS [ADDR ...]   bcc email address(es)
+    -xu  USERNAME             username for SMTP authentication
+    -xp  PASSWORD             password for SMTP authentication
+
+  ${colorGreen}Paranormal:${colorNormal}
+    -b BINDADDR[:PORT]        local host bind address
+    -l LOGFILE                log to the specified file
+    -v                        verbosity, use multiple times for greater effect
+    -q                        be quiet (i.e. no STDOUT output)
+    -o NAME=VALUE             advanced options, for details try: --help misc
+        -o message-content-type=<auto|text|html>
+        -o message-file=FILE         -o message-format=raw
+        -o message-header=HEADER     -o message-charset=CHARSET
+        -o reply-to=ADDRESS          -o timeout=SECONDS
+        -o username=USERNAME         -o password=PASSWORD
+        -o tls=<auto|yes|no>         -o fqdn=FQDN
+
+
+  ${colorGreen}Help:${colorNormal}
+    --help                    the helpful overview you're reading now
+    --help addressing         explain addressing and related options
+    --help message            explain message body input and related options
+    --help networking         explain -s, -b, etc
+    --help output             explain logging and other output options
+    --help misc               explain -o options, TLS, SMTP auth, and more
+
+EOM
+exit(1);
+}
+
+
+
+
+
+
+
+
+
+###############################################################################################
+## Function:    helpTopic ($topic)
+##
+## Description: For all those newbies ;) 
+##              Prints a help message and exits the program.
+## 
+###############################################################################################
+sub helpTopic {
+    exit(1) if (!$conf{'stdout'});
+    my ($topic) = @_;
+
+    CASE: {
+
+
+
+
+## ADDRESSING
+        ($topic eq 'addressing') && do {
+            print <<EOM;
+
+${colorBold}ADDRESSING DOCUMENTATION${colorNormal}
+
+${colorGreen}Addressing Options${colorNormal}
+Options related to addressing:
+    -f   ADDRESS
+    -t   ADDRESS [ADDRESS ...]
+    -cc  ADDRESS [ADDRESS ...]
+    -bcc ADDRESS [ADDRESS ...]
+    -o   reply-to=ADDRESS
+    
+-f ADDRESS
+    This required option specifies who the email is from, I.E. the sender's
+    email address.
+    
+-t ADDRESS [ADDRESS ...]
+    This option specifies the primary recipient(s).  At least one recipient
+    address must be specified via the -t, -cc. or -bcc options.
+
+-cc ADDRESS [ADDRESS ...]
+    This option specifies the "carbon copy" recipient(s).  At least one 
+    recipient address must be specified via the -t, -cc. or -bcc options.
+
+-bcc ADDRESS [ADDRESS ...]
+    This option specifies the "blind carbon copy" recipient(s).  At least
+    one recipient address must be specified via the -t, -cc. or -bcc options.
+
+-o reply-to=ADDRESS
+    This option specifies that an optional "Reply-To" address should be
+    written in the email's headers.
+    
+
+${colorGreen}Email Address Syntax${colorNormal}
+Email addresses may be specified in one of two ways:
+    Full Name:     "John Doe <john.doe\@gmail.com>"
+    Just Address:  "john.doe\@gmail.com"
+
+The "Full Name" method is useful if you want a name, rather than a plain
+email address, to be displayed in the recipient's From, To, or Cc fields
+when they view the message.
+    
+
+${colorGreen}Multiple Recipients${colorNormal}
+The -t, -cc, and -bcc options each accept multiple addresses.  They may be
+specified by separating them by either a white space, comma, or semi-colon
+separated list.  You may also specify the -t, -cc, and -bcc options multiple
+times, each occurance will append the new recipients to the respective list.
+
+Examples:
+(I used "-t" in these examples, but it can be "-cc" or "-bcc" as well)
+
+  * Space separated list:
+    -t jane.doe\@yahoo.com "John Doe <john.doe\@gmail.com>"
+    
+  * Semi-colon separated list:
+    -t "jane.doe\@yahoo.com; John Doe <john.doe\@gmail.com>"
+  * Comma separated list:
+    -t "jane.doe\@yahoo.com, John Doe <john.doe\@gmail.com>"
+  
+  * Multiple -t, -cc, or -bcc options:
+    -t "jane.doe\@yahoo.com" -t "John Doe <john.doe\@gmail.com>"
+  
+
+EOM
+            last CASE;
+        };
+
+
+
+
+
+
+## MESSAGE
+        ($topic eq 'message') && do {
+            print <<EOM;
+
+${colorBold}MESSAGE DOCUMENTATION${colorNormal}
+
+${colorGreen}Message Options${colorNormal}
+Options related to the email message body:
+    -u  SUBJECT
+    -m  MESSAGE
+    -o  message-file=FILE
+    -o  message-content-type=<auto|text|html>
+    -o  message-header=EMAIL HEADER
+    -o  message-charset=CHARSET
+    -o  message-format=raw
+    
+-u SUBJECT
+    This option allows you to specify the subject for your email message.
+    It is not required (anymore) that the subject be quoted, although it 
+    is recommended.  The subject will be read until an argument starting
+    with a hyphen (-) is found.  
+    Examples:
+      -u "Contact information while on vacation"
+      -u New Microsoft vulnerability discovered
+
+-m MESSAGE
+    This option is one of three methods that allow you to specify the message
+    body for your email.  The message may be specified on the command line
+    with this -m option, read from a file with the -o message-file=FILE
+    option, or read from STDIN if neither of these options are present.
+    
+    It is not required (anymore) that the message be quoted, although it is
+    recommended.  The message will be read until an argument starting with a
+    hyphen (-) is found.
+    Examples:
+      -m "See you in South Beach, Hawaii.  -Todd"
+      -m Please ensure that you upgrade your systems right away
+    
+    Multi-line message bodies may be specified with the -m option by putting
+    a "\\n" into the message.  Example:
+      -m "This is line 1.\\nAnd this is line 2."
+    
+    HTML messages are supported, simply begin your message with "<html>" and
+    sendEmail will properly label the mime header so MUAs properly render
+    the message.  It is currently not possible without "-o message-format=raw"
+    to send a message with both text and html parts with sendEmail.
+
+-o message-file=FILE
+    This option is one of three methods that allow you to specify the message
+    body for your email.  To use this option simply specify a text file
+    containing the body of your email message. Examples:
+      -o message-file=/root/message.txt
+      -o message-file="C:\\Program Files\\output.txt"
+
+-o message-content-type=<auto|text|html>
+    This option allows you to specify the content-type of the email. If your
+    email message is an html message but is being displayed as a text message
+    just add "-o message-content-type=html" to the command line to force it
+    to display as an html message. This actually just changes the Content-Type:
+    header. Advanced users will be happy to know that if you specify anything
+    other than the three options listed above it will use that as the vaule
+    for the Content-Type header.
+
+-o message-header=EMAIL HEADER
+    This option allows you to specify additional email headers to be included.
+    To add more than one message header simply use this option on the command
+    line more than once.  If you specify a message header that sendEmail would
+    normally generate the one you specified will be used in it's place.
+    Do not use this unless you know what you are doing!
+    Example:
+      To scare a Microsoft Outlook user you may want to try this:
+      -o message-header="X-Message-Flag: Message contains illegal content"
+    Example:
+      To request a read-receipt try this:
+      -o message-header="Disposition-Notification-To: <user\@domain.com>"
+    Example:
+      To set the message priority try this:
+      -o message-header="X-Priority: 1"
+      Priority reference: 1=highest, 2=high, 3=normal, 4=low, 5=lowest
+
+-o message-charset=CHARSET
+    This option allows you to specify the character-set for the message body.
+    The default is iso-8859-1.
+
+-o message-format=raw
+    This option instructs sendEmail to assume the message (specified with -m,
+    read from STDIN, or read from the file specified in -o message-file=FILE)
+    is already a *complete* email message.  SendEmail will not generate any
+    headers and will transmit the message as-is to the remote SMTP server.
+    Due to the nature of this option the following command line options will
+    be ignored when this one is used:
+      -u SUBJECT
+      -o message-header=EMAIL HEADER
+      -o message-charset=CHARSET
+      -a ATTACHMENT
+      
+
+${colorGreen}The Message Body${colorNormal}
+The email message body may be specified in one of three ways:
+ 1) Via the -m MESSAGE command line option.
+    Example:
+      -m "This is the message body"
+      
+ 2) By putting the message body in a file and using the -o message-file=FILE
+    command line option.
+    Example:
+      -o message-file=/root/message.txt
+      
+ 3) By piping the message body to sendEmail when nither of the above command
+    line options were specified.
+    Example:
+      grep "ERROR" /var/log/messages | sendEmail -t you\@domain.com ...
+
+If the message body begins with "<html>" then the message will be treated as
+an HTML message and the MIME headers will be written so that a HTML capable
+email client will display the message in it's HTML form.
+Any of the above methods may be used with the -o message-format=raw option 
+to deliver an already complete email message.
+
+
+EOM
+            last CASE;
+        };
+
+
+
+
+
+
+## MISC
+        ($topic eq 'misc') && do {
+            print <<EOM;
+
+${colorBold}MISC DOCUMENTATION${colorNormal}
+
+${colorGreen}Misc Options${colorNormal}
+Options that don't fit anywhere else:
+    -a   ATTACHMENT [ATTACHMENT ...]
+    -xu  USERNAME
+    -xp  PASSWORD
+    -o   username=USERNAME
+    -o   password=PASSWORD
+    -o   tls=<auto|yes|no>
+    -o   timeout=SECONDS
+    -o   fqdn=FQDN
+
+-a   ATTACHMENT [ATTACHMENT ...]
+    This option allows you to attach any number of files to your email message.
+    To specify more than one attachment, simply separate each filename with a
+    space.  Example: -a file1.txt file2.txt file3.txt
+
+-xu  USERNAME
+    Alias for -o username=USERNAME
+
+-xp  PASSWORD
+    Alias for -o password=PASSWORD
+
+-o   username=USERNAME (synonym for -xu)
+    These options allow specification of a username to be used with SMTP
+    servers that require authentication.  If a username is specified but a
+    password is not, you will be prompted to enter one at runtime.
+
+-o   password=PASSWORD (synonym for -xp)
+    These options allow specification of a password to be used with SMTP
+    servers that require authentication.  If a username is specified but a
+    password is not, you will be prompted to enter one at runtime. 
+
+-o   tls=<auto|yes|no>
+    This option allows you to specify if TLS (SSL for SMTP) should be enabled
+    or disabled.  The default, auto, will use TLS automatically if your perl
+    installation has the IO::Socket::SSL and Net::SSLeay modules available,
+    and if the remote SMTP server supports TLS.  To require TLS for message
+    delivery set this to yes.  To disable TLS support set this to no.  A debug
+    level of one or higher will reveal details about the status of TLS.
+
+-o   timeout=SECONDS
+    This option sets the timeout value in seconds used for all network reads,
+    writes, and a few other things.
+
+-o   fqdn=FQDN
+    This option sets the Fully Qualified Domain Name used during the initial
+    SMTP greeting.  Normally this is automatically detected, but in case you
+    need to manually set it for some reason or get a warning about detection
+    failing, you can use this to override the default.
+
+
+EOM
+            last CASE;
+        };
+
+
+
+
+
+
+## NETWORKING
+        ($topic eq 'networking') && do {
+            print <<EOM;
+
+${colorBold}NETWORKING DOCUMENTATION${colorNormal}
+
+${colorGreen}Networking Options${colorNormal}
+Options related to networking:
+    -s   SERVER[:PORT]
+    -b   BINDADDR[:PORT]
+    -o   tls=<auto|yes|no>
+    -o   timeout=SECONDS
+
+-s SERVER[:PORT]
+    This option allows you to specify the SMTP server sendEmail should
+    connect to to deliver your email message to.  If this option is not
+    specified sendEmail will try to connect to localhost:25 to deliver
+    the message.  THIS IS MOST LIKELY NOT WHAT YOU WANT, AND WILL LIKELY
+    FAIL unless you have a email server (commonly known as an MTA) running
+    on your computer!
+    Typically you will need to specify your company or ISP's email server.
+    For example, if you use CableOne you will need to specify:
+       -s mail.cableone.net
+    If you have your own email server running on port 300 you would
+    probably use an option like this:
+       -s myserver.mydomain.com:300
+    If you're a GMail user try:
+       -s smtp.gmail.com:587 -xu me\@gmail.com -xp PASSWD
+
+-b BINDADDR[:PORT]
+    This option allows you to specify the local IP address (and optional
+    tcp port number) for sendEmail to bind to when connecting to the remote
+    SMTP server.  This useful for people who need to send an email from a
+    specific network interface or source address and are running sendEmail on
+    a firewall or other host with several network interfaces.
+
+-o   tls=<auto|yes|no>
+    This option allows you to specify if TLS (SSL for SMTP) should be enabled
+    or disabled.  The default, auto, will use TLS automatically if your perl
+    installation has the IO::Socket::SSL and Net::SSLeay modules available,
+    and if the remote SMTP server supports TLS.  To require TLS for message
+    delivery set this to yes.  To disable TLS support set this to no.  A debug
+    level of one or higher will reveal details about the status of TLS.
+
+-o timeout=SECONDS
+    This option sets the timeout value in seconds used for all network reads,
+    writes, and a few other things.
+
+    
+EOM
+            last CASE;
+        };
+
+
+
+
+
+
+## OUTPUT
+        ($topic eq 'output') && do {
+            print <<EOM;
+
+${colorBold}OUTPUT DOCUMENTATION${colorNormal}
+
+${colorGreen}Output Options${colorNormal}
+Options related to output:
+    -l LOGFILE
+    -v
+    -q
+
+-l LOGFILE
+    This option allows you to specify a log file to append to.  Every message
+    that is displayed to STDOUT is also written to the log file.  This may be
+    used in conjunction with -q and -v.
+
+-q
+    This option tells sendEmail to disable printing to STDOUT.  In other
+    words nothing will be printed to the console.  This does not affect the
+    behavior of the -l or -v options.
+
+-v
+    This option allows you to increase the debug level of sendEmail.  You may
+    either use this option more than once, or specify more than one v at a
+    time to obtain a debug level higher than one.  Examples:
+        Specifies a debug level of 1:  -v
+        Specifies a debug level of 2:  -vv
+        Specifies a debug level of 2:  -v -v
+    A debug level of one is recommended when doing any sort of debugging.  
+    At that level you will see the entire SMTP transaction (except the
+    body of the email message), and hints will be displayed for most
+    warnings and errors.  The highest debug level is three.
+
+
+EOM
+            last CASE;
+        };
+
+        ## Unknown option selected!
+        quit("ERROR => The help topic specified is not valid!", 1);
+    };
+
+exit(1);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#############################
+##                          ##
+##      MAIN PROGRAM         ##
+##                          ##
+#############################
+
+
+## Initialize
+initialize();
+
+## Process Command Line
+processCommandLine();
+$conf{'alarm'} = $opt{'timeout'};
+
+## Abort program after $conf{'alarm'} seconds to avoid infinite hangs
+alarm($conf{'alarm'}) if ($^O !~ /win/i);  ## alarm() doesn't work in win32
+
+
+
+
+###################################################
+##  Read $message from STDIN if -m was not used  ##
+###################################################
+
+if (!($message)) {
+    ## Read message body from a file specified with -o message-file=
+    if ($opt{'message-file'}) {
+        if (! -e $opt{'message-file'}) {
+            printmsg("ERROR => Message body file specified [$opt{'message-file'}] does not exist!", 0);
+            printmsg("HINT => 1) check spelling of your file; 2) fully qualify the path; 3) doubble quote it", 1);
+            quit("", 1);
+        }
+        if (! -r $opt{'message-file'}) {
+            printmsg("ERROR => Message body file specified can not be read due to restricted permissions!", 0);
+            printmsg("HINT => Check permissions on file specified to ensure it can be read", 1);
+            quit("", 1);
+        }
+        if (!open(MFILE, "< " . $opt{'message-file'})) {
+            printmsg("ERROR => Error opening message body file [$opt{'message-file'}]: $!", 0);
+            quit("", 1);
+        }
+        while (<MFILE>) {
+            $message .= $_;
+        }
+        close(MFILE);
+    }
+    
+    ## Read message body from STDIN
+    else {
+        alarm($conf{'alarm'}) if ($^O !~ /win/i);  ## alarm() doesn't work in win32
+        if ($conf{'stdout'}) {
+            print "Reading message body from STDIN because the '-m' option was not used.\n";
+            print "If you are manually typing in a message:\n";
+            print "  - First line must be received within $conf{'alarm'} seconds.\n" if ($^O !~ /win/i);
+            print "  - End manual input with a CTRL-D on its own line.\n\n" if ($^O !~ /win/i);
+            print "  - End manual input with a CTRL-Z on its own line.\n\n" if ($^O =~ /win/i);
+        }
+        while (<STDIN>) {                 ## Read STDIN into $message
+            $message .= $_;
+            alarm(0) if ($^O !~ /win/i);  ## Disable the alarm since at least one line was received
+        }
+        printmsg("Message input complete.", 0);
+    }
+}
+
+## Replace bare LF's with CRLF's (\012 should always have \015 with it)
+$message =~ s/(\015)?(\012|$)/\015\012/g;
+
+## Replace bare CR's with CRLF's (\015 should always have \012 with it)
+$message =~ s/(\015)(\012|$)?/\015\012/g;
+
+## Check message for bare periods and encode them
+$message =~ s/(^|$CRLF)(\.{1})($CRLF|$)/$1.$2$3/g;
+
+## Get the current date for the email header
+my ($sec,$min,$hour,$mday,$mon,$year,$day) = gmtime();
+$year += 1900; $mon = return_month($mon); $day = return_day($day);
+my $date = sprintf("%s, %s %s %d %.2d:%.2d:%.2d %s",$day, $mday, $mon, $year, $hour, $min, $sec, $conf{'timezone'});
+
+
+
+
+##################################
+##  Connect to the SMTP server  ##
+##################################
+printmsg("DEBUG => Connecting to $conf{'server'}:$conf{'port'}", 1);
+$SIG{'ALRM'} = sub { 
+    printmsg("ERROR => Timeout while connecting to $conf{'server'}:$conf{'port'}  There was no response after $conf{'alarm'} seconds.", 0); 
+    printmsg("HINT => Try specifying a different mail relay with the -s option.", 1);
+    quit("", 1);
+};
+alarm($conf{'alarm'}) if ($^O !~ /win/i);  ## alarm() doesn't work in win32;
+$SERVER = IO::Socket::INET->new( PeerAddr  => $conf{'server'},
+                                 PeerPort  => $conf{'port'},
+                                 LocalAddr => $conf{'bindaddr'},
+                                 Proto     => 'tcp',
+                                 Autoflush => 1,
+                                 timeout   => $conf{'alarm'},
+);
+alarm(0) if ($^O !~ /win/i);  ## alarm() doesn't work in win32;
+
+## Make sure we got connected
+if ( (!$SERVER) or (!$SERVER->opened()) ) {
+    printmsg("ERROR => Connection attempt to $conf{'server'}:$conf{'port'} failed: $@", 0);
+    printmsg("HINT => Try specifying a different mail relay with the -s option.", 1);
+    quit("", 1);
+}
+
+## Save our IP address for later
+$conf{'ip'} = $SERVER->sockhost();
+printmsg("DEBUG => My IP address is: $conf{'ip'}", 1);
+
+
+
+
+
+
+
+#########################
+##  Do the SMTP Dance  ##
+#########################
+
+## Read initial greeting to make sure we're talking to a live SMTP server
+if (SMTPchat()) { quit($conf{'error'}, 1); }
+
+## We're about to use $opt{'fqdn'}, make sure it isn't empty
+if (!$opt{'fqdn'}) {
+    ## Ok, that means we couldn't get a hostname, how about using the IP address for the HELO instead
+    $opt{'fqdn'} = "[" . $conf{'ip'} . "]";
+}
+
+## EHLO
+if (SMTPchat('EHLO ' . $opt{'fqdn'}))   {
+    printmsg($conf{'error'}, 0);
+    printmsg("NOTICE => EHLO command failed, attempting HELO instead");
+    if (SMTPchat('HELO ' . $opt{'fqdn'})) { quit($conf{'error'}, 1); }
+    if ( $opt{'username'} and $opt{'password'} ) {
+        printmsg("WARNING => The mail server does not support SMTP authentication!", 0);
+    }
+}
+else {
+    
+    ## Determin if the server supports TLS
+    if ($conf{'SMTPchat_response'} =~ /STARTTLS/) {
+        $conf{'tls_server'} = 1;
+        printmsg("DEBUG => The remote SMTP server supports TLS :)", 2);
+    }
+    else {
+        $conf{'tls_server'} = 0;
+        printmsg("DEBUG => The remote SMTP server does NOT support TLS :(", 2);
+    }
+    
+    ## Start TLS if possible
+    if ($conf{'tls_server'} == 1 and $conf{'tls_client'} == 1 and $opt{'tls'} =~ /^(yes|auto)$/) {
+        printmsg("DEBUG => Starting TLS", 2);
+        if (SMTPchat('STARTTLS')) { quit($conf{'error'}, 1); }
+        if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv23:!SSLv3:!SSLv2', , SSL_verify_mode => 0)) {
+            quit("ERROR => TLS setup failed: " . IO::Socket::SSL::errstr(), 1);
+        }
+        printmsg("DEBUG => TLS: Using cipher: ". $SERVER->get_cipher(), 3);
+        printmsg("DEBUG => TLS session initialized :)", 1);
+        
+        ## Restart our SMTP session
+        if (SMTPchat('EHLO ' . $opt{'fqdn'})) { quit($conf{'error'}, 1); }
+    }
+    elsif ($opt{'tls'} eq 'yes' and $conf{'tls_server'} == 0) {
+        quit("ERROR => TLS not possible! Remote SMTP server, $conf{'server'},  does not support it.", 1);
+    }
+    
+    
+    ## Do SMTP Auth if required
+    if ( $opt{'username'} and $opt{'password'} ) {
+        if ($conf{'SMTPchat_response'} !~ /AUTH\s/) {
+            printmsg("NOTICE => Authentication not supported by the remote SMTP server!", 0);
+        }
+        else {
+            my $auth_succeeded = 0;
+            my $mutual_method = 0;
+            
+            # ## SASL CRAM-MD5 authentication method
+            # if ($conf{'SMTPchat_response'} =~ /\bCRAM-MD5\b/i) {
+            #     printmsg("DEBUG => SMTP-AUTH: Using CRAM-MD5 authentication method", 1);
+            #     if (SMTPchat('AUTH CRAM-MD5')) { quit($conf{'error'}, 1); }
+            #     
+            #     ## FIXME!!
+            #     
+            #     printmsg("DEBUG => User authentication was successful", 1);
+            # }
+            
+            ## SASL LOGIN authentication method
+            if ($auth_succeeded == 0 and $conf{'SMTPchat_response'} =~ /\bLOGIN\b/i) {
+                $mutual_method = 1;
+                printmsg("DEBUG => SMTP-AUTH: Using LOGIN authentication method", 1);
+                if (!SMTPchat('AUTH LOGIN')) {
+                    if (!SMTPchat(base64_encode($opt{'username'}))) {
+                        if (!SMTPchat(base64_encode($opt{'password'}))) {
+                            $auth_succeeded = 1;
+                            printmsg("DEBUG => User authentication was successful (Method: LOGIN)", 1);
+                        }
+                    }
+                }
+                if ($auth_succeeded == 0) {
+                    printmsg("DEBUG => SMTP-AUTH: LOGIN authenticaion failed.", 1);
+                }
+            }
+            
+            ## SASL PLAIN authentication method
+            if ($auth_succeeded == 0 and $conf{'SMTPchat_response'} =~ /\bPLAIN\b/i) {
+                $mutual_method = 1;
+                printmsg("DEBUG => SMTP-AUTH: Using PLAIN authentication method", 1);
+                if (SMTPchat('AUTH PLAIN ' . base64_encode("$opt{'username'}\0$opt{'username'}\0$opt{'password'}"))) {
+                    printmsg("DEBUG => SMTP-AUTH: PLAIN authenticaion failed.", 1);
+                }
+                else {
+                    $auth_succeeded = 1;
+                    printmsg("DEBUG => User authentication was successful (Method: PLAIN)", 1);
+                }
+            }
+            
+            ## If none of the authentication methods supported by sendEmail were supported by the server, let the user know
+            if ($mutual_method == 0) {
+                printmsg("WARNING => SMTP-AUTH: No mutually supported authentication methods available", 0);
+            }
+            
+            ## If we didn't get authenticated, log an error message and exit
+            if ($auth_succeeded == 0) {
+                quit("ERROR => ERROR => SMTP-AUTH: Authentication to $conf{'server'}:$conf{'port'} failed.", 1);
+            }
+        }
+    }
+}
+
+## MAIL FROM
+if (SMTPchat('MAIL FROM:<' .(returnAddressParts($from))[1]. '>')) { quit($conf{'error'}, 1); }
+
+## RCPT TO
+my $oneRcptAccepted = 0;
+foreach my $rcpt (@to, @cc, @bcc) {
+    my ($name, $address) = returnAddressParts($rcpt);
+    if (SMTPchat('RCPT TO:<' . $address . '>')) {
+        printmsg("WARNING => The recipient <$address> was rejected by the mail server, error follows:", 0);
+        $conf{'error'} =~ s/^ERROR/WARNING/o;
+        printmsg($conf{'error'}, 0);
+    }
+    elsif ($oneRcptAccepted == 0) {
+        $oneRcptAccepted = 1;
+    }
+}
+## If no recipients were accepted we need to exit with an error.
+if ($oneRcptAccepted == 0) {
+    quit("ERROR => Exiting. No recipients were accepted for delivery by the mail server.", 1);
+}
+
+## DATA
+if (SMTPchat('DATA')) { quit($conf{'error'}, 1); }
+
+
+###############################
+##  Build and send the body  ##
+###############################
+printmsg("INFO => Sending message body",1);
+
+## If the message-format is raw just send the message as-is.
+if ($opt{'message-format'} =~ /^raw$/i) {
+    print $SERVER $message;
+}
+
+## If the message-format isn't raw, then build and send the message,
+else {
+    
+    ## Message-ID: <MessageID>
+    if ($opt{'message-header'} !~ /^Message-ID:/iom) {
+        $header .= 'Message-ID: <' . $conf{'Message-ID'} . '@' . $conf{'hostname'} . '>' . $CRLF;
+    }
+    
+    ## From: "Name" <address@domain.com> (the pointless test below is just to keep scoping correct)
+    if ($from and $opt{'message-header'} !~ /^From:/iom) {
+        my ($name, $address) = returnAddressParts($from);
+        $header .= 'From: "' . $name . '" <' . $address . '>' . $CRLF;
+    }
+    
+    ## Reply-To: 
+    if ($opt{'reply-to'} and $opt{'message-header'} !~ /^Reply-To:/iom) {
+        my ($name, $address) = returnAddressParts($opt{'reply-to'});
+        $header .= 'Reply-To: "' . $name . '" <' . $address . '>' . $CRLF;
+    }
+    
+    ## To: "Name" <address@domain.com>
+    if ($opt{'message-header'} =~ /^To:/iom) {
+        ## The user put the To: header in via -o message-header - dont do anything
+    }
+    elsif (scalar(@to) > 0) {
+        $header .= "To:";
+        for (my $a = 0; $a < scalar(@to); $a++) {
+            my $msg = "";
+            
+            my ($name, $address) = returnAddressParts($to[$a]);
+            $msg = " \"$name\" <$address>";
+            
+            ## If we're not on the last address add a comma to the end of the line.
+            if (($a + 1) != scalar(@to)) {
+                $msg .= ",";
+            }
+            
+            $header .= $msg . $CRLF;
+        }
+    }
+    ## We always want a To: line so if the only recipients were bcc'd they don't see who it was sent to
+    else {
+        $header .= "To: \"Undisclosed Recipients\" <>$CRLF";
+    }
+    
+    if (scalar(@cc) > 0 and $opt{'message-header'} !~ /^Cc:/iom) {
+        $header .= "Cc:";
+        for (my $a = 0; $a < scalar(@cc); $a++) {
+            my $msg = "";
+            
+            my ($name, $address) = returnAddressParts($cc[$a]);
+            $msg = " \"$name\" <$address>";
+            
+            ## If we're not on the last address add a comma to the end of the line.
+            if (($a + 1) != scalar(@cc)) {
+                $msg .= ",";
+            }
+            
+            $header .= $msg . $CRLF;
+        }
+    }
+    
+    if ($opt{'message-header'} !~ /^Subject:/iom) {
+        $header .= 'Subject: ' . $subject . $CRLF;                   ## Subject
+    }
+    if ($opt{'message-header'} !~ /^Date:/iom) {
+        $header .= 'Date: ' . $date . $CRLF;                         ## Date
+    }
+    if ($opt{'message-header'} !~ /^X-Mailer:/iom) {
+        $header .= 'X-Mailer: sendEmail-'.$conf{'version'}.$CRLF;    ## X-Mailer
+    }
+    ## I wonder if I should put this in by default?
+    # if ($opt{'message-header'} !~ /^X-Originating-IP:/iom) {
+    #     $header .= 'X-Originating-IP: ['.$conf{'ip'}.']'.$CRLF;      ## X-Originating-IP
+    # }
+    
+    ## Encode all messages with MIME.
+    if ($opt{'message-header'} !~ /^MIME-Version:/iom) {
+        $header .=  "MIME-Version: 1.0$CRLF";
+    }
+    if ($opt{'message-header'} !~ /^Content-Type:/iom) {
+        my $content_type = 'multipart/mixed';
+        if (scalar(@attachments) == 0) { $content_type = 'multipart/related'; }
+        $header .= "Content-Type: $content_type; boundary=\"$conf{'delimiter'}\"$CRLF";
+    }
+    
+    ## Send additional message header line(s) if specified
+    if ($opt{'message-header'}) {
+        $header .= $opt{'message-header'};
+    }
+    
+    ## Send the message header to the server
+    print $SERVER $header . $CRLF;
+    
+    ## Start sending the message body to the server
+    print $SERVER "This is a multi-part message in MIME format. To properly display this message you need a MIME-Version 1.0 compliant Email program.$CRLF";
+    print $SERVER "$CRLF";
+    
+    
+    ## Send message body
+    print $SERVER "--$conf{'delimiter'}$CRLF";
+    ## Send a message content-type header:
+    ## If the message contains HTML...
+    if ($opt{'message-content-type'} eq 'html' or ($opt{'message-content-type'} eq 'auto' and $message =~ /^\s*(<HTML|<!DOCTYPE)/i) ) {
+        printmsg("Setting content-type: text/html", 1);
+        print $SERVER "Content-Type: text/html;$CRLF";
+    }
+    ## Otherwise assume it's plain text...
+    elsif ($opt{'message-content-type'} eq 'text' or $opt{'message-content-type'} eq 'auto') {
+        printmsg("Setting content-type: text/plain", 1);
+        print $SERVER "Content-Type: text/plain;$CRLF";
+    }
+    ## If they've specified their own content-type string...
+    else {
+        printmsg("Setting custom content-type: ".$opt{'message-content-type'}, 1);
+        print $SERVER "Content-Type: ".$opt{'message-content-type'}.";$CRLF";
+    }
+    print $SERVER "        charset=\"" . $opt{'message-charset'} . "\"$CRLF";
+    print $SERVER "Content-Transfer-Encoding: 7bit$CRLF";
+    print $SERVER $CRLF . $message;
+    
+    
+    
+    ## Send Attachemnts
+    if (scalar(@attachments) > 0) {
+        ## Disable the alarm so people on modems can send big attachments
+        alarm(0) if ($^O !~ /win/i);  ## alarm() doesn't work in win32
+        
+        ## Send the attachments
+        foreach my $filename (@attachments) {
+            ## This is check 2, we already checked this above, but just in case...
+            if ( ! -f $filename ) {
+                printmsg("ERROR => The file [$filename] doesn't exist!  Email will be sent, but without that attachment.", 0);
+            }
+            elsif ( ! -r $filename ) {
+                printmsg("ERROR => Couldn't open the file [$filename] for reading: $!   Email will be sent, but without that attachment.", 0);
+            }
+            else {
+                printmsg("DEBUG => Sending the attachment [$filename]", 1);
+                send_attachment($filename);
+            }
+        }
+    }
+    
+    
+    ## End the mime encoded message
+    print $SERVER "$CRLF--$conf{'delimiter'}--$CRLF";  
+}
+
+
+## Tell the server we are done sending the email
+print $SERVER "$CRLF.$CRLF";
+if (SMTPchat()) { quit($conf{'error'}, 1); }
+
+
+
+####################
+#  We are done!!!  #
+####################
+
+## Disconnect from the server (don't SMTPchat(), it breaks when using TLS)
+print $SERVER "QUIT$CRLF";
+close $SERVER;
+
+
+
+
+
+
+#######################################
+##  Generate exit message/log entry  ##
+#######################################
+
+if ($conf{'debug'} or $conf{'logging'}) {
+    printmsg("Generating a detailed exit message", 3);
+    
+    ## Put the message together
+    my $output = "Email was sent successfully!  From: <" . (returnAddressParts($from))[1] . "> ";
+    
+    if (scalar(@to) > 0) {
+        $output .= "To: ";
+        for ($a = 0; $a < scalar(@to); $a++) {
+            $output .= "<" . (returnAddressParts($to[$a]))[1] . "> ";
+        }
+    }
+    if (scalar(@cc) > 0) {
+        $output .= "Cc: ";
+        for ($a = 0; $a < scalar(@cc); $a++) {
+            $output .= "<" . (returnAddressParts($cc[$a]))[1] . "> ";
+        }
+    }
+    if (scalar(@bcc) > 0) {
+        $output .= "Bcc: ";
+        for ($a = 0; $a < scalar(@bcc); $a++) {
+            $output .= "<" . (returnAddressParts($bcc[$a]))[1] . "> ";
+        }
+    }
+    $output .= "Subject: [$subject] " if ($subject);
+    if (scalar(@attachments_names) > 0) { 
+        $output .= "Attachment(s): ";
+        foreach(@attachments_names) {
+            $output .= "[$_] ";
+        }
+    }
+    $output .= "Server: [$conf{'server'}:$conf{'port'}]";
+    
+    
+######################
+#  Exit the program  #
+######################
+    
+    ## Print / Log the detailed message
+    quit($output, 0);
+}
+else {
+    ## Or the standard message
+    quit("Email was sent successfully!", 0);
+}
+
index 3162099..5e61cd2 100644 (file)
@@ -8,13 +8,14 @@
     <meta content="no-cache" http-equiv="Pragma" />
     <meta content="0" http-equiv="Expires" />
     <link rel="stylesheet" href="[% abspath %][% staticpath %]css/w3pro.css">
+    <link rel="stylesheet" href="[% abspath %][% staticpath %]vendor/fmicons/icons.css">
     <title>Invoice Journal</title>
 </head>
 
 <body>
     <div class="w3-top">
     <div class="w3-bar w3-white w3-large" style="z-index:4">
-        <button class="w3-bar-item w3-button w3-hide-large w3-hover-none w3-hover-text-light-grey" onclick="w3_open();" id="btnsidemenu"><img src="[% abspath %][% staticpath %]img/icons/menu.svg" style="height: 33px;"/></button>
+        <button class="w3-bar-item w3-button w3-hide-large w3-hover-none w3-hover-text-light-grey" onclick="w3_open();" id="btnsidemenu"><img src="[% abspath %][% staticpath %]img/icons/menu.svg" style="height: 24px;"/></button>
         <span class="w3-bar-item">Invoice Journal</span>
         <span class="w3-bar-item w3-right" id="modulename"></span>
     </div>
@@ -28,7 +29,7 @@
             <a class="w3-bar-item w3-button w3-padding" href="javascript:admin.loadpage('module/invoicejournal/index.html','Journal');">Journal</a>
             <a class="w3-bar-item w3-button w3-padding" href="javascript:admin.loadpage('module/sales/index.html','Verkäufe');">Buchungen</a>
             <!-- <a href="javascript:admin.loadpage('module/invoices/index.html','Rechnungs-Erstellung');" class="w3-bar-item w3-button">Rechnungs-Erstellung</a> -->
-            <a class="w3-bar-item w3-button w3-padding" href="javascript:admin.loadpage('module/accounts/index.html','Adressen');">Addressen</a>
+            <a class="w3-bar-item w3-button w3-padding" href="javascript:admin.loadpage('module/accounts/index.html','Adressen');"><i class="icon-Adress_book_02"></i> Addressen</a>
             <a class="w3-bar-item w3-button w3-padding" href="javascript:admin.loadpage('module/bankaccount/index.html','Bankkonto');">Bankkonto</a>
             <!-- <a href="javascript:admin.loadpage('module/documents/index.html','Dokumente');" class="w3-bar-item w3-button">Dokumente</a> -->
             <a class="w3-bar-item w3-button w3-padding" href="javascript:admin.loadpage('module/offers/index.html','Angebote');">Angebote</a>
diff --git a/CGI/tmpl/app/invoicejournal/module/accounts/accounts.js b/CGI/tmpl/app/invoicejournal/module/accounts/accounts.js
new file mode 100644 (file)
index 0000000..c983eed
--- /dev/null
@@ -0,0 +1,41 @@
+var accounts ={
+  tbl: null,
+  name: "accounts",
+  initform: function(){
+
+  },
+  inittable: function(){
+    accounts.tbl = new Tabulator("#tbl_" + accounts.name, {
+      headerFilterPlaceholder:"filter...",
+      height: "100vh",
+      layout:"fitDataFill",
+      selectable:1,
+      responsiveLayout:"collapse",
+      columns:[
+      {title:"K.Nr", field:"ident",headerFilter:"input"},
+      {title:"Name", field:"company",headerFilter:"input"},
+      {title:"E-Mail", field:"email",headerFilter:"input"},
+      {title:"Tel", field:"phone",headerFilter:"input"},
+      {title:"Addresse", field:"address",headerFilter:"input"},
+      ],
+  });
+    accounts.gettbldata();
+  },
+  gettbldata: function(){
+    req.reqdata("POST","db.cgi",{"db":mpref.cfg.db,"type":"array","sql":"SELECT id, company, prename,surname, address, zip, city, country, email, phone, mobile, ident FROM accounts;"},accounts.loadtbldata);
+  },
+  loadtbldata: function(data){
+    if (data && data.sqldata){
+      accounts.tbl.setData(data.sqldata);
+    }
+  },
+  add: function(){
+    
+  },
+  edit: function(){
+
+  },
+  remove: function(){
+
+  }
+}
\ No newline at end of file
index 1281a47..f70412f 100644 (file)
@@ -7,29 +7,15 @@ function initpage(){
 }
 
 function loadtable(){
-  tbl = new Tabulator("#maintbl", {
-    headerFilterPlaceholder:"filter...",
-    height: "100vh",
-    layout:"fitDataFill",
-    selectable:1,
-    responsiveLayout:"collapse",
-    columns:[
-    {title:"K.Nr", field:"ident",headerFilter:"input"},
-    {title:"Name", field:"company",headerFilter:"input"},
-    {title:"E-Mail", field:"email",headerFilter:"input"},
-    {title:"Tel", field:"phone",headerFilter:"input"},
-    {title:"Addresse", field:"address",headerFilter:"input"},
-    ],
-});
-  gettbldata();
+  
 }
 
 function gettbldata(){
-  req.reqdata("POST","db.cgi",{"db":mpref.cfg.db,"type":"array","sql":"SELECT id, company, prename,surname, address, zip, city, country, email, phone, mobile, ident FROM accounts;"},filltbldata);
+  
 }
 
 function filltbldata(data){
-  if (data && data.sqldata){
-    tbl.setData(data.sqldata);
-  }
+  
 }
+
+
index fa2b50a..001ff9c 100644 (file)
@@ -1,6 +1,6 @@
 
     <div class="w3-display-container">
     <!-- PAGE DATA START-->
-    <div id="maintbl"></div>
+    <div id="tbl_Accounts"></div>
     <!-- PAGE DATA END -->
     </div>
index 1d4a6a1..dff50ba 100644 (file)
@@ -139,4 +139,5 @@ function parsestatement(data){
   //   }
   }
   return false;
-}
\ No newline at end of file
+}
+
diff --git a/CGI/tmpl/app/invoicejournal/module/bankaccount/transactions.js b/CGI/tmpl/app/invoicejournal/module/bankaccount/transactions.js
new file mode 100644 (file)
index 0000000..a0bbb64
--- /dev/null
@@ -0,0 +1,23 @@
+var transactions = {
+  name: "transactions",
+  tbl: null,
+  initform: function(){
+
+  },
+  inittable: function(){
+
+  },
+  add: function(){
+
+  },
+  edit: function(){
+
+  },
+  remove: function(){
+
+  },
+  afterremove: function(){
+    
+  }
+
+}
\ No newline at end of file
index 08f5ae9..70cfabc 100644 (file)
-var booking = {
-  name: "booking",
+var bookings = {
+  name: "bookings",
+  tbl: null,
+  choices: {},
   initform: function(){
 
   },
   inittable: function(){
-
+    bookings.tbl = new Tabulator("#tbl_" + bookings.name, {
+      height: "80vh",
+      layout: "fitColumns",
+      selectable: 1,
+      columns: [
+          { title: "Beschreibung", field: "description", formatter: "textarea", width: "400" },
+          {
+              title: "Anz.",
+              field: "quantity",
+              align: "right",
+              formatter: "money",
+              formatterParams: {
+                  decimal: ",",
+                  thousand: ".",
+                  symbol: "",
+                  symbolAfter: "p",
+                  precision: 0,
+              }
+          },
+          { title: "Einheit", field: "unit" },
+          {
+              title: "Einzel",
+              field: "unitamount",
+              align: "right",
+              formatter: "money",
+              formatterParams: {
+                  decimal: ",",
+                  thousand: ".",
+                  symbol: "€",
+                  symbolAfter: "p",
+                  precision: 2,
+              }
+          },
+          {
+              title: "Netto",
+              field: "netamount",
+              align: "right",
+              formatter: "money",
+              formatterParams: {
+                  decimal: ",",
+                  thousand: ".",
+                  symbol: "€",
+                  symbolAfter: "p",
+                  precision: 2,
+              },
+              download: false
+          },
+          {
+              title: "MwSt.",
+              field: "taxamount",
+              align: "right",
+              formatter: "money",
+              formatterParams: {
+                  decimal: ",",
+                  thousand: ".",
+                  symbol: "€",
+                  symbolAfter: "p",
+                  precision: 2,
+              },
+              download: false
+          }
+      ]
+  });
+  return false;
   },
   gettbldata: function(){
-
+    var udata = invoices.tbl.getSelectedData();
+    if (udata[0]) {
+        //console.log(udata[0]);
+        req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "bookingslist", "filter": "id_invoice=" + udata[0].id }, bookings.loadtbldata);
+    }
+    return false;
   },
   loadtbldata: function(data){
-
+    if (data && data.sqldata) {
+      bookings.tbl.setData(data.sqldata);
+    }
+    bookings.tbl.redraw(true);
+    return false;
   },
   add: function(){
-
+    cleanform("bookings");
+    module.viewdialog("bookings");
   },
   edit: function(){
-
+    cleanform("bookings");
+    var udata = bookings.tbl.getSelectedData();
+    if (udata[0]) {
+        req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "bookings", "filter": "id=" + udata[0].id }, bookings.fillform);
+    }
+  },
+  fillform: function(data){
+    if (data && data.sqldata) {
+      fillformbydataclass("bookings", data.sqldata[0],bookings.choices, false);
+      module.viewdialog("bookings");
+    }
   },
-  savebooking: function(){
+  save: function(){
 
   },
-  afterbookingsaved: function(data){
+  aftersaved: function(data){
 
   }
 }
\ No newline at end of file
index 8144852..6eb4fec 100644 (file)
-var tbl = null;
-var tblproducts = null;
-var tblfiles = null;
-var currentinvoice = null;
-var statustypes = [{ "value": "planned", "label": "geplant" },
-    { "value": "sended", "label": "verschickt" },
-    { "value": "received", "label": "erhalten" },
-    { "value": "payed", "label": "bezahlt" },
-    { "value": "overdue", "label": "überfällig" }
-];
-var currenttemplate = { "base": null, "elements": null };
-var statuslang = { "planned": "geplant", "payed": "bezahlt", "received": "erhalten", "overdue": "überfällig", "sended": "verschickt" };
-var quarters = [{ "value": "Q1", "label": "Q1" }, { "value": "Q2", "label": "Q2" }, { "value": "Q3", "label": "Q3" }, { "value": "Q4", "label": "Q4" }];
-var invoicetypes = [{ "value": "inv-out", "label": "Ausgangs-Rechnung" }, { "value": "inv-in", "label": "Eingangs-Rechnung" }, { "value": "crn-out", "label": "Ausgangs-Gutschrift" }, { "value": "crn-in", "label": "Eingangs-Gutschrift" }];
-
-// var templates = [{ "value": "dks-deutsch", "label": "DKS - Deutsch" }, { "value": "dks-french", "label": "DKS  Französisch" }, { "value": "dks-english", "label": "DKS - english" }];
-
-var choice = {
-    "invoices": {
-        "status": null,
-        "id_receipient": null,
-        "id_sender": null,
-        "bquarter": null,
-        "byear": null,
-        "invoicetype": null,
-        "id_template": null
-    }
-};
-
-var choicedata = {
-    "invoices": {
-        "status": { "data": statustypes },
-        "id_receipient": { "view": "receipients" },
-        "id_sender": { "view": "receipients" },
-        "bquarter": { "view": "quarters" },
-        "byear": { "view": "businessyears" },
-        "invoicetype": { "data": invoicetypes },
-        "id_template": { "view": "templates" }
-    }
-};
+// var tbl = null;
+// var tblproducts = null;
+// var tblfiles = null;
+// var currentinvoice = null;
+
+
+// var choice = {
+//     "invoices": {
+//         "status": null,
+//         "id_receipient": null,
+//         "id_sender": null,
+//         "bquarter": null,
+//         "byear": null,
+//         "invoicetype": null,
+//         "id_template": null
+//     }
+// };
+
+// var choicedata = {
+//     "invoices": {
+//         "status": { "data": statustypes },
+//         "id_receipient": { "view": "receipients" },
+//         "id_sender": { "view": "receipients" },
+//         "bquarter": { "view": "quarters" },
+//         "byear": { "view": "businessyears" },
+//         "invoicetype": { "data": invoicetypes },
+//         "id_template": { "view": templates }
+//     }
+// };
 
 function initpage() {
+    console.log(mpref.cfg);
+    console.log("APP:" + parent.app);
+    mpref.loadconfig();
+    invoices.inittable();
+    bookings.inittable();
+    invoices.initform();
     //console.log(mpref.cfg);
     //console.log("APP:" + parent.app);
-    flatpickr(".datefield", {
-        altInput: true,
-        altFormat: "d.m.Y",
-        dateFormat: "Y-m-d",
-        allowInput: true,
-        "locale": "de",
-    });
-
-
-    fillchoices();
-    journal.inittable();
-    inittblbookings();
-    inittblfiles();
+    
     return false;
 }
 
-function inittblinvoices() {
-    tbl = new Tabulator("#tbl_invoices", {
-        headerFilterPlaceholder: "filter...",
-        height: "92vh",
-        layout: "fitData",
-        selectable: 1,
-        // responsiveLayout:"collapse",
-        columns: [
-            { title: "Quartal", field: "bquarter", headerFilter: "input" },
-            {
-                title: "Datum",
-                field: "invoicedate",
-                formatter: "datetime",
-                formatterParams: {
-                    inputFormat: "YYYY-MM-DD",
-                    outputFormat: "DD.MM.YYYY",
-                    invalidPlaceholder: ""
-                }
-            },
-            { title: "Empfänger", field: "receipient", headerFilter: "input", width: 200 },
-            { title: "Sender", field: "sender", headerFilter: "input" },
-            { title: "Referenz", field: "reference", headerFilter: "input" },
-            {
-                title: "Status",
-                field: "status",
-                headerFilter: "input",
-                formatter: function(cell, formatterParams) {
-                    var value = cell.getValue();
-                    //console.log(value.indexOf("bez"));
-                    if (value.indexOf("payed") >= 0) {
-                        return "<span style='color:green;'>" + statuslang[value] + "</span>";
-                    } else if (value.indexOf("overdue") >= 0) {
-                        return "<span style='color:red; font-weight: bold;'>" + statuslang[value] + "</span>";
-                    } else if (value.indexOf("planned") >= 0) {
-                        return "<span style='color:grey;'>" + statuslang[value] + "</span>";
-                    } else {
-                        return "<span style='color:orange;'>" + statuslang[value] + "</span>";
-                    }
-                }
-            },
-            {
-                title: "Netto",
-                field: "netamount",
-                align: "right",
-                formatter: "money",
-                formatterParams: {
-                    decimal: ",",
-                    thousand: ".",
-                    symbol: "€",
-                    symbolAfter: "p",
-                    precision: 2,
-                }
-            },
-            {
-                title: "MwSt",
-                field: "vatamount",
-                align: "right",
-                formatter: "money",
-                formatterParams: {
-                    decimal: ",",
-                    thousand: ".",
-                    symbol: "€",
-                    symbolAfter: "p",
-                    precision: 2,
-                }
-            }, {
-                title: "Brutto",
-                field: "grossamount",
-                align: "right",
-                formatter: "money",
-                formatterParams: {
-                    decimal: ",",
-                    thousand: ".",
-                    symbol: "€",
-                    symbolAfter: "p",
-                    precision: 2,
-                }
-            }, {
-                title: "Bezahlt",
-                field: "payedamount",
-                align: "right",
-                formatter: "money",
-                formatterParams: {
-                    decimal: ",",
-                    thousand: ".",
-                    symbol: "€",
-                    symbolAfter: "p",
-                    precision: 2,
-                }
-            }
-        ]
-    });
-    gettbldata();
-}
+// function inittblinvoices() {
+//     tbl = new Tabulator("#tbl_invoices", {
+//         headerFilterPlaceholder: "filter...",
+//         height: "92vh",
+//         layout: "fitData",
+//         selectable: 1,
+//         // responsiveLayout:"collapse",
+//         columns: [
+//             { title: "Quartal", field: "bquarter", headerFilter: "input" },
+//             {
+//                 title: "Datum",
+//                 field: "invoicedate",
+//                 formatter: "datetime",
+//                 formatterParams: {
+//                     inputFormat: "YYYY-MM-DD",
+//                     outputFormat: "DD.MM.YYYY",
+//                     invalidPlaceholder: ""
+//                 }
+//             },
+//             { title: "Empfänger", field: "receipient", headerFilter: "input", width: 200 },
+//             { title: "Sender", field: "sender", headerFilter: "input" },
+//             { title: "Referenz", field: "reference", headerFilter: "input" },
+//             {
+//                 title: "Status",
+//                 field: "status",
+//                 headerFilter: "input",
+//                 formatter: function(cell, formatterParams) {
+//                     var value = cell.getValue();
+//                     //console.log(value.indexOf("bez"));
+//                     if (value.indexOf("payed") >= 0) {
+//                         return "<span style='color:green;'>" + statuslang[value] + "</span>";
+//                     } else if (value.indexOf("overdue") >= 0) {
+//                         return "<span style='color:red; font-weight: bold;'>" + statuslang[value] + "</span>";
+//                     } else if (value.indexOf("planned") >= 0) {
+//                         return "<span style='color:grey;'>" + statuslang[value] + "</span>";
+//                     } else {
+//                         return "<span style='color:orange;'>" + statuslang[value] + "</span>";
+//                     }
+//                 }
+//             },
+//             {
+//                 title: "Netto",
+//                 field: "netamount",
+//                 align: "right",
+//                 formatter: "money",
+//                 formatterParams: {
+//                     decimal: ",",
+//                     thousand: ".",
+//                     symbol: "€",
+//                     symbolAfter: "p",
+//                     precision: 2,
+//                 }
+//             },
+//             {
+//                 title: "MwSt",
+//                 field: "vatamount",
+//                 align: "right",
+//                 formatter: "money",
+//                 formatterParams: {
+//                     decimal: ",",
+//                     thousand: ".",
+//                     symbol: "€",
+//                     symbolAfter: "p",
+//                     precision: 2,
+//                 }
+//             }, {
+//                 title: "Brutto",
+//                 field: "grossamount",
+//                 align: "right",
+//                 formatter: "money",
+//                 formatterParams: {
+//                     decimal: ",",
+//                     thousand: ".",
+//                     symbol: "€",
+//                     symbolAfter: "p",
+//                     precision: 2,
+//                 }
+//             }, {
+//                 title: "Bezahlt",
+//                 field: "payedamount",
+//                 align: "right",
+//                 formatter: "money",
+//                 formatterParams: {
+//                     decimal: ",",
+//                     thousand: ".",
+//                     symbol: "€",
+//                     symbolAfter: "p",
+//                     precision: 2,
+//                 }
+//             }
+//         ]
+//     });
+//     gettbldata();
+// }
 
 function inittblfiles() {
     tblfiles = new Tabulator("#tbl_files", {
@@ -183,117 +166,8 @@ function loadtblfilesdata(data) {
     return false;
 }
 
-function inittblbookings() {
-    tblproducts = new Tabulator("#tbl_products", {
-        height: "80vh",
-        layout: "fitColumns",
-        selectable: 1,
-        columns: [
-            { title: "Beschreibung", field: "description", formatter: "textarea", width: "400" },
-            {
-                title: "Anz.",
-                field: "quantity",
-                align: "right",
-                formatter: "money",
-                formatterParams: {
-                    decimal: ",",
-                    thousand: ".",
-                    symbol: "",
-                    symbolAfter: "p",
-                    precision: 0,
-                }
-            },
-            { title: "Einheit", field: "unit" },
-            {
-                title: "Einzel",
-                field: "unitamount",
-                align: "right",
-                formatter: "money",
-                formatterParams: {
-                    decimal: ",",
-                    thousand: ".",
-                    symbol: "€",
-                    symbolAfter: "p",
-                    precision: 2,
-                }
-            },
-            {
-                title: "Netto",
-                field: "netamount",
-                align: "right",
-                formatter: "money",
-                formatterParams: {
-                    decimal: ",",
-                    thousand: ".",
-                    symbol: "€",
-                    symbolAfter: "p",
-                    precision: 2,
-                },
-                download: false
-            },
-            {
-                title: "MwSt.(%)",
-                field: "taxpercent",
-                align: "right",
-                formatter: "money",
-                formatterParams: {
-                    decimal: ",",
-                    thousand: ".",
-                    symbol: "%",
-                    symbolAfter: "p",
-                    precision: 2,
-                },
-                download: false
-            },
-            {
-                title: "MwSt.",
-                field: "taxamount",
-                align: "right",
-                formatter: "money",
-                formatterParams: {
-                    decimal: ",",
-                    thousand: ".",
-                    symbol: "€",
-                    symbolAfter: "p",
-                    precision: 2,
-                },
-                download: false
-            }
-        ]
-    });
-    return false;
-}
-
-function gettblbookingdata() {
-    var udata = tbl.getSelectedData();
-    if (udata[0]) {
-        //console.log(udata[0]);
-        req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "bookings", "filter": "id_invoice=" + udata[0].id }, loadtblbookingdata);
-    }
-    return false;
-}
 
-function loadtblbookingdata(data) {
-    //console.log(data);
-    if (data && data.sqldata) {
-        tblproducts.setData(data.sqldata);
-    }
-    tblproducts.redraw(true);
-    return false;
-}
 
-function gettbldata() {
-    req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "invoicelist" }, loadtbldata);
-    return false;
-}
-
-function loadtbldata(data) {
-    //console.log(data);
-    if (data && data.sqldata) {
-        tbl.setData(data.sqldata);
-    }
-    return false;
-}
 
 function edit() {
     var udata = tbl.getSelectedData();
@@ -399,85 +273,85 @@ function fillchoices() {
     return false;
 }
 
-function loadtab(tabname) {
-    var i;
-    var x = document.getElementsByClassName("tabpanel");
-    for (i = 0; i < x.length; i++) {
-        x[i].style.display = "none";
-    }
-    document.getElementById("tab_" + tabname).style.display = "block";
-    x = document.getElementsByClassName("tabbtn");
+// function loadtab(tabname) {
+//     var i;
+//     var x = document.getElementsByClassName("tabpanel");
+//     for (i = 0; i < x.length; i++) {
+//         x[i].style.display = "none";
+//     }
+//     document.getElementById("tab_" + tabname).style.display = "block";
+//     x = document.getElementsByClassName("tabbtn");
 
-    for (i = 0; i < x.length; i++) {
-        //console.log(x[i].classList);
-        x[i].classList.remove("w3-blue-grey");
-    }
-    document.getElementById("tabbtn_" + tabname).classList.add("w3-blue-grey");
-    x = document.getElementsByClassName("tabxbtn");
-    for (i = 0; i < x.length; i++) {
-        x[i].style.display = "none";
-    }
-    x = document.getElementsByClassName("tabbtn" + tabname);
-    for (i = 0; i < x.length; i++) {
-        x[i].style.display = "block";
-    }
-    return false;
-}
+//     for (i = 0; i < x.length; i++) {
+//         //console.log(x[i].classList);
+//         x[i].classList.remove("w3-blue-grey");
+//     }
+//     document.getElementById("tabbtn_" + tabname).classList.add("w3-blue-grey");
+//     x = document.getElementsByClassName("tabxbtn");
+//     for (i = 0; i < x.length; i++) {
+//         x[i].style.display = "none";
+//     }
+//     x = document.getElementsByClassName("tabbtn" + tabname);
+//     for (i = 0; i < x.length; i++) {
+//         x[i].style.display = "block";
+//     }
+//     return false;
+// }
 
 
 
-function geninvoice() {
-    req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "templates", "filter": "id=" + document.getElementById("id_template").value }, gettemplateelements);
-    return false;
-}
+// function geninvoice() {
+//     req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "templates", "filter": "id=" + document.getElementById("id_template").value }, gettemplateelements);
+//     return false;
+// }
 
-function gettemplateelements(data) {
-    if (data && data.sqldata) {
-        currenttemplate["base"] = data.sqldata[0];
-        req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "templateelements", "filter": "id_template=" + document.getElementById("id_template").value }, makepdf);
-    }
+// function gettemplateelements(data) {
+//     if (data && data.sqldata) {
+//         currenttemplate["base"] = data.sqldata[0];
+//         req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "templateelements", "filter": "id_template=" + document.getElementById("id_template").value }, makepdf);
+//     }
 
-}
+// }
 
-function makepdf(data) {
-    console.log(currentinvoice);
-    if (data && data.sqldata) {
-        currenttemplate["elements"] = data.sqldata;
-    }
-    console.log(currenttemplate);
+// function makepdf(data) {
+//     console.log(currentinvoice);
+//     if (data && data.sqldata) {
+//         currenttemplate["elements"] = data.sqldata;
+//     }
+//     console.log(currenttemplate);
 
-    var doc = new jsPDF({
-        orientation: currenttemplate.base.orientation,
-        unit: currenttemplate.base.unit,
-        format: "a4"
-    });
-    // for (var i in currenttemplate.elements) {
-    //     var cel = currenttemplate.elements[i];
-    //     // if (cel['etype'] == 'text') {
-    //     //     setpdftext(doc, cel);
-    //     // }
-    //     if (cel['etype'] == 'image') {
-    //         //doc.addImage(cel['edata'], cel['filetype'], cel['xpos'], cel['ypos'], cel['width'], cel['height'], undefined, 'none');
-    //         setpdfimage(doc, cel);
-    //     }
-    // }
-
-    for (var i in currenttemplate.elements) {
-        var cel = currenttemplate.elements[i];
-        if (cel['etype'] == 'text') {
-            console.log("add TEXT");
-            setpdftext(doc, cel);
-        }
-        if (cel['etype'] == 'image') {
-            console.log("add image");
-            setpdfimage(doc, cel);
-        }
-    }
-    // It can parse html:
-    //doc.autoTable({ html: '#tbl_products' });
-    doc.save(document.getElementById("reference").value + ".pdf");
-    return false;
-}
+//     var doc = new jsPDF({
+//         orientation: currenttemplate.base.orientation,
+//         unit: currenttemplate.base.unit,
+//         format: "a4"
+//     });
+//     // for (var i in currenttemplate.elements) {
+//     //     var cel = currenttemplate.elements[i];
+//     //     // if (cel['etype'] == 'text') {
+//     //     //     setpdftext(doc, cel);
+//     //     // }
+//     //     if (cel['etype'] == 'image') {
+//     //         //doc.addImage(cel['edata'], cel['filetype'], cel['xpos'], cel['ypos'], cel['width'], cel['height'], undefined, 'none');
+//     //         setpdfimage(doc, cel);
+//     //     }
+//     // }
+
+//     for (var i in currenttemplate.elements) {
+//         var cel = currenttemplate.elements[i];
+//         if (cel['etype'] == 'text') {
+//             console.log("add TEXT");
+//             setpdftext(doc, cel);
+//         }
+//         if (cel['etype'] == 'image') {
+//             console.log("add image");
+//             setpdfimage(doc, cel);
+//         }
+//     }
+//     // It can parse html:
+//     //doc.autoTable({ html: '#tbl_products' });
+//     doc.save(document.getElementById("reference").value + ".pdf");
+//     return false;
+// }
 
 // function makepdf(data) {
 //     console.log(currentinvoice);
@@ -528,40 +402,40 @@ function makepdf(data) {
 //     });
 // }
 
-function setpdftext(pdf, el) {
-    if (el['fontsize']) {
-        pdf.setFontSize(el['fontsize']);
-    }
-    const regex = /%%([\w]+)%%/gm;
-    var etext = el['edata'];
-    var m;
-    while ((m = regex.exec(etext)) !== null) {
-        // This is necessary to avoid infinite loops with zero-width matches
-        if (m.index === regex.lastIndex) {
-            regex.lastIndex++;
-        }
+// function setpdftext(pdf, el) {
+//     if (el['fontsize']) {
+//         pdf.setFontSize(el['fontsize']);
+//     }
+//     const regex = /%%([\w]+)%%/gm;
+//     var etext = el['edata'];
+//     var m;
+//     while ((m = regex.exec(etext)) !== null) {
+//         // This is necessary to avoid infinite loops with zero-width matches
+//         if (m.index === regex.lastIndex) {
+//             regex.lastIndex++;
+//         }
 
-        // The result can be accessed through the `m`-variable.
-        m.forEach((match, groupIndex) => {
-            //etext.replace('')
-            if (groupIndex == 1) {
-                if (document.getElementById(match)) {
-                    etext.replace('%%' + match + '%%', currentinvoice[match]);
-                }
+//         // The result can be accessed through the `m`-variable.
+//         m.forEach((match, groupIndex) => {
+//             //etext.replace('')
+//             if (groupIndex == 1) {
+//                 if (document.getElementById(match)) {
+//                     etext.replace('%%' + match + '%%', currentinvoice[match]);
+//                 }
 
-            }
-            //console.log(`Found match, group ${groupIndex}: ${match}`);
-        });
+//             }
+//             //console.log(`Found match, group ${groupIndex}: ${match}`);
+//         });
 
-    }
-    etext.replace(regex, '');
-    pdf.text(etext, el['xpos'], el['ypos']);
-    return false;
-}
+//     }
+//     etext.replace(regex, '');
+//     pdf.text(etext, el['xpos'], el['ypos']);
+//     return false;
+// }
 
-function setpdfimage(pdf, el) {
-    //console.log("ADD IMAGE");
-    //console.log(el);
-    pdf.addImage(el['edata'], el['filetype'], el['xpos'], el['ypos'], el['width'], el['height'], undefined, 'none');
-    return false;
-}
\ No newline at end of file
+// function setpdfimage(pdf, el) {
+//     //console.log("ADD IMAGE");
+//     //console.log(el);
+//     pdf.addImage(el['edata'], el['filetype'], el['xpos'], el['ypos'], el['width'], el['height'], undefined, 'none');
+//     return false;
+// }
\ No newline at end of file
index c584eb2..75aa661 100644 (file)
@@ -1,38 +1,35 @@
 [% PROCESS macro/fields.tt %]
 <div class="w3-top w3-border-bottom w3-white">
     <div class="w3-bar">
-        <button class="w3-bar-item w3-button w3-border w3-round w3-blue" onclick="viewtable();"> Journal</button>
-        <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-red invdata" onclick="invoice.genpdf();" style="display: none;"><i class="icon-pdf"></i></button>
-        <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-red invlist" onclick="remove();"><img src="[% abspath%][% staticpath %]img/icons/remove_white.svg" style="height: 24px;"/></button>
-        <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-blue invlist" onclick="edit();"><img src="[% abspath%][% staticpath %]img/icons/edit_white.svg" style="height: 24px;"/></button>
-        <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-blue invlist" onclick="add();"><img src="[% abspath%][% staticpath %]img/icons/plus_white.svg" style="height: 24px;"/></button>
-        <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-blue invdata" onclick="saveinvoice();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/Save.svg" style="height: 24px;"/></button>
+        <div class="toolbar" id="tbar_tbl_invoices">
+            <button class="w3-bar-item w3-button w3-border w3-blue-grey" onclick="module.viewpanel('tbl_invoices');"> Journal</button>
+            
+            <button class="w3-bar-item w3-button w3-border w3-right w3-red" onclick="invoices.remove();"><i class=" icon-Delete"></i></button>
+            <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="invoices.edit();"><i class=" icon-Edit"></i></button>
+            <button class="w3-bar-item w3-button w3-border w3-right w3-blue-gre" onclick="invoices.add();"><i class=" icon-Add"></i></button>
+        </div>
+        <div class="toolbar" id="tbar_frm_invoices" style="display: none;">
+            <button class="w3-bar-item w3-button w3-border w3-blue-grey" onclick="module.viewpanel('tbl_invoices');"> back</button>
+            
+            <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="invoice.genpdf();"><i class="icon-Printer"></i></button>
+            <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="invoices.save();"><i class=" icon-Save"></i></button>
+        </div>
     </div>
 </div>
-<div class="w3-display-container" id="tbl_invoices" style="margin-top: 50px;"></div>
-<div class="w3-display-container" id="pnl_invoices" style="display: none; margin-top: 50px;">
+<div class="w3-display-container panel" id="pnl_tbl_invoices" style="margin-top: 50px;">
+    <div id="tbl_invoices"></div>
+</div>
+<div class="w3-display-container panel" id="pnl_frm_invoices" style="display: none; margin-top: 50px;"></div>
+    
 
-    <div class="w3-top" style="margin-top: 43px;">
-        <div class="w3-bar w3-border-top w3-border-bottom tabbar w3-light-grey">
-            <button class="w3-bar-item w3-button tabbtn" id="tabbtn_details" onclick="loadtab('details');"><img src="[% abspath%][% staticpath %]img/icons/Bill.svg" style="height: 24px;"/> Allgemein</button>
-            <button class="w3-bar-item w3-button tabbtn" id="tabbtn_products" onclick="loadtab('products')"><img src="[% abspath%][% staticpath %]img/icons/package.svg" style="height: 24px;"/> Produkte</button>
-            <button class="w3-bar-item w3-button tabbtn" id="tabbtn_files" onclick="loadtab('files');"><img src="[% abspath%][% staticpath %]img/icons/file.svg" style="height: 24px;"/> Dateien</button>
-            <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-red tabxbtn tabbtnproducts" onclick="removeproduct();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/remove_white.svg" style="height: 24px;"/></button>
-            <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-blue tabxbtn tabbtnproducts" onclick="editproduct();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/edit_white.svg" style="height: 24px;"/></button>
-            <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-blue tabxbtn tabbtnproducts" onclick="addproduct();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/plus_white.svg" style="height: 24px;"/></button>
-            <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-red tabxbtn tabbtnfiles" onclick="removefile();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/remove_white.svg" style="height: 24px;"/></button>
-            <button class="w3-bar-item w3-button w3-border w3-round w3-right w3-blue tabxbtn tabbtnfiles" onclick="addfile();" style="display: none;"><img src="[% abspath%][% staticpath %]img/icons/plus_white.svg" style="height: 24px;"/></button>
-        </div>
-    </div>
-    <div class="w3-container tabpanel" id="tab_details" style="margin-top: 100px;">
+    <div class="w3-container" >
+        <form id="frm_invoices">
+        <div class="w3-container w3-threequarter">
         [% fieldhidden('id','invoices','ident') %]
         [% fieldhidden('address','invoices') %]
         <div class="w3-cell-row">
-            [% fieldselectbox('invoicetype','invoices','Typ','w3-half','') %] [% fieldselectbox('id_template','invoices','Vorlage','w3-half','') %]
-        </div>
-        <div class="w3-cell-row">
-            [% fieldselectbox('status','invoices','Status','w3-quarter','') %] [% fielddatebox('statusdate','invoices','Status-Datum','w3-quarter','readonly') %] [% fieldeditbox('statement','invoices','Kontoauszug','w3-quarter','') %] [% fieldselectbox('bquarter','invoices','G.Quartal','w3-quarter','')
-            %]
+            [% fieldselectbox('invoicetype','invoices','Typ','w3-half','') %] 
+            [% fieldselectbox('id_template','invoices','Vorlage','w3-half','') %]
         </div>
         <div class="w3-cell-row">
             [% fieldselectbox('id_receipient','invoices','Empfänger','w3-half','') %] [% fieldselectbox('id_sender','invoices','Sender','w3-half','') %] [% fieldeditbox('reference','invoices','Referenz','','') %]
             [% fielddatebox('invoicedate','invoices','Datum','w3-fifth','') %] [% fielddatebox('deadlinedate','invoices','Fälligkeit','w3-fifth','') %] [% fieldtagbox('reminderdates','invoices','Mahnungs-Daten','w3-threefifth','') %]
         </div>
         <div class="w3-cell-row">
-            [% fieldtextarea('headernote','invoices','Vorwort','','','200px','') %]
+            [% fieldtextarea('headernote','invoices','Vorwort','','','100px','') %]
         </div>
         <div class="w3-cell-row">
-            [% fieldtextarea('footernote','invoices','Nachwort','','','200px','') %]
+            [% fieldtextarea('footernote','invoices','Nachwort','','','100px','') %]
         </div>
+        </div>
+        <div class="w3-container w3-quarter">
+            [% fieldmoneybox('netamount','invoices','Netto','','readonly') %]
+                [% fieldmoneybox('vatamount','invoices','MwSt','','readonly') %] 
+                [% fieldmoneybox('grossamount','invoices','Brutto','','readonly') %] 
+                [% fieldmoneybox('payedamount','invoices','Bezahlt','','') %]
+                [% fieldselectbox('status','invoices','Status','','') %] 
+                [% fielddatebox('statusdate','invoices','Status-Datum','','readonly') %]
+                [% fieldeditbox('statement','invoices','Kontoauszug','','') %] 
+                [% fieldselectbox('bquarter','invoices','G.Quartal','','')%]
+        </div>
+        </form>
     </div>
-    <div class="w3-container tabpanel" id="tab_products" style="margin-top: 100px;display: none;">
-        <div id="tbl_products"></div>
-    </div>
-    <div class="w3-container tabpanel" id="tab_files" style="margin-top: 100px;display: none;">
-        <div id="tbl_files"></div>
+    <div class="w3-bar">
+        <button class="w3-bar-item w3-button w3-border w3-right w3-red" onclick="bookings.remove();" ><i class=" icon-Delete"></i></button>
+        <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="bookings.edit();" ><i class=" icon-Edit"></i></button>
+        <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="bookings.add();" ><i class=" icon-Add"></i></button>
     </div>
-    <div class="spacerx" style="height: 60px;"></div>
-    <div class="w3-bottom w3-border-bottom w3-light-grey">
-        <div class="w3-bar">
-            [% fieldmoneybox('netamount','invoices','Netto','w3-quarter','') %] [% fieldmoneybox('vatamount','invoices','MwSt','w3-quarter','') %] [% fieldmoneybox('grossamount','invoices','Brutto','w3-quarter','') %] [% fieldmoneybox('payedamount','invoices','Bezahlt','w3-quarter','')
-            %]
+    <div id="tbl_bookings"></div>
+    
+    
+    
+    
+    <!-- <div class="spacerx footer" style="height: 60px; display:none;"></div>
+        <div class="w3-bottom w3-border-bottom w3-light-grey footer" id="footerdata" style="display: none;">
+            <div class="w3-bar">
+                
+            </div>
+        </div> -->
+    
+</div>
+<div id="dlg_bookings" class="w3-modal">
+
+  <div class="w3-modal-content w3-animate-top w3-card-4">
+    <header class="w3-container"> 
+      <span onclick="document.getElementById('dlg_bookings').style.display='none'; return false;" 
+       class="w3-button w3-display-topright">&times;</span>
+      <h2>Produkt/Dienstleistung</h2>
+    </header>
+    <div class="w3-container">
+      <form id="frm_bookings">
+        [% fieldhidden('id_booking','bookings','ident') %]
+        [% fieldhidden('id_invoice','bookings','ident') %]
+        <div class="w3-cell-row">
+        [% fieldnumberbox('quantity','bookings','Anzahl','w3-quarter','') %]
+        [% fieldeditbox('unit','bookings','Einheit','w3-quarter','') %]
+        [% fieldmoneybox('unitamount','bookings','Einheitspreis','w3-quarter','') %]
         </div>
+        <div class="w3-cell-row">
+        [% fieldmoneybox('taxamount','bookings','MwSt','w3-quarter','') %]
+        [% fieldmoneybox('taxpercent','bookings','MwSt (%)','w3-quarter','') %]
+        [% fieldmoneybox('netamount','display','Netto','w3-quarter','readonly') %]
+        </div>
+        <div class="w3-cell-row">
+        [% fieldrichtextarea('description','bookings','Beschreibung','','','100px','') %]
+        </div>
+        
+      </form>
     </div>
+    <footer class="w3-container w3-right-align w3-padding-16">
+    <button class="w3-button w3-theme-light w3-margin-right w3-border" onclick="document.getElementById('dlg_bookings').style.display='none'; return false;">Abbrechern</button>  
+    <button class="w3-button w3-red w3-margin-right w3-border" onclick="bookings.save();">Speichern</button> 
+    </footer>
+  </div>
 </div>
+
 [% INCLUDE "block/dlgdataload.tt" %]
 [% INCLUDE "block/dlgdeleterow.tt" %]
 [% INCLUDE "block/dlgmessage.tt" %]
-<script src="panel/journal/journal.js"></script>
-<script src="panel/journal/invoice.js"></script>
-<script src="panel/journal/booking.js"></script>
\ No newline at end of file
+<script src="invoice.js"></script>
+<script src="booking.js"></script>
\ No newline at end of file
index 49b33cf..34359d4 100644 (file)
-var invoice = {
-  name: "invoice",
-  initform: function(){
+var statustypes = [{ "value": "planned", "label": "geplant" },
+    { "value": "sended", "label": "verschickt" },
+    { "value": "received", "label": "erhalten" },
+    { "value": "payed", "label": "bezahlt" },
+    { "value": "overdue", "label": "überfällig" }
+];
+// var currenttemplate = { "base": null, "elements": null };
+var statuslang = { "planned": "geplant", "payed": "bezahlt", "received": "erhalten", "overdue": "überfällig", "sended": "verschickt" };
+// var quarters = [{ "value": "Q1", "label": "Q1" }, { "value": "Q2", "label": "Q2" }, { "value": "Q3", "label": "Q3" }, { "value": "Q4", "label": "Q4" }];
+var invoicetypes = [{ "value": "inv-out", "label": "Ausgangs-Rechnung" }, { "value": "inv-in", "label": "Eingangs-Rechnung" }, { "value": "crn-out", "label": "Ausgangs-Gutschrift" }, { "value": "crn-in", "label": "Eingangs-Gutschrift" }];
+
+var templates = [{ "value": "dks-deutsch", "label": "DKS - Deutsch" }, { "value": "dks-french", "label": "DKS  Französisch" }, { "value": "dks-english", "label": "DKS - english" }];
 
+var invoices = {
+  name: "invoices",
+  current: null,
+  choices: {"status": null,"id_receipient": null,"id_sender": null,"bquarter": null,"invoicetype": null,"id_template": null},//"byear": null,
+  choicesdata: {
+        "status": { "data": statustypes },
+        "id_receipient": { "view": "receipients" },
+        "id_sender": { "view": "receipients" },
+        "bquarter": { "view": "quarters" },
+        // "byear": { "view": "businessyears" },
+        "invoicetype": { "data": invoicetypes },
+        "id_template": { "data": templates }
+  },
+  initform: function(){
+    flatpickr(".datefield", {
+      altInput: true,
+      altFormat: "d.m.Y",
+      dateFormat: "Y-m-d",
+      allowInput: true,
+      "locale": "de",
+    });
+    for (var c in invoices.choices) {
+      invoices.choices[c] = new Choices('#' + c, {
+              searchEnabled: false,
+              itemSelectText: '',
+              removeItemButton: true,
+              choices: ((invoices.choicesdata[c]['data']) ? invoices.choicesdata[c]['data'] : []),
+              shouldSort: false
+          });
+          if (invoices.choicesdata[c]['view']) {
+              //console.log("We have a view:" + choicedata[f][c]['view']);
+              invoices.getchoicedata(invoices.choicesdata[c]['view']);
+          }
+      }
+  },
+  inittable: function(){
+    invoices.tbl = new Tabulator("#tbl_" + invoices.name, {
+      headerFilterPlaceholder: "filter...",
+      height: "92vh",
+      layout: "fitData",
+      selectable: 1,
+      // responsiveLayout:"collapse",
+      columns: [
+          { title: "Quartal", field: "bquarter", headerFilter: "input" },
+          {
+              title: "Datum",
+              field: "invoicedate",
+              formatter: "datetime",
+              formatterParams: {
+                  inputFormat: "YYYY-MM-DD",
+                  outputFormat: "DD.MM.YYYY",
+                  invalidPlaceholder: ""
+              }
+          },
+          { title: "Empfänger", field: "receipient", headerFilter: "input", width: 200 },
+          { title: "Sender", field: "sender", headerFilter: "input" },
+          { title: "Referenz", field: "reference", headerFilter: "input" },
+          {
+              title: "Status",
+              field: "status",
+              headerFilter: "input",
+              formatter: function(cell, formatterParams) {
+                  var value = cell.getValue();
+                  //console.log(value.indexOf("bez"));
+                  if (value.indexOf("payed") >= 0) {
+                      return "<span style='color:green;'>" + statuslang[value] + "</span>";
+                  } else if (value.indexOf("overdue") >= 0) {
+                      return "<span style='color:red; font-weight: bold;'>" + statuslang[value] + "</span>";
+                  } else if (value.indexOf("planned") >= 0) {
+                      return "<span style='color:grey;'>" + statuslang[value] + "</span>";
+                  } else {
+                      return "<span style='color:orange;'>" + statuslang[value] + "</span>";
+                  }
+              }
+          },
+          {
+              title: "Netto",
+              field: "netamount",
+              align: "right",
+              formatter: "money",
+              formatterParams: {
+                  decimal: ",",
+                  thousand: ".",
+                  symbol: "€",
+                  symbolAfter: "p",
+                  precision: 2,
+              }
+          },
+          {
+              title: "MwSt",
+              field: "vatamount",
+              align: "right",
+              formatter: "money",
+              formatterParams: {
+                  decimal: ",",
+                  thousand: ".",
+                  symbol: "€",
+                  symbolAfter: "p",
+                  precision: 2,
+              }
+          }, {
+              title: "Brutto",
+              field: "grossamount",
+              align: "right",
+              formatter: "money",
+              formatterParams: {
+                  decimal: ",",
+                  thousand: ".",
+                  symbol: "€",
+                  symbolAfter: "p",
+                  precision: 2,
+              }
+          }, {
+              title: "Bezahlt",
+              field: "payedamount",
+              align: "right",
+              formatter: "money",
+              formatterParams: {
+                  decimal: ",",
+                  thousand: ".",
+                  symbol: "€",
+                  symbolAfter: "p",
+                  precision: 2,
+              }
+          }
+      ]
+    });
+    invoices.gettbldata();
+  },
+  gettbldata: function(){
+    req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "invoicelist" }, invoices.loadtbldata);
+    return false;
+  },
+  loadtbldata: function(data){
+    if (data && data.sqldata) {
+      invoices.tbl.setData(data.sqldata);
+    }
+    return false;
   },
   add: function(){
-
+    cleanform("invoices");
+    bookings.tbl.clearData();
   },
   remove: function(){
+    var udata = journal.tbl.getSelectedData();
+    if (udata[0]) {
+      var uid = udata[0].id;
+      showdeletedlg("invoices",uid,"Êtes vous sûre de supprimer l'employé(e) sélectionnée?",invoices.afterdeletecallback);
+      //module.viewpanel('tbl_' + staff.name);
+    }
+  },
+  afterdeletecallback: function(){
 
   },
   edit: function(){
-    var udata = journal.tbl.getSelectedData();
-    //cleanform("invoices");
+    var udata = invoices.tbl.getSelectedData();
+    cleanform("invoices");
     if (udata[0]) {
-        currentinvoice = udata[0];
-        //console.log(udata[0]);
-        req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "invoices", "filter": "id=" + udata[0].id }, fillinvoice);
-        viewinvoicepanel();
+        invoices.current = udata[0];
+        console.log(udata[0]);
+        req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "invoices", "filter": "id=" + udata[0].id }, invoices.fillinvoice);
+        module.viewpanel("frm_" + invoices.name);
     }
     return false;
   },
@@ -25,5 +181,36 @@ var invoice = {
   },
   geninvoice: function(){
     
+  },
+  getchoicedata: function(view){
+    req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": view }, invoices.setchoicesdata);
+    return false;
+  },
+  fillinvoice: function(data){
+    console.log("Data to fill in");
+    console.log(data);
+    if (data && data.sqldata) {
+      
+      fillformbydataclass("invoices", data.sqldata[0],invoices.choices, false);
+      //console.log(data.sqldata[0].invoicetype);
+      invoices.current = data.sqldata[0];
+      if (data.sqldata[0].invoicetype == "inv-out") {
+          //document.getElementById("netamount").readonly = true;
+      }
+      bookings.gettbldata();
   }
+  return false;
+  },
+  setchoicesdata: function (data) {
+    if (data && data.sqldata && data.view) {
+            for (var c in invoices.choices) {
+              if (invoices.choicesdata[c]['view'] && invoices.choicesdata[c]['view'] == data.view) {
+                console.log(c);
+                fillselectlist(invoices.choices[c], data.sqldata, "value", "label");
+              }
+        }
+    }
+    return false;
+}
+
 }
\ No newline at end of file
diff --git a/CGI/tmpl/app/invoicejournal/module/invoicejournal/journal.js b/CGI/tmpl/app/invoicejournal/module/invoicejournal/journal.js
deleted file mode 100644 (file)
index 285792d..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-var statustypes = [{ "value": "planned", "label": "geplant" },
-    { "value": "sended", "label": "verschickt" },
-    { "value": "received", "label": "erhalten" },
-    { "value": "payed", "label": "bezahlt" },
-    { "value": "overdue", "label": "überfällig" }
-];
-var currenttemplate = { "base": null, "elements": null };
-var statuslang = { "planned": "geplant", "payed": "bezahlt", "received": "erhalten", "overdue": "überfällig", "sended": "verschickt" };
-var quarters = [{ "value": "Q1", "label": "Q1" }, { "value": "Q2", "label": "Q2" }, { "value": "Q3", "label": "Q3" }, { "value": "Q4", "label": "Q4" }];
-var invoicetypes = [{ "value": "inv-out", "label": "Ausgangs-Rechnung" }, { "value": "inv-in", "label": "Eingangs-Rechnung" }, { "value": "crn-out", "label": "Ausgangs-Gutschrift" }, { "value": "crn-in", "label": "Eingangs-Gutschrift" }];
-
-var journal = {
-  name:"journal",
-  tbl:null,
-  initform: function(){
-
-  },
-  inittable: function(){
-    journal.tbl = new Tabulator("#tbl_" + journal.name, {
-      headerFilterPlaceholder: "filter...",
-      height: "92vh",
-      layout: "fitData",
-      selectable: 1,
-      // responsiveLayout:"collapse",
-      columns: [
-          { title: "Quartal", field: "bquarter", headerFilter: "input" },
-          {
-              title: "Datum",
-              field: "invoicedate",
-              formatter: "datetime",
-              formatterParams: {
-                  inputFormat: "YYYY-MM-DD",
-                  outputFormat: "DD.MM.YYYY",
-                  invalidPlaceholder: ""
-              }
-          },
-          { title: "Empfänger", field: "receipient", headerFilter: "input", width: 200 },
-          { title: "Sender", field: "sender", headerFilter: "input" },
-          { title: "Referenz", field: "reference", headerFilter: "input" },
-          {
-              title: "Status",
-              field: "status",
-              headerFilter: "input",
-              formatter: function(cell, formatterParams) {
-                  var value = cell.getValue();
-                  //console.log(value.indexOf("bez"));
-                  if (value.indexOf("payed") >= 0) {
-                      return "<span style='color:green;'>" + statuslang[value] + "</span>";
-                  } else if (value.indexOf("overdue") >= 0) {
-                      return "<span style='color:red; font-weight: bold;'>" + statuslang[value] + "</span>";
-                  } else if (value.indexOf("planned") >= 0) {
-                      return "<span style='color:grey;'>" + statuslang[value] + "</span>";
-                  } else {
-                      return "<span style='color:orange;'>" + statuslang[value] + "</span>";
-                  }
-              }
-          },
-          {
-              title: "Netto",
-              field: "netamount",
-              align: "right",
-              formatter: "money",
-              formatterParams: {
-                  decimal: ",",
-                  thousand: ".",
-                  symbol: "€",
-                  symbolAfter: "p",
-                  precision: 2,
-              }
-          },
-          {
-              title: "MwSt",
-              field: "vatamount",
-              align: "right",
-              formatter: "money",
-              formatterParams: {
-                  decimal: ",",
-                  thousand: ".",
-                  symbol: "€",
-                  symbolAfter: "p",
-                  precision: 2,
-              }
-          }, {
-              title: "Brutto",
-              field: "grossamount",
-              align: "right",
-              formatter: "money",
-              formatterParams: {
-                  decimal: ",",
-                  thousand: ".",
-                  symbol: "€",
-                  symbolAfter: "p",
-                  precision: 2,
-              }
-          }, {
-              title: "Bezahlt",
-              field: "payedamount",
-              align: "right",
-              formatter: "money",
-              formatterParams: {
-                  decimal: ",",
-                  thousand: ".",
-                  symbol: "€",
-                  symbolAfter: "p",
-                  precision: 2,
-              }
-          }
-      ]
-  });
-  journal.gettbldata();
-  },
-  gettbldata: function(){
-    req.reqdata("POST", "db.cgi", { "db": parent.app + "/" + mpref.cfg.db, "get": "invoicelist" }, journal.loadtbldata);
-    return false;
-  },
-  loadtbldata: function(data){
-    if (data && data.sqldata) {
-      journal.tbl.setData(data.sqldata);
-    }
-    return false;
-  },
-  add: function(){
-
-  },
-  edit: function(){
-    
-  },
-  remove: function(){
-    
-  }
-}
\ No newline at end of file
index bc9f4ae..375769f 100644 (file)
@@ -3,9 +3,9 @@
     <button class="w3-bar-item w3-button w3-border w3-blue-grey" onclick="viewtable();"><img src="[% abspath%][% staticpath %]img/icons/list_white.svg" style="height: 24px;"/> Rechnungen</button>
     <!-- <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey " onclick="setusergroups();"><img src="[% abspath%][% staticpath %]img/icons/group_white.svg" style="height: 24px;"/></button>
     <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey " onclick="setlogin();"><img src="[% abspath%][% staticpath %]img/icons/user_white.svg" style="height: 24px;"/></button> -->
-    <button class="w3-bar-item w3-button w3-border w3-right w3-red" onclick="add();"><img src="[% abspath%][% staticpath %]img/icons/plus_white.svg" style="height: 24px;"/></button>
-    <button class="w3-bar-item w3-button w3-border w3-right w3-red" onclick="remove();"><img src="[% abspath%][% staticpath %]img/icons/remove_white.svg" style="height: 24px;"/></button>
-    <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="edit();"><img src="[% abspath%][% staticpath %]img/icons/edit_white.svg" style="height: 24px;"/></button>
+    <button class="w3-bar-item w3-button w3-border w3-right w3-red" onclick="add();"><i class=" icon-Add"></i></button>
+    <button class="w3-bar-item w3-button w3-border w3-right w3-red" onclick="remove();"><i class=" icon-Delete"></i></button>
+    <button class="w3-bar-item w3-button w3-border w3-right w3-blue-grey" onclick="edit();"><i class=" icon-Edit"></i></button>
 </div>
 </div>
 <div class="w3-display-container" id="tbl_invoices" style="margin-top: 50px;"></div>
index 70ea776..e861d28 100755 (executable)
@@ -7,13 +7,11 @@ use lib ('.');
 use pdfreport;
 my $dbpath = $ENV{HOME}.'/Workspace/dksnas/data';
 my $data = {
-  dbtype => 'SQLite', #'PgPP' or ScLite
-  dsn => 'DBI:SQLite:dbname='.$dbpath.'/invoicejournal/dksbuchhaltung.sqlite',
-  dbuser => '',
-  dbpassword => ''
+  id_invoice => "469",
+  dsn => 'DBI:SQLite:dbname='.$dbpath.'/invoicejournal/dksbuchhaltung.sqlite'
 };
-my $rep = pdfreport->new({tmplpath => $RealBin.'/report', tmp => $RealBin.'/tmp',data => {}});
-my ($result,$file) = $rep->createpdf('ttinvoice',$RealBin.'/output/textinvoice.pdf');
+my $rep = pdfreport->new({tmplpath => $RealBin.'/report', tmp => $RealBin.'/tmp'});
+my ($result,$file) = $rep->createpdf('ttinvoice',$RealBin.'/output/textinvoice.pdf',$data);
 print "$result: $file\n";
 
 
index 1e7d1d0..258b764 100644 (file)
Binary files a/bin/wkhtmltopdf/output/textinvoice.pdf and b/bin/wkhtmltopdf/output/textinvoice.pdf differ
index 370f4ec..7c1b7ca 100644 (file)
@@ -11,8 +11,10 @@ sub new {
     my $self = bless {}, $class;
     $self->{tmplpath} =$p->{tmplpath};
     $self->{tmp} =$p->{tmp};
-    $self->{data} = $p->{data};
-    $self->{PDFAPP} = "/usr/local/bin/wkhtmltopdf";
+    $self->{pdf} = undef;
+    $self->{template} = undef;
+    #$self->{template} = $p->{template};
+    $self->{pdf}->{app} = "/usr/local/bin/wkhtmltopdf";
     return $self;
 }
 
@@ -20,26 +22,29 @@ sub createpdf(){
   my $self = shift;
   my $template = shift;
   my $output = shift;
-  my $pdfcfg = ();
+  my $inputdata = shift;
   my $r = -1;
   print $self->{tmplpath}.'/'.$template.'.conf'."\n";
   if (-e $self->{tmplpath}.'/'.$template.'.conf'){
-    $pdfcfg = $self->readpdfconfig($template);
-    print Dumper($pdfcfg);
+    $self->readpdfconfig($template,$inputdata);
+    print Dumper($self->{template});
   }
+  print Dumper($self->{pdf});
+  print Dumper($self->{template});
   my $tmpreportpath=$self->{tmplpath};
-  if (exists($pdfcfg->{ENGINE}) && ($pdfcfg->{ENGINE} eq "Template::Toolkit")){
+  if (exists($self->{pdf}->{engine}) && ($self->{pdf}->{engine} eq "Template::Toolkit")){
     $template = $self->createTTReport($template);
     $tmpreportpath = $self->{tmp};
   }
-  if ((keys(%{$pdfcfg}) > 0) && (-e $tmpreportpath.'/'.$template.'.html')){
-    my $cmd = '"'.$self->{PDFAPP}.'"';
-    if ($pdfcfg->{PDFBOTTOM}){ $cmd .= " -B ".$pdfcfg->{PDFBOTTOM}; }
-    if ($pdfcfg->{PDFLEFT}){ $cmd .= " -L ".$pdfcfg->{PDFLEFT}; }
-    if ($pdfcfg->{PDFRIGHT}){ $cmd .= " -R ".$pdfcfg->{PDFRIGHT}; }
-    if ($pdfcfg->{PDFTOP}){ $cmd .= " -T ".$pdfcfg->{PDFTOP}; }
-    if ($pdfcfg->{PDFORIENTATION}){ $cmd .= " -O ".$pdfcfg->{PDFORIENTATION}; }
-    if ($pdfcfg->{PDFSIZE}){ $cmd .= " -s ".$pdfcfg->{PDFSIZE}; }
+  if ((keys(%{$self}) > 0) && (-e $tmpreportpath.'/'.$template.'.html')){
+    my $cmd = '"'.$self->{pdf}->{app}.'"';
+    if ($self->{pdf}->{bottom}){ $cmd .= " -B ".$self->{pdf}->{bottom}; }
+    if ($self->{pdf}->{left}){ $cmd .= " -L ".$self->{pdf}->{left}; }
+    if ($self->{pdf}->{right}){ $cmd .= " -R ".$self->{pdf}->{right}; }
+    if ($self->{pdf}->{top}){ $cmd .= " -T ".$self->{pdf}->{top}; }
+    if ($self->{pdf}->{orientation}){ $cmd .= " -O ".$self->{pdf}->{orientation}; }
+    if ($self->{pdf}->{size}){ $cmd .= " -s ".$self->{pdf}->{size}; }
+    if ($self->{pdf}->{encoding}){ $cmd .= " --encoding '".$self->{pdf}->{encoding}."'"; }
     if (-e $tmpreportpath.'/'.$template.'.header.html'){
       $cmd .= ' --header-html "'.$tmpreportpath.'/'.$template.'.header.html"';
     }
@@ -62,13 +67,13 @@ sub createTTReport(){
   my $template = shift;
   my $uniquekey = $$;
   if (-e $self->{tmplpath}.'/'.$template.".tt"){
-    $self->TTtoHTML($self->{tmplpath}.'/'.$template.".tt",$self->{tmp}.'/'.$template.$$.".html",$self->{data});
+    $self->TTtoHTML($self->{tmplpath}.'/'.$template.".tt",$self->{tmp}.'/'.$template.$$.".html");
   }
   if (-e $self->{tmplpath}.'/'.$template.".header.tt"){
-    $self->TTtoHTML($self->{tmplpath}.'/'.$template.".header.tt",$self->{tmp}.'/'.$template.$$.".header.html",$self->{data});
+    $self->TTtoHTML($self->{tmplpath}.'/'.$template.".header.tt",$self->{tmp}.'/'.$template.$$.".header.html");
   }
   if (-e $self->{tmplpath}.'/'.$template.".footer.tt"){
-    $self->TTtoHTML($self->{tmplpath}.'/'.$template.".footer.tt",$self->{tmp}.'/'.$template.$$.".footer.html",$self->{data});
+    $self->TTtoHTML($self->{tmplpath}.'/'.$template.".footer.tt",$self->{tmp}.'/'.$template.$$.".footer.html");
   }
   if (-d $self->{tmplpath}.'/'.$template){
     dircopy($self->{tmplpath}.'/'.$template,$self->{tmp}.'/'.$template);
@@ -80,26 +85,28 @@ sub TTtoHTML(){
   my $self = shift;
   my $ttfile = shift;
   my $outfile = shift;
-  my $data = shift;
-  my $template = Template->new({INCLUDE_PATH => [dirname($ttfile)],OUTPUT => $outfile});
-  $template->process(basename($ttfile),$data) || die "Template process failed: ", $template->error(), "\n";
+  my $template = Template->new({INCLUDE_PATH => [dirname($ttfile)]});#,ENCODING => 'utf8'
+  $template->process(basename($ttfile),$self->{template},$outfile) || die "Template process failed: ", $template->error(), "\n";#,{binmode => ':utf8'}
 }
 
 sub readpdfconfig(){
   my $self = shift;
   my $template = shift;
-  my $cfg = ();
+  my $inputdata = shift;
   open(CFG,$self->{tmplpath}.'/'.$template.'.conf');
   while (my $l = <CFG>){
     chomp($l);
+    print $l."\n";
     $l =~ s/^\s+//;
     if (($l =~ /^#/) || ($l eq "")) {next;}
     if ($l =~ /\w+=.+/){
-      my ($k,$v) = $l =~ m/^(\w+)=\"(.+)\"$/;
-      $cfg->{$k} = $v;
+      my ($k1,$k2,$v) = $l =~ m/^(\w+)_(\w+)=\"(.+)\"$/;
+      $self->{lc($k1)}->{lc($k2)} = $v;
     }
   }
   close(CFG);
-  return $cfg;
+  foreach my $ik (keys(%{$inputdata})){
+    $self->{template}->{lc($ik)} = $inputdata->{$ik};
+  }
 }
 1;
\ No newline at end of file
index b5596a1..04bf49e 100644 (file)
@@ -8,14 +8,14 @@
     <td style="width: 60mm">&nbsp;</td>
     <td style="width: 50mm;text-align: right;">
       <div style="text-align: left;width: 50mm; font-size: 12pt;font: sans;">
-          <b>DKS s.à r.l.</b><br/>
-          8b, rue du Moulin<br/>
-          L-6914 Roodt-sur-Syre<br/><br/>
+          <b>DKS s.à r.l.</b><br/>
+          4, rue Principale<br/>
+          L-3770 Tétange<br/><br/>
           Tel: +352 691 504 574<br/>
           info@dks.lu / www.dks.lu<br/>
       </div>
     </td>
-    <tr><td style="text-align: left;">Database knowledge Solutions - <b>Simplify IT</b></td><td></td><td></td></tr>
+    <tr><td style="text-align: left;">Database Knowledge Solutions - <b>Simplify IT</b></td><td></td><td></td></tr>
   </tr>
 </table>
 </body></html>
index f3327fa..204cf90 100644 (file)
@@ -1,9 +1,7 @@
 <!DOCTYPE html>
 <html lang="en">
+<meta charset="UTF-8">
 <head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <meta http-equiv="X-UA-Compatible" content="ie=edge">
   <title>Document</title>
   <style>
 
index 8533791..0b78e2e 100644 (file)
@@ -1,7 +1,11 @@
-PDFTOP="40mm"
-PDFBOTTOM="20mm"
-PDFLEFT="20mm"
-PDFRIGHT="10mm"
-PDFSIZE="A4"
-PDFORIENTATION="Portrait"
-ENGINE="Template::Toolkit"
+PDF_TOP="40mm"
+PDF_BOTTOM="20mm"
+PDF_LEFT="20mm"
+PDF_RIGHT="10mm"
+PDF_SIZE="A4"
+PDF_ORIENTATION="Portrait"
+PDF_ENGINE="Template::Toolkit"
+PDF_ENCODING="UTF-8"
+TEMPLATE_DSN=""
+TEMPLATE_DBUSER=""
+TEMPLATE_DBPASSWORD=""
\ No newline at end of file
index fa11876..0f19953 100644 (file)
@@ -1,5 +1,8 @@
 <!DOCTYPE html>
-<html><head><script>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
 function subst() {
     var vars = {};
     var query_strings_from_url = document.location.search.substring(1).split('&');
@@ -19,9 +22,10 @@ function subst() {
         }
     }
 }
-</script></head><body style="border:0; margin: 0;" onload="subst()">
+</script></head>
+<body style="border:0; margin: 0;" onload="subst()">
 <table style="width: 100%;" >
-  <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société Ã  responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
+  <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société Ã  responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
     <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
   <tr>
     <td></td>
index 689fe7c..8e40350 100644 (file)
@@ -1,15 +1,15 @@
 <!DOCTYPE html>
 <html><head>
-
+<meta charset="UTF-8">
 </head><body style="border:0; margin: 0;" o>
 <table style="width: 100%;">
   <tr>
     <td style="width: 150mm; margin-top:5mm;"><img src="ttinvoice/sitc.png" style="height: 35mm;"/></td>
     <td style="width: 60mm;text-align: right;">
       <div style="text-align: left;width: 60mm; font-size: 12pt;font: sans;">
-          <b>SAFFRAN IT Consulting S.à r.l.</b><br/>
+          <b>SAFFRAN IT Consulting S.à r.l.</b><br/>
           4, rue Principale<br/>
-          L-3770 Tétange<br/><br/>
+          L-3770 Tétange<br/><br/>
           Tel: +352 691 504 574<br/>
           info@saffran.lu / www.saffran.lu<br/>
       </div>
index 81e1401..93f96d0 100644 (file)
@@ -1,8 +1,9 @@
+[% USE DBI %]
+[% USE dksdb = DBI(dsn, dbuser, dbpassword) %]
 <!DOCTYPE html>
-<html lang="en">
+<html>
 <head>
-  <meta charset="ISO-8859-1">
-  <title>Document</title>
+  <title>Invoice</title>
   <style>
   div {
   font-size: 18pt;
@@ -58,53 +59,64 @@ th.footer {
   </style>
 </head>
 <body>
-  
+  [% qginv = dksdb.prepare("select * from vw_invoiceoutlist WHERE id= ?") %]
+  [% ginv = qginv.execute(id_invoice) %]
+  [% inv = ginv.get_all() %]
   <table style="width: 100%;">
     <tr>
       <td style="width: 60%;"></td>
       <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
-    </tr>
+    </tr> 
     <tr>
       <td style="vertical-align: top; font-size: 25pt;">
-        Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
+        [% inv.0.receipient %]<br/>[% inv.0.address %]<br>[% inv.0.zip %] [% inv.0.city %]<br/>[% inv.0.country %]<br/>
       </td>
       <td >
         <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
-          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
-          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
+          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">[% inv.0.reference %]</td></tr>
+          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">[% inv.0.invoicedate %]</td> </tr>
+          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">[% inv.0.deadlinedate %]</td> </tr>
+          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">[% inv.0.ident %]</td> </tr>
         </table>
       </td>
     </tr>
     
   </table>
+  [% qbookings = dksdb.prepare("SELECT id, id_invoice, quantity, unit, description, unitamount, netamount, taxamount, taxpercent, totalamount FROM vw_bookingoutlist where id_invoice= ?;") %]
+
   <table id="tbl_products" >
-    <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
+    <thead>
+      <tr>
+      <th>Produkt / Dienstleistung</th>
+      <th style="width: 25mm;" colspan="2">Anz.</th>
+      <th style="width: 25mm;">Einzel-Preis</th>
+      <th style="width: 25mm;">Netto-Summe</th>
+      </tr>
+    </thead>
     <tbody>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>      
+      [% FOREACH book = qbookings.execute(id_invoice) %]    
+      <tr>
+        <td>[% book.description %]</td>
+        <td class="right" style="width: 10mm;">[% book.quantity %]</td>
+        <td style="width: 15mm;">[% book.unit %]</td>
+        <td class="right">[% book.unitamount %] â‚¬</td>
+        <td class="right">[% book.netamount %] â‚¬</td>
+      </tr>
+      [% END %]
+          
     </tbody>
     <tfoot>
       <tr>
         <th colspan="4" class="footer right">Total Netto</td>
-        <td colspan="2" class="right" >0000,00 ?</td>
+        <td colspan="2" class="right" >[% inv.0.totalnet %] â‚¬</td>
       </tr>
       <tr>
           <th colspan="4" class="footer right">MwSt. (17%)</td>
-          <td colspan="2" class="right" style="font-style: italic;">0000,00 ?</td>
+          <td colspan="2" class="right" style="font-style: italic;">[% inv.0.totalvat %] â‚¬</td>
         </tr>
         <tr>
             <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
-            <td colspan="2" class="right" style="font-weight: bold;">0000,00 ?</td>
+            <td colspan="2" class="right" style="font-weight: bold;">[% inv.0.totalgross %] â‚¬</td>
           </tr>
     </tfoot>
   </table>
diff --git a/bin/wkhtmltopdf/report/ttinvoice/ttinvoice.conf b/bin/wkhtmltopdf/report/ttinvoice/ttinvoice.conf
new file mode 100644 (file)
index 0000000..0b78e2e
--- /dev/null
@@ -0,0 +1,11 @@
+PDF_TOP="40mm"
+PDF_BOTTOM="20mm"
+PDF_LEFT="20mm"
+PDF_RIGHT="10mm"
+PDF_SIZE="A4"
+PDF_ORIENTATION="Portrait"
+PDF_ENGINE="Template::Toolkit"
+PDF_ENCODING="UTF-8"
+TEMPLATE_DSN=""
+TEMPLATE_DBUSER=""
+TEMPLATE_DBPASSWORD=""
\ No newline at end of file
@@ -1,5 +1,8 @@
 <!DOCTYPE html>
-<html><head><script>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
 function subst() {
     var vars = {};
     var query_strings_from_url = document.location.search.substring(1).split('&');
@@ -19,9 +22,10 @@ function subst() {
         }
     }
 }
-</script></head><body style="border:0; margin: 0;" onload="subst()">
+</script></head>
+<body style="border:0; margin: 0;" onload="subst()">
 <table style="width: 100%;" >
-  <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société Ã  responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
+  <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société Ã  responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
     <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
   <tr>
     <td></td>
@@ -1,17 +1,17 @@
 <!DOCTYPE html>
 <html><head>
-
+<meta charset="UTF-8">
 </head><body style="border:0; margin: 0;" o>
 <table style="width: 100%;">
   <tr>
     <td style="width: 150mm; margin-top:5mm;"><img src="ttinvoice/sitc.png" style="height: 35mm;"/></td>
     <td style="width: 60mm;text-align: right;">
       <div style="text-align: left;width: 60mm; font-size: 12pt;font: sans;">
-          <b>SAFFRAN IT Consulting S.à r.l.</b><br/>
+          <b>SAFFRAN IT Consulting S.à r.l.</b><br/>
           4, rue Principale<br/>
-          L-3770 Tétange<br/><br/>
+          L-3770 Tétange<br/><br/>
           Tel: +352 691 504 574<br/>
-          info@saffran.lu / www.saffrans.lu<br/>
+          info@saffran.lu / www.saffran.lu<br/>
       </div>
     </td>
     <tr><td style="text-align: left;"></td><td></td></tr>
diff --git a/bin/wkhtmltopdf/report/ttinvoice/ttinvoice.tt b/bin/wkhtmltopdf/report/ttinvoice/ttinvoice.tt
new file mode 100644 (file)
index 0000000..93f96d0
--- /dev/null
@@ -0,0 +1,126 @@
+[% USE DBI %]
+[% USE dksdb = DBI(dsn, dbuser, dbpassword) %]
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Invoice</title>
+  <style>
+  div {
+  font-size: 18pt;
+}
+table {
+  font-size: 18pt;
+  border-spacing: unset;
+  border-collapse: unset;
+}
+td.invdatalbl {
+  font-weight: bold;
+  margin: 1mm; 
+  padding: 2mm;
+  border-collapse:collapse;;
+  width: 30mm;
+  background-color: #c6c6c6;
+}
+td.invdataval {
+  font-weight: normal; 
+  margin: 1mm; 
+  padding: 2mm;
+}
+.right{
+  text-align: right;
+}
+table#tbl_products {
+  border-spacing: 0;
+  border-collapse: 0;
+  margin-top: 10mm;
+  width: 100%;
+}
+table#tbl_products td {
+  padding: 2mm;
+  border-bottom: 1px solid black;
+}
+
+table#tbl_products th {
+  margin: 1mm; 
+  border: 1px solid #fff;
+  border-bottom: 0px;
+  padding: 2mm;
+  background-color: #c6c6c6;
+}
+
+th.footer {
+  margin: 1mm; 
+  border: 1px solid #fff;
+  background-color: unset;
+  border-bottom: 0px;
+  padding: 2mm;
+  text-align: right;
+}
+  </style>
+</head>
+<body>
+  [% qginv = dksdb.prepare("select * from vw_invoiceoutlist WHERE id= ?") %]
+  [% ginv = qginv.execute(id_invoice) %]
+  [% inv = ginv.get_all() %]
+  <table style="width: 100%;">
+    <tr>
+      <td style="width: 60%;"></td>
+      <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
+    </tr> 
+    <tr>
+      <td style="vertical-align: top; font-size: 25pt;">
+        [% inv.0.receipient %]<br/>[% inv.0.address %]<br>[% inv.0.zip %] [% inv.0.city %]<br/>[% inv.0.country %]<br/>
+      </td>
+      <td >
+        <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
+          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">[% inv.0.reference %]</td></tr>
+          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">[% inv.0.invoicedate %]</td> </tr>
+          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">[% inv.0.deadlinedate %]</td> </tr>
+          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">[% inv.0.ident %]</td> </tr>
+        </table>
+      </td>
+    </tr>
+    
+  </table>
+  [% qbookings = dksdb.prepare("SELECT id, id_invoice, quantity, unit, description, unitamount, netamount, taxamount, taxpercent, totalamount FROM vw_bookingoutlist where id_invoice= ?;") %]
+
+  <table id="tbl_products" >
+    <thead>
+      <tr>
+      <th>Produkt / Dienstleistung</th>
+      <th style="width: 25mm;" colspan="2">Anz.</th>
+      <th style="width: 25mm;">Einzel-Preis</th>
+      <th style="width: 25mm;">Netto-Summe</th>
+      </tr>
+    </thead>
+    <tbody>
+      [% FOREACH book = qbookings.execute(id_invoice) %]    
+      <tr>
+        <td>[% book.description %]</td>
+        <td class="right" style="width: 10mm;">[% book.quantity %]</td>
+        <td style="width: 15mm;">[% book.unit %]</td>
+        <td class="right">[% book.unitamount %] â‚¬</td>
+        <td class="right">[% book.netamount %] â‚¬</td>
+      </tr>
+      [% END %]
+          
+    </tbody>
+    <tfoot>
+      <tr>
+        <th colspan="4" class="footer right">Total Netto</td>
+        <td colspan="2" class="right" >[% inv.0.totalnet %] â‚¬</td>
+      </tr>
+      <tr>
+          <th colspan="4" class="footer right">MwSt. (17%)</td>
+          <td colspan="2" class="right" style="font-style: italic;">[% inv.0.totalvat %] â‚¬</td>
+        </tr>
+        <tr>
+            <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
+            <td colspan="2" class="right" style="font-weight: bold;">[% inv.0.totalgross %] â‚¬</td>
+          </tr>
+    </tfoot>
+  </table>
+  <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
+      <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice/ttinvoice.css b/bin/wkhtmltopdf/tmp/ttinvoice/ttinvoice.css
deleted file mode 100644 (file)
index d56ba40..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-div {
-  font-size: 18pt;
-}
-table {
-  font-size: 18pt;
-  border-spacing: unset;
-  border-collapse: unset;
-}
-td.invdatalbl {
-  font-weight: bold;
-  margin: 1mm; 
-  padding: 2mm;
-  border-collapse:collapse;;
-  width: 30mm;
-  background-color: #c6c6c6;
-}
-td.invdataval {
-  font-weight: normal; 
-  margin: 1mm; 
-  padding: 2mm;
-}
-.right{
-  text-align: right;
-}
-table#tbl_products {
-  border-spacing: 0;
-  border-collapse: 0;
-  margin-top: 10mm;
-  width: 100%;
-}
-table#tbl_products td {
-  padding: 2mm;
-  border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  border-bottom: 0px;
-  padding: 2mm;
-  background-color: #c6c6c6;
-}
-
-th.footer {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  background-color: unset;
-  border-bottom: 0px;
-  padding: 2mm;
-  text-align: right;
-}
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2386.footer.html b/bin/wkhtmltopdf/tmp/ttinvoice2386.footer.html
deleted file mode 100644 (file)
index 17ac4bd..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html><head><script>
-function subst() {
-    var vars = {};
-    var query_strings_from_url = document.location.search.substring(1).split('&');
-    for (var query_string in query_strings_from_url) {
-        if (query_strings_from_url.hasOwnProperty(query_string)) {
-            var temp_var = query_strings_from_url[query_string].split('=', 2);
-            vars[temp_var[0]] = decodeURI(temp_var[1]);
-        }
-    }
-    var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
-    for (var css_class in css_selector_classes) {
-        if (css_selector_classes.hasOwnProperty(css_class)) {
-            var element = document.getElementsByClassName(css_selector_classes[css_class]);
-            for (var j = 0; j < element.length; ++j) {
-                element[j].textContent = vars[css_selector_classes[css_class]];
-            }
-        }
-    }
-}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="width: 100%;" >
-  <tr><td colspan="2" style="text-align: center;"><b>DKS</b>, Soci�t� ï¿½responsabilit� limit�e, <b>RC</b> B168572 - <b>TVA:</b> LU 25375617 - <b>No. Aut:</b> 10024550 / 0<br/>
-    <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
-  <tr>
-    <td></td>
-    <td style="text-align:right">
-      Seite <span class="page"></span>/<span class="topage"></span>
-    </td>
-  </tr>
-</table>
-</body></html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2386.header.html b/bin/wkhtmltopdf/tmp/ttinvoice2386.header.html
deleted file mode 100644 (file)
index 777164d..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
-  <tr>
-    <td style="width: 100mm; margin-top:5mm;"><img src="dks_500.png" style="height: 35mm;"/></td>
-    <td style="width: 60mm">&nbsp;</td>
-    <td style="width: 50mm;text-align: right;">
-      <div style="text-align: left;width: 50mm; font-size: 12pt;font: sans;">
-          <b>DKS s.à r.l.</b><br/>
-          4, rue Principale<br/>
-          L-3770 Tétange<br/><br/>
-          Tel: +352 691 504 574<br/>
-          info@saffran.lu / www.saffrans.lu<br/>
-      </div>
-    </td>
-    <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
-  </tr>
-</table>
-</body></html>
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2386.html b/bin/wkhtmltopdf/tmp/ttinvoice2386.html
deleted file mode 100644 (file)
index 81791fa..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="UTF-8">
-  <title>Document</title>
-  <link rel="stylesheet" href="ttinvoice.css"/>
-  </style>
-</head>
-<body>
-  
-  <table style="width: 100%;">
-    <tr>
-      <td style="width: 60%;"></td>
-      <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
-    </tr>
-    <tr>
-      <td style="vertical-align: top; font-size: 25pt;">
-        Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
-      </td>
-      <td >
-        <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
-          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
-          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
-        </table>
-      </td>
-    </tr>
-    
-  </table>
-  <table id="tbl_products" >
-    <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
-    <tbody>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>      
-    </tbody>
-    <tfoot>
-      <tr>
-        <th colspan="4" class="footer right">Total Netto</td>
-        <td colspan="2" class="right" >0000,00 â‚¬</td>
-      </tr>
-      <tr>
-          <th colspan="4" class="footer right">MwSt. (17%)</td>
-          <td colspan="2" class="right" style="font-style: italic;">0000,00 â‚¬</td>
-        </tr>
-        <tr>
-            <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
-            <td colspan="2" class="right" style="font-weight: bold;">0000,00 â‚¬</td>
-          </tr>
-    </tfoot>
-  </table>
-  <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
-      <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2529.footer.html b/bin/wkhtmltopdf/tmp/ttinvoice2529.footer.html
deleted file mode 100644 (file)
index 17ac4bd..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html><head><script>
-function subst() {
-    var vars = {};
-    var query_strings_from_url = document.location.search.substring(1).split('&');
-    for (var query_string in query_strings_from_url) {
-        if (query_strings_from_url.hasOwnProperty(query_string)) {
-            var temp_var = query_strings_from_url[query_string].split('=', 2);
-            vars[temp_var[0]] = decodeURI(temp_var[1]);
-        }
-    }
-    var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
-    for (var css_class in css_selector_classes) {
-        if (css_selector_classes.hasOwnProperty(css_class)) {
-            var element = document.getElementsByClassName(css_selector_classes[css_class]);
-            for (var j = 0; j < element.length; ++j) {
-                element[j].textContent = vars[css_selector_classes[css_class]];
-            }
-        }
-    }
-}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="width: 100%;" >
-  <tr><td colspan="2" style="text-align: center;"><b>DKS</b>, Soci�t� ï¿½responsabilit� limit�e, <b>RC</b> B168572 - <b>TVA:</b> LU 25375617 - <b>No. Aut:</b> 10024550 / 0<br/>
-    <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
-  <tr>
-    <td></td>
-    <td style="text-align:right">
-      Seite <span class="page"></span>/<span class="topage"></span>
-    </td>
-  </tr>
-</table>
-</body></html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2529.header.html b/bin/wkhtmltopdf/tmp/ttinvoice2529.header.html
deleted file mode 100644 (file)
index 69ee309..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
-  <tr>
-    <td style="width: 100mm; margin-top:5mm;"><img src="ttinvoice/dks_500.png" style="height: 35mm;"/></td>
-    <td style="width: 60mm">&nbsp;</td>
-    <td style="width: 50mm;text-align: right;">
-      <div style="text-align: left;width: 50mm; font-size: 12pt;font: sans;">
-          <b>DKS s.à r.l.</b><br/>
-          4, rue Principale<br/>
-          L-3770 Tétange<br/><br/>
-          Tel: +352 691 504 574<br/>
-          info@saffran.lu / www.saffrans.lu<br/>
-      </div>
-    </td>
-    <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
-  </tr>
-</table>
-</body></html>
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2529.html b/bin/wkhtmltopdf/tmp/ttinvoice2529.html
deleted file mode 100644 (file)
index 81791fa..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="UTF-8">
-  <title>Document</title>
-  <link rel="stylesheet" href="ttinvoice.css"/>
-  </style>
-</head>
-<body>
-  
-  <table style="width: 100%;">
-    <tr>
-      <td style="width: 60%;"></td>
-      <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
-    </tr>
-    <tr>
-      <td style="vertical-align: top; font-size: 25pt;">
-        Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
-      </td>
-      <td >
-        <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
-          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
-          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
-        </table>
-      </td>
-    </tr>
-    
-  </table>
-  <table id="tbl_products" >
-    <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
-    <tbody>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>      
-    </tbody>
-    <tfoot>
-      <tr>
-        <th colspan="4" class="footer right">Total Netto</td>
-        <td colspan="2" class="right" >0000,00 â‚¬</td>
-      </tr>
-      <tr>
-          <th colspan="4" class="footer right">MwSt. (17%)</td>
-          <td colspan="2" class="right" style="font-style: italic;">0000,00 â‚¬</td>
-        </tr>
-        <tr>
-            <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
-            <td colspan="2" class="right" style="font-weight: bold;">0000,00 â‚¬</td>
-          </tr>
-    </tfoot>
-  </table>
-  <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
-      <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2649.footer.html b/bin/wkhtmltopdf/tmp/ttinvoice2649.footer.html
deleted file mode 100644 (file)
index 17ac4bd..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html><head><script>
-function subst() {
-    var vars = {};
-    var query_strings_from_url = document.location.search.substring(1).split('&');
-    for (var query_string in query_strings_from_url) {
-        if (query_strings_from_url.hasOwnProperty(query_string)) {
-            var temp_var = query_strings_from_url[query_string].split('=', 2);
-            vars[temp_var[0]] = decodeURI(temp_var[1]);
-        }
-    }
-    var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
-    for (var css_class in css_selector_classes) {
-        if (css_selector_classes.hasOwnProperty(css_class)) {
-            var element = document.getElementsByClassName(css_selector_classes[css_class]);
-            for (var j = 0; j < element.length; ++j) {
-                element[j].textContent = vars[css_selector_classes[css_class]];
-            }
-        }
-    }
-}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="width: 100%;" >
-  <tr><td colspan="2" style="text-align: center;"><b>DKS</b>, Soci�t� ï¿½responsabilit� limit�e, <b>RC</b> B168572 - <b>TVA:</b> LU 25375617 - <b>No. Aut:</b> 10024550 / 0<br/>
-    <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
-  <tr>
-    <td></td>
-    <td style="text-align:right">
-      Seite <span class="page"></span>/<span class="topage"></span>
-    </td>
-  </tr>
-</table>
-</body></html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2649.header.html b/bin/wkhtmltopdf/tmp/ttinvoice2649.header.html
deleted file mode 100644 (file)
index 69ee309..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
-  <tr>
-    <td style="width: 100mm; margin-top:5mm;"><img src="ttinvoice/dks_500.png" style="height: 35mm;"/></td>
-    <td style="width: 60mm">&nbsp;</td>
-    <td style="width: 50mm;text-align: right;">
-      <div style="text-align: left;width: 50mm; font-size: 12pt;font: sans;">
-          <b>DKS s.à r.l.</b><br/>
-          4, rue Principale<br/>
-          L-3770 Tétange<br/><br/>
-          Tel: +352 691 504 574<br/>
-          info@saffran.lu / www.saffrans.lu<br/>
-      </div>
-    </td>
-    <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
-  </tr>
-</table>
-</body></html>
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2649.html b/bin/wkhtmltopdf/tmp/ttinvoice2649.html
deleted file mode 100644 (file)
index a972aeb..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="ISO-8859-1">
-  <title>Document</title>
-  <style>
-  div {
-  font-size: 18pt;
-}
-table {
-  font-size: 18pt;
-  border-spacing: unset;
-  border-collapse: unset;
-}
-td.invdatalbl {
-  font-weight: bold;
-  margin: 1mm; 
-  padding: 2mm;
-  border-collapse:collapse;;
-  width: 30mm;
-  background-color: #c6c6c6;
-}
-td.invdataval {
-  font-weight: normal; 
-  margin: 1mm; 
-  padding: 2mm;
-}
-.right{
-  text-align: right;
-}
-table#tbl_products {
-  border-spacing: 0;
-  border-collapse: 0;
-  margin-top: 10mm;
-  width: 100%;
-}
-table#tbl_products td {
-  padding: 2mm;
-  border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  border-bottom: 0px;
-  padding: 2mm;
-  background-color: #c6c6c6;
-}
-
-th.footer {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  background-color: unset;
-  border-bottom: 0px;
-  padding: 2mm;
-  text-align: right;
-}
-  </style>
-</head>
-<body>
-  
-  <table style="width: 100%;">
-    <tr>
-      <td style="width: 60%;"></td>
-      <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
-    </tr>
-    <tr>
-      <td style="vertical-align: top; font-size: 25pt;">
-        Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
-      </td>
-      <td >
-        <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
-          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
-          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
-        </table>
-      </td>
-    </tr>
-    
-  </table>
-  <table id="tbl_products" >
-    <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
-    <tbody>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 â‚¬</td><td class="right">0,00 â‚¬</td></tr>      
-    </tbody>
-    <tfoot>
-      <tr>
-        <th colspan="4" class="footer right">Total Netto</td>
-        <td colspan="2" class="right" >0000,00 â‚¬</td>
-      </tr>
-      <tr>
-          <th colspan="4" class="footer right">MwSt. (17%)</td>
-          <td colspan="2" class="right" style="font-style: italic;">0000,00 â‚¬</td>
-        </tr>
-        <tr>
-            <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
-            <td colspan="2" class="right" style="font-weight: bold;">0000,00 â‚¬</td>
-          </tr>
-    </tfoot>
-  </table>
-  <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
-      <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2720.footer.html b/bin/wkhtmltopdf/tmp/ttinvoice2720.footer.html
deleted file mode 100644 (file)
index e398a66..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html><head><script>
-function subst() {
-    var vars = {};
-    var query_strings_from_url = document.location.search.substring(1).split('&');
-    for (var query_string in query_strings_from_url) {
-        if (query_strings_from_url.hasOwnProperty(query_string)) {
-            var temp_var = query_strings_from_url[query_string].split('=', 2);
-            vars[temp_var[0]] = decodeURI(temp_var[1]);
-        }
-    }
-    var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
-    for (var css_class in css_selector_classes) {
-        if (css_selector_classes.hasOwnProperty(css_class)) {
-            var element = document.getElementsByClassName(css_selector_classes[css_class]);
-            for (var j = 0; j < element.length; ++j) {
-                element[j].textContent = vars[css_selector_classes[css_class]];
-            }
-        }
-    }
-}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="width: 100%;" >
-  <tr><td colspan="2" style="text-align: center;"><b>DKS</b>, Société Ã  responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 25375617 - <b>No. Aut:</b> 10024550 / 0<br/>
-    <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
-  <tr>
-    <td></td>
-    <td style="text-align:right">
-      Seite <span class="page"></span>/<span class="topage"></span>
-    </td>
-  </tr>
-</table>
-</body></html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2720.header.html b/bin/wkhtmltopdf/tmp/ttinvoice2720.header.html
deleted file mode 100644 (file)
index 62b6ce3..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
-  <tr>
-    <td style="width: 100mm; margin-top:5mm;"><img src="ttinvoice/dks_500.png" style="height: 35mm;"/></td>
-    <td style="width: 60mm">&nbsp;</td>
-    <td style="width: 50mm;text-align: right;">
-      <div style="text-align: left;width: 50mm; font-size: 12pt;font: sans;">
-          <b>DKS s.à r.l.</b><br/>
-          4, rue Principale<br/>
-          L-3770 Tétange<br/><br/>
-          Tel: +352 691 504 574<br/>
-          info@saffran.lu / www.saffrans.lu<br/>
-      </div>
-    </td>
-    <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
-  </tr>
-</table>
-</body></html>
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2720.html b/bin/wkhtmltopdf/tmp/ttinvoice2720.html
deleted file mode 100644 (file)
index 81e1401..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="ISO-8859-1">
-  <title>Document</title>
-  <style>
-  div {
-  font-size: 18pt;
-}
-table {
-  font-size: 18pt;
-  border-spacing: unset;
-  border-collapse: unset;
-}
-td.invdatalbl {
-  font-weight: bold;
-  margin: 1mm; 
-  padding: 2mm;
-  border-collapse:collapse;;
-  width: 30mm;
-  background-color: #c6c6c6;
-}
-td.invdataval {
-  font-weight: normal; 
-  margin: 1mm; 
-  padding: 2mm;
-}
-.right{
-  text-align: right;
-}
-table#tbl_products {
-  border-spacing: 0;
-  border-collapse: 0;
-  margin-top: 10mm;
-  width: 100%;
-}
-table#tbl_products td {
-  padding: 2mm;
-  border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  border-bottom: 0px;
-  padding: 2mm;
-  background-color: #c6c6c6;
-}
-
-th.footer {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  background-color: unset;
-  border-bottom: 0px;
-  padding: 2mm;
-  text-align: right;
-}
-  </style>
-</head>
-<body>
-  
-  <table style="width: 100%;">
-    <tr>
-      <td style="width: 60%;"></td>
-      <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
-    </tr>
-    <tr>
-      <td style="vertical-align: top; font-size: 25pt;">
-        Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
-      </td>
-      <td >
-        <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
-          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
-          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
-        </table>
-      </td>
-    </tr>
-    
-  </table>
-  <table id="tbl_products" >
-    <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
-    <tbody>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>      
-    </tbody>
-    <tfoot>
-      <tr>
-        <th colspan="4" class="footer right">Total Netto</td>
-        <td colspan="2" class="right" >0000,00 ?</td>
-      </tr>
-      <tr>
-          <th colspan="4" class="footer right">MwSt. (17%)</td>
-          <td colspan="2" class="right" style="font-style: italic;">0000,00 ?</td>
-        </tr>
-        <tr>
-            <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
-            <td colspan="2" class="right" style="font-weight: bold;">0000,00 ?</td>
-          </tr>
-    </tfoot>
-  </table>
-  <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
-      <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2750.footer.html b/bin/wkhtmltopdf/tmp/ttinvoice2750.footer.html
deleted file mode 100644 (file)
index e398a66..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html><head><script>
-function subst() {
-    var vars = {};
-    var query_strings_from_url = document.location.search.substring(1).split('&');
-    for (var query_string in query_strings_from_url) {
-        if (query_strings_from_url.hasOwnProperty(query_string)) {
-            var temp_var = query_strings_from_url[query_string].split('=', 2);
-            vars[temp_var[0]] = decodeURI(temp_var[1]);
-        }
-    }
-    var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
-    for (var css_class in css_selector_classes) {
-        if (css_selector_classes.hasOwnProperty(css_class)) {
-            var element = document.getElementsByClassName(css_selector_classes[css_class]);
-            for (var j = 0; j < element.length; ++j) {
-                element[j].textContent = vars[css_selector_classes[css_class]];
-            }
-        }
-    }
-}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="width: 100%;" >
-  <tr><td colspan="2" style="text-align: center;"><b>DKS</b>, Société Ã  responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 25375617 - <b>No. Aut:</b> 10024550 / 0<br/>
-    <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
-  <tr>
-    <td></td>
-    <td style="text-align:right">
-      Seite <span class="page"></span>/<span class="topage"></span>
-    </td>
-  </tr>
-</table>
-</body></html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2750.header.html b/bin/wkhtmltopdf/tmp/ttinvoice2750.header.html
deleted file mode 100644 (file)
index 0bb10b3..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
-  <tr>
-    <td style="width: 100mm; margin-top:5mm;"><img src="ttinvoice/dks_500.png" style="height: 35mm;"/></td>
-    <td style="width: 60mm">&nbsp;</td>
-    <td style="width: 50mm;text-align: right;">
-      <div style="text-align: left;width: 50mm; font-size: 12pt;font: sans;">
-          <b>SAFFRAN IT Consulting S.à r.l.</b><br/>
-          4, rue Principale<br/>
-          L-3770 Tétange<br/><br/>
-          Tel: +352 691 504 574<br/>
-          info@saffran.lu / www.saffrans.lu<br/>
-      </div>
-    </td>
-    <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
-  </tr>
-</table>
-</body></html>
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2750.html b/bin/wkhtmltopdf/tmp/ttinvoice2750.html
deleted file mode 100644 (file)
index 81e1401..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="ISO-8859-1">
-  <title>Document</title>
-  <style>
-  div {
-  font-size: 18pt;
-}
-table {
-  font-size: 18pt;
-  border-spacing: unset;
-  border-collapse: unset;
-}
-td.invdatalbl {
-  font-weight: bold;
-  margin: 1mm; 
-  padding: 2mm;
-  border-collapse:collapse;;
-  width: 30mm;
-  background-color: #c6c6c6;
-}
-td.invdataval {
-  font-weight: normal; 
-  margin: 1mm; 
-  padding: 2mm;
-}
-.right{
-  text-align: right;
-}
-table#tbl_products {
-  border-spacing: 0;
-  border-collapse: 0;
-  margin-top: 10mm;
-  width: 100%;
-}
-table#tbl_products td {
-  padding: 2mm;
-  border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  border-bottom: 0px;
-  padding: 2mm;
-  background-color: #c6c6c6;
-}
-
-th.footer {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  background-color: unset;
-  border-bottom: 0px;
-  padding: 2mm;
-  text-align: right;
-}
-  </style>
-</head>
-<body>
-  
-  <table style="width: 100%;">
-    <tr>
-      <td style="width: 60%;"></td>
-      <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
-    </tr>
-    <tr>
-      <td style="vertical-align: top; font-size: 25pt;">
-        Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
-      </td>
-      <td >
-        <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
-          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
-          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
-        </table>
-      </td>
-    </tr>
-    
-  </table>
-  <table id="tbl_products" >
-    <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
-    <tbody>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>      
-    </tbody>
-    <tfoot>
-      <tr>
-        <th colspan="4" class="footer right">Total Netto</td>
-        <td colspan="2" class="right" >0000,00 ?</td>
-      </tr>
-      <tr>
-          <th colspan="4" class="footer right">MwSt. (17%)</td>
-          <td colspan="2" class="right" style="font-style: italic;">0000,00 ?</td>
-        </tr>
-        <tr>
-            <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
-            <td colspan="2" class="right" style="font-weight: bold;">0000,00 ?</td>
-          </tr>
-    </tfoot>
-  </table>
-  <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
-      <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2805.header.html b/bin/wkhtmltopdf/tmp/ttinvoice2805.header.html
deleted file mode 100644 (file)
index 067372a..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
-  <tr>
-    <td style="width: 100mm; margin-top:5mm;"><img src="ttinvoice/dks_500.png" style="height: 35mm;"/></td>
-    <td style="width: 40mm">&nbsp;</td>
-    <td style="width: 70mm;text-align: right;">
-      <div style="text-align: left;width: 7'mm; font-size: 12pt;font: sans;">
-          <b>SAFFRAN IT Consulting S.à r.l.</b><br/>
-          4, rue Principale<br/>
-          L-3770 Tétange<br/><br/>
-          Tel: +352 691 504 574<br/>
-          info@saffran.lu / www.saffrans.lu<br/>
-      </div>
-    </td>
-    <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
-  </tr>
-</table>
-</body></html>
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2805.html b/bin/wkhtmltopdf/tmp/ttinvoice2805.html
deleted file mode 100644 (file)
index 81e1401..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="ISO-8859-1">
-  <title>Document</title>
-  <style>
-  div {
-  font-size: 18pt;
-}
-table {
-  font-size: 18pt;
-  border-spacing: unset;
-  border-collapse: unset;
-}
-td.invdatalbl {
-  font-weight: bold;
-  margin: 1mm; 
-  padding: 2mm;
-  border-collapse:collapse;;
-  width: 30mm;
-  background-color: #c6c6c6;
-}
-td.invdataval {
-  font-weight: normal; 
-  margin: 1mm; 
-  padding: 2mm;
-}
-.right{
-  text-align: right;
-}
-table#tbl_products {
-  border-spacing: 0;
-  border-collapse: 0;
-  margin-top: 10mm;
-  width: 100%;
-}
-table#tbl_products td {
-  padding: 2mm;
-  border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  border-bottom: 0px;
-  padding: 2mm;
-  background-color: #c6c6c6;
-}
-
-th.footer {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  background-color: unset;
-  border-bottom: 0px;
-  padding: 2mm;
-  text-align: right;
-}
-  </style>
-</head>
-<body>
-  
-  <table style="width: 100%;">
-    <tr>
-      <td style="width: 60%;"></td>
-      <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
-    </tr>
-    <tr>
-      <td style="vertical-align: top; font-size: 25pt;">
-        Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
-      </td>
-      <td >
-        <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
-          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
-          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
-        </table>
-      </td>
-    </tr>
-    
-  </table>
-  <table id="tbl_products" >
-    <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
-    <tbody>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>      
-    </tbody>
-    <tfoot>
-      <tr>
-        <th colspan="4" class="footer right">Total Netto</td>
-        <td colspan="2" class="right" >0000,00 ?</td>
-      </tr>
-      <tr>
-          <th colspan="4" class="footer right">MwSt. (17%)</td>
-          <td colspan="2" class="right" style="font-style: italic;">0000,00 ?</td>
-        </tr>
-        <tr>
-            <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
-            <td colspan="2" class="right" style="font-weight: bold;">0000,00 ?</td>
-          </tr>
-    </tfoot>
-  </table>
-  <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
-      <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2823.header.html b/bin/wkhtmltopdf/tmp/ttinvoice2823.header.html
deleted file mode 100644 (file)
index 067372a..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
-  <tr>
-    <td style="width: 100mm; margin-top:5mm;"><img src="ttinvoice/dks_500.png" style="height: 35mm;"/></td>
-    <td style="width: 40mm">&nbsp;</td>
-    <td style="width: 70mm;text-align: right;">
-      <div style="text-align: left;width: 7'mm; font-size: 12pt;font: sans;">
-          <b>SAFFRAN IT Consulting S.à r.l.</b><br/>
-          4, rue Principale<br/>
-          L-3770 Tétange<br/><br/>
-          Tel: +352 691 504 574<br/>
-          info@saffran.lu / www.saffrans.lu<br/>
-      </div>
-    </td>
-    <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
-  </tr>
-</table>
-</body></html>
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2823.html b/bin/wkhtmltopdf/tmp/ttinvoice2823.html
deleted file mode 100644 (file)
index 81e1401..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="ISO-8859-1">
-  <title>Document</title>
-  <style>
-  div {
-  font-size: 18pt;
-}
-table {
-  font-size: 18pt;
-  border-spacing: unset;
-  border-collapse: unset;
-}
-td.invdatalbl {
-  font-weight: bold;
-  margin: 1mm; 
-  padding: 2mm;
-  border-collapse:collapse;;
-  width: 30mm;
-  background-color: #c6c6c6;
-}
-td.invdataval {
-  font-weight: normal; 
-  margin: 1mm; 
-  padding: 2mm;
-}
-.right{
-  text-align: right;
-}
-table#tbl_products {
-  border-spacing: 0;
-  border-collapse: 0;
-  margin-top: 10mm;
-  width: 100%;
-}
-table#tbl_products td {
-  padding: 2mm;
-  border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  border-bottom: 0px;
-  padding: 2mm;
-  background-color: #c6c6c6;
-}
-
-th.footer {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  background-color: unset;
-  border-bottom: 0px;
-  padding: 2mm;
-  text-align: right;
-}
-  </style>
-</head>
-<body>
-  
-  <table style="width: 100%;">
-    <tr>
-      <td style="width: 60%;"></td>
-      <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
-    </tr>
-    <tr>
-      <td style="vertical-align: top; font-size: 25pt;">
-        Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
-      </td>
-      <td >
-        <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
-          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
-          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
-        </table>
-      </td>
-    </tr>
-    
-  </table>
-  <table id="tbl_products" >
-    <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
-    <tbody>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>      
-    </tbody>
-    <tfoot>
-      <tr>
-        <th colspan="4" class="footer right">Total Netto</td>
-        <td colspan="2" class="right" >0000,00 ?</td>
-      </tr>
-      <tr>
-          <th colspan="4" class="footer right">MwSt. (17%)</td>
-          <td colspan="2" class="right" style="font-style: italic;">0000,00 ?</td>
-        </tr>
-        <tr>
-            <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
-            <td colspan="2" class="right" style="font-weight: bold;">0000,00 ?</td>
-          </tr>
-    </tfoot>
-  </table>
-  <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
-      <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2853.footer.html b/bin/wkhtmltopdf/tmp/ttinvoice2853.footer.html
deleted file mode 100644 (file)
index fa11876..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html><head><script>
-function subst() {
-    var vars = {};
-    var query_strings_from_url = document.location.search.substring(1).split('&');
-    for (var query_string in query_strings_from_url) {
-        if (query_strings_from_url.hasOwnProperty(query_string)) {
-            var temp_var = query_strings_from_url[query_string].split('=', 2);
-            vars[temp_var[0]] = decodeURI(temp_var[1]);
-        }
-    }
-    var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
-    for (var css_class in css_selector_classes) {
-        if (css_selector_classes.hasOwnProperty(css_class)) {
-            var element = document.getElementsByClassName(css_selector_classes[css_class]);
-            for (var j = 0; j < element.length; ++j) {
-                element[j].textContent = vars[css_selector_classes[css_class]];
-            }
-        }
-    }
-}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="width: 100%;" >
-  <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société Ã  responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
-    <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
-  <tr>
-    <td></td>
-    <td style="text-align:right">
-      Seite <span class="page"></span>/<span class="topage"></span>
-    </td>
-  </tr>
-</table>
-</body></html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2853.header.html b/bin/wkhtmltopdf/tmp/ttinvoice2853.header.html
deleted file mode 100644 (file)
index 80786df..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html><head>
-
-</head><body style="border:0; margin: 0;" o>
-<table style="width: 100%;">
-  <tr>
-    <td style="width: 100mm; margin-top:5mm;"><img src="ttinvoice/dks_500.png" style="height: 35mm;"/></td>
-    <td style="width: 50mm">&nbsp;</td>
-    <td style="width: 60mm;text-align: right;">
-      <div style="text-align: left;width: 60mm; font-size: 12pt;font: sans;">
-          <b>SAFFRAN IT Consulting S.à r.l.</b><br/>
-          4, rue Principale<br/>
-          L-3770 Tétange<br/><br/>
-          Tel: +352 691 504 574<br/>
-          info@saffran.lu / www.saffrans.lu<br/>
-      </div>
-    </td>
-    <tr><td style="text-align: left;">SAFFRAN IT Consulting - <b>Simplify IT</b></td><td></td><td></td></tr>
-  </tr>
-</table>
-</body></html>
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2853.html b/bin/wkhtmltopdf/tmp/ttinvoice2853.html
deleted file mode 100644 (file)
index 81e1401..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="ISO-8859-1">
-  <title>Document</title>
-  <style>
-  div {
-  font-size: 18pt;
-}
-table {
-  font-size: 18pt;
-  border-spacing: unset;
-  border-collapse: unset;
-}
-td.invdatalbl {
-  font-weight: bold;
-  margin: 1mm; 
-  padding: 2mm;
-  border-collapse:collapse;;
-  width: 30mm;
-  background-color: #c6c6c6;
-}
-td.invdataval {
-  font-weight: normal; 
-  margin: 1mm; 
-  padding: 2mm;
-}
-.right{
-  text-align: right;
-}
-table#tbl_products {
-  border-spacing: 0;
-  border-collapse: 0;
-  margin-top: 10mm;
-  width: 100%;
-}
-table#tbl_products td {
-  padding: 2mm;
-  border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  border-bottom: 0px;
-  padding: 2mm;
-  background-color: #c6c6c6;
-}
-
-th.footer {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  background-color: unset;
-  border-bottom: 0px;
-  padding: 2mm;
-  text-align: right;
-}
-  </style>
-</head>
-<body>
-  
-  <table style="width: 100%;">
-    <tr>
-      <td style="width: 60%;"></td>
-      <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
-    </tr>
-    <tr>
-      <td style="vertical-align: top; font-size: 25pt;">
-        Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
-      </td>
-      <td >
-        <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
-          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
-          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
-        </table>
-      </td>
-    </tr>
-    
-  </table>
-  <table id="tbl_products" >
-    <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
-    <tbody>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>      
-    </tbody>
-    <tfoot>
-      <tr>
-        <th colspan="4" class="footer right">Total Netto</td>
-        <td colspan="2" class="right" >0000,00 ?</td>
-      </tr>
-      <tr>
-          <th colspan="4" class="footer right">MwSt. (17%)</td>
-          <td colspan="2" class="right" style="font-style: italic;">0000,00 ?</td>
-        </tr>
-        <tr>
-            <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
-            <td colspan="2" class="right" style="font-weight: bold;">0000,00 ?</td>
-          </tr>
-    </tfoot>
-  </table>
-  <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
-      <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2981.footer.html b/bin/wkhtmltopdf/tmp/ttinvoice2981.footer.html
deleted file mode 100644 (file)
index fa11876..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html><head><script>
-function subst() {
-    var vars = {};
-    var query_strings_from_url = document.location.search.substring(1).split('&');
-    for (var query_string in query_strings_from_url) {
-        if (query_strings_from_url.hasOwnProperty(query_string)) {
-            var temp_var = query_strings_from_url[query_string].split('=', 2);
-            vars[temp_var[0]] = decodeURI(temp_var[1]);
-        }
-    }
-    var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
-    for (var css_class in css_selector_classes) {
-        if (css_selector_classes.hasOwnProperty(css_class)) {
-            var element = document.getElementsByClassName(css_selector_classes[css_class]);
-            for (var j = 0; j < element.length; ++j) {
-                element[j].textContent = vars[css_selector_classes[css_class]];
-            }
-        }
-    }
-}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="width: 100%;" >
-  <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société Ã  responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
-    <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
-  <tr>
-    <td></td>
-    <td style="text-align:right">
-      Seite <span class="page"></span>/<span class="topage"></span>
-    </td>
-  </tr>
-</table>
-</body></html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/tmp/ttinvoice2981.html b/bin/wkhtmltopdf/tmp/ttinvoice2981.html
deleted file mode 100644 (file)
index 81e1401..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="ISO-8859-1">
-  <title>Document</title>
-  <style>
-  div {
-  font-size: 18pt;
-}
-table {
-  font-size: 18pt;
-  border-spacing: unset;
-  border-collapse: unset;
-}
-td.invdatalbl {
-  font-weight: bold;
-  margin: 1mm; 
-  padding: 2mm;
-  border-collapse:collapse;;
-  width: 30mm;
-  background-color: #c6c6c6;
-}
-td.invdataval {
-  font-weight: normal; 
-  margin: 1mm; 
-  padding: 2mm;
-}
-.right{
-  text-align: right;
-}
-table#tbl_products {
-  border-spacing: 0;
-  border-collapse: 0;
-  margin-top: 10mm;
-  width: 100%;
-}
-table#tbl_products td {
-  padding: 2mm;
-  border-bottom: 1px solid black;
-}
-
-table#tbl_products th {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  border-bottom: 0px;
-  padding: 2mm;
-  background-color: #c6c6c6;
-}
-
-th.footer {
-  margin: 1mm; 
-  border: 1px solid #fff;
-  background-color: unset;
-  border-bottom: 0px;
-  padding: 2mm;
-  text-align: right;
-}
-  </style>
-</head>
-<body>
-  
-  <table style="width: 100%;">
-    <tr>
-      <td style="width: 60%;"></td>
-      <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
-    </tr>
-    <tr>
-      <td style="vertical-align: top; font-size: 25pt;">
-        Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
-      </td>
-      <td >
-        <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
-          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
-          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
-          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
-        </table>
-      </td>
-    </tr>
-    
-  </table>
-  <table id="tbl_products" >
-    <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
-    <tbody>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>
-      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 ?</td><td class="right">0,00 ?</td></tr>      
-    </tbody>
-    <tfoot>
-      <tr>
-        <th colspan="4" class="footer right">Total Netto</td>
-        <td colspan="2" class="right" >0000,00 ?</td>
-      </tr>
-      <tr>
-          <th colspan="4" class="footer right">MwSt. (17%)</td>
-          <td colspan="2" class="right" style="font-style: italic;">0000,00 ?</td>
-        </tr>
-        <tr>
-            <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
-            <td colspan="2" class="right" style="font-weight: bold;">0000,00 ?</td>
-          </tr>
-    </tfoot>
-  </table>
-  <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
-      <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
-</body>
-</html>
\ No newline at end of file
index 7392859..c0d727d 100755 (executable)
Binary files a/data/invoicejournal/dksbuchhaltung.sqlite and b/data/invoicejournal/dksbuchhaltung.sqlite differ
diff --git a/data/invoicejournal/templates/invoices/dks-deutsch.conf b/data/invoicejournal/templates/invoices/dks-deutsch.conf
new file mode 100644 (file)
index 0000000..d5f503a
--- /dev/null
@@ -0,0 +1,12 @@
+PDF_TOP="40mm"
+PDF_BOTTOM="20mm"
+PDF_LEFT="20mm"
+PDF_RIGHT="10mm"
+PDF_SIZE="A4"
+PDF_ORIENTATION="Portrait"
+PDF_ENGINE="Template::Toolkit"
+PDF_ENCODING="UTF-8"
+TEMPLATE_DSN=""
+TEMPLATE_DBUSER=""
+TEMPLATE_DBPASSWORD=""
+REPORT_NAME="DKS - deutsch"
\ No newline at end of file
@@ -1,5 +1,8 @@
 <!DOCTYPE html>
-<html><head><script>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
 function subst() {
     var vars = {};
     var query_strings_from_url = document.location.search.substring(1).split('&');
@@ -19,9 +22,10 @@ function subst() {
         }
     }
 }
-</script></head><body style="border:0; margin: 0;" onload="subst()">
+</script></head>
+<body style="border:0; margin: 0;" onload="subst()">
 <table style="width: 100%;" >
-  <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société Ã  responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
+  <tr><td colspan="2" style="text-align: center;"><b>SAFFRAN IT Consulting s.à r.l.</b> ist eine Handelsbezeichnung von<br/> <b>DKS</b>, Société Ã  responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 2537 5617 - <b>No. Aut:</b> 10024550 / 0<br/>
     <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
   <tr>
     <td></td>
diff --git a/data/invoicejournal/templates/invoices/dks-deutsch.header.tt b/data/invoicejournal/templates/invoices/dks-deutsch.header.tt
new file mode 100644 (file)
index 0000000..8e40350
--- /dev/null
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html><head>
+<meta charset="UTF-8">
+</head><body style="border:0; margin: 0;" o>
+<table style="width: 100%;">
+  <tr>
+    <td style="width: 150mm; margin-top:5mm;"><img src="ttinvoice/sitc.png" style="height: 35mm;"/></td>
+    <td style="width: 60mm;text-align: right;">
+      <div style="text-align: left;width: 60mm; font-size: 12pt;font: sans;">
+          <b>SAFFRAN IT Consulting S.à r.l.</b><br/>
+          4, rue Principale<br/>
+          L-3770 Tétange<br/><br/>
+          Tel: +352 691 504 574<br/>
+          info@saffran.lu / www.saffran.lu<br/>
+      </div>
+    </td>
+    <tr><td style="text-align: left;"></td><td></td></tr>
+  </tr>
+</table>
+</body></html>
diff --git a/data/invoicejournal/templates/invoices/dks-deutsch.tt b/data/invoicejournal/templates/invoices/dks-deutsch.tt
new file mode 100644 (file)
index 0000000..93f96d0
--- /dev/null
@@ -0,0 +1,126 @@
+[% USE DBI %]
+[% USE dksdb = DBI(dsn, dbuser, dbpassword) %]
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Invoice</title>
+  <style>
+  div {
+  font-size: 18pt;
+}
+table {
+  font-size: 18pt;
+  border-spacing: unset;
+  border-collapse: unset;
+}
+td.invdatalbl {
+  font-weight: bold;
+  margin: 1mm; 
+  padding: 2mm;
+  border-collapse:collapse;;
+  width: 30mm;
+  background-color: #c6c6c6;
+}
+td.invdataval {
+  font-weight: normal; 
+  margin: 1mm; 
+  padding: 2mm;
+}
+.right{
+  text-align: right;
+}
+table#tbl_products {
+  border-spacing: 0;
+  border-collapse: 0;
+  margin-top: 10mm;
+  width: 100%;
+}
+table#tbl_products td {
+  padding: 2mm;
+  border-bottom: 1px solid black;
+}
+
+table#tbl_products th {
+  margin: 1mm; 
+  border: 1px solid #fff;
+  border-bottom: 0px;
+  padding: 2mm;
+  background-color: #c6c6c6;
+}
+
+th.footer {
+  margin: 1mm; 
+  border: 1px solid #fff;
+  background-color: unset;
+  border-bottom: 0px;
+  padding: 2mm;
+  text-align: right;
+}
+  </style>
+</head>
+<body>
+  [% qginv = dksdb.prepare("select * from vw_invoiceoutlist WHERE id= ?") %]
+  [% ginv = qginv.execute(id_invoice) %]
+  [% inv = ginv.get_all() %]
+  <table style="width: 100%;">
+    <tr>
+      <td style="width: 60%;"></td>
+      <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
+    </tr> 
+    <tr>
+      <td style="vertical-align: top; font-size: 25pt;">
+        [% inv.0.receipient %]<br/>[% inv.0.address %]<br>[% inv.0.zip %] [% inv.0.city %]<br/>[% inv.0.country %]<br/>
+      </td>
+      <td >
+        <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
+          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">[% inv.0.reference %]</td></tr>
+          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">[% inv.0.invoicedate %]</td> </tr>
+          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">[% inv.0.deadlinedate %]</td> </tr>
+          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">[% inv.0.ident %]</td> </tr>
+        </table>
+      </td>
+    </tr>
+    
+  </table>
+  [% qbookings = dksdb.prepare("SELECT id, id_invoice, quantity, unit, description, unitamount, netamount, taxamount, taxpercent, totalamount FROM vw_bookingoutlist where id_invoice= ?;") %]
+
+  <table id="tbl_products" >
+    <thead>
+      <tr>
+      <th>Produkt / Dienstleistung</th>
+      <th style="width: 25mm;" colspan="2">Anz.</th>
+      <th style="width: 25mm;">Einzel-Preis</th>
+      <th style="width: 25mm;">Netto-Summe</th>
+      </tr>
+    </thead>
+    <tbody>
+      [% FOREACH book = qbookings.execute(id_invoice) %]    
+      <tr>
+        <td>[% book.description %]</td>
+        <td class="right" style="width: 10mm;">[% book.quantity %]</td>
+        <td style="width: 15mm;">[% book.unit %]</td>
+        <td class="right">[% book.unitamount %] â‚¬</td>
+        <td class="right">[% book.netamount %] â‚¬</td>
+      </tr>
+      [% END %]
+          
+    </tbody>
+    <tfoot>
+      <tr>
+        <th colspan="4" class="footer right">Total Netto</td>
+        <td colspan="2" class="right" >[% inv.0.totalnet %] â‚¬</td>
+      </tr>
+      <tr>
+          <th colspan="4" class="footer right">MwSt. (17%)</td>
+          <td colspan="2" class="right" style="font-style: italic;">[% inv.0.totalvat %] â‚¬</td>
+        </tr>
+        <tr>
+            <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
+            <td colspan="2" class="right" style="font-weight: bold;">[% inv.0.totalgross %] â‚¬</td>
+          </tr>
+    </tfoot>
+  </table>
+  <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
+      <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/data2/dksbuchhaltung.sqlite b/data2/dksbuchhaltung.sqlite
new file mode 100755 (executable)
index 0000000..7392859
Binary files /dev/null and b/data2/dksbuchhaltung.sqlite differ
index df69740..dc58aa8 100644 (file)
--- a/dksnas.pl
+++ b/dksnas.pl
@@ -54,7 +54,7 @@ my $allapp = builder {
      }
    }
    closedir(API);
-   mount "/htdocs" => Plack::App::File->new(root => $RealBin."/htdocs",)->to_app;
+   mount "/htdocs" => Plack::App::File->new(root => $RealBin."/htdocs")->to_app;
   #  if (-e $cfgpath.'/'.$name.'.passwd'){
   #            enable "Auth::Basic", authenticator => \&authen_cb;     
   #  }
diff --git a/htdocs/css/invoicejournal.epic.css b/htdocs/css/invoicejournal.epic.css
deleted file mode 100644 (file)
index 21f884c..0000000
+++ /dev/null
@@ -1,8814 +0,0 @@
-/*----Fonts----*/
-
-@import url('https://fonts.googleapis.com/css?family=Roboto');
-
-
-/*----Bootstrap----*/
-
-:root {
-  --blue: #007bff;
-  --indigo: #6610f2;
-  --purple: #6f42c1;
-  --pink: #e83e8c;
-  --red: #dc3545;
-  --orange: #fd7e14;
-  --yellow: #ffc107;
-  --green: #28a745;
-  --teal: #20c997;
-  --cyan: #17a2b8;
-  --white: #fff;
-  --gray: #6c757d;
-  --gray-dark: #343a40;
-  --primary: #3a59b1;
-  --secondary: #6c757d;
-  --success: #22b24c;
-  --info: yellow;
-  --warning: #ffc107;
-  --danger: #fc3434;
-  --light: white;
-  --dark: #6a8ed3;
-  --breakpoint-xs: 0;
-  --breakpoint-sm: 576px;
-  --breakpoint-md: 768px;
-  --breakpoint-lg: 992px;
-  --breakpoint-xl: 1200px;
-  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
-  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
-}
-
-@media print {
-  *,
-  *::before,
-  *::after {
-    text-shadow: none !important;
-    box-shadow: none !important;
-  }
-  a:not(.btn) {
-    text-decoration: underline;
-  }
-  abbr[title]::after {
-    content: " (" attr(title) ")";
-  }
-  pre {
-    white-space: pre-wrap !important;
-  }
-  pre,
-  blockquote {
-    border: 1px solid #adb5bd;
-    page-break-inside: avoid;
-  }
-  thead {
-    display: table-header-group;
-  }
-  tr,
-  img {
-    page-break-inside: avoid;
-  }
-  p,
-  h2,
-  h3 {
-    orphans: 3;
-    widows: 3;
-  }
-  h2,
-  h3 {
-    page-break-after: avoid;
-  }
-  @page {
-    size: a3;
-  }
-  body {
-    min-width: 992px !important;
-  }
-  .container {
-    min-width: 992px !important;
-  }
-  .navbar {
-    display: none;
-  }
-  .badge {
-    border: 1px solid #000;
-  }
-  .table {
-    border-collapse: collapse !important;
-  }
-  .table td,
-  .table th {
-    background-color: #fff !important;
-  }
-  .table-bordered th,
-  .table-bordered td {
-    border: 1px solid #dee2e6 !important;
-  }
-  .table-dark {
-    color: inherit;
-  }
-  .table-dark th,
-  .table-dark td,
-  .table-dark thead th,
-  .table-dark tbody + tbody {
-    border-color: #dee2e6;
-  }
-  .table .thead-dark th {
-    color: inherit;
-    border-color: #dee2e6;
-  }
-}
-
-*,
-*::before,
-*::after {
-  box-sizing: border-box;
-}
-
-html {
-  font-family: sans-serif;
-  line-height: 1.15;
-  -webkit-text-size-adjust: 100%;
-  -ms-text-size-adjust: 100%;
-  -ms-overflow-style: scrollbar;
-  -webkit-tap-highlight-color: transparent;
-}
-
-@-ms-viewport {
-  width: device-width;
-}
-
-article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
-  display: block;
-}
-
-body {
-  margin: 0;
-  font-family: Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
-  font-size: 0.81rem;
-  font-weight: 400;
-  line-height: 1.5;
-  color: #212529;
-  text-align: left;
-  background-color: #fff;
-}
-
-[tabindex="-1"]:focus {
-  outline: 0 !important;
-}
-
-hr {
-  box-sizing: content-box;
-  height: 0;
-  overflow: visible;
-}
-
-h1, h2, h3, h4, h5, h6 {
-  margin-top: 0;
-  margin-bottom: 0.5rem;
-}
-
-p {
-  margin-top: 0;
-  margin-bottom: 1rem;
-}
-
-abbr[title],
-abbr[data-original-title] {
-  text-decoration: underline;
-  -webkit-text-decoration: underline dotted;
-  text-decoration: underline dotted;
-  cursor: help;
-  border-bottom: 0;
-}
-
-address {
-  margin-bottom: 1rem;
-  font-style: normal;
-  line-height: inherit;
-}
-
-ol,
-ul,
-dl {
-  margin-top: 0;
-  margin-bottom: 1rem;
-}
-
-ol ol,
-ul ul,
-ol ul,
-ul ol {
-  margin-bottom: 0;
-}
-
-dt {
-  font-weight: 700;
-}
-
-dd {
-  margin-bottom: .5rem;
-  margin-left: 0;
-}
-
-blockquote {
-  margin: 0 0 1rem;
-}
-
-dfn {
-  font-style: italic;
-}
-
-b,
-strong {
-  font-weight: bolder;
-}
-
-small {
-  font-size: 80%;
-}
-
-sub,
-sup {
-  position: relative;
-  font-size: 75%;
-  line-height: 0;
-  vertical-align: baseline;
-}
-
-sub {
-  bottom: -.25em;
-}
-
-sup {
-  top: -.5em;
-}
-
-a {
-  color: #3a59b1;
-  text-decoration: none;
-  background-color: transparent;
-  -webkit-text-decoration-skip: objects;
-}
-
-a:hover {
-  color: #273c77;
-  text-decoration: underline;
-}
-
-a:not([href]):not([tabindex]) {
-  color: inherit;
-  text-decoration: none;
-}
-
-a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
-  color: inherit;
-  text-decoration: none;
-}
-
-a:not([href]):not([tabindex]):focus {
-  outline: 0;
-}
-
-pre,
-code,
-kbd,
-samp {
-  font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
-  font-size: 1em;
-}
-
-pre {
-  margin-top: 0;
-  margin-bottom: 1rem;
-  overflow: auto;
-  -ms-overflow-style: scrollbar;
-}
-
-figure {
-  margin: 0 0 1rem;
-}
-
-img {
-  vertical-align: middle;
-  border-style: none;
-}
-
-svg {
-  overflow: hidden;
-  vertical-align: middle;
-}
-
-table {
-  border-collapse: collapse;
-}
-
-caption {
-  padding-top: 0.5rem;
-  padding-bottom: 0.5rem;
-  color: #6c757d;
-  text-align: left;
-  caption-side: bottom;
-}
-
-th {
-  text-align: inherit;
-}
-
-label {
-  display: inline-block;
-  margin-bottom: 0.5rem;
-}
-
-button {
-  border-radius: 0;
-}
-
-button:focus {
-  outline: 1px dotted;
-  outline: 5px auto -webkit-focus-ring-color;
-}
-
-input,
-button,
-select,
-optgroup,
-textarea {
-  margin: 0;
-  font-family: inherit;
-  font-size: inherit;
-  line-height: inherit;
-}
-
-button,
-input {
-  overflow: visible;
-}
-
-button,
-select {
-  text-transform: none;
-}
-
-button,
-html [type="button"],
-[type="reset"],
-[type="submit"] {
-  -webkit-appearance: button;
-}
-
-button::-moz-focus-inner,
-[type="button"]::-moz-focus-inner,
-[type="reset"]::-moz-focus-inner,
-[type="submit"]::-moz-focus-inner {
-  padding: 0;
-  border-style: none;
-}
-
-input[type="radio"],
-input[type="checkbox"] {
-  box-sizing: border-box;
-  padding: 0;
-}
-
-input[type="date"],
-input[type="time"],
-input[type="datetime-local"],
-input[type="month"] {
-  -webkit-appearance: listbox;
-}
-
-textarea {
-  overflow: auto;
-  resize: vertical;
-}
-
-fieldset {
-  min-width: 0;
-  padding: 0;
-  margin: 0;
-  border: 0;
-}
-
-legend {
-  display: block;
-  width: 100%;
-  max-width: 100%;
-  padding: 0;
-  margin-bottom: .5rem;
-  font-size: 1.5rem;
-  line-height: inherit;
-  color: inherit;
-  white-space: normal;
-}
-
-progress {
-  vertical-align: baseline;
-}
-
-[type="number"]::-webkit-inner-spin-button,
-[type="number"]::-webkit-outer-spin-button {
-  height: auto;
-}
-
-[type="search"] {
-  outline-offset: -2px;
-  -webkit-appearance: none;
-}
-
-[type="search"]::-webkit-search-cancel-button,
-[type="search"]::-webkit-search-decoration {
-  -webkit-appearance: none;
-}
-
-::-webkit-file-upload-button {
-  font: inherit;
-  -webkit-appearance: button;
-}
-
-output {
-  display: inline-block;
-}
-
-summary {
-  display: list-item;
-  cursor: pointer;
-}
-
-template {
-  display: none;
-}
-
-[hidden] {
-  display: none !important;
-}
-
-h1, h2, h3, h4, h5, h6,
-.h1, .h2, .h3, .h4, .h5, .h6 {
-  margin-bottom: 0.5rem;
-  font-family: inherit;
-  font-weight: 200;
-  line-height: 1.1;
-  color: inherit;
-}
-
-h1, .h1 {
-  font-size: 1.5rem;
-}
-
-h2, .h2 {
-  font-size: 1.25rem;
-}
-
-h3, .h3 {
-  font-size: 1.4175rem;
-}
-
-h4, .h4 {
-  font-size: 1.215rem;
-}
-
-h5, .h5 {
-  font-size: 1.0125rem;
-}
-
-h6, .h6 {
-  font-size: 0.81rem;
-}
-
-.lead {
-  font-size: 1.0125rem;
-  font-weight: 300;
-}
-
-.display-1 {
-  font-size: 6rem;
-  font-weight: 300;
-  line-height: 1.1;
-}
-
-.display-2 {
-  font-size: 5.5rem;
-  font-weight: 300;
-  line-height: 1.1;
-}
-
-.display-3 {
-  font-size: 4.5rem;
-  font-weight: 300;
-  line-height: 1.1;
-}
-
-.display-4 {
-  font-size: 3.5rem;
-  font-weight: 300;
-  line-height: 1.1;
-}
-
-hr {
-  margin-top: 1rem;
-  margin-bottom: 1rem;
-  border: 0;
-  border-top: 1px solid rgba(0, 0, 0, 0.1);
-}
-
-small,
-.small {
-  font-size: 80%;
-  font-weight: 400;
-}
-
-mark,
-.mark {
-  padding: 0.2em;
-  background-color: #fcf8e3;
-}
-
-.list-unstyled {
-  padding-left: 0;
-  list-style: none;
-}
-
-.list-inline {
-  padding-left: 0;
-  list-style: none;
-}
-
-.list-inline-item {
-  display: inline-block;
-}
-
-.list-inline-item:not(:last-child) {
-  margin-right: 0.5rem;
-}
-
-.initialism {
-  font-size: 90%;
-  text-transform: uppercase;
-}
-
-.blockquote {
-  margin-bottom: 1rem;
-  font-size: 1.0125rem;
-}
-
-.blockquote-footer {
-  display: block;
-  font-size: 80%;
-  color: #6c757d;
-}
-
-.blockquote-footer::before {
-  content: "\2014 \00A0";
-}
-
-.img-fluid {
-  max-width: 100%;
-  height: auto;
-}
-
-.img-thumbnail {
-  padding: 0.25rem;
-  background-color: #fff;
-  border: 1px solid #dee2e6;
-  max-width: 100%;
-  height: auto;
-}
-
-.figure {
-  display: inline-block;
-}
-
-.figure-img {
-  margin-bottom: 0.5rem;
-  line-height: 1;
-}
-
-.figure-caption {
-  font-size: 90%;
-  color: #6c757d;
-}
-
-code {
-  font-size: 87.5%;
-  color: #e83e8c;
-  word-break: break-word;
-}
-
-a > code {
-  color: inherit;
-}
-
-kbd {
-  padding: 0.2rem 0.4rem;
-  font-size: 87.5%;
-  color: #fff;
-  background-color: #212529;
-}
-
-kbd kbd {
-  padding: 0;
-  font-size: 100%;
-  font-weight: 700;
-}
-
-pre {
-  display: block;
-  font-size: 87.5%;
-  color: #212529;
-}
-
-pre code {
-  font-size: inherit;
-  color: inherit;
-  word-break: normal;
-}
-
-.pre-scrollable {
-  max-height: 340px;
-  overflow-y: scroll;
-}
-
-.container {
-  width: 100%;
-  padding-right: 15px;
-  padding-left: 15px;
-  margin-right: auto;
-  margin-left: auto;
-}
-
-@media (min-width: 576px) {
-  .container {
-    max-width: 540px;
-  }
-}
-
-@media (min-width: 768px) {
-  .container {
-    max-width: 720px;
-  }
-}
-
-@media (min-width: 992px) {
-  .container {
-    max-width: 960px;
-  }
-}
-
-@media (min-width: 1200px) {
-  .container {
-    max-width: 1140px;
-  }
-}
-
-.container-fluid {
-  width: 100%;
-  padding-right: 15px;
-  padding-left: 15px;
-  margin-right: auto;
-  margin-left: auto;
-}
-
-.row {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-wrap: wrap;
-  flex-wrap: wrap;
-  margin-right: -15px;
-  margin-left: -15px;
-}
-
-.no-gutters {
-  margin-right: 0;
-  margin-left: 0;
-}
-
-.no-gutters > .col,
-.no-gutters > [class*="col-"] {
-  padding-right: 0;
-  padding-left: 0;
-}
-
-.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
-.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
-.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
-.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
-.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
-.col-xl-auto {
-  position: relative;
-  width: 100%;
-  min-height: 1px;
-  padding-right: 15px;
-  padding-left: 15px;
-}
-
-.col {
-  -ms-flex-preferred-size: 0;
-  flex-basis: 0;
-  -ms-flex-positive: 1;
-  flex-grow: 1;
-  max-width: 100%;
-}
-
-.col-auto {
-  -ms-flex: 0 0 auto;
-  flex: 0 0 auto;
-  width: auto;
-  max-width: none;
-}
-
-.col-1 {
-  -ms-flex: 0 0 8.333333%;
-  flex: 0 0 8.333333%;
-  max-width: 8.333333%;
-}
-
-.col-2 {
-  -ms-flex: 0 0 16.666667%;
-  flex: 0 0 16.666667%;
-  max-width: 16.666667%;
-}
-
-.col-3 {
-  -ms-flex: 0 0 25%;
-  flex: 0 0 25%;
-  max-width: 25%;
-}
-
-.col-4 {
-  -ms-flex: 0 0 33.333333%;
-  flex: 0 0 33.333333%;
-  max-width: 33.333333%;
-}
-
-.col-5 {
-  -ms-flex: 0 0 41.666667%;
-  flex: 0 0 41.666667%;
-  max-width: 41.666667%;
-}
-
-.col-6 {
-  -ms-flex: 0 0 50%;
-  flex: 0 0 50%;
-  max-width: 50%;
-}
-
-.col-7 {
-  -ms-flex: 0 0 58.333333%;
-  flex: 0 0 58.333333%;
-  max-width: 58.333333%;
-}
-
-.col-8 {
-  -ms-flex: 0 0 66.666667%;
-  flex: 0 0 66.666667%;
-  max-width: 66.666667%;
-}
-
-.col-9 {
-  -ms-flex: 0 0 75%;
-  flex: 0 0 75%;
-  max-width: 75%;
-}
-
-.col-10 {
-  -ms-flex: 0 0 83.333333%;
-  flex: 0 0 83.333333%;
-  max-width: 83.333333%;
-}
-
-.col-11 {
-  -ms-flex: 0 0 91.666667%;
-  flex: 0 0 91.666667%;
-  max-width: 91.666667%;
-}
-
-.col-12 {
-  -ms-flex: 0 0 100%;
-  flex: 0 0 100%;
-  max-width: 100%;
-}
-
-.order-first {
-  -ms-flex-order: -1;
-  order: -1;
-}
-
-.order-last {
-  -ms-flex-order: 13;
-  order: 13;
-}
-
-.order-0 {
-  -ms-flex-order: 0;
-  order: 0;
-}
-
-.order-1 {
-  -ms-flex-order: 1;
-  order: 1;
-}
-
-.order-2 {
-  -ms-flex-order: 2;
-  order: 2;
-}
-
-.order-3 {
-  -ms-flex-order: 3;
-  order: 3;
-}
-
-.order-4 {
-  -ms-flex-order: 4;
-  order: 4;
-}
-
-.order-5 {
-  -ms-flex-order: 5;
-  order: 5;
-}
-
-.order-6 {
-  -ms-flex-order: 6;
-  order: 6;
-}
-
-.order-7 {
-  -ms-flex-order: 7;
-  order: 7;
-}
-
-.order-8 {
-  -ms-flex-order: 8;
-  order: 8;
-}
-
-.order-9 {
-  -ms-flex-order: 9;
-  order: 9;
-}
-
-.order-10 {
-  -ms-flex-order: 10;
-  order: 10;
-}
-
-.order-11 {
-  -ms-flex-order: 11;
-  order: 11;
-}
-
-.order-12 {
-  -ms-flex-order: 12;
-  order: 12;
-}
-
-.offset-1 {
-  margin-left: 8.333333%;
-}
-
-.offset-2 {
-  margin-left: 16.666667%;
-}
-
-.offset-3 {
-  margin-left: 25%;
-}
-
-.offset-4 {
-  margin-left: 33.333333%;
-}
-
-.offset-5 {
-  margin-left: 41.666667%;
-}
-
-.offset-6 {
-  margin-left: 50%;
-}
-
-.offset-7 {
-  margin-left: 58.333333%;
-}
-
-.offset-8 {
-  margin-left: 66.666667%;
-}
-
-.offset-9 {
-  margin-left: 75%;
-}
-
-.offset-10 {
-  margin-left: 83.333333%;
-}
-
-.offset-11 {
-  margin-left: 91.666667%;
-}
-
-@media (min-width: 576px) {
-  .col-sm {
-    -ms-flex-preferred-size: 0;
-    flex-basis: 0;
-    -ms-flex-positive: 1;
-    flex-grow: 1;
-    max-width: 100%;
-  }
-  .col-sm-auto {
-    -ms-flex: 0 0 auto;
-    flex: 0 0 auto;
-    width: auto;
-    max-width: none;
-  }
-  .col-sm-1 {
-    -ms-flex: 0 0 8.333333%;
-    flex: 0 0 8.333333%;
-    max-width: 8.333333%;
-  }
-  .col-sm-2 {
-    -ms-flex: 0 0 16.666667%;
-    flex: 0 0 16.666667%;
-    max-width: 16.666667%;
-  }
-  .col-sm-3 {
-    -ms-flex: 0 0 25%;
-    flex: 0 0 25%;
-    max-width: 25%;
-  }
-  .col-sm-4 {
-    -ms-flex: 0 0 33.333333%;
-    flex: 0 0 33.333333%;
-    max-width: 33.333333%;
-  }
-  .col-sm-5 {
-    -ms-flex: 0 0 41.666667%;
-    flex: 0 0 41.666667%;
-    max-width: 41.666667%;
-  }
-  .col-sm-6 {
-    -ms-flex: 0 0 50%;
-    flex: 0 0 50%;
-    max-width: 50%;
-  }
-  .col-sm-7 {
-    -ms-flex: 0 0 58.333333%;
-    flex: 0 0 58.333333%;
-    max-width: 58.333333%;
-  }
-  .col-sm-8 {
-    -ms-flex: 0 0 66.666667%;
-    flex: 0 0 66.666667%;
-    max-width: 66.666667%;
-  }
-  .col-sm-9 {
-    -ms-flex: 0 0 75%;
-    flex: 0 0 75%;
-    max-width: 75%;
-  }
-  .col-sm-10 {
-    -ms-flex: 0 0 83.333333%;
-    flex: 0 0 83.333333%;
-    max-width: 83.333333%;
-  }
-  .col-sm-11 {
-    -ms-flex: 0 0 91.666667%;
-    flex: 0 0 91.666667%;
-    max-width: 91.666667%;
-  }
-  .col-sm-12 {
-    -ms-flex: 0 0 100%;
-    flex: 0 0 100%;
-    max-width: 100%;
-  }
-  .order-sm-first {
-    -ms-flex-order: -1;
-    order: -1;
-  }
-  .order-sm-last {
-    -ms-flex-order: 13;
-    order: 13;
-  }
-  .order-sm-0 {
-    -ms-flex-order: 0;
-    order: 0;
-  }
-  .order-sm-1 {
-    -ms-flex-order: 1;
-    order: 1;
-  }
-  .order-sm-2 {
-    -ms-flex-order: 2;
-    order: 2;
-  }
-  .order-sm-3 {
-    -ms-flex-order: 3;
-    order: 3;
-  }
-  .order-sm-4 {
-    -ms-flex-order: 4;
-    order: 4;
-  }
-  .order-sm-5 {
-    -ms-flex-order: 5;
-    order: 5;
-  }
-  .order-sm-6 {
-    -ms-flex-order: 6;
-    order: 6;
-  }
-  .order-sm-7 {
-    -ms-flex-order: 7;
-    order: 7;
-  }
-  .order-sm-8 {
-    -ms-flex-order: 8;
-    order: 8;
-  }
-  .order-sm-9 {
-    -ms-flex-order: 9;
-    order: 9;
-  }
-  .order-sm-10 {
-    -ms-flex-order: 10;
-    order: 10;
-  }
-  .order-sm-11 {
-    -ms-flex-order: 11;
-    order: 11;
-  }
-  .order-sm-12 {
-    -ms-flex-order: 12;
-    order: 12;
-  }
-  .offset-sm-0 {
-    margin-left: 0;
-  }
-  .offset-sm-1 {
-    margin-left: 8.333333%;
-  }
-  .offset-sm-2 {
-    margin-left: 16.666667%;
-  }
-  .offset-sm-3 {
-    margin-left: 25%;
-  }
-  .offset-sm-4 {
-    margin-left: 33.333333%;
-  }
-  .offset-sm-5 {
-    margin-left: 41.666667%;
-  }
-  .offset-sm-6 {
-    margin-left: 50%;
-  }
-  .offset-sm-7 {
-    margin-left: 58.333333%;
-  }
-  .offset-sm-8 {
-    margin-left: 66.666667%;
-  }
-  .offset-sm-9 {
-    margin-left: 75%;
-  }
-  .offset-sm-10 {
-    margin-left: 83.333333%;
-  }
-  .offset-sm-11 {
-    margin-left: 91.666667%;
-  }
-}
-
-@media (min-width: 768px) {
-  .col-md {
-    -ms-flex-preferred-size: 0;
-    flex-basis: 0;
-    -ms-flex-positive: 1;
-    flex-grow: 1;
-    max-width: 100%;
-  }
-  .col-md-auto {
-    -ms-flex: 0 0 auto;
-    flex: 0 0 auto;
-    width: auto;
-    max-width: none;
-  }
-  .col-md-1 {
-    -ms-flex: 0 0 8.333333%;
-    flex: 0 0 8.333333%;
-    max-width: 8.333333%;
-  }
-  .col-md-2 {
-    -ms-flex: 0 0 16.666667%;
-    flex: 0 0 16.666667%;
-    max-width: 16.666667%;
-  }
-  .col-md-3 {
-    -ms-flex: 0 0 25%;
-    flex: 0 0 25%;
-    max-width: 25%;
-  }
-  .col-md-4 {
-    -ms-flex: 0 0 33.333333%;
-    flex: 0 0 33.333333%;
-    max-width: 33.333333%;
-  }
-  .col-md-5 {
-    -ms-flex: 0 0 41.666667%;
-    flex: 0 0 41.666667%;
-    max-width: 41.666667%;
-  }
-  .col-md-6 {
-    -ms-flex: 0 0 50%;
-    flex: 0 0 50%;
-    max-width: 50%;
-  }
-  .col-md-7 {
-    -ms-flex: 0 0 58.333333%;
-    flex: 0 0 58.333333%;
-    max-width: 58.333333%;
-  }
-  .col-md-8 {
-    -ms-flex: 0 0 66.666667%;
-    flex: 0 0 66.666667%;
-    max-width: 66.666667%;
-  }
-  .col-md-9 {
-    -ms-flex: 0 0 75%;
-    flex: 0 0 75%;
-    max-width: 75%;
-  }
-  .col-md-10 {
-    -ms-flex: 0 0 83.333333%;
-    flex: 0 0 83.333333%;
-    max-width: 83.333333%;
-  }
-  .col-md-11 {
-    -ms-flex: 0 0 91.666667%;
-    flex: 0 0 91.666667%;
-    max-width: 91.666667%;
-  }
-  .col-md-12 {
-    -ms-flex: 0 0 100%;
-    flex: 0 0 100%;
-    max-width: 100%;
-  }
-  .order-md-first {
-    -ms-flex-order: -1;
-    order: -1;
-  }
-  .order-md-last {
-    -ms-flex-order: 13;
-    order: 13;
-  }
-  .order-md-0 {
-    -ms-flex-order: 0;
-    order: 0;
-  }
-  .order-md-1 {
-    -ms-flex-order: 1;
-    order: 1;
-  }
-  .order-md-2 {
-    -ms-flex-order: 2;
-    order: 2;
-  }
-  .order-md-3 {
-    -ms-flex-order: 3;
-    order: 3;
-  }
-  .order-md-4 {
-    -ms-flex-order: 4;
-    order: 4;
-  }
-  .order-md-5 {
-    -ms-flex-order: 5;
-    order: 5;
-  }
-  .order-md-6 {
-    -ms-flex-order: 6;
-    order: 6;
-  }
-  .order-md-7 {
-    -ms-flex-order: 7;
-    order: 7;
-  }
-  .order-md-8 {
-    -ms-flex-order: 8;
-    order: 8;
-  }
-  .order-md-9 {
-    -ms-flex-order: 9;
-    order: 9;
-  }
-  .order-md-10 {
-    -ms-flex-order: 10;
-    order: 10;
-  }
-  .order-md-11 {
-    -ms-flex-order: 11;
-    order: 11;
-  }
-  .order-md-12 {
-    -ms-flex-order: 12;
-    order: 12;
-  }
-  .offset-md-0 {
-    margin-left: 0;
-  }
-  .offset-md-1 {
-    margin-left: 8.333333%;
-  }
-  .offset-md-2 {
-    margin-left: 16.666667%;
-  }
-  .offset-md-3 {
-    margin-left: 25%;
-  }
-  .offset-md-4 {
-    margin-left: 33.333333%;
-  }
-  .offset-md-5 {
-    margin-left: 41.666667%;
-  }
-  .offset-md-6 {
-    margin-left: 50%;
-  }
-  .offset-md-7 {
-    margin-left: 58.333333%;
-  }
-  .offset-md-8 {
-    margin-left: 66.666667%;
-  }
-  .offset-md-9 {
-    margin-left: 75%;
-  }
-  .offset-md-10 {
-    margin-left: 83.333333%;
-  }
-  .offset-md-11 {
-    margin-left: 91.666667%;
-  }
-}
-
-@media (min-width: 992px) {
-  .col-lg {
-    -ms-flex-preferred-size: 0;
-    flex-basis: 0;
-    -ms-flex-positive: 1;
-    flex-grow: 1;
-    max-width: 100%;
-  }
-  .col-lg-auto {
-    -ms-flex: 0 0 auto;
-    flex: 0 0 auto;
-    width: auto;
-    max-width: none;
-  }
-  .col-lg-1 {
-    -ms-flex: 0 0 8.333333%;
-    flex: 0 0 8.333333%;
-    max-width: 8.333333%;
-  }
-  .col-lg-2 {
-    -ms-flex: 0 0 16.666667%;
-    flex: 0 0 16.666667%;
-    max-width: 16.666667%;
-  }
-  .col-lg-3 {
-    -ms-flex: 0 0 25%;
-    flex: 0 0 25%;
-    max-width: 25%;
-  }
-  .col-lg-4 {
-    -ms-flex: 0 0 33.333333%;
-    flex: 0 0 33.333333%;
-    max-width: 33.333333%;
-  }
-  .col-lg-5 {
-    -ms-flex: 0 0 41.666667%;
-    flex: 0 0 41.666667%;
-    max-width: 41.666667%;
-  }
-  .col-lg-6 {
-    -ms-flex: 0 0 50%;
-    flex: 0 0 50%;
-    max-width: 50%;
-  }
-  .col-lg-7 {
-    -ms-flex: 0 0 58.333333%;
-    flex: 0 0 58.333333%;
-    max-width: 58.333333%;
-  }
-  .col-lg-8 {
-    -ms-flex: 0 0 66.666667%;
-    flex: 0 0 66.666667%;
-    max-width: 66.666667%;
-  }
-  .col-lg-9 {
-    -ms-flex: 0 0 75%;
-    flex: 0 0 75%;
-    max-width: 75%;
-  }
-  .col-lg-10 {
-    -ms-flex: 0 0 83.333333%;
-    flex: 0 0 83.333333%;
-    max-width: 83.333333%;
-  }
-  .col-lg-11 {
-    -ms-flex: 0 0 91.666667%;
-    flex: 0 0 91.666667%;
-    max-width: 91.666667%;
-  }
-  .col-lg-12 {
-    -ms-flex: 0 0 100%;
-    flex: 0 0 100%;
-    max-width: 100%;
-  }
-  .order-lg-first {
-    -ms-flex-order: -1;
-    order: -1;
-  }
-  .order-lg-last {
-    -ms-flex-order: 13;
-    order: 13;
-  }
-  .order-lg-0 {
-    -ms-flex-order: 0;
-    order: 0;
-  }
-  .order-lg-1 {
-    -ms-flex-order: 1;
-    order: 1;
-  }
-  .order-lg-2 {
-    -ms-flex-order: 2;
-    order: 2;
-  }
-  .order-lg-3 {
-    -ms-flex-order: 3;
-    order: 3;
-  }
-  .order-lg-4 {
-    -ms-flex-order: 4;
-    order: 4;
-  }
-  .order-lg-5 {
-    -ms-flex-order: 5;
-    order: 5;
-  }
-  .order-lg-6 {
-    -ms-flex-order: 6;
-    order: 6;
-  }
-  .order-lg-7 {
-    -ms-flex-order: 7;
-    order: 7;
-  }
-  .order-lg-8 {
-    -ms-flex-order: 8;
-    order: 8;
-  }
-  .order-lg-9 {
-    -ms-flex-order: 9;
-    order: 9;
-  }
-  .order-lg-10 {
-    -ms-flex-order: 10;
-    order: 10;
-  }
-  .order-lg-11 {
-    -ms-flex-order: 11;
-    order: 11;
-  }
-  .order-lg-12 {
-    -ms-flex-order: 12;
-    order: 12;
-  }
-  .offset-lg-0 {
-    margin-left: 0;
-  }
-  .offset-lg-1 {
-    margin-left: 8.333333%;
-  }
-  .offset-lg-2 {
-    margin-left: 16.666667%;
-  }
-  .offset-lg-3 {
-    margin-left: 25%;
-  }
-  .offset-lg-4 {
-    margin-left: 33.333333%;
-  }
-  .offset-lg-5 {
-    margin-left: 41.666667%;
-  }
-  .offset-lg-6 {
-    margin-left: 50%;
-  }
-  .offset-lg-7 {
-    margin-left: 58.333333%;
-  }
-  .offset-lg-8 {
-    margin-left: 66.666667%;
-  }
-  .offset-lg-9 {
-    margin-left: 75%;
-  }
-  .offset-lg-10 {
-    margin-left: 83.333333%;
-  }
-  .offset-lg-11 {
-    margin-left: 91.666667%;
-  }
-}
-
-@media (min-width: 1200px) {
-  .col-xl {
-    -ms-flex-preferred-size: 0;
-    flex-basis: 0;
-    -ms-flex-positive: 1;
-    flex-grow: 1;
-    max-width: 100%;
-  }
-  .col-xl-auto {
-    -ms-flex: 0 0 auto;
-    flex: 0 0 auto;
-    width: auto;
-    max-width: none;
-  }
-  .col-xl-1 {
-    -ms-flex: 0 0 8.333333%;
-    flex: 0 0 8.333333%;
-    max-width: 8.333333%;
-  }
-  .col-xl-2 {
-    -ms-flex: 0 0 16.666667%;
-    flex: 0 0 16.666667%;
-    max-width: 16.666667%;
-  }
-  .col-xl-3 {
-    -ms-flex: 0 0 25%;
-    flex: 0 0 25%;
-    max-width: 25%;
-  }
-  .col-xl-4 {
-    -ms-flex: 0 0 33.333333%;
-    flex: 0 0 33.333333%;
-    max-width: 33.333333%;
-  }
-  .col-xl-5 {
-    -ms-flex: 0 0 41.666667%;
-    flex: 0 0 41.666667%;
-    max-width: 41.666667%;
-  }
-  .col-xl-6 {
-    -ms-flex: 0 0 50%;
-    flex: 0 0 50%;
-    max-width: 50%;
-  }
-  .col-xl-7 {
-    -ms-flex: 0 0 58.333333%;
-    flex: 0 0 58.333333%;
-    max-width: 58.333333%;
-  }
-  .col-xl-8 {
-    -ms-flex: 0 0 66.666667%;
-    flex: 0 0 66.666667%;
-    max-width: 66.666667%;
-  }
-  .col-xl-9 {
-    -ms-flex: 0 0 75%;
-    flex: 0 0 75%;
-    max-width: 75%;
-  }
-  .col-xl-10 {
-    -ms-flex: 0 0 83.333333%;
-    flex: 0 0 83.333333%;
-    max-width: 83.333333%;
-  }
-  .col-xl-11 {
-    -ms-flex: 0 0 91.666667%;
-    flex: 0 0 91.666667%;
-    max-width: 91.666667%;
-  }
-  .col-xl-12 {
-    -ms-flex: 0 0 100%;
-    flex: 0 0 100%;
-    max-width: 100%;
-  }
-  .order-xl-first {
-    -ms-flex-order: -1;
-    order: -1;
-  }
-  .order-xl-last {
-    -ms-flex-order: 13;
-    order: 13;
-  }
-  .order-xl-0 {
-    -ms-flex-order: 0;
-    order: 0;
-  }
-  .order-xl-1 {
-    -ms-flex-order: 1;
-    order: 1;
-  }
-  .order-xl-2 {
-    -ms-flex-order: 2;
-    order: 2;
-  }
-  .order-xl-3 {
-    -ms-flex-order: 3;
-    order: 3;
-  }
-  .order-xl-4 {
-    -ms-flex-order: 4;
-    order: 4;
-  }
-  .order-xl-5 {
-    -ms-flex-order: 5;
-    order: 5;
-  }
-  .order-xl-6 {
-    -ms-flex-order: 6;
-    order: 6;
-  }
-  .order-xl-7 {
-    -ms-flex-order: 7;
-    order: 7;
-  }
-  .order-xl-8 {
-    -ms-flex-order: 8;
-    order: 8;
-  }
-  .order-xl-9 {
-    -ms-flex-order: 9;
-    order: 9;
-  }
-  .order-xl-10 {
-    -ms-flex-order: 10;
-    order: 10;
-  }
-  .order-xl-11 {
-    -ms-flex-order: 11;
-    order: 11;
-  }
-  .order-xl-12 {
-    -ms-flex-order: 12;
-    order: 12;
-  }
-  .offset-xl-0 {
-    margin-left: 0;
-  }
-  .offset-xl-1 {
-    margin-left: 8.333333%;
-  }
-  .offset-xl-2 {
-    margin-left: 16.666667%;
-  }
-  .offset-xl-3 {
-    margin-left: 25%;
-  }
-  .offset-xl-4 {
-    margin-left: 33.333333%;
-  }
-  .offset-xl-5 {
-    margin-left: 41.666667%;
-  }
-  .offset-xl-6 {
-    margin-left: 50%;
-  }
-  .offset-xl-7 {
-    margin-left: 58.333333%;
-  }
-  .offset-xl-8 {
-    margin-left: 66.666667%;
-  }
-  .offset-xl-9 {
-    margin-left: 75%;
-  }
-  .offset-xl-10 {
-    margin-left: 83.333333%;
-  }
-  .offset-xl-11 {
-    margin-left: 91.666667%;
-  }
-}
-
-.table {
-  width: 100%;
-  margin-bottom: 1rem;
-  background-color: transparent;
-}
-
-.table th,
-.table td {
-  padding: 0.5rem;
-  vertical-align: top;
-  border-top: 1px solid #dee2e6;
-}
-
-.table thead th {
-  vertical-align: bottom;
-  border-bottom: 2px solid #dee2e6;
-}
-
-.table tbody + tbody {
-  border-top: 2px solid #dee2e6;
-}
-
-.table .table {
-  background-color: #fff;
-}
-
-.table-sm th,
-.table-sm td {
-  padding: 0.3rem;
-}
-
-.table-bordered {
-  border: 1px solid #dee2e6;
-}
-
-.table-bordered th,
-.table-bordered td {
-  border: 1px solid #dee2e6;
-}
-
-.table-bordered thead th,
-.table-bordered thead td {
-  border-bottom-width: 2px;
-}
-
-.table-borderless th,
-.table-borderless td,
-.table-borderless thead th,
-.table-borderless tbody + tbody {
-  border: 0;
-}
-
-.table-striped tbody tr:nth-of-type(odd) {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-
-.table-hover tbody tr:hover {
-  background-color: rgba(0, 0, 0, 0.075);
-}
-
-.table-primary,
-.table-primary > th,
-.table-primary > td {
-  background-color: #c8d1e9;
-}
-
-.table-hover .table-primary:hover {
-  background-color: #b6c2e2;
-}
-
-.table-hover .table-primary:hover > td,
-.table-hover .table-primary:hover > th {
-  background-color: #b6c2e2;
-}
-
-.table-secondary,
-.table-secondary > th,
-.table-secondary > td {
-  background-color: #d6d8db;
-}
-
-.table-hover .table-secondary:hover {
-  background-color: #c8cbcf;
-}
-
-.table-hover .table-secondary:hover > td,
-.table-hover .table-secondary:hover > th {
-  background-color: #c8cbcf;
-}
-
-.table-success,
-.table-success > th,
-.table-success > td {
-  background-color: #c1e9cd;
-}
-
-.table-hover .table-success:hover {
-  background-color: #aee2be;
-}
-
-.table-hover .table-success:hover > td,
-.table-hover .table-success:hover > th {
-  background-color: #aee2be;
-}
-
-.table-info,
-.table-info > th,
-.table-info > td {
-  background-color: #ffffb8;
-}
-
-.table-hover .table-info:hover {
-  background-color: #ffff9f;
-}
-
-.table-hover .table-info:hover > td,
-.table-hover .table-info:hover > th {
-  background-color: #ffff9f;
-}
-
-.table-warning,
-.table-warning > th,
-.table-warning > td {
-  background-color: #ffeeba;
-}
-
-.table-hover .table-warning:hover {
-  background-color: #ffe8a1;
-}
-
-.table-hover .table-warning:hover > td,
-.table-hover .table-warning:hover > th {
-  background-color: #ffe8a1;
-}
-
-.table-danger,
-.table-danger > th,
-.table-danger > td {
-  background-color: #fec6c6;
-}
-
-.table-hover .table-danger:hover {
-  background-color: #feadad;
-}
-
-.table-hover .table-danger:hover > td,
-.table-hover .table-danger:hover > th {
-  background-color: #feadad;
-}
-
-.table-light,
-.table-light > th,
-.table-light > td {
-  background-color: white;
-}
-
-.table-hover .table-light:hover {
-  background-color: #f2f2f2;
-}
-
-.table-hover .table-light:hover > td,
-.table-hover .table-light:hover > th {
-  background-color: #f2f2f2;
-}
-
-.table-dark,
-.table-dark > th,
-.table-dark > td {
-  background-color: #d5dff3;
-}
-
-.table-hover .table-dark:hover {
-  background-color: #c1d0ed;
-}
-
-.table-hover .table-dark:hover > td,
-.table-hover .table-dark:hover > th {
-  background-color: #c1d0ed;
-}
-
-.table-active,
-.table-active > th,
-.table-active > td {
-  background-color: rgba(0, 0, 0, 0.075);
-}
-
-.table-hover .table-active:hover {
-  background-color: rgba(0, 0, 0, 0.075);
-}
-
-.table-hover .table-active:hover > td,
-.table-hover .table-active:hover > th {
-  background-color: rgba(0, 0, 0, 0.075);
-}
-
-.table .thead-dark th {
-  color: #fff;
-  background-color: #212529;
-  border-color: #32383e;
-}
-
-.table .thead-light th {
-  color: #495057;
-  background-color: #e9ecef;
-  border-color: #dee2e6;
-}
-
-.table-dark {
-  color: #fff;
-  background-color: #212529;
-}
-
-.table-dark th,
-.table-dark td,
-.table-dark thead th {
-  border-color: #32383e;
-}
-
-.table-dark.table-bordered {
-  border: 0;
-}
-
-.table-dark.table-striped tbody tr:nth-of-type(odd) {
-  background-color: rgba(255, 255, 255, 0.05);
-}
-
-.table-dark.table-hover tbody tr:hover {
-  background-color: rgba(255, 255, 255, 0.075);
-}
-
-@media (max-width: 575.98px) {
-  .table-responsive-sm {
-    display: block;
-    width: 100%;
-    overflow-x: auto;
-    -webkit-overflow-scrolling: touch;
-    -ms-overflow-style: -ms-autohiding-scrollbar;
-  }
-  .table-responsive-sm > .table-bordered {
-    border: 0;
-  }
-}
-
-@media (max-width: 767.98px) {
-  .table-responsive-md {
-    display: block;
-    width: 100%;
-    overflow-x: auto;
-    -webkit-overflow-scrolling: touch;
-    -ms-overflow-style: -ms-autohiding-scrollbar;
-  }
-  .table-responsive-md > .table-bordered {
-    border: 0;
-  }
-}
-
-@media (max-width: 991.98px) {
-  .table-responsive-lg {
-    display: block;
-    width: 100%;
-    overflow-x: auto;
-    -webkit-overflow-scrolling: touch;
-    -ms-overflow-style: -ms-autohiding-scrollbar;
-  }
-  .table-responsive-lg > .table-bordered {
-    border: 0;
-  }
-}
-
-@media (max-width: 1199.98px) {
-  .table-responsive-xl {
-    display: block;
-    width: 100%;
-    overflow-x: auto;
-    -webkit-overflow-scrolling: touch;
-    -ms-overflow-style: -ms-autohiding-scrollbar;
-  }
-  .table-responsive-xl > .table-bordered {
-    border: 0;
-  }
-}
-
-.table-responsive {
-  display: block;
-  width: 100%;
-  overflow-x: auto;
-  -webkit-overflow-scrolling: touch;
-  -ms-overflow-style: -ms-autohiding-scrollbar;
-}
-
-.table-responsive > .table-bordered {
-  border: 0;
-}
-
-.form-control {
-  display: block;
-  width: 100%;
-  height: calc(1.965rem + 2px);
-  padding: 0.375rem 0.38rem;
-  font-size: 0.81rem;
-  line-height: 1.5;
-  color: #495057;
-  background-color: #fff;
-  background-clip: padding-box;
-  border: 1px solid #ced4da;
-  border-radius: 0;
-  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
-  .form-control {
-    transition: none;
-  }
-}
-
-.form-control::-ms-expand {
-  background-color: transparent;
-  border: 0;
-}
-
-.form-control:focus {
-  color: #495057;
-  background-color: #fff;
-  border-color: #90a3db;
-  outline: 0;
-  box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.form-control::-webkit-input-placeholder {
-  color: #6c757d;
-  opacity: 1;
-}
-
-.form-control::-moz-placeholder {
-  color: #6c757d;
-  opacity: 1;
-}
-
-.form-control:-ms-input-placeholder {
-  color: #6c757d;
-  opacity: 1;
-}
-
-.form-control::-ms-input-placeholder {
-  color: #6c757d;
-  opacity: 1;
-}
-
-.form-control::placeholder {
-  color: #6c757d;
-  opacity: 1;
-}
-
-.form-control:disabled, .form-control[readonly] {
-  background-color: #e9ecef;
-  opacity: 1;
-}
-
-select.form-control:focus::-ms-value {
-  color: #495057;
-  background-color: #fff;
-}
-
-.form-control-file,
-.form-control-range {
-  display: block;
-  width: 100%;
-}
-
-.col-form-label {
-  padding-top: calc(0.375rem + 1px);
-  padding-bottom: calc(0.375rem + 1px);
-  margin-bottom: 0;
-  font-size: inherit;
-  line-height: 1.5;
-}
-
-.col-form-label-lg {
-  padding-top: calc(0.5rem + 1px);
-  padding-bottom: calc(0.5rem + 1px);
-  font-size: 1.0125rem;
-  line-height: 1.5;
-}
-
-.col-form-label-sm {
-  padding-top: calc(0.25rem + 1px);
-  padding-bottom: calc(0.25rem + 1px);
-  font-size: 0.70875rem;
-  line-height: 1.5;
-}
-
-.form-control-plaintext {
-  display: block;
-  width: 100%;
-  padding-top: 0.375rem;
-  padding-bottom: 0.375rem;
-  margin-bottom: 0;
-  line-height: 1.5;
-  color: #212529;
-  background-color: transparent;
-  border: solid transparent;
-  border-width: 1px 0;
-}
-
-.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {
-  padding-right: 0;
-  padding-left: 0;
-}
-
-.form-control-sm {
-  height: calc(1.563125rem + 2px);
-  padding: 0.25rem 0.5rem;
-  font-size: 0.70875rem;
-  line-height: 1.5;
-}
-
-.form-control-lg {
-  height: calc(2.51875rem + 2px);
-  padding: 0.5rem 1rem;
-  font-size: 1.0125rem;
-  line-height: 1.5;
-}
-
-select.form-control[size], select.form-control[multiple] {
-  height: auto;
-}
-
-textarea.form-control {
-  height: auto;
-}
-
-.form-group {
-  margin-bottom: 1rem;
-}
-
-.form-text {
-  display: block;
-  margin-top: 0.25rem;
-}
-
-.form-row {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-wrap: wrap;
-  flex-wrap: wrap;
-  margin-right: -5px;
-  margin-left: -5px;
-}
-
-.form-row > .col,
-.form-row > [class*="col-"] {
-  padding-right: 5px;
-  padding-left: 5px;
-}
-
-.form-check {
-  position: relative;
-  display: block;
-  padding-left: 1.25rem;
-}
-
-.form-check-input {
-  position: absolute;
-  margin-top: 0.3rem;
-  margin-left: -1.25rem;
-}
-
-.form-check-input:disabled ~ .form-check-label {
-  color: #6c757d;
-}
-
-.form-check-label {
-  margin-bottom: 0;
-}
-
-.form-check-inline {
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  -ms-flex-align: center;
-  align-items: center;
-  padding-left: 0;
-  margin-right: 0.75rem;
-}
-
-.form-check-inline .form-check-input {
-  position: static;
-  margin-top: 0;
-  margin-right: 0.3125rem;
-  margin-left: 0;
-}
-
-.valid-feedback {
-  display: none;
-  width: 100%;
-  margin-top: 0.25rem;
-  font-size: 80%;
-  color: #22b24c;
-}
-
-.valid-tooltip {
-  position: absolute;
-  top: 100%;
-  z-index: 5;
-  display: none;
-  max-width: 100%;
-  padding: 0.25rem 0.5rem;
-  margin-top: .1rem;
-  font-size: 0.70875rem;
-  line-height: 1.5;
-  color: #fff;
-  background-color: rgba(34, 178, 76, 0.9);
-}
-
-.was-validated .form-control:valid, .form-control.is-valid, .was-validated
-.custom-select:valid,
-.custom-select.is-valid {
-  border-color: #22b24c;
-}
-
-.was-validated .form-control:valid:focus, .form-control.is-valid:focus, .was-validated
-.custom-select:valid:focus,
-.custom-select.is-valid:focus {
-  border-color: #22b24c;
-  box-shadow: 0 0 0 0.2rem rgba(34, 178, 76, 0.25);
-}
-
-.was-validated .form-control:valid ~ .valid-feedback,
-.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,
-.form-control.is-valid ~ .valid-tooltip, .was-validated
-.custom-select:valid ~ .valid-feedback,
-.was-validated
-.custom-select:valid ~ .valid-tooltip,
-.custom-select.is-valid ~ .valid-feedback,
-.custom-select.is-valid ~ .valid-tooltip {
-  display: block;
-}
-
-.was-validated .form-control-file:valid ~ .valid-feedback,
-.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,
-.form-control-file.is-valid ~ .valid-tooltip {
-  display: block;
-}
-
-.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
-  color: #22b24c;
-}
-
-.was-validated .form-check-input:valid ~ .valid-feedback,
-.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,
-.form-check-input.is-valid ~ .valid-tooltip {
-  display: block;
-}
-
-.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {
-  color: #22b24c;
-}
-
-.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {
-  background-color: #70e492;
-}
-
-.was-validated .custom-control-input:valid ~ .valid-feedback,
-.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,
-.custom-control-input.is-valid ~ .valid-tooltip {
-  display: block;
-}
-
-.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {
-  background-color: #30d761;
-}
-
-.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {
-  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(34, 178, 76, 0.25);
-}
-
-.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {
-  border-color: #22b24c;
-}
-
-.was-validated .custom-file-input:valid ~ .custom-file-label::after, .custom-file-input.is-valid ~ .custom-file-label::after {
-  border-color: inherit;
-}
-
-.was-validated .custom-file-input:valid ~ .valid-feedback,
-.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,
-.custom-file-input.is-valid ~ .valid-tooltip {
-  display: block;
-}
-
-.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {
-  box-shadow: 0 0 0 0.2rem rgba(34, 178, 76, 0.25);
-}
-
-.invalid-feedback {
-  display: none;
-  width: 100%;
-  margin-top: 0.25rem;
-  font-size: 80%;
-  color: #fc3434;
-}
-
-.invalid-tooltip {
-  position: absolute;
-  top: 100%;
-  z-index: 5;
-  display: none;
-  max-width: 100%;
-  padding: 0.25rem 0.5rem;
-  margin-top: .1rem;
-  font-size: 0.70875rem;
-  line-height: 1.5;
-  color: #fff;
-  background-color: rgba(252, 52, 52, 0.9);
-}
-
-.was-validated .form-control:invalid, .form-control.is-invalid, .was-validated
-.custom-select:invalid,
-.custom-select.is-invalid {
-  border-color: #fc3434;
-}
-
-.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, .was-validated
-.custom-select:invalid:focus,
-.custom-select.is-invalid:focus {
-  border-color: #fc3434;
-  box-shadow: 0 0 0 0.2rem rgba(252, 52, 52, 0.25);
-}
-
-.was-validated .form-control:invalid ~ .invalid-feedback,
-.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,
-.form-control.is-invalid ~ .invalid-tooltip, .was-validated
-.custom-select:invalid ~ .invalid-feedback,
-.was-validated
-.custom-select:invalid ~ .invalid-tooltip,
-.custom-select.is-invalid ~ .invalid-feedback,
-.custom-select.is-invalid ~ .invalid-tooltip {
-  display: block;
-}
-
-.was-validated .form-control-file:invalid ~ .invalid-feedback,
-.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,
-.form-control-file.is-invalid ~ .invalid-tooltip {
-  display: block;
-}
-
-.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
-  color: #fc3434;
-}
-
-.was-validated .form-check-input:invalid ~ .invalid-feedback,
-.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,
-.form-check-input.is-invalid ~ .invalid-tooltip {
-  display: block;
-}
-
-.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {
-  color: #fc3434;
-}
-
-.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {
-  background-color: #feb2b2;
-}
-
-.was-validated .custom-control-input:invalid ~ .invalid-feedback,
-.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,
-.custom-control-input.is-invalid ~ .invalid-tooltip {
-  display: block;
-}
-
-.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {
-  background-color: #fd6666;
-}
-
-.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {
-  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(252, 52, 52, 0.25);
-}
-
-.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {
-  border-color: #fc3434;
-}
-
-.was-validated .custom-file-input:invalid ~ .custom-file-label::after, .custom-file-input.is-invalid ~ .custom-file-label::after {
-  border-color: inherit;
-}
-
-.was-validated .custom-file-input:invalid ~ .invalid-feedback,
-.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,
-.custom-file-input.is-invalid ~ .invalid-tooltip {
-  display: block;
-}
-
-.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {
-  box-shadow: 0 0 0 0.2rem rgba(252, 52, 52, 0.25);
-}
-
-.form-inline {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-flow: row wrap;
-  flex-flow: row wrap;
-  -ms-flex-align: center;
-  align-items: center;
-}
-
-.form-inline .form-check {
-  width: 100%;
-}
-
-@media (min-width: 576px) {
-  .form-inline label {
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-align: center;
-    align-items: center;
-    -ms-flex-pack: center;
-    justify-content: center;
-    margin-bottom: 0;
-  }
-  .form-inline .form-group {
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex: 0 0 auto;
-    flex: 0 0 auto;
-    -ms-flex-flow: row wrap;
-    flex-flow: row wrap;
-    -ms-flex-align: center;
-    align-items: center;
-    margin-bottom: 0;
-  }
-  .form-inline .form-control {
-    display: inline-block;
-    width: auto;
-    vertical-align: middle;
-  }
-  .form-inline .form-control-plaintext {
-    display: inline-block;
-  }
-  .form-inline .input-group,
-  .form-inline .custom-select {
-    width: auto;
-  }
-  .form-inline .form-check {
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-align: center;
-    align-items: center;
-    -ms-flex-pack: center;
-    justify-content: center;
-    width: auto;
-    padding-left: 0;
-  }
-  .form-inline .form-check-input {
-    position: relative;
-    margin-top: 0;
-    margin-right: 0.25rem;
-    margin-left: 0;
-  }
-  .form-inline .custom-control {
-    -ms-flex-align: center;
-    align-items: center;
-    -ms-flex-pack: center;
-    justify-content: center;
-  }
-  .form-inline .custom-control-label {
-    margin-bottom: 0;
-  }
-}
-
-.btn {
-  display: inline-block;
-  font-weight: 400;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: middle;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  border: 1px solid transparent;
-  padding: 0.375rem 1rem;
-  font-size: 0.81rem;
-  line-height: 1.5;
-  border-radius: 0;
-  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
-  .btn {
-    transition: none;
-  }
-}
-
-.btn:hover, .btn:focus {
-  text-decoration: none;
-}
-
-.btn:focus, .btn.focus {
-  outline: 0;
-  box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.btn.disabled, .btn:disabled {
-  opacity: 0.65;
-}
-
-.btn:not(:disabled):not(.disabled) {
-  cursor: pointer;
-}
-
-a.btn.disabled,
-fieldset:disabled a.btn {
-  pointer-events: none;
-}
-
-.btn-primary {
-  color: #fff;
-  background-color: #3a59b1;
-  border-color: #3a59b1;
-}
-
-.btn-primary:hover {
-  color: #fff;
-  background-color: #314b94;
-  border-color: #2d468b;
-}
-
-.btn-primary:focus, .btn-primary.focus {
-  box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.5);
-}
-
-.btn-primary.disabled, .btn-primary:disabled {
-  color: #fff;
-  background-color: #3a59b1;
-  border-color: #3a59b1;
-}
-
-.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,
-.show > .btn-primary.dropdown-toggle {
-  color: #fff;
-  background-color: #2d468b;
-  border-color: #2a4181;
-}
-
-.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-primary.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.5);
-}
-
-.btn-secondary {
-  color: #fff;
-  background-color: #6c757d;
-  border-color: #6c757d;
-}
-
-.btn-secondary:hover {
-  color: #fff;
-  background-color: #5a6268;
-  border-color: #545b62;
-}
-
-.btn-secondary:focus, .btn-secondary.focus {
-  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
-}
-
-.btn-secondary.disabled, .btn-secondary:disabled {
-  color: #fff;
-  background-color: #6c757d;
-  border-color: #6c757d;
-}
-
-.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,
-.show > .btn-secondary.dropdown-toggle {
-  color: #fff;
-  background-color: #545b62;
-  border-color: #4e555b;
-}
-
-.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-secondary.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
-}
-
-.btn-success {
-  color: #fff;
-  background-color: #22b24c;
-  border-color: #22b24c;
-}
-
-.btn-success:hover {
-  color: #fff;
-  background-color: #1c923e;
-  border-color: #1a873a;
-}
-
-.btn-success:focus, .btn-success.focus {
-  box-shadow: 0 0 0 0.2rem rgba(34, 178, 76, 0.5);
-}
-
-.btn-success.disabled, .btn-success:disabled {
-  color: #fff;
-  background-color: #22b24c;
-  border-color: #22b24c;
-}
-
-.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,
-.show > .btn-success.dropdown-toggle {
-  color: #fff;
-  background-color: #1a873a;
-  border-color: #187c35;
-}
-
-.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,
-.show > .btn-success.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(34, 178, 76, 0.5);
-}
-
-.btn-info {
-  color: #212529;
-  background-color: yellow;
-  border-color: yellow;
-}
-
-.btn-info:hover {
-  color: #212529;
-  background-color: #d9d900;
-  border-color: #cccc00;
-}
-
-.btn-info:focus, .btn-info.focus {
-  box-shadow: 0 0 0 0.2rem rgba(255, 255, 0, 0.5);
-}
-
-.btn-info.disabled, .btn-info:disabled {
-  color: #212529;
-  background-color: yellow;
-  border-color: yellow;
-}
-
-.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,
-.show > .btn-info.dropdown-toggle {
-  color: #212529;
-  background-color: #cccc00;
-  border-color: #bfbf00;
-}
-
-.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,
-.show > .btn-info.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(255, 255, 0, 0.5);
-}
-
-.btn-warning {
-  color: #212529;
-  background-color: #ffc107;
-  border-color: #ffc107;
-}
-
-.btn-warning:hover {
-  color: #212529;
-  background-color: #e0a800;
-  border-color: #d39e00;
-}
-
-.btn-warning:focus, .btn-warning.focus {
-  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
-}
-
-.btn-warning.disabled, .btn-warning:disabled {
-  color: #212529;
-  background-color: #ffc107;
-  border-color: #ffc107;
-}
-
-.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,
-.show > .btn-warning.dropdown-toggle {
-  color: #212529;
-  background-color: #d39e00;
-  border-color: #c69500;
-}
-
-.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,
-.show > .btn-warning.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
-}
-
-.btn-danger {
-  color: #fff;
-  background-color: #fc3434;
-  border-color: #fc3434;
-}
-
-.btn-danger:hover {
-  color: #fff;
-  background-color: #fb0e0e;
-  border-color: #f90404;
-}
-
-.btn-danger:focus, .btn-danger.focus {
-  box-shadow: 0 0 0 0.2rem rgba(252, 52, 52, 0.5);
-}
-
-.btn-danger.disabled, .btn-danger:disabled {
-  color: #fff;
-  background-color: #fc3434;
-  border-color: #fc3434;
-}
-
-.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,
-.show > .btn-danger.dropdown-toggle {
-  color: #fff;
-  background-color: #f90404;
-  border-color: #ed0303;
-}
-
-.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,
-.show > .btn-danger.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(252, 52, 52, 0.5);
-}
-
-.btn-light {
-  color: #212529;
-  background-color: white;
-  border-color: white;
-}
-
-.btn-light:hover {
-  color: #212529;
-  background-color: #ececec;
-  border-color: #e6e6e6;
-}
-
-.btn-light:focus, .btn-light.focus {
-  box-shadow: 0 0 0 0.2rem rgba(255, 255, 255, 0.5);
-}
-
-.btn-light.disabled, .btn-light:disabled {
-  color: #212529;
-  background-color: white;
-  border-color: white;
-}
-
-.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,
-.show > .btn-light.dropdown-toggle {
-  color: #212529;
-  background-color: #e6e6e6;
-  border-color: #dfdfdf;
-}
-
-.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,
-.show > .btn-light.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(255, 255, 255, 0.5);
-}
-
-.btn-dark {
-  color: #fff;
-  background-color: #6a8ed3;
-  border-color: #6a8ed3;
-}
-
-.btn-dark:hover {
-  color: #fff;
-  background-color: #4c78ca;
-  border-color: #4370c7;
-}
-
-.btn-dark:focus, .btn-dark.focus {
-  box-shadow: 0 0 0 0.2rem rgba(106, 142, 211, 0.5);
-}
-
-.btn-dark.disabled, .btn-dark:disabled {
-  color: #fff;
-  background-color: #6a8ed3;
-  border-color: #6a8ed3;
-}
-
-.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,
-.show > .btn-dark.dropdown-toggle {
-  color: #fff;
-  background-color: #4370c7;
-  border-color: #3a69c4;
-}
-
-.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,
-.show > .btn-dark.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(106, 142, 211, 0.5);
-}
-
-.btn-outline-primary {
-  color: #3a59b1;
-  background-color: transparent;
-  background-image: none;
-  border-color: #3a59b1;
-}
-
-.btn-outline-primary:hover {
-  color: #fff;
-  background-color: #3a59b1;
-  border-color: #3a59b1;
-}
-
-.btn-outline-primary:focus, .btn-outline-primary.focus {
-  box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.5);
-}
-
-.btn-outline-primary.disabled, .btn-outline-primary:disabled {
-  color: #3a59b1;
-  background-color: transparent;
-}
-
-.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,
-.show > .btn-outline-primary.dropdown-toggle {
-  color: #fff;
-  background-color: #3a59b1;
-  border-color: #3a59b1;
-}
-
-.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-primary.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.5);
-}
-
-.btn-outline-secondary {
-  color: #6c757d;
-  background-color: transparent;
-  background-image: none;
-  border-color: #6c757d;
-}
-
-.btn-outline-secondary:hover {
-  color: #fff;
-  background-color: #6c757d;
-  border-color: #6c757d;
-}
-
-.btn-outline-secondary:focus, .btn-outline-secondary.focus {
-  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
-}
-
-.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
-  color: #6c757d;
-  background-color: transparent;
-}
-
-.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,
-.show > .btn-outline-secondary.dropdown-toggle {
-  color: #fff;
-  background-color: #6c757d;
-  border-color: #6c757d;
-}
-
-.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-secondary.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
-}
-
-.btn-outline-success {
-  color: #22b24c;
-  background-color: transparent;
-  background-image: none;
-  border-color: #22b24c;
-}
-
-.btn-outline-success:hover {
-  color: #fff;
-  background-color: #22b24c;
-  border-color: #22b24c;
-}
-
-.btn-outline-success:focus, .btn-outline-success.focus {
-  box-shadow: 0 0 0 0.2rem rgba(34, 178, 76, 0.5);
-}
-
-.btn-outline-success.disabled, .btn-outline-success:disabled {
-  color: #22b24c;
-  background-color: transparent;
-}
-
-.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,
-.show > .btn-outline-success.dropdown-toggle {
-  color: #fff;
-  background-color: #22b24c;
-  border-color: #22b24c;
-}
-
-.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-success.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(34, 178, 76, 0.5);
-}
-
-.btn-outline-info {
-  color: yellow;
-  background-color: transparent;
-  background-image: none;
-  border-color: yellow;
-}
-
-.btn-outline-info:hover {
-  color: #212529;
-  background-color: yellow;
-  border-color: yellow;
-}
-
-.btn-outline-info:focus, .btn-outline-info.focus {
-  box-shadow: 0 0 0 0.2rem rgba(255, 255, 0, 0.5);
-}
-
-.btn-outline-info.disabled, .btn-outline-info:disabled {
-  color: yellow;
-  background-color: transparent;
-}
-
-.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,
-.show > .btn-outline-info.dropdown-toggle {
-  color: #212529;
-  background-color: yellow;
-  border-color: yellow;
-}
-
-.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-info.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(255, 255, 0, 0.5);
-}
-
-.btn-outline-warning {
-  color: #ffc107;
-  background-color: transparent;
-  background-image: none;
-  border-color: #ffc107;
-}
-
-.btn-outline-warning:hover {
-  color: #212529;
-  background-color: #ffc107;
-  border-color: #ffc107;
-}
-
-.btn-outline-warning:focus, .btn-outline-warning.focus {
-  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
-}
-
-.btn-outline-warning.disabled, .btn-outline-warning:disabled {
-  color: #ffc107;
-  background-color: transparent;
-}
-
-.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,
-.show > .btn-outline-warning.dropdown-toggle {
-  color: #212529;
-  background-color: #ffc107;
-  border-color: #ffc107;
-}
-
-.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-warning.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
-}
-
-.btn-outline-danger {
-  color: #fc3434;
-  background-color: transparent;
-  background-image: none;
-  border-color: #fc3434;
-}
-
-.btn-outline-danger:hover {
-  color: #fff;
-  background-color: #fc3434;
-  border-color: #fc3434;
-}
-
-.btn-outline-danger:focus, .btn-outline-danger.focus {
-  box-shadow: 0 0 0 0.2rem rgba(252, 52, 52, 0.5);
-}
-
-.btn-outline-danger.disabled, .btn-outline-danger:disabled {
-  color: #fc3434;
-  background-color: transparent;
-}
-
-.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,
-.show > .btn-outline-danger.dropdown-toggle {
-  color: #fff;
-  background-color: #fc3434;
-  border-color: #fc3434;
-}
-
-.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-danger.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(252, 52, 52, 0.5);
-}
-
-.btn-outline-light {
-  color: white;
-  background-color: transparent;
-  background-image: none;
-  border-color: white;
-}
-
-.btn-outline-light:hover {
-  color: #212529;
-  background-color: white;
-  border-color: white;
-}
-
-.btn-outline-light:focus, .btn-outline-light.focus {
-  box-shadow: 0 0 0 0.2rem rgba(255, 255, 255, 0.5);
-}
-
-.btn-outline-light.disabled, .btn-outline-light:disabled {
-  color: white;
-  background-color: transparent;
-}
-
-.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,
-.show > .btn-outline-light.dropdown-toggle {
-  color: #212529;
-  background-color: white;
-  border-color: white;
-}
-
-.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-light.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(255, 255, 255, 0.5);
-}
-
-.btn-outline-dark {
-  color: #6a8ed3;
-  background-color: transparent;
-  background-image: none;
-  border-color: #6a8ed3;
-}
-
-.btn-outline-dark:hover {
-  color: #fff;
-  background-color: #6a8ed3;
-  border-color: #6a8ed3;
-}
-
-.btn-outline-dark:focus, .btn-outline-dark.focus {
-  box-shadow: 0 0 0 0.2rem rgba(106, 142, 211, 0.5);
-}
-
-.btn-outline-dark.disabled, .btn-outline-dark:disabled {
-  color: #6a8ed3;
-  background-color: transparent;
-}
-
-.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,
-.show > .btn-outline-dark.dropdown-toggle {
-  color: #fff;
-  background-color: #6a8ed3;
-  border-color: #6a8ed3;
-}
-
-.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-dark.dropdown-toggle:focus {
-  box-shadow: 0 0 0 0.2rem rgba(106, 142, 211, 0.5);
-}
-
-.btn-link {
-  font-weight: 400;
-  color: #3a59b1;
-  background-color: transparent;
-}
-
-.btn-link:hover {
-  color: #273c77;
-  text-decoration: underline;
-  background-color: transparent;
-  border-color: transparent;
-}
-
-.btn-link:focus, .btn-link.focus {
-  text-decoration: underline;
-  border-color: transparent;
-  box-shadow: none;
-}
-
-.btn-link:disabled, .btn-link.disabled {
-  color: #6c757d;
-  pointer-events: none;
-}
-
-.btn-lg, .btn-group-lg > .btn {
-  padding: 0.5rem 1rem;
-  font-size: 1.0125rem;
-  line-height: 1.5;
-  border-radius: 0;
-}
-
-.btn-sm, .btn-group-sm > .btn {
-  padding: 0.25rem 0.5rem;
-  font-size: 0.70875rem;
-  line-height: 1.5;
-  border-radius: 0;
-}
-
-.btn-block {
-  display: block;
-  width: 100%;
-}
-
-.btn-block + .btn-block {
-  margin-top: 0.5rem;
-}
-
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
-  width: 100%;
-}
-
-.fade {
-  transition: opacity 0.15s linear;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
-  .fade {
-    transition: none;
-  }
-}
-
-.fade:not(.show) {
-  opacity: 0;
-}
-
-.collapse:not(.show) {
-  display: none;
-}
-
-.collapsing {
-  position: relative;
-  height: 0;
-  overflow: hidden;
-  transition: height 0.35s ease;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
-  .collapsing {
-    transition: none;
-  }
-}
-
-.dropup,
-.dropright,
-.dropdown,
-.dropleft {
-  position: relative;
-}
-
-.dropdown-toggle::after {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  margin-left: 0.255em;
-  vertical-align: 0.255em;
-  content: "";
-  border-top: 0.3em solid;
-  border-right: 0.3em solid transparent;
-  border-bottom: 0;
-  border-left: 0.3em solid transparent;
-}
-
-.dropdown-toggle:empty::after {
-  margin-left: 0;
-}
-
-.dropdown-menu {
-  position: absolute;
-  top: 100%;
-  left: 0;
-  z-index: 1000;
-  display: none;
-  float: left;
-  min-width: 10rem;
-  padding: 0.5rem 0;
-  margin: 0.125rem 0 0;
-  font-size: 0.81rem;
-  color: #212529;
-  text-align: left;
-  list-style: none;
-  background-color: #fff;
-  background-clip: padding-box;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-}
-
-.dropdown-menu-right {
-  right: 0;
-  left: auto;
-}
-
-.dropup .dropdown-menu {
-  top: auto;
-  bottom: 100%;
-  margin-top: 0;
-  margin-bottom: 0.125rem;
-}
-
-.dropup .dropdown-toggle::after {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  margin-left: 0.255em;
-  vertical-align: 0.255em;
-  content: "";
-  border-top: 0;
-  border-right: 0.3em solid transparent;
-  border-bottom: 0.3em solid;
-  border-left: 0.3em solid transparent;
-}
-
-.dropup .dropdown-toggle:empty::after {
-  margin-left: 0;
-}
-
-.dropright .dropdown-menu {
-  top: 0;
-  right: auto;
-  left: 100%;
-  margin-top: 0;
-  margin-left: 0.125rem;
-}
-
-.dropright .dropdown-toggle::after {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  margin-left: 0.255em;
-  vertical-align: 0.255em;
-  content: "";
-  border-top: 0.3em solid transparent;
-  border-right: 0;
-  border-bottom: 0.3em solid transparent;
-  border-left: 0.3em solid;
-}
-
-.dropright .dropdown-toggle:empty::after {
-  margin-left: 0;
-}
-
-.dropright .dropdown-toggle::after {
-  vertical-align: 0;
-}
-
-.dropleft .dropdown-menu {
-  top: 0;
-  right: 100%;
-  left: auto;
-  margin-top: 0;
-  margin-right: 0.125rem;
-}
-
-.dropleft .dropdown-toggle::after {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  margin-left: 0.255em;
-  vertical-align: 0.255em;
-  content: "";
-}
-
-.dropleft .dropdown-toggle::after {
-  display: none;
-}
-
-.dropleft .dropdown-toggle::before {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  margin-right: 0.255em;
-  vertical-align: 0.255em;
-  content: "";
-  border-top: 0.3em solid transparent;
-  border-right: 0.3em solid;
-  border-bottom: 0.3em solid transparent;
-}
-
-.dropleft .dropdown-toggle:empty::after {
-  margin-left: 0;
-}
-
-.dropleft .dropdown-toggle::before {
-  vertical-align: 0;
-}
-
-.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] {
-  right: auto;
-  bottom: auto;
-}
-
-.dropdown-divider {
-  height: 0;
-  margin: 0.5rem 0;
-  overflow: hidden;
-  border-top: 1px solid #e9ecef;
-}
-
-.dropdown-item {
-  display: block;
-  width: 100%;
-  padding: 0.25rem 1.5rem;
-  clear: both;
-  font-weight: 400;
-  color: #212529;
-  text-align: inherit;
-  white-space: nowrap;
-  background-color: transparent;
-  border: 0;
-}
-
-.dropdown-item:hover, .dropdown-item:focus {
-  color: #16181b;
-  text-decoration: none;
-  background-color: #f8f9fa;
-}
-
-.dropdown-item.active, .dropdown-item:active {
-  color: #fff;
-  text-decoration: none;
-  background-color: #3a59b1;
-}
-
-.dropdown-item.disabled, .dropdown-item:disabled {
-  color: #6c757d;
-  background-color: transparent;
-}
-
-.dropdown-menu.show {
-  display: block;
-}
-
-.dropdown-header {
-  display: block;
-  padding: 0.5rem 1.5rem;
-  margin-bottom: 0;
-  font-size: 0.70875rem;
-  color: #6c757d;
-  white-space: nowrap;
-}
-
-.dropdown-item-text {
-  display: block;
-  padding: 0.25rem 1.5rem;
-  color: #212529;
-}
-
-.btn-group,
-.btn-group-vertical {
-  position: relative;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  vertical-align: middle;
-}
-
-.btn-group > .btn,
-.btn-group-vertical > .btn {
-  position: relative;
-  -ms-flex: 0 1 auto;
-  flex: 0 1 auto;
-}
-
-.btn-group > .btn:hover,
-.btn-group-vertical > .btn:hover {
-  z-index: 1;
-}
-
-.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
-.btn-group-vertical > .btn:focus,
-.btn-group-vertical > .btn:active,
-.btn-group-vertical > .btn.active {
-  z-index: 1;
-}
-
-.btn-group .btn + .btn,
-.btn-group .btn + .btn-group,
-.btn-group .btn-group + .btn,
-.btn-group .btn-group + .btn-group,
-.btn-group-vertical .btn + .btn,
-.btn-group-vertical .btn + .btn-group,
-.btn-group-vertical .btn-group + .btn,
-.btn-group-vertical .btn-group + .btn-group {
-  margin-left: -1px;
-}
-
-.btn-toolbar {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-pack: start;
-  justify-content: flex-start;
-}
-
-.btn-toolbar .input-group {
-  width: auto;
-}
-
-.btn-group > .btn:first-child {
-  margin-left: 0;
-}
-
-.dropdown-toggle-split {
-  padding-right: 0.75rem;
-  padding-left: 0.75rem;
-}
-
-.dropdown-toggle-split::after,
-.dropup .dropdown-toggle-split::after,
-.dropright .dropdown-toggle-split::after {
-  margin-left: 0;
-}
-
-.dropleft .dropdown-toggle-split::before {
-  margin-right: 0;
-}
-
-.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {
-  padding-right: 0.375rem;
-  padding-left: 0.375rem;
-}
-
-.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {
-  padding-right: 0.75rem;
-  padding-left: 0.75rem;
-}
-
-.btn-group-vertical {
-  -ms-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-align: start;
-  align-items: flex-start;
-  -ms-flex-pack: center;
-  justify-content: center;
-}
-
-.btn-group-vertical .btn,
-.btn-group-vertical .btn-group {
-  width: 100%;
-}
-
-.btn-group-vertical > .btn + .btn,
-.btn-group-vertical > .btn + .btn-group,
-.btn-group-vertical > .btn-group + .btn,
-.btn-group-vertical > .btn-group + .btn-group {
-  margin-top: -1px;
-  margin-left: 0;
-}
-
-.btn-group-toggle > .btn,
-.btn-group-toggle > .btn-group > .btn {
-  margin-bottom: 0;
-}
-
-.btn-group-toggle > .btn input[type="radio"],
-.btn-group-toggle > .btn input[type="checkbox"],
-.btn-group-toggle > .btn-group > .btn input[type="radio"],
-.btn-group-toggle > .btn-group > .btn input[type="checkbox"] {
-  position: absolute;
-  clip: rect(0, 0, 0, 0);
-  pointer-events: none;
-}
-
-.input-group {
-  position: relative;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-align: stretch;
-  align-items: stretch;
-  width: 100%;
-}
-
-.input-group > .form-control,
-.input-group > .custom-select,
-.input-group > .custom-file {
-  position: relative;
-  -ms-flex: 1 1 auto;
-  flex: 1 1 auto;
-  width: 1%;
-  margin-bottom: 0;
-}
-
-.input-group > .form-control + .form-control,
-.input-group > .form-control + .custom-select,
-.input-group > .form-control + .custom-file,
-.input-group > .custom-select + .form-control,
-.input-group > .custom-select + .custom-select,
-.input-group > .custom-select + .custom-file,
-.input-group > .custom-file + .form-control,
-.input-group > .custom-file + .custom-select,
-.input-group > .custom-file + .custom-file {
-  margin-left: -1px;
-}
-
-.input-group > .form-control:focus,
-.input-group > .custom-select:focus,
-.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {
-  z-index: 3;
-}
-
-.input-group > .custom-file .custom-file-input:focus {
-  z-index: 4;
-}
-
-.input-group > .custom-file {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: center;
-  align-items: center;
-}
-
-.input-group-prepend,
-.input-group-append {
-  display: -ms-flexbox;
-  display: flex;
-}
-
-.input-group-prepend .btn,
-.input-group-append .btn {
-  position: relative;
-  z-index: 2;
-}
-
-.input-group-prepend .btn + .btn,
-.input-group-prepend .btn + .input-group-text,
-.input-group-prepend .input-group-text + .input-group-text,
-.input-group-prepend .input-group-text + .btn,
-.input-group-append .btn + .btn,
-.input-group-append .btn + .input-group-text,
-.input-group-append .input-group-text + .input-group-text,
-.input-group-append .input-group-text + .btn {
-  margin-left: -1px;
-}
-
-.input-group-prepend {
-  margin-right: -1px;
-}
-
-.input-group-append {
-  margin-left: -1px;
-}
-
-.input-group-text {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: center;
-  align-items: center;
-  padding: 0.375rem 0.38rem;
-  margin-bottom: 0;
-  font-size: 0.81rem;
-  font-weight: 400;
-  line-height: 1.5;
-  color: #495057;
-  text-align: center;
-  white-space: nowrap;
-  background-color: #e9ecef;
-  border: 1px solid #ced4da;
-}
-
-.input-group-text input[type="radio"],
-.input-group-text input[type="checkbox"] {
-  margin-top: 0;
-}
-
-.input-group-lg > .form-control,
-.input-group-lg > .input-group-prepend > .input-group-text,
-.input-group-lg > .input-group-append > .input-group-text,
-.input-group-lg > .input-group-prepend > .btn,
-.input-group-lg > .input-group-append > .btn {
-  height: calc(2.51875rem + 2px);
-  padding: 0.5rem 1rem;
-  font-size: 1.0125rem;
-  line-height: 1.5;
-}
-
-.input-group-sm > .form-control,
-.input-group-sm > .input-group-prepend > .input-group-text,
-.input-group-sm > .input-group-append > .input-group-text,
-.input-group-sm > .input-group-prepend > .btn,
-.input-group-sm > .input-group-append > .btn {
-  height: calc(1.563125rem + 2px);
-  padding: 0.25rem 0.5rem;
-  font-size: 0.70875rem;
-  line-height: 1.5;
-}
-
-.custom-control {
-  position: relative;
-  display: block;
-  min-height: 1.215rem;
-  padding-left: 1.5rem;
-}
-
-.custom-control-inline {
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  margin-right: 1rem;
-}
-
-.custom-control-input {
-  position: absolute;
-  z-index: -1;
-  opacity: 0;
-}
-
-.custom-control-input:checked ~ .custom-control-label::before {
-  color: #fff;
-  background-color: #3a59b1;
-}
-
-.custom-control-input:focus ~ .custom-control-label::before {
-  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.custom-control-input:active ~ .custom-control-label::before {
-  color: #fff;
-  background-color: #b6c3e7;
-}
-
-.custom-control-input:disabled ~ .custom-control-label {
-  color: #6c757d;
-}
-
-.custom-control-input:disabled ~ .custom-control-label::before {
-  background-color: #e9ecef;
-}
-
-.custom-control-label {
-  position: relative;
-  margin-bottom: 0;
-}
-
-.custom-control-label::before {
-  position: absolute;
-  top: 0.1075rem;
-  left: -1.5rem;
-  display: block;
-  width: 1rem;
-  height: 1rem;
-  pointer-events: none;
-  content: "";
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  background-color: #dee2e6;
-}
-
-.custom-control-label::after {
-  position: absolute;
-  top: 0.1075rem;
-  left: -1.5rem;
-  display: block;
-  width: 1rem;
-  height: 1rem;
-  content: "";
-  background-repeat: no-repeat;
-  background-position: center center;
-  background-size: 50% 50%;
-}
-
-.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before {
-  background-color: #3a59b1;
-}
-
-.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E");
-}
-
-.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
-  background-color: #3a59b1;
-}
-
-.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E");
-}
-
-.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {
-  background-color: rgba(58, 89, 177, 0.5);
-}
-
-.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {
-  background-color: rgba(58, 89, 177, 0.5);
-}
-
-.custom-radio .custom-control-label::before {
-  border-radius: 50%;
-}
-
-.custom-radio .custom-control-input:checked ~ .custom-control-label::before {
-  background-color: #3a59b1;
-}
-
-.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E");
-}
-
-.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {
-  background-color: rgba(58, 89, 177, 0.5);
-}
-
-.custom-select {
-  display: inline-block;
-  width: 100%;
-  height: calc(1.965rem + 2px);
-  padding: 0.375rem 1.75rem 0.375rem 0.75rem;
-  line-height: 1.5;
-  color: #495057;
-  vertical-align: middle;
-  background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center;
-  background-size: 8px 10px;
-  border: 1px solid #ced4da;
-  border-radius: 0;
-  -webkit-appearance: none;
-  -moz-appearance: none;
-  appearance: none;
-}
-
-.custom-select:focus {
-  border-color: #90a3db;
-  outline: 0;
-  box-shadow: 0 0 0 0.2rem rgba(144, 163, 219, 0.5);
-}
-
-.custom-select:focus::-ms-value {
-  color: #495057;
-  background-color: #fff;
-}
-
-.custom-select[multiple], .custom-select[size]:not([size="1"]) {
-  height: auto;
-  padding-right: 0.75rem;
-  background-image: none;
-}
-
-.custom-select:disabled {
-  color: #6c757d;
-  background-color: #e9ecef;
-}
-
-.custom-select::-ms-expand {
-  opacity: 0;
-}
-
-.custom-select-sm {
-  height: calc(1.563125rem + 2px);
-  padding-top: 0.375rem;
-  padding-bottom: 0.375rem;
-  font-size: 75%;
-}
-
-.custom-select-lg {
-  height: calc(2.51875rem + 2px);
-  padding-top: 0.375rem;
-  padding-bottom: 0.375rem;
-  font-size: 125%;
-}
-
-.custom-file {
-  position: relative;
-  display: inline-block;
-  width: 100%;
-  height: calc(1.965rem + 2px);
-  margin-bottom: 0;
-}
-
-.custom-file-input {
-  position: relative;
-  z-index: 2;
-  width: 100%;
-  height: calc(1.965rem + 2px);
-  margin: 0;
-  opacity: 0;
-}
-
-.custom-file-input:focus ~ .custom-file-label {
-  border-color: #90a3db;
-  box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.custom-file-input:focus ~ .custom-file-label::after {
-  border-color: #90a3db;
-}
-
-.custom-file-input:disabled ~ .custom-file-label {
-  background-color: #e9ecef;
-}
-
-.custom-file-input:lang(en) ~ .custom-file-label::after {
-  content: "Browse";
-}
-
-.custom-file-label {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  z-index: 1;
-  height: calc(1.965rem + 2px);
-  padding: 0.375rem 0.75rem;
-  line-height: 1.5;
-  color: #495057;
-  background-color: #fff;
-  border: 1px solid #ced4da;
-}
-
-.custom-file-label::after {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  z-index: 3;
-  display: block;
-  height: 1.965rem;
-  padding: 0.375rem 0.75rem;
-  line-height: 1.5;
-  color: #495057;
-  content: "Browse";
-  background-color: #e9ecef;
-  border-left: 1px solid #ced4da;
-}
-
-.custom-range {
-  width: 100%;
-  padding-left: 0;
-  background-color: transparent;
-  -webkit-appearance: none;
-  -moz-appearance: none;
-  appearance: none;
-}
-
-.custom-range:focus {
-  outline: none;
-}
-
-.custom-range:focus::-webkit-slider-thumb {
-  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.custom-range:focus::-moz-range-thumb {
-  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.custom-range:focus::-ms-thumb {
-  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.custom-range::-moz-focus-outer {
-  border: 0;
-}
-
-.custom-range::-webkit-slider-thumb {
-  width: 1rem;
-  height: 1rem;
-  margin-top: -0.25rem;
-  background-color: #3a59b1;
-  border: 0;
-  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-  -webkit-appearance: none;
-  appearance: none;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
-  .custom-range::-webkit-slider-thumb {
-    transition: none;
-  }
-}
-
-.custom-range::-webkit-slider-thumb:active {
-  background-color: #b6c3e7;
-}
-
-.custom-range::-webkit-slider-runnable-track {
-  width: 100%;
-  height: 0.5rem;
-  color: transparent;
-  cursor: pointer;
-  background-color: #dee2e6;
-  border-color: transparent;
-}
-
-.custom-range::-moz-range-thumb {
-  width: 1rem;
-  height: 1rem;
-  background-color: #3a59b1;
-  border: 0;
-  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-  -moz-appearance: none;
-  appearance: none;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
-  .custom-range::-moz-range-thumb {
-    transition: none;
-  }
-}
-
-.custom-range::-moz-range-thumb:active {
-  background-color: #b6c3e7;
-}
-
-.custom-range::-moz-range-track {
-  width: 100%;
-  height: 0.5rem;
-  color: transparent;
-  cursor: pointer;
-  background-color: #dee2e6;
-  border-color: transparent;
-}
-
-.custom-range::-ms-thumb {
-  width: 1rem;
-  height: 1rem;
-  margin-top: 0;
-  margin-right: 0.2rem;
-  margin-left: 0.2rem;
-  background-color: #3a59b1;
-  border: 0;
-  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-  appearance: none;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
-  .custom-range::-ms-thumb {
-    transition: none;
-  }
-}
-
-.custom-range::-ms-thumb:active {
-  background-color: #b6c3e7;
-}
-
-.custom-range::-ms-track {
-  width: 100%;
-  height: 0.5rem;
-  color: transparent;
-  cursor: pointer;
-  background-color: transparent;
-  border-color: transparent;
-  border-width: 0.5rem;
-}
-
-.custom-range::-ms-fill-lower {
-  background-color: #dee2e6;
-}
-
-.custom-range::-ms-fill-upper {
-  margin-right: 15px;
-  background-color: #dee2e6;
-}
-
-.custom-control-label::before,
-.custom-file-label,
-.custom-select {
-  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
-  .custom-control-label::before,
-  .custom-file-label,
-  .custom-select {
-    transition: none;
-  }
-}
-
-.nav {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-wrap: wrap;
-  flex-wrap: wrap;
-  padding-left: 0;
-  margin-bottom: 0;
-  list-style: none;
-}
-
-.nav-link {
-  display: block;
-  padding: 0.5rem 1rem;
-}
-
-.nav-link:hover, .nav-link:focus {
-  text-decoration: none;
-}
-
-.nav-link.disabled {
-  color: #6c757d;
-}
-
-.nav-tabs {
-  border-bottom: 1px solid #dee2e6;
-}
-
-.nav-tabs .nav-item {
-  margin-bottom: -1px;
-}
-
-.nav-tabs .nav-link {
-  border: 1px solid transparent;
-}
-
-.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {
-  border-color: #e9ecef #e9ecef #dee2e6;
-}
-
-.nav-tabs .nav-link.disabled {
-  color: #6c757d;
-  background-color: transparent;
-  border-color: transparent;
-}
-
-.nav-tabs .nav-link.active,
-.nav-tabs .nav-item.show .nav-link {
-  color: #495057;
-  background-color: #fff;
-  border-color: #dee2e6 #dee2e6 #fff;
-}
-
-.nav-tabs .dropdown-menu {
-  margin-top: -1px;
-}
-
-.nav-pills .nav-link.active,
-.nav-pills .show > .nav-link {
-  color: #fff;
-  background-color: #3a59b1;
-}
-
-.nav-fill .nav-item {
-  -ms-flex: 1 1 auto;
-  flex: 1 1 auto;
-  text-align: center;
-}
-
-.nav-justified .nav-item {
-  -ms-flex-preferred-size: 0;
-  flex-basis: 0;
-  -ms-flex-positive: 1;
-  flex-grow: 1;
-  text-align: center;
-}
-
-.tab-content > .tab-pane {
-  display: none;
-}
-
-.tab-content > .active {
-  display: block;
-}
-
-.navbar {
-  position: relative;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-align: center;
-  align-items: center;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-  padding: 0rem 0.25rem;
-}
-
-.navbar > .container,
-.navbar > .container-fluid {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-align: center;
-  align-items: center;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-}
-
-.navbar-brand {
-  display: inline-block;
-  padding-top: 0.348125rem;
-  padding-bottom: 0.348125rem;
-  margin-right: 0.25rem;
-  font-size: 1.0125rem;
-  line-height: inherit;
-  white-space: nowrap;
-}
-
-.navbar-brand:hover, .navbar-brand:focus {
-  text-decoration: none;
-}
-
-.navbar-nav {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  padding-left: 0;
-  margin-bottom: 0;
-  list-style: none;
-}
-
-.navbar-nav .nav-link {
-  padding-right: 0;
-  padding-left: 0;
-}
-
-.navbar-nav .dropdown-menu {
-  position: static;
-  float: none;
-}
-
-.navbar-text {
-  display: inline-block;
-  padding-top: 0.5rem;
-  padding-bottom: 0.5rem;
-}
-
-.navbar-collapse {
-  -ms-flex-preferred-size: 100%;
-  flex-basis: 100%;
-  -ms-flex-positive: 1;
-  flex-grow: 1;
-  -ms-flex-align: center;
-  align-items: center;
-}
-
-.navbar-toggler {
-  padding: 0.25rem 0.75rem;
-  font-size: 1.0125rem;
-  line-height: 1;
-  background-color: transparent;
-  border: 1px solid transparent;
-}
-
-.navbar-toggler:hover, .navbar-toggler:focus {
-  text-decoration: none;
-}
-
-.navbar-toggler:not(:disabled):not(.disabled) {
-  cursor: pointer;
-}
-
-.navbar-toggler-icon {
-  display: inline-block;
-  width: 1.5em;
-  height: 1.5em;
-  vertical-align: middle;
-  content: "";
-  background: no-repeat center center;
-  background-size: 100% 100%;
-}
-
-@media (max-width: 575.98px) {
-  .navbar-expand-sm > .container,
-  .navbar-expand-sm > .container-fluid {
-    padding-right: 0;
-    padding-left: 0;
-  }
-}
-
-@media (min-width: 576px) {
-  .navbar-expand-sm {
-    -ms-flex-flow: row nowrap;
-    flex-flow: row nowrap;
-    -ms-flex-pack: start;
-    justify-content: flex-start;
-  }
-  .navbar-expand-sm .navbar-nav {
-    -ms-flex-direction: row;
-    flex-direction: row;
-  }
-  .navbar-expand-sm .navbar-nav .dropdown-menu {
-    position: absolute;
-  }
-  .navbar-expand-sm .navbar-nav .nav-link {
-    padding-right: 0.5rem;
-    padding-left: 0.5rem;
-  }
-  .navbar-expand-sm > .container,
-  .navbar-expand-sm > .container-fluid {
-    -ms-flex-wrap: nowrap;
-    flex-wrap: nowrap;
-  }
-  .navbar-expand-sm .navbar-collapse {
-    display: -ms-flexbox !important;
-    display: flex !important;
-    -ms-flex-preferred-size: auto;
-    flex-basis: auto;
-  }
-  .navbar-expand-sm .navbar-toggler {
-    display: none;
-  }
-}
-
-@media (max-width: 767.98px) {
-  .navbar-expand-md > .container,
-  .navbar-expand-md > .container-fluid {
-    padding-right: 0;
-    padding-left: 0;
-  }
-}
-
-@media (min-width: 768px) {
-  .navbar-expand-md {
-    -ms-flex-flow: row nowrap;
-    flex-flow: row nowrap;
-    -ms-flex-pack: start;
-    justify-content: flex-start;
-  }
-  .navbar-expand-md .navbar-nav {
-    -ms-flex-direction: row;
-    flex-direction: row;
-  }
-  .navbar-expand-md .navbar-nav .dropdown-menu {
-    position: absolute;
-  }
-  .navbar-expand-md .navbar-nav .nav-link {
-    padding-right: 0.5rem;
-    padding-left: 0.5rem;
-  }
-  .navbar-expand-md > .container,
-  .navbar-expand-md > .container-fluid {
-    -ms-flex-wrap: nowrap;
-    flex-wrap: nowrap;
-  }
-  .navbar-expand-md .navbar-collapse {
-    display: -ms-flexbox !important;
-    display: flex !important;
-    -ms-flex-preferred-size: auto;
-    flex-basis: auto;
-  }
-  .navbar-expand-md .navbar-toggler {
-    display: none;
-  }
-}
-
-@media (max-width: 991.98px) {
-  .navbar-expand-lg > .container,
-  .navbar-expand-lg > .container-fluid {
-    padding-right: 0;
-    padding-left: 0;
-  }
-}
-
-@media (min-width: 992px) {
-  .navbar-expand-lg {
-    -ms-flex-flow: row nowrap;
-    flex-flow: row nowrap;
-    -ms-flex-pack: start;
-    justify-content: flex-start;
-  }
-  .navbar-expand-lg .navbar-nav {
-    -ms-flex-direction: row;
-    flex-direction: row;
-  }
-  .navbar-expand-lg .navbar-nav .dropdown-menu {
-    position: absolute;
-  }
-  .navbar-expand-lg .navbar-nav .nav-link {
-    padding-right: 0.5rem;
-    padding-left: 0.5rem;
-  }
-  .navbar-expand-lg > .container,
-  .navbar-expand-lg > .container-fluid {
-    -ms-flex-wrap: nowrap;
-    flex-wrap: nowrap;
-  }
-  .navbar-expand-lg .navbar-collapse {
-    display: -ms-flexbox !important;
-    display: flex !important;
-    -ms-flex-preferred-size: auto;
-    flex-basis: auto;
-  }
-  .navbar-expand-lg .navbar-toggler {
-    display: none;
-  }
-}
-
-@media (max-width: 1199.98px) {
-  .navbar-expand-xl > .container,
-  .navbar-expand-xl > .container-fluid {
-    padding-right: 0;
-    padding-left: 0;
-  }
-}
-
-@media (min-width: 1200px) {
-  .navbar-expand-xl {
-    -ms-flex-flow: row nowrap;
-    flex-flow: row nowrap;
-    -ms-flex-pack: start;
-    justify-content: flex-start;
-  }
-  .navbar-expand-xl .navbar-nav {
-    -ms-flex-direction: row;
-    flex-direction: row;
-  }
-  .navbar-expand-xl .navbar-nav .dropdown-menu {
-    position: absolute;
-  }
-  .navbar-expand-xl .navbar-nav .nav-link {
-    padding-right: 0.5rem;
-    padding-left: 0.5rem;
-  }
-  .navbar-expand-xl > .container,
-  .navbar-expand-xl > .container-fluid {
-    -ms-flex-wrap: nowrap;
-    flex-wrap: nowrap;
-  }
-  .navbar-expand-xl .navbar-collapse {
-    display: -ms-flexbox !important;
-    display: flex !important;
-    -ms-flex-preferred-size: auto;
-    flex-basis: auto;
-  }
-  .navbar-expand-xl .navbar-toggler {
-    display: none;
-  }
-}
-
-.navbar-expand {
-  -ms-flex-flow: row nowrap;
-  flex-flow: row nowrap;
-  -ms-flex-pack: start;
-  justify-content: flex-start;
-}
-
-.navbar-expand > .container,
-.navbar-expand > .container-fluid {
-  padding-right: 0;
-  padding-left: 0;
-}
-
-.navbar-expand .navbar-nav {
-  -ms-flex-direction: row;
-  flex-direction: row;
-}
-
-.navbar-expand .navbar-nav .dropdown-menu {
-  position: absolute;
-}
-
-.navbar-expand .navbar-nav .nav-link {
-  padding-right: 0.5rem;
-  padding-left: 0.5rem;
-}
-
-.navbar-expand > .container,
-.navbar-expand > .container-fluid {
-  -ms-flex-wrap: nowrap;
-  flex-wrap: nowrap;
-}
-
-.navbar-expand .navbar-collapse {
-  display: -ms-flexbox !important;
-  display: flex !important;
-  -ms-flex-preferred-size: auto;
-  flex-basis: auto;
-}
-
-.navbar-expand .navbar-toggler {
-  display: none;
-}
-
-.navbar-light .navbar-brand {
-  color: #000;
-}
-
-.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {
-  color: #000;
-}
-
-.navbar-light .navbar-nav .nav-link {
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {
-  color: #000;
-}
-
-.navbar-light .navbar-nav .nav-link.disabled {
-  color: rgba(0, 0, 0, 0.3);
-}
-
-.navbar-light .navbar-nav .show > .nav-link,
-.navbar-light .navbar-nav .active > .nav-link,
-.navbar-light .navbar-nav .nav-link.show,
-.navbar-light .navbar-nav .nav-link.active {
-  color: #000;
-}
-
-.navbar-light .navbar-toggler {
-  color: rgba(0, 0, 0, 0.7);
-  border-color: rgba(0, 0, 0, 0.1);
-}
-
-.navbar-light .navbar-toggler-icon {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.7)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");
-}
-
-.navbar-light .navbar-text {
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.navbar-light .navbar-text a {
-  color: #000;
-}
-
-.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {
-  color: #000;
-}
-
-.navbar-dark .navbar-brand {
-  color: #fff;
-}
-
-.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {
-  color: #fff;
-}
-
-.navbar-dark .navbar-nav .nav-link {
-  color: rgba(255, 255, 255, 0.5);
-}
-
-.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {
-  color: rgba(255, 255, 255, 0.75);
-}
-
-.navbar-dark .navbar-nav .nav-link.disabled {
-  color: rgba(255, 255, 255, 0.25);
-}
-
-.navbar-dark .navbar-nav .show > .nav-link,
-.navbar-dark .navbar-nav .active > .nav-link,
-.navbar-dark .navbar-nav .nav-link.show,
-.navbar-dark .navbar-nav .nav-link.active {
-  color: #fff;
-}
-
-.navbar-dark .navbar-toggler {
-  color: rgba(255, 255, 255, 0.5);
-  border-color: rgba(255, 255, 255, 0.1);
-}
-
-.navbar-dark .navbar-toggler-icon {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");
-}
-
-.navbar-dark .navbar-text {
-  color: rgba(255, 255, 255, 0.5);
-}
-
-.navbar-dark .navbar-text a {
-  color: #fff;
-}
-
-.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {
-  color: #fff;
-}
-
-.card {
-  position: relative;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  min-width: 0;
-  word-wrap: break-word;
-  background-color: #fff;
-  background-clip: border-box;
-  border: 1px solid rgba(0, 0, 0, 0.125);
-}
-
-.card > hr {
-  margin-right: 0;
-  margin-left: 0;
-}
-
-.card-body {
-  -ms-flex: 1 1 auto;
-  flex: 1 1 auto;
-  padding: 1.25rem;
-}
-
-.card-title {
-  margin-bottom: 8px;
-}
-
-.card-subtitle {
-  margin-top: -4px;
-  margin-bottom: 0;
-}
-
-.card-text:last-child {
-  margin-bottom: 0;
-}
-
-.card-link:hover {
-  text-decoration: none;
-}
-
-.card-link + .card-link {
-  margin-left: 1.25rem;
-}
-
-.card-header {
-  padding: 8px 1.25rem;
-  margin-bottom: 0;
-  background-color: rgba(0, 0, 0, 0.03);
-  border-bottom: 1px solid rgba(0, 0, 0, 0.125);
-}
-
-.card-header + .list-group .list-group-item:first-child {
-  border-top: 0;
-}
-
-.card-footer {
-  padding: 8px 1.25rem;
-  background-color: rgba(0, 0, 0, 0.03);
-  border-top: 1px solid rgba(0, 0, 0, 0.125);
-}
-
-.card-header-tabs {
-  margin-right: -0.625rem;
-  margin-bottom: -8px;
-  margin-left: -0.625rem;
-  border-bottom: 0;
-}
-
-.card-header-pills {
-  margin-right: -0.625rem;
-  margin-left: -0.625rem;
-}
-
-.card-img-overlay {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  padding: 1.25rem;
-}
-
-.card-img {
-  width: 100%;
-}
-
-.card-img-top {
-  width: 100%;
-}
-
-.card-img-bottom {
-  width: 100%;
-}
-
-.card-deck {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-}
-
-.card-deck .card {
-  margin-bottom: 15px;
-}
-
-@media (min-width: 576px) {
-  .card-deck {
-    -ms-flex-flow: row wrap;
-    flex-flow: row wrap;
-    margin-right: -15px;
-    margin-left: -15px;
-  }
-  .card-deck .card {
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex: 1 0 0%;
-    flex: 1 0 0%;
-    -ms-flex-direction: column;
-    flex-direction: column;
-    margin-right: 15px;
-    margin-bottom: 0;
-    margin-left: 15px;
-  }
-}
-
-.card-group {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-}
-
-.card-group > .card {
-  margin-bottom: 15px;
-}
-
-@media (min-width: 576px) {
-  .card-group {
-    -ms-flex-flow: row wrap;
-    flex-flow: row wrap;
-  }
-  .card-group > .card {
-    -ms-flex: 1 0 0%;
-    flex: 1 0 0%;
-    margin-bottom: 0;
-  }
-  .card-group > .card + .card {
-    margin-left: 0;
-    border-left: 0;
-  }
-}
-
-.card-columns .card {
-  margin-bottom: 8px;
-}
-
-@media (min-width: 576px) {
-  .card-columns {
-    -webkit-column-count: 3;
-    -moz-column-count: 3;
-    column-count: 3;
-    -webkit-column-gap: 1.25rem;
-    -moz-column-gap: 1.25rem;
-    column-gap: 1.25rem;
-    orphans: 1;
-    widows: 1;
-  }
-  .card-columns .card {
-    display: inline-block;
-    width: 100%;
-  }
-}
-
-.accordion .card:not(:first-of-type):not(:last-of-type) {
-  border-bottom: 0;
-  border-radius: 0;
-}
-
-.accordion .card:not(:first-of-type) .card-header:first-child {
-  border-radius: 0;
-}
-
-.accordion .card:first-of-type {
-  border-bottom: 0;
-  border-bottom-right-radius: 0;
-  border-bottom-left-radius: 0;
-}
-
-.accordion .card:last-of-type {
-  border-top-left-radius: 0;
-  border-top-right-radius: 0;
-}
-
-.breadcrumb {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-wrap: wrap;
-  flex-wrap: wrap;
-  padding: 0.75rem 0.5rem;
-  margin-bottom: 1rem;
-  list-style: none;
-  background-color: #e9ecef;
-}
-
-.breadcrumb-item + .breadcrumb-item {
-  padding-left: 0.5rem;
-}
-
-.breadcrumb-item + .breadcrumb-item::before {
-  display: inline-block;
-  padding-right: 0.5rem;
-  color: #6c757d;
-  content: "/";
-}
-
-.breadcrumb-item + .breadcrumb-item:hover::before {
-  text-decoration: underline;
-}
-
-.breadcrumb-item + .breadcrumb-item:hover::before {
-  text-decoration: none;
-}
-
-.breadcrumb-item.active {
-  color: #6c757d;
-}
-
-.pagination {
-  display: -ms-flexbox;
-  display: flex;
-  padding-left: 0;
-  list-style: none;
-}
-
-.page-link {
-  position: relative;
-  display: block;
-  padding: 0.5rem 0.75rem;
-  margin-left: -1px;
-  line-height: 1.25;
-  color: #3a59b1;
-  background-color: #fff;
-  border: 1px solid #EB6864;
-}
-
-.page-link:hover {
-  z-index: 2;
-  color: #fff;
-  text-decoration: none;
-  background-color: #EB6864;
-  border-color: #dee2e6;
-}
-
-.page-link:focus {
-  z-index: 2;
-  outline: 0;
-  box-shadow: 0 0 0 0.2rem rgba(58, 89, 177, 0.25);
-}
-
-.page-link:not(:disabled):not(.disabled) {
-  cursor: pointer;
-}
-
-.page-item:first-child .page-link {
-  margin-left: 0;
-}
-
-.page-item.active .page-link {
-  z-index: 1;
-  color: #fff;
-  background-color: #3a59b1;
-  border-color: #3a59b1;
-}
-
-.page-item.disabled .page-link {
-  color: #6c757d;
-  pointer-events: none;
-  cursor: auto;
-  background-color: #fff;
-  border-color: #dee2e6;
-}
-
-.pagination-lg .page-link {
-  padding: 0.75rem 1.5rem;
-  font-size: 1.0125rem;
-  line-height: 1.5;
-}
-
-.pagination-sm .page-link {
-  padding: 0.25rem 0.5rem;
-  font-size: 0.70875rem;
-  line-height: 1.5;
-}
-
-.badge {
-  display: inline-block;
-  padding: 0.25rem 0.4em;
-  font-size: 75%;
-  font-weight: 700;
-  line-height: 1;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: baseline;
-}
-
-.badge:empty {
-  display: none;
-}
-
-.btn .badge {
-  position: relative;
-  top: -1px;
-}
-
-.badge-pill {
-  padding-right: 0.6em;
-  padding-left: 0.6em;
-}
-
-.badge-primary {
-  color: #fff;
-  background-color: #3a59b1;
-}
-
-.badge-primary[href]:hover, .badge-primary[href]:focus {
-  color: #fff;
-  text-decoration: none;
-  background-color: #2d468b;
-}
-
-.badge-secondary {
-  color: #fff;
-  background-color: #6c757d;
-}
-
-.badge-secondary[href]:hover, .badge-secondary[href]:focus {
-  color: #fff;
-  text-decoration: none;
-  background-color: #545b62;
-}
-
-.badge-success {
-  color: #fff;
-  background-color: #22b24c;
-}
-
-.badge-success[href]:hover, .badge-success[href]:focus {
-  color: #fff;
-  text-decoration: none;
-  background-color: #1a873a;
-}
-
-.badge-info {
-  color: #212529;
-  background-color: yellow;
-}
-
-.badge-info[href]:hover, .badge-info[href]:focus {
-  color: #212529;
-  text-decoration: none;
-  background-color: #cccc00;
-}
-
-.badge-warning {
-  color: #212529;
-  background-color: #ffc107;
-}
-
-.badge-warning[href]:hover, .badge-warning[href]:focus {
-  color: #212529;
-  text-decoration: none;
-  background-color: #d39e00;
-}
-
-.badge-danger {
-  color: #fff;
-  background-color: #fc3434;
-}
-
-.badge-danger[href]:hover, .badge-danger[href]:focus {
-  color: #fff;
-  text-decoration: none;
-  background-color: #f90404;
-}
-
-.badge-light {
-  color: #212529;
-  background-color: white;
-}
-
-.badge-light[href]:hover, .badge-light[href]:focus {
-  color: #212529;
-  text-decoration: none;
-  background-color: #e6e6e6;
-}
-
-.badge-dark {
-  color: #fff;
-  background-color: #6a8ed3;
-}
-
-.badge-dark[href]:hover, .badge-dark[href]:focus {
-  color: #fff;
-  text-decoration: none;
-  background-color: #4370c7;
-}
-
-.jumbotron {
-  padding: 1.44rem 0.72rem;
-  margin-bottom: 1.44rem;
-  background-color: #e9ecef;
-}
-
-@media (min-width: 576px) {
-  .jumbotron {
-    padding: 2.88rem 1.44rem;
-  }
-}
-
-.jumbotron-fluid {
-  padding-right: 0;
-  padding-left: 0;
-}
-
-.alert {
-  position: relative;
-  padding: 0.5rem 1.25rem;
-  margin-bottom: 1rem;
-  border: 1px solid transparent;
-}
-
-.alert-heading {
-  color: inherit;
-}
-
-.alert-link {
-  font-weight: 700;
-}
-
-.alert-dismissible {
-  padding-right: 3.715rem;
-}
-
-.alert-dismissible .close {
-  position: absolute;
-  top: 0;
-  right: 0;
-  padding: 0.5rem 1.25rem;
-  color: inherit;
-}
-
-.alert-primary {
-  color: #1e2e5c;
-  background-color: #d8deef;
-  border-color: #c8d1e9;
-}
-
-.alert-primary hr {
-  border-top-color: #b6c2e2;
-}
-
-.alert-primary .alert-link {
-  color: #111b36;
-}
-
-.alert-secondary {
-  color: #383d41;
-  background-color: #e2e3e5;
-  border-color: #d6d8db;
-}
-
-.alert-secondary hr {
-  border-top-color: #c8cbcf;
-}
-
-.alert-secondary .alert-link {
-  color: #202326;
-}
-
-.alert-success {
-  color: #125d28;
-  background-color: #d3f0db;
-  border-color: #c1e9cd;
-}
-
-.alert-success hr {
-  border-top-color: #aee2be;
-}
-
-.alert-success .alert-link {
-  color: #0a3216;
-}
-
-.alert-info {
-  color: #858500;
-  background-color: #ffffcc;
-  border-color: #ffffb8;
-}
-
-.alert-info hr {
-  border-top-color: #ffff9f;
-}
-
-.alert-info .alert-link {
-  color: #525200;
-}
-
-.alert-warning {
-  color: #856404;
-  background-color: #fff3cd;
-  border-color: #ffeeba;
-}
-
-.alert-warning hr {
-  border-top-color: #ffe8a1;
-}
-
-.alert-warning .alert-link {
-  color: #533f03;
-}
-
-.alert-danger {
-  color: #831b1b;
-  background-color: #fed6d6;
-  border-color: #fec6c6;
-}
-
-.alert-danger hr {
-  border-top-color: #feadad;
-}
-
-.alert-danger .alert-link {
-  color: #591212;
-}
-
-.alert-light {
-  color: #858585;
-  background-color: white;
-  border-color: white;
-}
-
-.alert-light hr {
-  border-top-color: #f2f2f2;
-}
-
-.alert-light .alert-link {
-  color: #6c6c6c;
-}
-
-.alert-dark {
-  color: #374a6e;
-  background-color: #e1e8f6;
-  border-color: #d5dff3;
-}
-
-.alert-dark hr {
-  border-top-color: #c1d0ed;
-}
-
-.alert-dark .alert-link {
-  color: #26334c;
-}
-
-@-webkit-keyframes progress-bar-stripes {
-  from {
-    background-position: 1rem 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-@keyframes progress-bar-stripes {
-  from {
-    background-position: 1rem 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-.progress {
-  display: -ms-flexbox;
-  display: flex;
-  height: 1rem;
-  overflow: hidden;
-  font-size: 0.6075rem;
-  background-color: #e9ecef;
-}
-
-.progress-bar {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-pack: center;
-  justify-content: center;
-  color: #fff;
-  text-align: center;
-  white-space: nowrap;
-  background-color: #3a59b1;
-  transition: width 0.6s ease;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
-  .progress-bar {
-    transition: none;
-  }
-}
-
-.progress-bar-striped {
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-size: 1rem 1rem;
-}
-
-.progress-bar-animated {
-  -webkit-animation: progress-bar-stripes 1s linear infinite;
-  animation: progress-bar-stripes 1s linear infinite;
-}
-
-.media {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: start;
-  align-items: flex-start;
-}
-
-.media-body {
-  -ms-flex: 1;
-  flex: 1;
-}
-
-.list-group {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  padding-left: 0;
-  margin-bottom: 0;
-}
-
-.list-group-item-action {
-  width: 100%;
-  color: #495057;
-  text-align: inherit;
-}
-
-.list-group-item-action:hover, .list-group-item-action:focus {
-  color: #495057;
-  text-decoration: none;
-  background-color: #f8f9fa;
-}
-
-.list-group-item-action:active {
-  color: #212529;
-  background-color: #e9ecef;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 0.5rem 0.5rem;
-  margin-bottom: -1px;
-  background-color: #fff;
-  border: 1px solid rgba(0, 0, 0, 0.125);
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-}
-
-.list-group-item:hover, .list-group-item:focus {
-  z-index: 1;
-  text-decoration: none;
-}
-
-.list-group-item.disabled, .list-group-item:disabled {
-  color: #6c757d;
-  background-color: #fff;
-}
-
-.list-group-item.active {
-  z-index: 2;
-  color: #fff;
-  background-color: #3a59b1;
-  border-color: #3a59b1;
-}
-
-.list-group-flush .list-group-item {
-  border-right: 0;
-  border-left: 0;
-}
-
-.list-group-flush:first-child .list-group-item:first-child {
-  border-top: 0;
-}
-
-.list-group-flush:last-child .list-group-item:last-child {
-  border-bottom: 0;
-}
-
-.list-group-item-primary {
-  color: #1e2e5c;
-  background-color: #c8d1e9;
-}
-
-.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {
-  color: #1e2e5c;
-  background-color: #b6c2e2;
-}
-
-.list-group-item-primary.list-group-item-action.active {
-  color: #fff;
-  background-color: #1e2e5c;
-  border-color: #1e2e5c;
-}
-
-.list-group-item-secondary {
-  color: #383d41;
-  background-color: #d6d8db;
-}
-
-.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {
-  color: #383d41;
-  background-color: #c8cbcf;
-}
-
-.list-group-item-secondary.list-group-item-action.active {
-  color: #fff;
-  background-color: #383d41;
-  border-color: #383d41;
-}
-
-.list-group-item-success {
-  color: #125d28;
-  background-color: #c1e9cd;
-}
-
-.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {
-  color: #125d28;
-  background-color: #aee2be;
-}
-
-.list-group-item-success.list-group-item-action.active {
-  color: #fff;
-  background-color: #125d28;
-  border-color: #125d28;
-}
-
-.list-group-item-info {
-  color: #858500;
-  background-color: #ffffb8;
-}
-
-.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {
-  color: #858500;
-  background-color: #ffff9f;
-}
-
-.list-group-item-info.list-group-item-action.active {
-  color: #fff;
-  background-color: #858500;
-  border-color: #858500;
-}
-
-.list-group-item-warning {
-  color: #856404;
-  background-color: #ffeeba;
-}
-
-.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {
-  color: #856404;
-  background-color: #ffe8a1;
-}
-
-.list-group-item-warning.list-group-item-action.active {
-  color: #fff;
-  background-color: #856404;
-  border-color: #856404;
-}
-
-.list-group-item-danger {
-  color: #831b1b;
-  background-color: #fec6c6;
-}
-
-.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {
-  color: #831b1b;
-  background-color: #feadad;
-}
-
-.list-group-item-danger.list-group-item-action.active {
-  color: #fff;
-  background-color: #831b1b;
-  border-color: #831b1b;
-}
-
-.list-group-item-light {
-  color: #858585;
-  background-color: white;
-}
-
-.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {
-  color: #858585;
-  background-color: #f2f2f2;
-}
-
-.list-group-item-light.list-group-item-action.active {
-  color: #fff;
-  background-color: #858585;
-  border-color: #858585;
-}
-
-.list-group-item-dark {
-  color: #374a6e;
-  background-color: #d5dff3;
-}
-
-.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {
-  color: #374a6e;
-  background-color: #c1d0ed;
-}
-
-.list-group-item-dark.list-group-item-action.active {
-  color: #fff;
-  background-color: #374a6e;
-  border-color: #374a6e;
-}
-
-.close {
-  float: right;
-  font-size: 1.215rem;
-  font-weight: 700;
-  line-height: 1;
-  color: #000;
-  text-shadow: 0 1px 0 #fff;
-  opacity: .5;
-}
-
-.close:not(:disabled):not(.disabled) {
-  cursor: pointer;
-}
-
-.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {
-  color: #000;
-  text-decoration: none;
-  opacity: .75;
-}
-
-button.close {
-  padding: 0;
-  background-color: transparent;
-  border: 0;
-  -webkit-appearance: none;
-}
-
-.modal-open {
-  overflow: hidden;
-}
-
-.modal-open .modal {
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.modal {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1050;
-  display: none;
-  overflow: hidden;
-  outline: 0;
-}
-
-.modal-dialog {
-  position: relative;
-  width: auto;
-  margin: 0.5rem;
-  pointer-events: none;
-}
-
-.modal.fade .modal-dialog {
-  transition: -webkit-transform 0.3s ease-out;
-  transition: transform 0.3s ease-out;
-  transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;
-  -webkit-transform: translate(0, -25%);
-  transform: translate(0, -25%);
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
-  .modal.fade .modal-dialog {
-    transition: none;
-  }
-}
-
-.modal.show .modal-dialog {
-  -webkit-transform: translate(0, 0);
-  transform: translate(0, 0);
-}
-
-.modal-dialog-centered {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: center;
-  align-items: center;
-  min-height: calc(100% - (0.5rem * 2));
-}
-
-.modal-dialog-centered::before {
-  display: block;
-  height: calc(100vh - (0.5rem * 2));
-  content: "";
-}
-
-.modal-content {
-  position: relative;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-direction: column;
-  flex-direction: column;
-  width: 100%;
-  pointer-events: auto;
-  background-color: #fff;
-  background-clip: padding-box;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  outline: 0;
-}
-
-.modal-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1040;
-  background-color: #000;
-}
-
-.modal-backdrop.fade {
-  opacity: 0;
-}
-
-.modal-backdrop.show {
-  opacity: 0.5;
-}
-
-.modal-header {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: start;
-  align-items: flex-start;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-  padding: 1rem;
-  border-bottom: 1px solid #e9ecef;
-}
-
-.modal-header .close {
-  padding: 1rem;
-  margin: -1rem -1rem -1rem auto;
-}
-
-.modal-title {
-  margin-bottom: 0;
-  line-height: 1.5;
-}
-
-.modal-body {
-  position: relative;
-  -ms-flex: 1 1 auto;
-  flex: 1 1 auto;
-  padding: 1rem;
-}
-
-.modal-footer {
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: center;
-  align-items: center;
-  -ms-flex-pack: end;
-  justify-content: flex-end;
-  padding: 1rem;
-  border-top: 1px solid #e9ecef;
-}
-
-.modal-footer > :not(:first-child) {
-  margin-left: .25rem;
-}
-
-.modal-footer > :not(:last-child) {
-  margin-right: .25rem;
-}
-
-.modal-scrollbar-measure {
-  position: absolute;
-  top: -9999px;
-  width: 50px;
-  height: 50px;
-  overflow: scroll;
-}
-
-@media (min-width: 576px) {
-  .modal-dialog {
-    max-width: 500px;
-    margin: 1.75rem auto;
-  }
-  .modal-dialog-centered {
-    min-height: calc(100% - (1.75rem * 2));
-  }
-  .modal-dialog-centered::before {
-    height: calc(100vh - (1.75rem * 2));
-  }
-  .modal-sm {
-    max-width: 300px;
-  }
-}
-
-@media (min-width: 992px) {
-  .modal-lg {
-    max-width: 800px;
-  }
-}
-
-.tooltip {
-  position: absolute;
-  z-index: 1070;
-  display: block;
-  margin: 0;
-  font-family: Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
-  font-style: normal;
-  font-weight: 400;
-  line-height: 1.5;
-  text-align: left;
-  text-align: start;
-  text-decoration: none;
-  text-shadow: none;
-  text-transform: none;
-  letter-spacing: normal;
-  word-break: normal;
-  word-spacing: normal;
-  white-space: normal;
-  line-break: auto;
-  font-size: 0.70875rem;
-  word-wrap: break-word;
-  opacity: 0;
-}
-
-.tooltip.show {
-  opacity: 0.9;
-}
-
-.tooltip .arrow {
-  position: absolute;
-  display: block;
-  width: 0.8rem;
-  height: 0.4rem;
-}
-
-.tooltip .arrow::before {
-  position: absolute;
-  content: "";
-  border-color: transparent;
-  border-style: solid;
-}
-
-.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] {
-  padding: 0.4rem 0;
-}
-
-.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow {
-  bottom: 0;
-}
-
-.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before {
-  top: 0;
-  border-width: 0.4rem 0.4rem 0;
-  border-top-color: #000;
-}
-
-.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] {
-  padding: 0 0.4rem;
-}
-
-.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow {
-  left: 0;
-  width: 0.4rem;
-  height: 0.8rem;
-}
-
-.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before {
-  right: 0;
-  border-width: 0.4rem 0.4rem 0.4rem 0;
-  border-right-color: #000;
-}
-
-.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] {
-  padding: 0.4rem 0;
-}
-
-.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow {
-  top: 0;
-}
-
-.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before {
-  bottom: 0;
-  border-width: 0 0.4rem 0.4rem;
-  border-bottom-color: #000;
-}
-
-.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] {
-  padding: 0 0.4rem;
-}
-
-.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow {
-  right: 0;
-  width: 0.4rem;
-  height: 0.8rem;
-}
-
-.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before {
-  left: 0;
-  border-width: 0.4rem 0 0.4rem 0.4rem;
-  border-left-color: #000;
-}
-
-.tooltip-inner {
-  max-width: 200px;
-  padding: 0.25rem 0.5rem;
-  color: #fff;
-  text-align: center;
-  background-color: #000;
-}
-
-.popover {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: 1060;
-  display: block;
-  max-width: 276px;
-  font-family: Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
-  font-style: normal;
-  font-weight: 400;
-  line-height: 1.5;
-  text-align: left;
-  text-align: start;
-  text-decoration: none;
-  text-shadow: none;
-  text-transform: none;
-  letter-spacing: normal;
-  word-break: normal;
-  word-spacing: normal;
-  white-space: normal;
-  line-break: auto;
-  font-size: 0.70875rem;
-  word-wrap: break-word;
-  background-color: #fff;
-  background-clip: padding-box;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-}
-
-.popover .arrow {
-  position: absolute;
-  display: block;
-  width: 1rem;
-  height: 0.5rem;
-  margin: 0 0.3rem;
-}
-
-.popover .arrow::before, .popover .arrow::after {
-  position: absolute;
-  display: block;
-  content: "";
-  border-color: transparent;
-  border-style: solid;
-}
-
-.bs-popover-top, .bs-popover-auto[x-placement^="top"] {
-  margin-bottom: 0.5rem;
-}
-
-.bs-popover-top .arrow, .bs-popover-auto[x-placement^="top"] .arrow {
-  bottom: calc((0.5rem + 1px) * -1);
-}
-
-.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^="top"] .arrow::before,
-.bs-popover-top .arrow::after,
-.bs-popover-auto[x-placement^="top"] .arrow::after {
-  border-width: 0.5rem 0.5rem 0;
-}
-
-.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^="top"] .arrow::before {
-  bottom: 0;
-  border-top-color: rgba(0, 0, 0, 0.25);
-}
-
-
-.bs-popover-top .arrow::after,
-.bs-popover-auto[x-placement^="top"] .arrow::after {
-  bottom: 1px;
-  border-top-color: #fff;
-}
-
-.bs-popover-right, .bs-popover-auto[x-placement^="right"] {
-  margin-left: 0.5rem;
-}
-
-.bs-popover-right .arrow, .bs-popover-auto[x-placement^="right"] .arrow {
-  left: calc((0.5rem + 1px) * -1);
-  width: 0.5rem;
-  height: 1rem;
-  margin: 0.3rem 0;
-}
-
-.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^="right"] .arrow::before,
-.bs-popover-right .arrow::after,
-.bs-popover-auto[x-placement^="right"] .arrow::after {
-  border-width: 0.5rem 0.5rem 0.5rem 0;
-}
-
-.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^="right"] .arrow::before {
-  left: 0;
-  border-right-color: rgba(0, 0, 0, 0.25);
-}
-
-
-.bs-popover-right .arrow::after,
-.bs-popover-auto[x-placement^="right"] .arrow::after {
-  left: 1px;
-  border-right-color: #fff;
-}
-
-.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] {
-  margin-top: 0.5rem;
-}
-
-.bs-popover-bottom .arrow, .bs-popover-auto[x-placement^="bottom"] .arrow {
-  top: calc((0.5rem + 1px) * -1);
-}
-
-.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^="bottom"] .arrow::before,
-.bs-popover-bottom .arrow::after,
-.bs-popover-auto[x-placement^="bottom"] .arrow::after {
-  border-width: 0 0.5rem 0.5rem 0.5rem;
-}
-
-.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^="bottom"] .arrow::before {
-  top: 0;
-  border-bottom-color: rgba(0, 0, 0, 0.25);
-}
-
-
-.bs-popover-bottom .arrow::after,
-.bs-popover-auto[x-placement^="bottom"] .arrow::after {
-  top: 1px;
-  border-bottom-color: #fff;
-}
-
-.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before {
-  position: absolute;
-  top: 0;
-  left: 50%;
-  display: block;
-  width: 1rem;
-  margin-left: -0.5rem;
-  content: "";
-  border-bottom: 1px solid #f7f7f7;
-}
-
-.bs-popover-left, .bs-popover-auto[x-placement^="left"] {
-  margin-right: 0.5rem;
-}
-
-.bs-popover-left .arrow, .bs-popover-auto[x-placement^="left"] .arrow {
-  right: calc((0.5rem + 1px) * -1);
-  width: 0.5rem;
-  height: 1rem;
-  margin: 0.3rem 0;
-}
-
-.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^="left"] .arrow::before,
-.bs-popover-left .arrow::after,
-.bs-popover-auto[x-placement^="left"] .arrow::after {
-  border-width: 0.5rem 0 0.5rem 0.5rem;
-}
-
-.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^="left"] .arrow::before {
-  right: 0;
-  border-left-color: rgba(0, 0, 0, 0.25);
-}
-
-
-.bs-popover-left .arrow::after,
-.bs-popover-auto[x-placement^="left"] .arrow::after {
-  right: 1px;
-  border-left-color: #fff;
-}
-
-.popover-header {
-  padding: 0.5rem 0.75rem;
-  margin-bottom: 0;
-  font-size: 0.81rem;
-  color: inherit;
-  background-color: #f7f7f7;
-  border-bottom: 1px solid #ebebeb;
-}
-
-.popover-header:empty {
-  display: none;
-}
-
-.popover-body {
-  padding: 0.5rem 0.75rem;
-  color: #212529;
-}
-
-.carousel {
-  position: relative;
-}
-
-.carousel-inner {
-  position: relative;
-  width: 100%;
-  overflow: hidden;
-}
-
-.carousel-item {
-  position: relative;
-  display: none;
-  -ms-flex-align: center;
-  align-items: center;
-  width: 100%;
-  -webkit-backface-visibility: hidden;
-  backface-visibility: hidden;
-  -webkit-perspective: 1000px;
-  perspective: 1000px;
-}
-
-.carousel-item.active,
-.carousel-item-next,
-.carousel-item-prev {
-  display: block;
-  transition: -webkit-transform 0.6s ease;
-  transition: transform 0.6s ease;
-  transition: transform 0.6s ease, -webkit-transform 0.6s ease;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
-  .carousel-item.active,
-  .carousel-item-next,
-  .carousel-item-prev {
-    transition: none;
-  }
-}
-
-.carousel-item-next,
-.carousel-item-prev {
-  position: absolute;
-  top: 0;
-}
-
-.carousel-item-next.carousel-item-left,
-.carousel-item-prev.carousel-item-right {
-  -webkit-transform: translateX(0);
-  transform: translateX(0);
-}
-
-@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {
-  .carousel-item-next.carousel-item-left,
-  .carousel-item-prev.carousel-item-right {
-    -webkit-transform: translate3d(0, 0, 0);
-    transform: translate3d(0, 0, 0);
-  }
-}
-
-.carousel-item-next,
-.active.carousel-item-right {
-  -webkit-transform: translateX(100%);
-  transform: translateX(100%);
-}
-
-@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {
-  .carousel-item-next,
-  .active.carousel-item-right {
-    -webkit-transform: translate3d(100%, 0, 0);
-    transform: translate3d(100%, 0, 0);
-  }
-}
-
-.carousel-item-prev,
-.active.carousel-item-left {
-  -webkit-transform: translateX(-100%);
-  transform: translateX(-100%);
-}
-
-@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {
-  .carousel-item-prev,
-  .active.carousel-item-left {
-    -webkit-transform: translate3d(-100%, 0, 0);
-    transform: translate3d(-100%, 0, 0);
-  }
-}
-
-.carousel-fade .carousel-item {
-  opacity: 0;
-  transition-duration: .6s;
-  transition-property: opacity;
-}
-
-.carousel-fade .carousel-item.active,
-.carousel-fade .carousel-item-next.carousel-item-left,
-.carousel-fade .carousel-item-prev.carousel-item-right {
-  opacity: 1;
-}
-
-.carousel-fade .active.carousel-item-left,
-.carousel-fade .active.carousel-item-right {
-  opacity: 0;
-}
-
-.carousel-fade .carousel-item-next,
-.carousel-fade .carousel-item-prev,
-.carousel-fade .carousel-item.active,
-.carousel-fade .active.carousel-item-left,
-.carousel-fade .active.carousel-item-prev {
-  -webkit-transform: translateX(0);
-  transform: translateX(0);
-}
-
-@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {
-  .carousel-fade .carousel-item-next,
-  .carousel-fade .carousel-item-prev,
-  .carousel-fade .carousel-item.active,
-  .carousel-fade .active.carousel-item-left,
-  .carousel-fade .active.carousel-item-prev {
-    -webkit-transform: translate3d(0, 0, 0);
-    transform: translate3d(0, 0, 0);
-  }
-}
-
-.carousel-control-prev,
-.carousel-control-next {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-align: center;
-  align-items: center;
-  -ms-flex-pack: center;
-  justify-content: center;
-  width: 15%;
-  color: #fff;
-  text-align: center;
-  opacity: 0.5;
-}
-
-.carousel-control-prev:hover, .carousel-control-prev:focus,
-.carousel-control-next:hover,
-.carousel-control-next:focus {
-  color: #fff;
-  text-decoration: none;
-  outline: 0;
-  opacity: .9;
-}
-
-.carousel-control-prev {
-  left: 0;
-}
-
-.carousel-control-next {
-  right: 0;
-}
-
-.carousel-control-prev-icon,
-.carousel-control-next-icon {
-  display: inline-block;
-  width: 20px;
-  height: 20px;
-  background: transparent no-repeat center center;
-  background-size: 100% 100%;
-}
-
-.carousel-control-prev-icon {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E");
-}
-
-.carousel-control-next-icon {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E");
-}
-
-.carousel-indicators {
-  position: absolute;
-  right: 0;
-  bottom: 10px;
-  left: 0;
-  z-index: 15;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-pack: center;
-  justify-content: center;
-  padding-left: 0;
-  margin-right: 15%;
-  margin-left: 15%;
-  list-style: none;
-}
-
-.carousel-indicators li {
-  position: relative;
-  -ms-flex: 0 1 auto;
-  flex: 0 1 auto;
-  width: 30px;
-  height: 3px;
-  margin-right: 3px;
-  margin-left: 3px;
-  text-indent: -999px;
-  cursor: pointer;
-  background-color: rgba(255, 255, 255, 0.5);
-}
-
-.carousel-indicators li::before {
-  position: absolute;
-  top: -10px;
-  left: 0;
-  display: inline-block;
-  width: 100%;
-  height: 10px;
-  content: "";
-}
-
-.carousel-indicators li::after {
-  position: absolute;
-  bottom: -10px;
-  left: 0;
-  display: inline-block;
-  width: 100%;
-  height: 10px;
-  content: "";
-}
-
-.carousel-indicators .active {
-  background-color: #fff;
-}
-
-.carousel-caption {
-  position: absolute;
-  right: 15%;
-  bottom: 20px;
-  left: 15%;
-  z-index: 10;
-  padding-top: 20px;
-  padding-bottom: 20px;
-  color: #fff;
-  text-align: center;
-}
-
-.align-baseline {
-  vertical-align: baseline !important;
-}
-
-.align-top {
-  vertical-align: top !important;
-}
-
-.align-middle {
-  vertical-align: middle !important;
-}
-
-.align-bottom {
-  vertical-align: bottom !important;
-}
-
-.align-text-bottom {
-  vertical-align: text-bottom !important;
-}
-
-.align-text-top {
-  vertical-align: text-top !important;
-}
-
-.bg-primary {
-  background-color: #3a59b1 !important;
-}
-
-a.bg-primary:hover, a.bg-primary:focus,
-button.bg-primary:hover,
-button.bg-primary:focus {
-  background-color: #2d468b !important;
-}
-
-.bg-secondary {
-  background-color: #6c757d !important;
-}
-
-a.bg-secondary:hover, a.bg-secondary:focus,
-button.bg-secondary:hover,
-button.bg-secondary:focus {
-  background-color: #545b62 !important;
-}
-
-.bg-success {
-  background-color: #22b24c !important;
-}
-
-a.bg-success:hover, a.bg-success:focus,
-button.bg-success:hover,
-button.bg-success:focus {
-  background-color: #1a873a !important;
-}
-
-.bg-info {
-  background-color: yellow !important;
-}
-
-a.bg-info:hover, a.bg-info:focus,
-button.bg-info:hover,
-button.bg-info:focus {
-  background-color: #cccc00 !important;
-}
-
-.bg-warning {
-  background-color: #ffc107 !important;
-}
-
-a.bg-warning:hover, a.bg-warning:focus,
-button.bg-warning:hover,
-button.bg-warning:focus {
-  background-color: #d39e00 !important;
-}
-
-.bg-danger {
-  background-color: #fc3434 !important;
-}
-
-a.bg-danger:hover, a.bg-danger:focus,
-button.bg-danger:hover,
-button.bg-danger:focus {
-  background-color: #f90404 !important;
-}
-
-.bg-light {
-  background-color: white !important;
-}
-
-a.bg-light:hover, a.bg-light:focus,
-button.bg-light:hover,
-button.bg-light:focus {
-  background-color: #e6e6e6 !important;
-}
-
-.bg-dark {
-  background-color: #6a8ed3 !important;
-}
-
-a.bg-dark:hover, a.bg-dark:focus,
-button.bg-dark:hover,
-button.bg-dark:focus {
-  background-color: #4370c7 !important;
-}
-
-.bg-white {
-  background-color: #fff !important;
-}
-
-.bg-transparent {
-  background-color: transparent !important;
-}
-
-.border {
-  border: 1px solid #dee2e6 !important;
-}
-
-.border-top {
-  border-top: 1px solid #dee2e6 !important;
-}
-
-.border-right {
-  border-right: 1px solid #dee2e6 !important;
-}
-
-.border-bottom {
-  border-bottom: 1px solid #dee2e6 !important;
-}
-
-.border-left {
-  border-left: 1px solid #dee2e6 !important;
-}
-
-.border-0 {
-  border: 0 !important;
-}
-
-.border-top-0 {
-  border-top: 0 !important;
-}
-
-.border-right-0 {
-  border-right: 0 !important;
-}
-
-.border-bottom-0 {
-  border-bottom: 0 !important;
-}
-
-.border-left-0 {
-  border-left: 0 !important;
-}
-
-.border-primary {
-  border-color: #3a59b1 !important;
-}
-
-.border-secondary {
-  border-color: #6c757d !important;
-}
-
-.border-success {
-  border-color: #22b24c !important;
-}
-
-.border-info {
-  border-color: yellow !important;
-}
-
-.border-warning {
-  border-color: #ffc107 !important;
-}
-
-.border-danger {
-  border-color: #fc3434 !important;
-}
-
-.border-light {
-  border-color: white !important;
-}
-
-.border-dark {
-  border-color: #6a8ed3 !important;
-}
-
-.border-white {
-  border-color: #fff !important;
-}
-
-.rounded {
-  border-radius: 0.25rem !important;
-}
-
-.rounded-top {
-  border-top-left-radius: 0.25rem !important;
-  border-top-right-radius: 0.25rem !important;
-}
-
-.rounded-right {
-  border-top-right-radius: 0.25rem !important;
-  border-bottom-right-radius: 0.25rem !important;
-}
-
-.rounded-bottom {
-  border-bottom-right-radius: 0.25rem !important;
-  border-bottom-left-radius: 0.25rem !important;
-}
-
-.rounded-left {
-  border-top-left-radius: 0.25rem !important;
-  border-bottom-left-radius: 0.25rem !important;
-}
-
-.rounded-circle {
-  border-radius: 50% !important;
-}
-
-.rounded-0 {
-  border-radius: 0 !important;
-}
-
-.clearfix::after {
-  display: block;
-  clear: both;
-  content: "";
-}
-
-.d-none {
-  display: none !important;
-}
-
-.d-inline {
-  display: inline !important;
-}
-
-.d-inline-block {
-  display: inline-block !important;
-}
-
-.d-block {
-  display: block !important;
-}
-
-.d-table {
-  display: table !important;
-}
-
-.d-table-row {
-  display: table-row !important;
-}
-
-.d-table-cell {
-  display: table-cell !important;
-}
-
-.d-flex {
-  display: -ms-flexbox !important;
-  display: flex !important;
-}
-
-.d-inline-flex {
-  display: -ms-inline-flexbox !important;
-  display: inline-flex !important;
-}
-
-@media (min-width: 576px) {
-  .d-sm-none {
-    display: none !important;
-  }
-  .d-sm-inline {
-    display: inline !important;
-  }
-  .d-sm-inline-block {
-    display: inline-block !important;
-  }
-  .d-sm-block {
-    display: block !important;
-  }
-  .d-sm-table {
-    display: table !important;
-  }
-  .d-sm-table-row {
-    display: table-row !important;
-  }
-  .d-sm-table-cell {
-    display: table-cell !important;
-  }
-  .d-sm-flex {
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-  .d-sm-inline-flex {
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-@media (min-width: 768px) {
-  .d-md-none {
-    display: none !important;
-  }
-  .d-md-inline {
-    display: inline !important;
-  }
-  .d-md-inline-block {
-    display: inline-block !important;
-  }
-  .d-md-block {
-    display: block !important;
-  }
-  .d-md-table {
-    display: table !important;
-  }
-  .d-md-table-row {
-    display: table-row !important;
-  }
-  .d-md-table-cell {
-    display: table-cell !important;
-  }
-  .d-md-flex {
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-  .d-md-inline-flex {
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-@media (min-width: 992px) {
-  .d-lg-none {
-    display: none !important;
-  }
-  .d-lg-inline {
-    display: inline !important;
-  }
-  .d-lg-inline-block {
-    display: inline-block !important;
-  }
-  .d-lg-block {
-    display: block !important;
-  }
-  .d-lg-table {
-    display: table !important;
-  }
-  .d-lg-table-row {
-    display: table-row !important;
-  }
-  .d-lg-table-cell {
-    display: table-cell !important;
-  }
-  .d-lg-flex {
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-  .d-lg-inline-flex {
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-@media (min-width: 1200px) {
-  .d-xl-none {
-    display: none !important;
-  }
-  .d-xl-inline {
-    display: inline !important;
-  }
-  .d-xl-inline-block {
-    display: inline-block !important;
-  }
-  .d-xl-block {
-    display: block !important;
-  }
-  .d-xl-table {
-    display: table !important;
-  }
-  .d-xl-table-row {
-    display: table-row !important;
-  }
-  .d-xl-table-cell {
-    display: table-cell !important;
-  }
-  .d-xl-flex {
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-  .d-xl-inline-flex {
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-@media print {
-  .d-print-none {
-    display: none !important;
-  }
-  .d-print-inline {
-    display: inline !important;
-  }
-  .d-print-inline-block {
-    display: inline-block !important;
-  }
-  .d-print-block {
-    display: block !important;
-  }
-  .d-print-table {
-    display: table !important;
-  }
-  .d-print-table-row {
-    display: table-row !important;
-  }
-  .d-print-table-cell {
-    display: table-cell !important;
-  }
-  .d-print-flex {
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-  .d-print-inline-flex {
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-.embed-responsive {
-  position: relative;
-  display: block;
-  width: 100%;
-  padding: 0;
-  overflow: hidden;
-}
-
-.embed-responsive::before {
-  display: block;
-  content: "";
-}
-
-.embed-responsive .embed-responsive-item,
-.embed-responsive iframe,
-.embed-responsive embed,
-.embed-responsive object,
-.embed-responsive video {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  border: 0;
-}
-
-.embed-responsive-21by9::before {
-  padding-top: 42.857143%;
-}
-
-.embed-responsive-16by9::before {
-  padding-top: 56.25%;
-}
-
-.embed-responsive-4by3::before {
-  padding-top: 75%;
-}
-
-.embed-responsive-1by1::before {
-  padding-top: 100%;
-}
-
-.flex-row {
-  -ms-flex-direction: row !important;
-  flex-direction: row !important;
-}
-
-.flex-column {
-  -ms-flex-direction: column !important;
-  flex-direction: column !important;
-}
-
-.flex-row-reverse {
-  -ms-flex-direction: row-reverse !important;
-  flex-direction: row-reverse !important;
-}
-
-.flex-column-reverse {
-  -ms-flex-direction: column-reverse !important;
-  flex-direction: column-reverse !important;
-}
-
-.flex-wrap {
-  -ms-flex-wrap: wrap !important;
-  flex-wrap: wrap !important;
-}
-
-.flex-nowrap {
-  -ms-flex-wrap: nowrap !important;
-  flex-wrap: nowrap !important;
-}
-
-.flex-wrap-reverse {
-  -ms-flex-wrap: wrap-reverse !important;
-  flex-wrap: wrap-reverse !important;
-}
-
-.flex-fill {
-  -ms-flex: 1 1 auto !important;
-  flex: 1 1 auto !important;
-}
-
-.flex-grow-0 {
-  -ms-flex-positive: 0 !important;
-  flex-grow: 0 !important;
-}
-
-.flex-grow-1 {
-  -ms-flex-positive: 1 !important;
-  flex-grow: 1 !important;
-}
-
-.flex-shrink-0 {
-  -ms-flex-negative: 0 !important;
-  flex-shrink: 0 !important;
-}
-
-.flex-shrink-1 {
-  -ms-flex-negative: 1 !important;
-  flex-shrink: 1 !important;
-}
-
-.justify-content-start {
-  -ms-flex-pack: start !important;
-  justify-content: flex-start !important;
-}
-
-.justify-content-end {
-  -ms-flex-pack: end !important;
-  justify-content: flex-end !important;
-}
-
-.justify-content-center {
-  -ms-flex-pack: center !important;
-  justify-content: center !important;
-}
-
-.justify-content-between {
-  -ms-flex-pack: justify !important;
-  justify-content: space-between !important;
-}
-
-.justify-content-around {
-  -ms-flex-pack: distribute !important;
-  justify-content: space-around !important;
-}
-
-.align-items-start {
-  -ms-flex-align: start !important;
-  align-items: flex-start !important;
-}
-
-.align-items-end {
-  -ms-flex-align: end !important;
-  align-items: flex-end !important;
-}
-
-.align-items-center {
-  -ms-flex-align: center !important;
-  align-items: center !important;
-}
-
-.align-items-baseline {
-  -ms-flex-align: baseline !important;
-  align-items: baseline !important;
-}
-
-.align-items-stretch {
-  -ms-flex-align: stretch !important;
-  align-items: stretch !important;
-}
-
-.align-content-start {
-  -ms-flex-line-pack: start !important;
-  align-content: flex-start !important;
-}
-
-.align-content-end {
-  -ms-flex-line-pack: end !important;
-  align-content: flex-end !important;
-}
-
-.align-content-center {
-  -ms-flex-line-pack: center !important;
-  align-content: center !important;
-}
-
-.align-content-between {
-  -ms-flex-line-pack: justify !important;
-  align-content: space-between !important;
-}
-
-.align-content-around {
-  -ms-flex-line-pack: distribute !important;
-  align-content: space-around !important;
-}
-
-.align-content-stretch {
-  -ms-flex-line-pack: stretch !important;
-  align-content: stretch !important;
-}
-
-.align-self-auto {
-  -ms-flex-item-align: auto !important;
-  align-self: auto !important;
-}
-
-.align-self-start {
-  -ms-flex-item-align: start !important;
-  align-self: flex-start !important;
-}
-
-.align-self-end {
-  -ms-flex-item-align: end !important;
-  align-self: flex-end !important;
-}
-
-.align-self-center {
-  -ms-flex-item-align: center !important;
-  align-self: center !important;
-}
-
-.align-self-baseline {
-  -ms-flex-item-align: baseline !important;
-  align-self: baseline !important;
-}
-
-.align-self-stretch {
-  -ms-flex-item-align: stretch !important;
-  align-self: stretch !important;
-}
-
-@media (min-width: 576px) {
-  .flex-sm-row {
-    -ms-flex-direction: row !important;
-    flex-direction: row !important;
-  }
-  .flex-sm-column {
-    -ms-flex-direction: column !important;
-    flex-direction: column !important;
-  }
-  .flex-sm-row-reverse {
-    -ms-flex-direction: row-reverse !important;
-    flex-direction: row-reverse !important;
-  }
-  .flex-sm-column-reverse {
-    -ms-flex-direction: column-reverse !important;
-    flex-direction: column-reverse !important;
-  }
-  .flex-sm-wrap {
-    -ms-flex-wrap: wrap !important;
-    flex-wrap: wrap !important;
-  }
-  .flex-sm-nowrap {
-    -ms-flex-wrap: nowrap !important;
-    flex-wrap: nowrap !important;
-  }
-  .flex-sm-wrap-reverse {
-    -ms-flex-wrap: wrap-reverse !important;
-    flex-wrap: wrap-reverse !important;
-  }
-  .flex-sm-fill {
-    -ms-flex: 1 1 auto !important;
-    flex: 1 1 auto !important;
-  }
-  .flex-sm-grow-0 {
-    -ms-flex-positive: 0 !important;
-    flex-grow: 0 !important;
-  }
-  .flex-sm-grow-1 {
-    -ms-flex-positive: 1 !important;
-    flex-grow: 1 !important;
-  }
-  .flex-sm-shrink-0 {
-    -ms-flex-negative: 0 !important;
-    flex-shrink: 0 !important;
-  }
-  .flex-sm-shrink-1 {
-    -ms-flex-negative: 1 !important;
-    flex-shrink: 1 !important;
-  }
-  .justify-content-sm-start {
-    -ms-flex-pack: start !important;
-    justify-content: flex-start !important;
-  }
-  .justify-content-sm-end {
-    -ms-flex-pack: end !important;
-    justify-content: flex-end !important;
-  }
-  .justify-content-sm-center {
-    -ms-flex-pack: center !important;
-    justify-content: center !important;
-  }
-  .justify-content-sm-between {
-    -ms-flex-pack: justify !important;
-    justify-content: space-between !important;
-  }
-  .justify-content-sm-around {
-    -ms-flex-pack: distribute !important;
-    justify-content: space-around !important;
-  }
-  .align-items-sm-start {
-    -ms-flex-align: start !important;
-    align-items: flex-start !important;
-  }
-  .align-items-sm-end {
-    -ms-flex-align: end !important;
-    align-items: flex-end !important;
-  }
-  .align-items-sm-center {
-    -ms-flex-align: center !important;
-    align-items: center !important;
-  }
-  .align-items-sm-baseline {
-    -ms-flex-align: baseline !important;
-    align-items: baseline !important;
-  }
-  .align-items-sm-stretch {
-    -ms-flex-align: stretch !important;
-    align-items: stretch !important;
-  }
-  .align-content-sm-start {
-    -ms-flex-line-pack: start !important;
-    align-content: flex-start !important;
-  }
-  .align-content-sm-end {
-    -ms-flex-line-pack: end !important;
-    align-content: flex-end !important;
-  }
-  .align-content-sm-center {
-    -ms-flex-line-pack: center !important;
-    align-content: center !important;
-  }
-  .align-content-sm-between {
-    -ms-flex-line-pack: justify !important;
-    align-content: space-between !important;
-  }
-  .align-content-sm-around {
-    -ms-flex-line-pack: distribute !important;
-    align-content: space-around !important;
-  }
-  .align-content-sm-stretch {
-    -ms-flex-line-pack: stretch !important;
-    align-content: stretch !important;
-  }
-  .align-self-sm-auto {
-    -ms-flex-item-align: auto !important;
-    align-self: auto !important;
-  }
-  .align-self-sm-start {
-    -ms-flex-item-align: start !important;
-    align-self: flex-start !important;
-  }
-  .align-self-sm-end {
-    -ms-flex-item-align: end !important;
-    align-self: flex-end !important;
-  }
-  .align-self-sm-center {
-    -ms-flex-item-align: center !important;
-    align-self: center !important;
-  }
-  .align-self-sm-baseline {
-    -ms-flex-item-align: baseline !important;
-    align-self: baseline !important;
-  }
-  .align-self-sm-stretch {
-    -ms-flex-item-align: stretch !important;
-    align-self: stretch !important;
-  }
-}
-
-@media (min-width: 768px) {
-  .flex-md-row {
-    -ms-flex-direction: row !important;
-    flex-direction: row !important;
-  }
-  .flex-md-column {
-    -ms-flex-direction: column !important;
-    flex-direction: column !important;
-  }
-  .flex-md-row-reverse {
-    -ms-flex-direction: row-reverse !important;
-    flex-direction: row-reverse !important;
-  }
-  .flex-md-column-reverse {
-    -ms-flex-direction: column-reverse !important;
-    flex-direction: column-reverse !important;
-  }
-  .flex-md-wrap {
-    -ms-flex-wrap: wrap !important;
-    flex-wrap: wrap !important;
-  }
-  .flex-md-nowrap {
-    -ms-flex-wrap: nowrap !important;
-    flex-wrap: nowrap !important;
-  }
-  .flex-md-wrap-reverse {
-    -ms-flex-wrap: wrap-reverse !important;
-    flex-wrap: wrap-reverse !important;
-  }
-  .flex-md-fill {
-    -ms-flex: 1 1 auto !important;
-    flex: 1 1 auto !important;
-  }
-  .flex-md-grow-0 {
-    -ms-flex-positive: 0 !important;
-    flex-grow: 0 !important;
-  }
-  .flex-md-grow-1 {
-    -ms-flex-positive: 1 !important;
-    flex-grow: 1 !important;
-  }
-  .flex-md-shrink-0 {
-    -ms-flex-negative: 0 !important;
-    flex-shrink: 0 !important;
-  }
-  .flex-md-shrink-1 {
-    -ms-flex-negative: 1 !important;
-    flex-shrink: 1 !important;
-  }
-  .justify-content-md-start {
-    -ms-flex-pack: start !important;
-    justify-content: flex-start !important;
-  }
-  .justify-content-md-end {
-    -ms-flex-pack: end !important;
-    justify-content: flex-end !important;
-  }
-  .justify-content-md-center {
-    -ms-flex-pack: center !important;
-    justify-content: center !important;
-  }
-  .justify-content-md-between {
-    -ms-flex-pack: justify !important;
-    justify-content: space-between !important;
-  }
-  .justify-content-md-around {
-    -ms-flex-pack: distribute !important;
-    justify-content: space-around !important;
-  }
-  .align-items-md-start {
-    -ms-flex-align: start !important;
-    align-items: flex-start !important;
-  }
-  .align-items-md-end {
-    -ms-flex-align: end !important;
-    align-items: flex-end !important;
-  }
-  .align-items-md-center {
-    -ms-flex-align: center !important;
-    align-items: center !important;
-  }
-  .align-items-md-baseline {
-    -ms-flex-align: baseline !important;
-    align-items: baseline !important;
-  }
-  .align-items-md-stretch {
-    -ms-flex-align: stretch !important;
-    align-items: stretch !important;
-  }
-  .align-content-md-start {
-    -ms-flex-line-pack: start !important;
-    align-content: flex-start !important;
-  }
-  .align-content-md-end {
-    -ms-flex-line-pack: end !important;
-    align-content: flex-end !important;
-  }
-  .align-content-md-center {
-    -ms-flex-line-pack: center !important;
-    align-content: center !important;
-  }
-  .align-content-md-between {
-    -ms-flex-line-pack: justify !important;
-    align-content: space-between !important;
-  }
-  .align-content-md-around {
-    -ms-flex-line-pack: distribute !important;
-    align-content: space-around !important;
-  }
-  .align-content-md-stretch {
-    -ms-flex-line-pack: stretch !important;
-    align-content: stretch !important;
-  }
-  .align-self-md-auto {
-    -ms-flex-item-align: auto !important;
-    align-self: auto !important;
-  }
-  .align-self-md-start {
-    -ms-flex-item-align: start !important;
-    align-self: flex-start !important;
-  }
-  .align-self-md-end {
-    -ms-flex-item-align: end !important;
-    align-self: flex-end !important;
-  }
-  .align-self-md-center {
-    -ms-flex-item-align: center !important;
-    align-self: center !important;
-  }
-  .align-self-md-baseline {
-    -ms-flex-item-align: baseline !important;
-    align-self: baseline !important;
-  }
-  .align-self-md-stretch {
-    -ms-flex-item-align: stretch !important;
-    align-self: stretch !important;
-  }
-}
-
-@media (min-width: 992px) {
-  .flex-lg-row {
-    -ms-flex-direction: row !important;
-    flex-direction: row !important;
-  }
-  .flex-lg-column {
-    -ms-flex-direction: column !important;
-    flex-direction: column !important;
-  }
-  .flex-lg-row-reverse {
-    -ms-flex-direction: row-reverse !important;
-    flex-direction: row-reverse !important;
-  }
-  .flex-lg-column-reverse {
-    -ms-flex-direction: column-reverse !important;
-    flex-direction: column-reverse !important;
-  }
-  .flex-lg-wrap {
-    -ms-flex-wrap: wrap !important;
-    flex-wrap: wrap !important;
-  }
-  .flex-lg-nowrap {
-    -ms-flex-wrap: nowrap !important;
-    flex-wrap: nowrap !important;
-  }
-  .flex-lg-wrap-reverse {
-    -ms-flex-wrap: wrap-reverse !important;
-    flex-wrap: wrap-reverse !important;
-  }
-  .flex-lg-fill {
-    -ms-flex: 1 1 auto !important;
-    flex: 1 1 auto !important;
-  }
-  .flex-lg-grow-0 {
-    -ms-flex-positive: 0 !important;
-    flex-grow: 0 !important;
-  }
-  .flex-lg-grow-1 {
-    -ms-flex-positive: 1 !important;
-    flex-grow: 1 !important;
-  }
-  .flex-lg-shrink-0 {
-    -ms-flex-negative: 0 !important;
-    flex-shrink: 0 !important;
-  }
-  .flex-lg-shrink-1 {
-    -ms-flex-negative: 1 !important;
-    flex-shrink: 1 !important;
-  }
-  .justify-content-lg-start {
-    -ms-flex-pack: start !important;
-    justify-content: flex-start !important;
-  }
-  .justify-content-lg-end {
-    -ms-flex-pack: end !important;
-    justify-content: flex-end !important;
-  }
-  .justify-content-lg-center {
-    -ms-flex-pack: center !important;
-    justify-content: center !important;
-  }
-  .justify-content-lg-between {
-    -ms-flex-pack: justify !important;
-    justify-content: space-between !important;
-  }
-  .justify-content-lg-around {
-    -ms-flex-pack: distribute !important;
-    justify-content: space-around !important;
-  }
-  .align-items-lg-start {
-    -ms-flex-align: start !important;
-    align-items: flex-start !important;
-  }
-  .align-items-lg-end {
-    -ms-flex-align: end !important;
-    align-items: flex-end !important;
-  }
-  .align-items-lg-center {
-    -ms-flex-align: center !important;
-    align-items: center !important;
-  }
-  .align-items-lg-baseline {
-    -ms-flex-align: baseline !important;
-    align-items: baseline !important;
-  }
-  .align-items-lg-stretch {
-    -ms-flex-align: stretch !important;
-    align-items: stretch !important;
-  }
-  .align-content-lg-start {
-    -ms-flex-line-pack: start !important;
-    align-content: flex-start !important;
-  }
-  .align-content-lg-end {
-    -ms-flex-line-pack: end !important;
-    align-content: flex-end !important;
-  }
-  .align-content-lg-center {
-    -ms-flex-line-pack: center !important;
-    align-content: center !important;
-  }
-  .align-content-lg-between {
-    -ms-flex-line-pack: justify !important;
-    align-content: space-between !important;
-  }
-  .align-content-lg-around {
-    -ms-flex-line-pack: distribute !important;
-    align-content: space-around !important;
-  }
-  .align-content-lg-stretch {
-    -ms-flex-line-pack: stretch !important;
-    align-content: stretch !important;
-  }
-  .align-self-lg-auto {
-    -ms-flex-item-align: auto !important;
-    align-self: auto !important;
-  }
-  .align-self-lg-start {
-    -ms-flex-item-align: start !important;
-    align-self: flex-start !important;
-  }
-  .align-self-lg-end {
-    -ms-flex-item-align: end !important;
-    align-self: flex-end !important;
-  }
-  .align-self-lg-center {
-    -ms-flex-item-align: center !important;
-    align-self: center !important;
-  }
-  .align-self-lg-baseline {
-    -ms-flex-item-align: baseline !important;
-    align-self: baseline !important;
-  }
-  .align-self-lg-stretch {
-    -ms-flex-item-align: stretch !important;
-    align-self: stretch !important;
-  }
-}
-
-@media (min-width: 1200px) {
-  .flex-xl-row {
-    -ms-flex-direction: row !important;
-    flex-direction: row !important;
-  }
-  .flex-xl-column {
-    -ms-flex-direction: column !important;
-    flex-direction: column !important;
-  }
-  .flex-xl-row-reverse {
-    -ms-flex-direction: row-reverse !important;
-    flex-direction: row-reverse !important;
-  }
-  .flex-xl-column-reverse {
-    -ms-flex-direction: column-reverse !important;
-    flex-direction: column-reverse !important;
-  }
-  .flex-xl-wrap {
-    -ms-flex-wrap: wrap !important;
-    flex-wrap: wrap !important;
-  }
-  .flex-xl-nowrap {
-    -ms-flex-wrap: nowrap !important;
-    flex-wrap: nowrap !important;
-  }
-  .flex-xl-wrap-reverse {
-    -ms-flex-wrap: wrap-reverse !important;
-    flex-wrap: wrap-reverse !important;
-  }
-  .flex-xl-fill {
-    -ms-flex: 1 1 auto !important;
-    flex: 1 1 auto !important;
-  }
-  .flex-xl-grow-0 {
-    -ms-flex-positive: 0 !important;
-    flex-grow: 0 !important;
-  }
-  .flex-xl-grow-1 {
-    -ms-flex-positive: 1 !important;
-    flex-grow: 1 !important;
-  }
-  .flex-xl-shrink-0 {
-    -ms-flex-negative: 0 !important;
-    flex-shrink: 0 !important;
-  }
-  .flex-xl-shrink-1 {
-    -ms-flex-negative: 1 !important;
-    flex-shrink: 1 !important;
-  }
-  .justify-content-xl-start {
-    -ms-flex-pack: start !important;
-    justify-content: flex-start !important;
-  }
-  .justify-content-xl-end {
-    -ms-flex-pack: end !important;
-    justify-content: flex-end !important;
-  }
-  .justify-content-xl-center {
-    -ms-flex-pack: center !important;
-    justify-content: center !important;
-  }
-  .justify-content-xl-between {
-    -ms-flex-pack: justify !important;
-    justify-content: space-between !important;
-  }
-  .justify-content-xl-around {
-    -ms-flex-pack: distribute !important;
-    justify-content: space-around !important;
-  }
-  .align-items-xl-start {
-    -ms-flex-align: start !important;
-    align-items: flex-start !important;
-  }
-  .align-items-xl-end {
-    -ms-flex-align: end !important;
-    align-items: flex-end !important;
-  }
-  .align-items-xl-center {
-    -ms-flex-align: center !important;
-    align-items: center !important;
-  }
-  .align-items-xl-baseline {
-    -ms-flex-align: baseline !important;
-    align-items: baseline !important;
-  }
-  .align-items-xl-stretch {
-    -ms-flex-align: stretch !important;
-    align-items: stretch !important;
-  }
-  .align-content-xl-start {
-    -ms-flex-line-pack: start !important;
-    align-content: flex-start !important;
-  }
-  .align-content-xl-end {
-    -ms-flex-line-pack: end !important;
-    align-content: flex-end !important;
-  }
-  .align-content-xl-center {
-    -ms-flex-line-pack: center !important;
-    align-content: center !important;
-  }
-  .align-content-xl-between {
-    -ms-flex-line-pack: justify !important;
-    align-content: space-between !important;
-  }
-  .align-content-xl-around {
-    -ms-flex-line-pack: distribute !important;
-    align-content: space-around !important;
-  }
-  .align-content-xl-stretch {
-    -ms-flex-line-pack: stretch !important;
-    align-content: stretch !important;
-  }
-  .align-self-xl-auto {
-    -ms-flex-item-align: auto !important;
-    align-self: auto !important;
-  }
-  .align-self-xl-start {
-    -ms-flex-item-align: start !important;
-    align-self: flex-start !important;
-  }
-  .align-self-xl-end {
-    -ms-flex-item-align: end !important;
-    align-self: flex-end !important;
-  }
-  .align-self-xl-center {
-    -ms-flex-item-align: center !important;
-    align-self: center !important;
-  }
-  .align-self-xl-baseline {
-    -ms-flex-item-align: baseline !important;
-    align-self: baseline !important;
-  }
-  .align-self-xl-stretch {
-    -ms-flex-item-align: stretch !important;
-    align-self: stretch !important;
-  }
-}
-
-.float-left {
-  float: left !important;
-}
-
-.float-right {
-  float: right !important;
-}
-
-.float-none {
-  float: none !important;
-}
-
-@media (min-width: 576px) {
-  .float-sm-left {
-    float: left !important;
-  }
-  .float-sm-right {
-    float: right !important;
-  }
-  .float-sm-none {
-    float: none !important;
-  }
-}
-
-@media (min-width: 768px) {
-  .float-md-left {
-    float: left !important;
-  }
-  .float-md-right {
-    float: right !important;
-  }
-  .float-md-none {
-    float: none !important;
-  }
-}
-
-@media (min-width: 992px) {
-  .float-lg-left {
-    float: left !important;
-  }
-  .float-lg-right {
-    float: right !important;
-  }
-  .float-lg-none {
-    float: none !important;
-  }
-}
-
-@media (min-width: 1200px) {
-  .float-xl-left {
-    float: left !important;
-  }
-  .float-xl-right {
-    float: right !important;
-  }
-  .float-xl-none {
-    float: none !important;
-  }
-}
-
-.position-static {
-  position: static !important;
-}
-
-.position-relative {
-  position: relative !important;
-}
-
-.position-absolute {
-  position: absolute !important;
-}
-
-.position-fixed {
-  position: fixed !important;
-}
-
-.position-sticky {
-  position: -webkit-sticky !important;
-  position: sticky !important;
-}
-
-.fixed-top {
-  position: fixed;
-  top: 0;
-  right: 0;
-  left: 0;
-  z-index: 1030;
-}
-
-.fixed-bottom {
-  position: fixed;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1030;
-}
-
-@supports ((position: -webkit-sticky) or (position: sticky)) {
-  .sticky-top {
-    position: -webkit-sticky;
-    position: sticky;
-    top: 0;
-    z-index: 1020;
-  }
-}
-
-.sr-only {
-  position: absolute;
-  width: 1px;
-  height: 1px;
-  padding: 0;
-  overflow: hidden;
-  clip: rect(0, 0, 0, 0);
-  white-space: nowrap;
-  border: 0;
-}
-
-.sr-only-focusable:active, .sr-only-focusable:focus {
-  position: static;
-  width: auto;
-  height: auto;
-  overflow: visible;
-  clip: auto;
-  white-space: normal;
-}
-
-.shadow-sm {
-  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
-}
-
-.shadow {
-  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
-}
-
-.shadow-lg {
-  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
-}
-
-.shadow-none {
-  box-shadow: none !important;
-}
-
-.w-25 {
-  width: 25% !important;
-}
-
-.w-50 {
-  width: 50% !important;
-}
-
-.w-75 {
-  width: 75% !important;
-}
-
-.w-100 {
-  width: 100% !important;
-}
-
-.w-auto {
-  width: auto !important;
-}
-
-.h-25 {
-  height: 25% !important;
-}
-
-.h-50 {
-  height: 50% !important;
-}
-
-.h-75 {
-  height: 75% !important;
-}
-
-.h-100 {
-  height: 100% !important;
-}
-
-.h-auto {
-  height: auto !important;
-}
-
-.mw-100 {
-  max-width: 100% !important;
-}
-
-.mh-100 {
-  max-height: 100% !important;
-}
-
-.m-0 {
-  margin: 0 !important;
-}
-
-.mt-0,
-.my-0 {
-  margin-top: 0 !important;
-}
-
-.mr-0,
-.mx-0 {
-  margin-right: 0 !important;
-}
-
-.mb-0,
-.my-0 {
-  margin-bottom: 0 !important;
-}
-
-.ml-0,
-.mx-0 {
-  margin-left: 0 !important;
-}
-
-.m-1 {
-  margin: 0.25rem !important;
-}
-
-.mt-1,
-.my-1 {
-  margin-top: 0.25rem !important;
-}
-
-.mr-1,
-.mx-1 {
-  margin-right: 0.25rem !important;
-}
-
-.mb-1,
-.my-1 {
-  margin-bottom: 0.25rem !important;
-}
-
-.ml-1,
-.mx-1 {
-  margin-left: 0.25rem !important;
-}
-
-.m-2 {
-  margin: 0.5rem !important;
-}
-
-.mt-2,
-.my-2 {
-  margin-top: 0.5rem !important;
-}
-
-.mr-2,
-.mx-2 {
-  margin-right: 0.5rem !important;
-}
-
-.mb-2,
-.my-2 {
-  margin-bottom: 0.5rem !important;
-}
-
-.ml-2,
-.mx-2 {
-  margin-left: 0.5rem !important;
-}
-
-.m-3 {
-  margin: 1rem !important;
-}
-
-.mt-3,
-.my-3 {
-  margin-top: 1rem !important;
-}
-
-.mr-3,
-.mx-3 {
-  margin-right: 1rem !important;
-}
-
-.mb-3,
-.my-3 {
-  margin-bottom: 1rem !important;
-}
-
-.ml-3,
-.mx-3 {
-  margin-left: 1rem !important;
-}
-
-.m-4 {
-  margin: 1.5rem !important;
-}
-
-.mt-4,
-.my-4 {
-  margin-top: 1.5rem !important;
-}
-
-.mr-4,
-.mx-4 {
-  margin-right: 1.5rem !important;
-}
-
-.mb-4,
-.my-4 {
-  margin-bottom: 1.5rem !important;
-}
-
-.ml-4,
-.mx-4 {
-  margin-left: 1.5rem !important;
-}
-
-.m-5 {
-  margin: 3rem !important;
-}
-
-.mt-5,
-.my-5 {
-  margin-top: 3rem !important;
-}
-
-.mr-5,
-.mx-5 {
-  margin-right: 3rem !important;
-}
-
-.mb-5,
-.my-5 {
-  margin-bottom: 3rem !important;
-}
-
-.ml-5,
-.mx-5 {
-  margin-left: 3rem !important;
-}
-
-.p-0 {
-  padding: 0 !important;
-}
-
-.pt-0,
-.py-0 {
-  padding-top: 0 !important;
-}
-
-.pr-0,
-.px-0 {
-  padding-right: 0 !important;
-}
-
-.pb-0,
-.py-0 {
-  padding-bottom: 0 !important;
-}
-
-.pl-0,
-.px-0 {
-  padding-left: 0 !important;
-}
-
-.p-1 {
-  padding: 0.25rem !important;
-}
-
-.pt-1,
-.py-1 {
-  padding-top: 0.25rem !important;
-}
-
-.pr-1,
-.px-1 {
-  padding-right: 0.25rem !important;
-}
-
-.pb-1,
-.py-1 {
-  padding-bottom: 0.25rem !important;
-}
-
-.pl-1,
-.px-1 {
-  padding-left: 0.25rem !important;
-}
-
-.p-2 {
-  padding: 0.5rem !important;
-}
-
-.pt-2,
-.py-2 {
-  padding-top: 0.5rem !important;
-}
-
-.pr-2,
-.px-2 {
-  padding-right: 0.5rem !important;
-}
-
-.pb-2,
-.py-2 {
-  padding-bottom: 0.5rem !important;
-}
-
-.pl-2,
-.px-2 {
-  padding-left: 0.5rem !important;
-}
-
-.p-3 {
-  padding: 1rem !important;
-}
-
-.pt-3,
-.py-3 {
-  padding-top: 1rem !important;
-}
-
-.pr-3,
-.px-3 {
-  padding-right: 1rem !important;
-}
-
-.pb-3,
-.py-3 {
-  padding-bottom: 1rem !important;
-}
-
-.pl-3,
-.px-3 {
-  padding-left: 1rem !important;
-}
-
-.p-4 {
-  padding: 1.5rem !important;
-}
-
-.pt-4,
-.py-4 {
-  padding-top: 1.5rem !important;
-}
-
-.pr-4,
-.px-4 {
-  padding-right: 1.5rem !important;
-}
-
-.pb-4,
-.py-4 {
-  padding-bottom: 1.5rem !important;
-}
-
-.pl-4,
-.px-4 {
-  padding-left: 1.5rem !important;
-}
-
-.p-5 {
-  padding: 3rem !important;
-}
-
-.pt-5,
-.py-5 {
-  padding-top: 3rem !important;
-}
-
-.pr-5,
-.px-5 {
-  padding-right: 3rem !important;
-}
-
-.pb-5,
-.py-5 {
-  padding-bottom: 3rem !important;
-}
-
-.pl-5,
-.px-5 {
-  padding-left: 3rem !important;
-}
-
-.m-auto {
-  margin: auto !important;
-}
-
-.mt-auto,
-.my-auto {
-  margin-top: auto !important;
-}
-
-.mr-auto,
-.mx-auto {
-  margin-right: auto !important;
-}
-
-.mb-auto,
-.my-auto {
-  margin-bottom: auto !important;
-}
-
-.ml-auto,
-.mx-auto {
-  margin-left: auto !important;
-}
-
-@media (min-width: 576px) {
-  .m-sm-0 {
-    margin: 0 !important;
-  }
-  .mt-sm-0,
-  .my-sm-0 {
-    margin-top: 0 !important;
-  }
-  .mr-sm-0,
-  .mx-sm-0 {
-    margin-right: 0 !important;
-  }
-  .mb-sm-0,
-  .my-sm-0 {
-    margin-bottom: 0 !important;
-  }
-  .ml-sm-0,
-  .mx-sm-0 {
-    margin-left: 0 !important;
-  }
-  .m-sm-1 {
-    margin: 0.25rem !important;
-  }
-  .mt-sm-1,
-  .my-sm-1 {
-    margin-top: 0.25rem !important;
-  }
-  .mr-sm-1,
-  .mx-sm-1 {
-    margin-right: 0.25rem !important;
-  }
-  .mb-sm-1,
-  .my-sm-1 {
-    margin-bottom: 0.25rem !important;
-  }
-  .ml-sm-1,
-  .mx-sm-1 {
-    margin-left: 0.25rem !important;
-  }
-  .m-sm-2 {
-    margin: 0.5rem !important;
-  }
-  .mt-sm-2,
-  .my-sm-2 {
-    margin-top: 0.5rem !important;
-  }
-  .mr-sm-2,
-  .mx-sm-2 {
-    margin-right: 0.5rem !important;
-  }
-  .mb-sm-2,
-  .my-sm-2 {
-    margin-bottom: 0.5rem !important;
-  }
-  .ml-sm-2,
-  .mx-sm-2 {
-    margin-left: 0.5rem !important;
-  }
-  .m-sm-3 {
-    margin: 1rem !important;
-  }
-  .mt-sm-3,
-  .my-sm-3 {
-    margin-top: 1rem !important;
-  }
-  .mr-sm-3,
-  .mx-sm-3 {
-    margin-right: 1rem !important;
-  }
-  .mb-sm-3,
-  .my-sm-3 {
-    margin-bottom: 1rem !important;
-  }
-  .ml-sm-3,
-  .mx-sm-3 {
-    margin-left: 1rem !important;
-  }
-  .m-sm-4 {
-    margin: 1.5rem !important;
-  }
-  .mt-sm-4,
-  .my-sm-4 {
-    margin-top: 1.5rem !important;
-  }
-  .mr-sm-4,
-  .mx-sm-4 {
-    margin-right: 1.5rem !important;
-  }
-  .mb-sm-4,
-  .my-sm-4 {
-    margin-bottom: 1.5rem !important;
-  }
-  .ml-sm-4,
-  .mx-sm-4 {
-    margin-left: 1.5rem !important;
-  }
-  .m-sm-5 {
-    margin: 3rem !important;
-  }
-  .mt-sm-5,
-  .my-sm-5 {
-    margin-top: 3rem !important;
-  }
-  .mr-sm-5,
-  .mx-sm-5 {
-    margin-right: 3rem !important;
-  }
-  .mb-sm-5,
-  .my-sm-5 {
-    margin-bottom: 3rem !important;
-  }
-  .ml-sm-5,
-  .mx-sm-5 {
-    margin-left: 3rem !important;
-  }
-  .p-sm-0 {
-    padding: 0 !important;
-  }
-  .pt-sm-0,
-  .py-sm-0 {
-    padding-top: 0 !important;
-  }
-  .pr-sm-0,
-  .px-sm-0 {
-    padding-right: 0 !important;
-  }
-  .pb-sm-0,
-  .py-sm-0 {
-    padding-bottom: 0 !important;
-  }
-  .pl-sm-0,
-  .px-sm-0 {
-    padding-left: 0 !important;
-  }
-  .p-sm-1 {
-    padding: 0.25rem !important;
-  }
-  .pt-sm-1,
-  .py-sm-1 {
-    padding-top: 0.25rem !important;
-  }
-  .pr-sm-1,
-  .px-sm-1 {
-    padding-right: 0.25rem !important;
-  }
-  .pb-sm-1,
-  .py-sm-1 {
-    padding-bottom: 0.25rem !important;
-  }
-  .pl-sm-1,
-  .px-sm-1 {
-    padding-left: 0.25rem !important;
-  }
-  .p-sm-2 {
-    padding: 0.5rem !important;
-  }
-  .pt-sm-2,
-  .py-sm-2 {
-    padding-top: 0.5rem !important;
-  }
-  .pr-sm-2,
-  .px-sm-2 {
-    padding-right: 0.5rem !important;
-  }
-  .pb-sm-2,
-  .py-sm-2 {
-    padding-bottom: 0.5rem !important;
-  }
-  .pl-sm-2,
-  .px-sm-2 {
-    padding-left: 0.5rem !important;
-  }
-  .p-sm-3 {
-    padding: 1rem !important;
-  }
-  .pt-sm-3,
-  .py-sm-3 {
-    padding-top: 1rem !important;
-  }
-  .pr-sm-3,
-  .px-sm-3 {
-    padding-right: 1rem !important;
-  }
-  .pb-sm-3,
-  .py-sm-3 {
-    padding-bottom: 1rem !important;
-  }
-  .pl-sm-3,
-  .px-sm-3 {
-    padding-left: 1rem !important;
-  }
-  .p-sm-4 {
-    padding: 1.5rem !important;
-  }
-  .pt-sm-4,
-  .py-sm-4 {
-    padding-top: 1.5rem !important;
-  }
-  .pr-sm-4,
-  .px-sm-4 {
-    padding-right: 1.5rem !important;
-  }
-  .pb-sm-4,
-  .py-sm-4 {
-    padding-bottom: 1.5rem !important;
-  }
-  .pl-sm-4,
-  .px-sm-4 {
-    padding-left: 1.5rem !important;
-  }
-  .p-sm-5 {
-    padding: 3rem !important;
-  }
-  .pt-sm-5,
-  .py-sm-5 {
-    padding-top: 3rem !important;
-  }
-  .pr-sm-5,
-  .px-sm-5 {
-    padding-right: 3rem !important;
-  }
-  .pb-sm-5,
-  .py-sm-5 {
-    padding-bottom: 3rem !important;
-  }
-  .pl-sm-5,
-  .px-sm-5 {
-    padding-left: 3rem !important;
-  }
-  .m-sm-auto {
-    margin: auto !important;
-  }
-  .mt-sm-auto,
-  .my-sm-auto {
-    margin-top: auto !important;
-  }
-  .mr-sm-auto,
-  .mx-sm-auto {
-    margin-right: auto !important;
-  }
-  .mb-sm-auto,
-  .my-sm-auto {
-    margin-bottom: auto !important;
-  }
-  .ml-sm-auto,
-  .mx-sm-auto {
-    margin-left: auto !important;
-  }
-}
-
-@media (min-width: 768px) {
-  .m-md-0 {
-    margin: 0 !important;
-  }
-  .mt-md-0,
-  .my-md-0 {
-    margin-top: 0 !important;
-  }
-  .mr-md-0,
-  .mx-md-0 {
-    margin-right: 0 !important;
-  }
-  .mb-md-0,
-  .my-md-0 {
-    margin-bottom: 0 !important;
-  }
-  .ml-md-0,
-  .mx-md-0 {
-    margin-left: 0 !important;
-  }
-  .m-md-1 {
-    margin: 0.25rem !important;
-  }
-  .mt-md-1,
-  .my-md-1 {
-    margin-top: 0.25rem !important;
-  }
-  .mr-md-1,
-  .mx-md-1 {
-    margin-right: 0.25rem !important;
-  }
-  .mb-md-1,
-  .my-md-1 {
-    margin-bottom: 0.25rem !important;
-  }
-  .ml-md-1,
-  .mx-md-1 {
-    margin-left: 0.25rem !important;
-  }
-  .m-md-2 {
-    margin: 0.5rem !important;
-  }
-  .mt-md-2,
-  .my-md-2 {
-    margin-top: 0.5rem !important;
-  }
-  .mr-md-2,
-  .mx-md-2 {
-    margin-right: 0.5rem !important;
-  }
-  .mb-md-2,
-  .my-md-2 {
-    margin-bottom: 0.5rem !important;
-  }
-  .ml-md-2,
-  .mx-md-2 {
-    margin-left: 0.5rem !important;
-  }
-  .m-md-3 {
-    margin: 1rem !important;
-  }
-  .mt-md-3,
-  .my-md-3 {
-    margin-top: 1rem !important;
-  }
-  .mr-md-3,
-  .mx-md-3 {
-    margin-right: 1rem !important;
-  }
-  .mb-md-3,
-  .my-md-3 {
-    margin-bottom: 1rem !important;
-  }
-  .ml-md-3,
-  .mx-md-3 {
-    margin-left: 1rem !important;
-  }
-  .m-md-4 {
-    margin: 1.5rem !important;
-  }
-  .mt-md-4,
-  .my-md-4 {
-    margin-top: 1.5rem !important;
-  }
-  .mr-md-4,
-  .mx-md-4 {
-    margin-right: 1.5rem !important;
-  }
-  .mb-md-4,
-  .my-md-4 {
-    margin-bottom: 1.5rem !important;
-  }
-  .ml-md-4,
-  .mx-md-4 {
-    margin-left: 1.5rem !important;
-  }
-  .m-md-5 {
-    margin: 3rem !important;
-  }
-  .mt-md-5,
-  .my-md-5 {
-    margin-top: 3rem !important;
-  }
-  .mr-md-5,
-  .mx-md-5 {
-    margin-right: 3rem !important;
-  }
-  .mb-md-5,
-  .my-md-5 {
-    margin-bottom: 3rem !important;
-  }
-  .ml-md-5,
-  .mx-md-5 {
-    margin-left: 3rem !important;
-  }
-  .p-md-0 {
-    padding: 0 !important;
-  }
-  .pt-md-0,
-  .py-md-0 {
-    padding-top: 0 !important;
-  }
-  .pr-md-0,
-  .px-md-0 {
-    padding-right: 0 !important;
-  }
-  .pb-md-0,
-  .py-md-0 {
-    padding-bottom: 0 !important;
-  }
-  .pl-md-0,
-  .px-md-0 {
-    padding-left: 0 !important;
-  }
-  .p-md-1 {
-    padding: 0.25rem !important;
-  }
-  .pt-md-1,
-  .py-md-1 {
-    padding-top: 0.25rem !important;
-  }
-  .pr-md-1,
-  .px-md-1 {
-    padding-right: 0.25rem !important;
-  }
-  .pb-md-1,
-  .py-md-1 {
-    padding-bottom: 0.25rem !important;
-  }
-  .pl-md-1,
-  .px-md-1 {
-    padding-left: 0.25rem !important;
-  }
-  .p-md-2 {
-    padding: 0.5rem !important;
-  }
-  .pt-md-2,
-  .py-md-2 {
-    padding-top: 0.5rem !important;
-  }
-  .pr-md-2,
-  .px-md-2 {
-    padding-right: 0.5rem !important;
-  }
-  .pb-md-2,
-  .py-md-2 {
-    padding-bottom: 0.5rem !important;
-  }
-  .pl-md-2,
-  .px-md-2 {
-    padding-left: 0.5rem !important;
-  }
-  .p-md-3 {
-    padding: 1rem !important;
-  }
-  .pt-md-3,
-  .py-md-3 {
-    padding-top: 1rem !important;
-  }
-  .pr-md-3,
-  .px-md-3 {
-    padding-right: 1rem !important;
-  }
-  .pb-md-3,
-  .py-md-3 {
-    padding-bottom: 1rem !important;
-  }
-  .pl-md-3,
-  .px-md-3 {
-    padding-left: 1rem !important;
-  }
-  .p-md-4 {
-    padding: 1.5rem !important;
-  }
-  .pt-md-4,
-  .py-md-4 {
-    padding-top: 1.5rem !important;
-  }
-  .pr-md-4,
-  .px-md-4 {
-    padding-right: 1.5rem !important;
-  }
-  .pb-md-4,
-  .py-md-4 {
-    padding-bottom: 1.5rem !important;
-  }
-  .pl-md-4,
-  .px-md-4 {
-    padding-left: 1.5rem !important;
-  }
-  .p-md-5 {
-    padding: 3rem !important;
-  }
-  .pt-md-5,
-  .py-md-5 {
-    padding-top: 3rem !important;
-  }
-  .pr-md-5,
-  .px-md-5 {
-    padding-right: 3rem !important;
-  }
-  .pb-md-5,
-  .py-md-5 {
-    padding-bottom: 3rem !important;
-  }
-  .pl-md-5,
-  .px-md-5 {
-    padding-left: 3rem !important;
-  }
-  .m-md-auto {
-    margin: auto !important;
-  }
-  .mt-md-auto,
-  .my-md-auto {
-    margin-top: auto !important;
-  }
-  .mr-md-auto,
-  .mx-md-auto {
-    margin-right: auto !important;
-  }
-  .mb-md-auto,
-  .my-md-auto {
-    margin-bottom: auto !important;
-  }
-  .ml-md-auto,
-  .mx-md-auto {
-    margin-left: auto !important;
-  }
-}
-
-@media (min-width: 992px) {
-  .m-lg-0 {
-    margin: 0 !important;
-  }
-  .mt-lg-0,
-  .my-lg-0 {
-    margin-top: 0 !important;
-  }
-  .mr-lg-0,
-  .mx-lg-0 {
-    margin-right: 0 !important;
-  }
-  .mb-lg-0,
-  .my-lg-0 {
-    margin-bottom: 0 !important;
-  }
-  .ml-lg-0,
-  .mx-lg-0 {
-    margin-left: 0 !important;
-  }
-  .m-lg-1 {
-    margin: 0.25rem !important;
-  }
-  .mt-lg-1,
-  .my-lg-1 {
-    margin-top: 0.25rem !important;
-  }
-  .mr-lg-1,
-  .mx-lg-1 {
-    margin-right: 0.25rem !important;
-  }
-  .mb-lg-1,
-  .my-lg-1 {
-    margin-bottom: 0.25rem !important;
-  }
-  .ml-lg-1,
-  .mx-lg-1 {
-    margin-left: 0.25rem !important;
-  }
-  .m-lg-2 {
-    margin: 0.5rem !important;
-  }
-  .mt-lg-2,
-  .my-lg-2 {
-    margin-top: 0.5rem !important;
-  }
-  .mr-lg-2,
-  .mx-lg-2 {
-    margin-right: 0.5rem !important;
-  }
-  .mb-lg-2,
-  .my-lg-2 {
-    margin-bottom: 0.5rem !important;
-  }
-  .ml-lg-2,
-  .mx-lg-2 {
-    margin-left: 0.5rem !important;
-  }
-  .m-lg-3 {
-    margin: 1rem !important;
-  }
-  .mt-lg-3,
-  .my-lg-3 {
-    margin-top: 1rem !important;
-  }
-  .mr-lg-3,
-  .mx-lg-3 {
-    margin-right: 1rem !important;
-  }
-  .mb-lg-3,
-  .my-lg-3 {
-    margin-bottom: 1rem !important;
-  }
-  .ml-lg-3,
-  .mx-lg-3 {
-    margin-left: 1rem !important;
-  }
-  .m-lg-4 {
-    margin: 1.5rem !important;
-  }
-  .mt-lg-4,
-  .my-lg-4 {
-    margin-top: 1.5rem !important;
-  }
-  .mr-lg-4,
-  .mx-lg-4 {
-    margin-right: 1.5rem !important;
-  }
-  .mb-lg-4,
-  .my-lg-4 {
-    margin-bottom: 1.5rem !important;
-  }
-  .ml-lg-4,
-  .mx-lg-4 {
-    margin-left: 1.5rem !important;
-  }
-  .m-lg-5 {
-    margin: 3rem !important;
-  }
-  .mt-lg-5,
-  .my-lg-5 {
-    margin-top: 3rem !important;
-  }
-  .mr-lg-5,
-  .mx-lg-5 {
-    margin-right: 3rem !important;
-  }
-  .mb-lg-5,
-  .my-lg-5 {
-    margin-bottom: 3rem !important;
-  }
-  .ml-lg-5,
-  .mx-lg-5 {
-    margin-left: 3rem !important;
-  }
-  .p-lg-0 {
-    padding: 0 !important;
-  }
-  .pt-lg-0,
-  .py-lg-0 {
-    padding-top: 0 !important;
-  }
-  .pr-lg-0,
-  .px-lg-0 {
-    padding-right: 0 !important;
-  }
-  .pb-lg-0,
-  .py-lg-0 {
-    padding-bottom: 0 !important;
-  }
-  .pl-lg-0,
-  .px-lg-0 {
-    padding-left: 0 !important;
-  }
-  .p-lg-1 {
-    padding: 0.25rem !important;
-  }
-  .pt-lg-1,
-  .py-lg-1 {
-    padding-top: 0.25rem !important;
-  }
-  .pr-lg-1,
-  .px-lg-1 {
-    padding-right: 0.25rem !important;
-  }
-  .pb-lg-1,
-  .py-lg-1 {
-    padding-bottom: 0.25rem !important;
-  }
-  .pl-lg-1,
-  .px-lg-1 {
-    padding-left: 0.25rem !important;
-  }
-  .p-lg-2 {
-    padding: 0.5rem !important;
-  }
-  .pt-lg-2,
-  .py-lg-2 {
-    padding-top: 0.5rem !important;
-  }
-  .pr-lg-2,
-  .px-lg-2 {
-    padding-right: 0.5rem !important;
-  }
-  .pb-lg-2,
-  .py-lg-2 {
-    padding-bottom: 0.5rem !important;
-  }
-  .pl-lg-2,
-  .px-lg-2 {
-    padding-left: 0.5rem !important;
-  }
-  .p-lg-3 {
-    padding: 1rem !important;
-  }
-  .pt-lg-3,
-  .py-lg-3 {
-    padding-top: 1rem !important;
-  }
-  .pr-lg-3,
-  .px-lg-3 {
-    padding-right: 1rem !important;
-  }
-  .pb-lg-3,
-  .py-lg-3 {
-    padding-bottom: 1rem !important;
-  }
-  .pl-lg-3,
-  .px-lg-3 {
-    padding-left: 1rem !important;
-  }
-  .p-lg-4 {
-    padding: 1.5rem !important;
-  }
-  .pt-lg-4,
-  .py-lg-4 {
-    padding-top: 1.5rem !important;
-  }
-  .pr-lg-4,
-  .px-lg-4 {
-    padding-right: 1.5rem !important;
-  }
-  .pb-lg-4,
-  .py-lg-4 {
-    padding-bottom: 1.5rem !important;
-  }
-  .pl-lg-4,
-  .px-lg-4 {
-    padding-left: 1.5rem !important;
-  }
-  .p-lg-5 {
-    padding: 3rem !important;
-  }
-  .pt-lg-5,
-  .py-lg-5 {
-    padding-top: 3rem !important;
-  }
-  .pr-lg-5,
-  .px-lg-5 {
-    padding-right: 3rem !important;
-  }
-  .pb-lg-5,
-  .py-lg-5 {
-    padding-bottom: 3rem !important;
-  }
-  .pl-lg-5,
-  .px-lg-5 {
-    padding-left: 3rem !important;
-  }
-  .m-lg-auto {
-    margin: auto !important;
-  }
-  .mt-lg-auto,
-  .my-lg-auto {
-    margin-top: auto !important;
-  }
-  .mr-lg-auto,
-  .mx-lg-auto {
-    margin-right: auto !important;
-  }
-  .mb-lg-auto,
-  .my-lg-auto {
-    margin-bottom: auto !important;
-  }
-  .ml-lg-auto,
-  .mx-lg-auto {
-    margin-left: auto !important;
-  }
-}
-
-@media (min-width: 1200px) {
-  .m-xl-0 {
-    margin: 0 !important;
-  }
-  .mt-xl-0,
-  .my-xl-0 {
-    margin-top: 0 !important;
-  }
-  .mr-xl-0,
-  .mx-xl-0 {
-    margin-right: 0 !important;
-  }
-  .mb-xl-0,
-  .my-xl-0 {
-    margin-bottom: 0 !important;
-  }
-  .ml-xl-0,
-  .mx-xl-0 {
-    margin-left: 0 !important;
-  }
-  .m-xl-1 {
-    margin: 0.25rem !important;
-  }
-  .mt-xl-1,
-  .my-xl-1 {
-    margin-top: 0.25rem !important;
-  }
-  .mr-xl-1,
-  .mx-xl-1 {
-    margin-right: 0.25rem !important;
-  }
-  .mb-xl-1,
-  .my-xl-1 {
-    margin-bottom: 0.25rem !important;
-  }
-  .ml-xl-1,
-  .mx-xl-1 {
-    margin-left: 0.25rem !important;
-  }
-  .m-xl-2 {
-    margin: 0.5rem !important;
-  }
-  .mt-xl-2,
-  .my-xl-2 {
-    margin-top: 0.5rem !important;
-  }
-  .mr-xl-2,
-  .mx-xl-2 {
-    margin-right: 0.5rem !important;
-  }
-  .mb-xl-2,
-  .my-xl-2 {
-    margin-bottom: 0.5rem !important;
-  }
-  .ml-xl-2,
-  .mx-xl-2 {
-    margin-left: 0.5rem !important;
-  }
-  .m-xl-3 {
-    margin: 1rem !important;
-  }
-  .mt-xl-3,
-  .my-xl-3 {
-    margin-top: 1rem !important;
-  }
-  .mr-xl-3,
-  .mx-xl-3 {
-    margin-right: 1rem !important;
-  }
-  .mb-xl-3,
-  .my-xl-3 {
-    margin-bottom: 1rem !important;
-  }
-  .ml-xl-3,
-  .mx-xl-3 {
-    margin-left: 1rem !important;
-  }
-  .m-xl-4 {
-    margin: 1.5rem !important;
-  }
-  .mt-xl-4,
-  .my-xl-4 {
-    margin-top: 1.5rem !important;
-  }
-  .mr-xl-4,
-  .mx-xl-4 {
-    margin-right: 1.5rem !important;
-  }
-  .mb-xl-4,
-  .my-xl-4 {
-    margin-bottom: 1.5rem !important;
-  }
-  .ml-xl-4,
-  .mx-xl-4 {
-    margin-left: 1.5rem !important;
-  }
-  .m-xl-5 {
-    margin: 3rem !important;
-  }
-  .mt-xl-5,
-  .my-xl-5 {
-    margin-top: 3rem !important;
-  }
-  .mr-xl-5,
-  .mx-xl-5 {
-    margin-right: 3rem !important;
-  }
-  .mb-xl-5,
-  .my-xl-5 {
-    margin-bottom: 3rem !important;
-  }
-  .ml-xl-5,
-  .mx-xl-5 {
-    margin-left: 3rem !important;
-  }
-  .p-xl-0 {
-    padding: 0 !important;
-  }
-  .pt-xl-0,
-  .py-xl-0 {
-    padding-top: 0 !important;
-  }
-  .pr-xl-0,
-  .px-xl-0 {
-    padding-right: 0 !important;
-  }
-  .pb-xl-0,
-  .py-xl-0 {
-    padding-bottom: 0 !important;
-  }
-  .pl-xl-0,
-  .px-xl-0 {
-    padding-left: 0 !important;
-  }
-  .p-xl-1 {
-    padding: 0.25rem !important;
-  }
-  .pt-xl-1,
-  .py-xl-1 {
-    padding-top: 0.25rem !important;
-  }
-  .pr-xl-1,
-  .px-xl-1 {
-    padding-right: 0.25rem !important;
-  }
-  .pb-xl-1,
-  .py-xl-1 {
-    padding-bottom: 0.25rem !important;
-  }
-  .pl-xl-1,
-  .px-xl-1 {
-    padding-left: 0.25rem !important;
-  }
-  .p-xl-2 {
-    padding: 0.5rem !important;
-  }
-  .pt-xl-2,
-  .py-xl-2 {
-    padding-top: 0.5rem !important;
-  }
-  .pr-xl-2,
-  .px-xl-2 {
-    padding-right: 0.5rem !important;
-  }
-  .pb-xl-2,
-  .py-xl-2 {
-    padding-bottom: 0.5rem !important;
-  }
-  .pl-xl-2,
-  .px-xl-2 {
-    padding-left: 0.5rem !important;
-  }
-  .p-xl-3 {
-    padding: 1rem !important;
-  }
-  .pt-xl-3,
-  .py-xl-3 {
-    padding-top: 1rem !important;
-  }
-  .pr-xl-3,
-  .px-xl-3 {
-    padding-right: 1rem !important;
-  }
-  .pb-xl-3,
-  .py-xl-3 {
-    padding-bottom: 1rem !important;
-  }
-  .pl-xl-3,
-  .px-xl-3 {
-    padding-left: 1rem !important;
-  }
-  .p-xl-4 {
-    padding: 1.5rem !important;
-  }
-  .pt-xl-4,
-  .py-xl-4 {
-    padding-top: 1.5rem !important;
-  }
-  .pr-xl-4,
-  .px-xl-4 {
-    padding-right: 1.5rem !important;
-  }
-  .pb-xl-4,
-  .py-xl-4 {
-    padding-bottom: 1.5rem !important;
-  }
-  .pl-xl-4,
-  .px-xl-4 {
-    padding-left: 1.5rem !important;
-  }
-  .p-xl-5 {
-    padding: 3rem !important;
-  }
-  .pt-xl-5,
-  .py-xl-5 {
-    padding-top: 3rem !important;
-  }
-  .pr-xl-5,
-  .px-xl-5 {
-    padding-right: 3rem !important;
-  }
-  .pb-xl-5,
-  .py-xl-5 {
-    padding-bottom: 3rem !important;
-  }
-  .pl-xl-5,
-  .px-xl-5 {
-    padding-left: 3rem !important;
-  }
-  .m-xl-auto {
-    margin: auto !important;
-  }
-  .mt-xl-auto,
-  .my-xl-auto {
-    margin-top: auto !important;
-  }
-  .mr-xl-auto,
-  .mx-xl-auto {
-    margin-right: auto !important;
-  }
-  .mb-xl-auto,
-  .my-xl-auto {
-    margin-bottom: auto !important;
-  }
-  .ml-xl-auto,
-  .mx-xl-auto {
-    margin-left: auto !important;
-  }
-}
-
-.text-monospace {
-  font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
-}
-
-.text-justify {
-  text-align: justify !important;
-}
-
-.text-nowrap {
-  white-space: nowrap !important;
-}
-
-.text-truncate {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.text-left {
-  text-align: left !important;
-}
-
-.text-right {
-  text-align: right !important;
-}
-
-.text-center {
-  text-align: center !important;
-}
-
-@media (min-width: 576px) {
-  .text-sm-left {
-    text-align: left !important;
-  }
-  .text-sm-right {
-    text-align: right !important;
-  }
-  .text-sm-center {
-    text-align: center !important;
-  }
-}
-
-@media (min-width: 768px) {
-  .text-md-left {
-    text-align: left !important;
-  }
-  .text-md-right {
-    text-align: right !important;
-  }
-  .text-md-center {
-    text-align: center !important;
-  }
-}
-
-@media (min-width: 992px) {
-  .text-lg-left {
-    text-align: left !important;
-  }
-  .text-lg-right {
-    text-align: right !important;
-  }
-  .text-lg-center {
-    text-align: center !important;
-  }
-}
-
-@media (min-width: 1200px) {
-  .text-xl-left {
-    text-align: left !important;
-  }
-  .text-xl-right {
-    text-align: right !important;
-  }
-  .text-xl-center {
-    text-align: center !important;
-  }
-}
-
-.text-lowercase {
-  text-transform: lowercase !important;
-}
-
-.text-uppercase {
-  text-transform: uppercase !important;
-}
-
-.text-capitalize {
-  text-transform: capitalize !important;
-}
-
-.font-weight-light {
-  font-weight: 300 !important;
-}
-
-.font-weight-normal {
-  font-weight: 400 !important;
-}
-
-.font-weight-bold {
-  font-weight: 700 !important;
-}
-
-.font-italic {
-  font-style: italic !important;
-}
-
-.text-white {
-  color: #fff !important;
-}
-
-.text-primary {
-  color: #3a59b1 !important;
-}
-
-a.text-primary:hover, a.text-primary:focus {
-  color: #2d468b !important;
-}
-
-.text-secondary {
-  color: #6c757d !important;
-}
-
-a.text-secondary:hover, a.text-secondary:focus {
-  color: #545b62 !important;
-}
-
-.text-success {
-  color: #22b24c !important;
-}
-
-a.text-success:hover, a.text-success:focus {
-  color: #1a873a !important;
-}
-
-.text-info {
-  color: yellow !important;
-}
-
-a.text-info:hover, a.text-info:focus {
-  color: #cccc00 !important;
-}
-
-.text-warning {
-  color: #ffc107 !important;
-}
-
-a.text-warning:hover, a.text-warning:focus {
-  color: #d39e00 !important;
-}
-
-.text-danger {
-  color: #fc3434 !important;
-}
-
-a.text-danger:hover, a.text-danger:focus {
-  color: #f90404 !important;
-}
-
-.text-light {
-  color: white !important;
-}
-
-a.text-light:hover, a.text-light:focus {
-  color: #e6e6e6 !important;
-}
-
-.text-dark {
-  color: #6a8ed3 !important;
-}
-
-a.text-dark:hover, a.text-dark:focus {
-  color: #4370c7 !important;
-}
-
-.text-body {
-  color: #212529 !important;
-}
-
-.text-muted {
-  color: #6c757d !important;
-}
-
-.text-black-50 {
-  color: rgba(0, 0, 0, 0.5) !important;
-}
-
-.text-white-50 {
-  color: rgba(255, 255, 255, 0.5) !important;
-}
-
-.text-hide {
-  font: 0/0 a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-
-.visible {
-  visibility: visible !important;
-}
-
-.invisible {
-  visibility: hidden !important;
-}
-
-/*----Custom CSS----*/
-
index 70c594a..9a3f2f5 100644 (file)
@@ -44,7 +44,7 @@ hr{border:0;border-top:1px solid #eee;margin:20px 0}
 .w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none}
 .w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block}
 .w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s}
-.w3-input{padding:4px;display:block;border:1px solid #ccc;width:100%;background-color: #e8f0fe; border-radius:4px}
+.w3-input{padding:4px;display:block;border:1px solid #ccc;width:100%;background-color: #e8f0fe; }
 .w3-select{padding:4px 0; display:block;width:100%;border:1px solid #ccc;background-color: #e8f0fe;}
 .w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer}
 .w3-dropdown-hover:hover .w3-dropdown-content{display:block; }
@@ -274,7 +274,7 @@ hr{border:0;border-top:1px solid #eee;margin:20px 0}
   margin: 0;
   border-bottom: 1px solid #aaa;
   box-shadow: 0 1px 0 1px rgba(0,0,0,.04);
-  /* border-radius: .5em; */
+  border-radius: 0px;
   -moz-appearance: none;
   -webkit-appearance: none;
   appearance: none;
@@ -317,7 +317,7 @@ hr{border:0;border-top:1px solid #eee;margin:20px 0}
   background-color: #333;
   color: #fff;
   text-align: center;
-  border-radius: 2px;
+  
   padding: 16px;
   position: fixed;
   z-index: 1;
@@ -356,7 +356,6 @@ hr{border:0;border-top:1px solid #eee;margin:20px 0}
   background-color: #e8f0fe;
   border: 1px solid #ccc;
   font-weight: normal;
-  border-radius:4px;
 }
 
 .w3-readonly {
index 3dcd0cf..d397298 100644 (file)
@@ -132,7 +132,7 @@ function cleanform(frmname) {
     return false;
 }
 
-function fillformbydataclass(dataclass, data, readonly = false) {
+function fillformbydataclass(dataclass, data,choices, readonly = false) {
     //console.log(data);
     var frm = document.querySelectorAll('.data_' + dataclass);
     if (data) {
@@ -152,7 +152,7 @@ function fillformbydataclass(dataclass, data, readonly = false) {
                         frm[f]._flatpickr.setDate(data[frm[f].id]);
                     } else if (frm[f].classList.contains("choices__input")) {
                         if ((data[frm[f].id] != null) && (data[frm[f].id] != '[""]')) {
-                            choice[dataclass][frm[f].id].setValue(JSON.parse(data[frm[f].id]));
+                            choices[frm[f].id].setValue(JSON.parse(data[frm[f].id]));
                         }
                     } else {
                         frm[f].value = data[frm[f].id];
@@ -162,9 +162,9 @@ function fillformbydataclass(dataclass, data, readonly = false) {
                     if (frm[f].classList.contains("choices__input")) {
                         if (frm[f].multiple == true) {
                             //console.log(data[frm[f].id]);
-                            choice[dataclass][frm[f].id].setChoiceByValue(JSON.parse(data[frm[f].id]));
+                            choices[frm[f].id].setChoiceByValue(JSON.parse(data[frm[f].id]));
                         } else {
-                            choice[dataclass][frm[f].id].setChoiceByValue(data[frm[f].id]);
+                            choices[frm[f].id].setChoiceByValue(data[frm[f].id]);
                         }
                     } else {
                         frm[f].value = data[frm[f].id];
index 46d2d31..aedbf70 100644 (file)
@@ -37,6 +37,30 @@ var module = {
       alert('dlg_' +dlgname + ' not found!');
     }
     
+  },
+  viewtab: function(tabname){
+    var i;
+    var x = document.getElementsByClassName("tabpanel");
+    for (i = 0; i < x.length; i++) {
+        x[i].style.display = "none";
+    }
+    document.getElementById("tab_" + tabname).style.display = "block";
+    x = document.getElementsByClassName("tabbtn");
+
+    for (i = 0; i < x.length; i++) {
+        //console.log(x[i].classList);
+        x[i].classList.remove("w3-blue");
+    }
+    document.getElementById("tabbtn_" + tabname).classList.add("w3-blue");
+    x = document.getElementsByClassName("tabxbtn");
+    for (i = 0; i < x.length; i++) {
+        x[i].style.display = "none";
+    }
+    x = document.getElementsByClassName("tabbtn" + tabname);
+    for (i = 0; i < x.length; i++) {
+        x[i].style.display = "block";
+    }
+    return false;
   }
 }
 
index a65b8c6..30775ff 100644 (file)
@@ -75,7 +75,7 @@ var req = {
         if (method.toUpperCase() == 'GET') {
             sendurl = sendurl + '?' + rdata;
         }
-        //console.log("sending URL: " + method + " => " + sendurl + '?' + rdata);
+        console.log("sending URL: " + method + " => " + sendurl + '?' + rdata);
         request.open(method.toUpperCase(), sendurl, true);
         request.onload = function() {
             if (request.status >= 200 && request.status <= 400) {
diff --git a/icons.txt b/icons.txt
new file mode 100644 (file)
index 0000000..9bd2a59
--- /dev/null
+++ b/icons.txt
@@ -0,0 +1,25 @@
+add
+edit
+remove
+pdf
+invoices
+menu
+logout
+close
+banktransactions
+save
+journal
+directory
+files
+print
+addressbook
+usercard
+dashboard
+offers
+products
+templates
+sales
+contract
+timer
+email
+database
\ No newline at end of file