]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/commitdiff
Merge remote-tracking branch 'dweismueller/vdr_vnsiserver5_new' into next
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 31 May 2014 10:29:22 +0000 (12:29 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 31 May 2014 10:29:22 +0000 (12:29 +0200)
Conflicts:
make.sh

125 files changed:
config/backup/includes/icinga [new file with mode: 0644]
config/cacti/cacti.conf
config/cacti/cacti.logrotate [new file with mode: 0644]
config/cacti/d.gif [new file with mode: 0644]
config/cacti/d.png [new file with mode: 0644]
config/cacti/throbber.gif [new file with mode: 0644]
config/cfgroot/header.pl
config/cfgroot/modem-lib.pl [new file with mode: 0644]
config/firewall/firewall-policy
config/icinga/icinga.conf [new file with mode: 0644]
config/kernel/kernel.config.armv5tel-ipfire-kirkwood
config/kernel/kernel.config.armv5tel-ipfire-multi
config/kernel/kernel.config.armv5tel-ipfire-rpi
config/kernel/kernel.config.i586-ipfire
config/kernel/kernel.config.i586-ipfire-pae
config/menu/20-status.menu
config/menu/70-log.menu
config/ovpn/openssl/ovpn.cnf
config/ovpn/settings
config/rootfiles/common/apache2
config/rootfiles/common/armv5tel/linux-kirkwood
config/rootfiles/common/armv5tel/linux-multi
config/rootfiles/common/armv5tel/linux-rpi
config/rootfiles/common/configroot
config/rootfiles/common/daq
config/rootfiles/common/i586/linux
config/rootfiles/common/i586/syslinux
config/rootfiles/common/inetutils [deleted file]
config/rootfiles/common/iputils
config/rootfiles/common/perl-Device-Modem [new file with mode: 0644]
config/rootfiles/common/perl-Device-SerialPort [new file with mode: 0644]
config/rootfiles/common/ppp
config/rootfiles/common/snort
config/rootfiles/common/squid
config/rootfiles/common/vnstat
config/rootfiles/common/vnstati [deleted file]
config/rootfiles/core/78/exclude [new file with mode: 0644]
config/rootfiles/core/78/filelists/armv5tel/linux-kirkwood [new symlink]
config/rootfiles/core/78/filelists/armv5tel/linux-multi [new symlink]
config/rootfiles/core/78/filelists/armv5tel/linux-rpi [new symlink]
config/rootfiles/core/78/filelists/daq [new symlink]
config/rootfiles/core/78/filelists/files [new file with mode: 0644]
config/rootfiles/core/78/filelists/i586/grub [new symlink]
config/rootfiles/core/78/filelists/i586/linux [new symlink]
config/rootfiles/core/78/filelists/i586/syslinux [new symlink]
config/rootfiles/core/78/filelists/openvpn [new symlink]
config/rootfiles/core/78/filelists/ppp [new symlink]
config/rootfiles/core/78/filelists/snort [new symlink]
config/rootfiles/core/78/filelists/squid [new symlink]
config/rootfiles/core/78/filelists/vnstat [new symlink]
config/rootfiles/core/78/meta [new file with mode: 0644]
config/rootfiles/core/78/update.sh [new file with mode: 0644]
config/rootfiles/packages/cacti
config/rootfiles/packages/icinga [new file with mode: 0644]
config/rootfiles/packages/linux-pae
config/rootfiles/packages/nut
config/rootfiles/packages/sslscan [new file with mode: 0644]
config/xen-image/README
config/xen-image/ipfire.cfg
config/xen-image/xen-image-maker.sh
doc/language_issues.de
doc/language_issues.en
doc/language_issues.es
doc/language_issues.fr
doc/language_issues.nl
doc/language_issues.pl
doc/language_issues.ru
doc/language_issues.tr
doc/language_missings
doc/make.sh-usage
html/cgi-bin/ddns.cgi
html/cgi-bin/ids.cgi
html/cgi-bin/logs.cgi/firewalllogcountry.dat [new file with mode: 0644]
html/cgi-bin/logs.cgi/showrequestfromcountry.dat [new file with mode: 0644]
html/cgi-bin/modem-status.cgi [new file with mode: 0755]
html/cgi-bin/ovpnmain.cgi
html/cgi-bin/pppsetup.cgi
html/cgi-bin/proxy.cgi
html/html/themes/ipfire/include/functions.pl
langs/de/cgi-bin/de.pl
langs/en/cgi-bin/en.pl
lfs/Config
lfs/cacti
lfs/configroot
lfs/daq
lfs/e1000e
lfs/icinga [new file with mode: 0644]
lfs/igb
lfs/iputils
lfs/linux
lfs/nut
lfs/openvpn
lfs/perl-Device-Modem [moved from lfs/vnstati with 91% similarity]
lfs/perl-Device-SerialPort [moved from lfs/inetutils with 79% similarity]
lfs/ppp
lfs/qemu
lfs/snort
lfs/squid
lfs/sslscan [new file with mode: 0644]
lfs/sudo
lfs/vnstat
make.sh
src/initscripts/init.d/firewall
src/initscripts/init.d/nut
src/initscripts/init.d/sshd
src/install+setup/install/main.c
src/paks/cacti/install.sh
src/patches/cacti/cacti-0.8.8a-legal.patch [new file with mode: 0644]
src/patches/cacti/cacti-0.8.8a-replace_treeview_by_jquery.jstree.patch [new file with mode: 0644]
src/patches/cacti/cacti-0.8.8b-html-injection.patch [new file with mode: 0644]
src/patches/cacti/cacti-0.8.8b-remote-command-execution.patch [new file with mode: 0644]
src/patches/cacti/cacti-0.8.8b-rra-comments.patch [new file with mode: 0644]
src/patches/cacti/cacti-0.8.8b-sanitize-variables.patch [new file with mode: 0644]
src/patches/cacti/cacti-0.8.8b-sql-injection-shell-escaping.patch [new file with mode: 0644]
src/patches/inetutils-1.4.2-daemon_fixes-1.patch [deleted file]
src/patches/inetutils-1.4.2-gcc4_fixes-3.patch [deleted file]
src/patches/linux-3.10.39-pie_packet_sch.patch [new file with mode: 0644]
src/patches/ppp/0003-build-sys-utilize-compiler-flags-handed-to-us-by-rpm.patch [new file with mode: 0644]
src/patches/ppp/0012-pppd-we-don-t-want-to-accidentally-leak-fds.patch [new file with mode: 0644]
src/patches/ppp/0013-everywhere-O_CLOEXEC-harder.patch [new file with mode: 0644]
src/patches/ppp/0014-everywhere-use-SOCK_CLOEXEC-when-creating-socket.patch [new file with mode: 0644]
src/patches/ppp/ppp-2.4.6-increase-max-padi-attempts.patch [new file with mode: 0644]
src/scripts/backupiso
src/scripts/setddns.pl
tools/make-functions

diff --git a/config/backup/includes/icinga b/config/backup/includes/icinga
new file mode 100644 (file)
index 0000000..ecea4e1
--- /dev/null
@@ -0,0 +1 @@
+/etc/icinga
index 9c39ef6a08a779fb6c07f1146d3052d43bf6427b..024449d3019d2703b1f7d9612c4739354c9a64eb 100644 (file)
@@ -1,11 +1,16 @@
 Listen 1009
 
 <VirtualHost *:1009>
-
     DocumentRoot /usr/share/cacti
+
     Include /etc/httpd/conf/conf.d/php*.conf
+
+    Alias /cacti /usr/share/cacti
     <Directory /usr/share/cacti>
         Options FollowSymLinks
         AllowOverride None
     </Directory>
+
+    RewriteEngine on
+    RewriteRule ^/$ /cacti/ [R]
 </VirtualHost>
diff --git a/config/cacti/cacti.logrotate b/config/cacti/cacti.logrotate
new file mode 100644 (file)
index 0000000..3ff4395
--- /dev/null
@@ -0,0 +1,6 @@
+/var/log/cacti/cacti.log {
+       missingok
+       monthly
+       notifempty
+       compress
+}
diff --git a/config/cacti/d.gif b/config/cacti/d.gif
new file mode 100644 (file)
index 0000000..0e958d3
Binary files /dev/null and b/config/cacti/d.gif differ
diff --git a/config/cacti/d.png b/config/cacti/d.png
new file mode 100644 (file)
index 0000000..8540175
Binary files /dev/null and b/config/cacti/d.png differ
diff --git a/config/cacti/throbber.gif b/config/cacti/throbber.gif
new file mode 100644 (file)
index 0000000..5b33f7e
Binary files /dev/null and b/config/cacti/throbber.gif differ
index 39472a85759dfe7d0658b99b2e43ace36a4fa709..bbb7e21f45243b183e43169b017c6937e1364ec2 100644 (file)
@@ -153,6 +153,10 @@ sub genmenu {
     if (&General::RedIsWireless()) {
         $menu->{'01.system'}{'subMenu'}->{'21.wlan'}{'enabled'} = 1;
     }
+
+    if ($ethsettings{'RED_TYPE'} eq "PPPOE") {
+        $menu->{'02.status'}{'subMenu'}->{'74.modem-status'}{'enabled'} = 1;
+    }
 }
 
 sub showhttpheaders
diff --git a/config/cfgroot/modem-lib.pl b/config/cfgroot/modem-lib.pl
new file mode 100644 (file)
index 0000000..51b6d68
--- /dev/null
@@ -0,0 +1,276 @@
+#!/usr/bin/perl
+###############################################################################
+#                                                                             #
+# IPFire.org - A linux based firewall                                         #
+# Copyright (C) 2014 IPFire Team  <info@ipfire.org>                           #
+#                                                                             #
+# This 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 3 of the License, or           #
+# (at your option) any later version.                                         #
+#                                                                             #
+# This program is distributed in the hope that it will be useful,             #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of              #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
+# GNU General Public License for more details.                                #
+#                                                                             #
+# You should have received a copy of the GNU General Public License           #
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
+#                                                                             #
+###############################################################################
+
+use Device::Modem;
+
+package Modem;
+
+sub new() {
+       my $class = shift;
+
+       my $port = shift;
+       my $baud = shift;
+
+       my $self = {};
+       bless $self, $class;
+
+       # Initialize the connetion to the modem.
+       $self->_initialize($port, $baud);
+
+       if ($self->_is_working()) {
+               return $self;
+       }
+
+       return undef;
+}
+
+sub DESTROY() {
+       my $self = shift;
+
+       # Close connection to modem.
+       if ($self->{modem}) {
+               $self->{modem}->close();
+       }
+}
+
+sub _initialize() {
+       my ($self, $port, $baud) = @_;
+
+       # Establish connection to the modem.
+       $self->{modem} = new Device::Modem(port => $port);
+       $self->{modem}->connect(baudrate => $baud);
+}
+
+sub _is_working() {
+       my $self = shift;
+
+       # Check if the modem responds to AT commands.
+       $self->{modem}->atsend("AT\r\n");
+
+       my $response = $self->{modem}->answer();
+       return ($response eq "OK");
+}
+
+sub _command() {
+       my $self = shift;
+       my $cmd  = shift;
+
+       # Terminate the AT command with newline.
+       $cmd .= "\r\n";
+
+       $self->{modem}->atsend($cmd);
+
+       my $response = $self->{modem}->answer();
+       my @response = split(/\n/, $response);
+
+       # Trim leading and trailing spaces.
+       foreach my $line (@response) {
+               $line =~ s/^\s+|\s+$//g;
+               chomp($line);
+       }
+
+       my $last_element = pop(@response);
+       unless ($last_element eq "OK") {
+               push(@response, $last_element);
+       }
+
+       $response = join("\n", @response);
+
+       return $self->_trim($response);
+}
+
+sub _trim() {
+       my $self = shift;
+       my $input = shift;
+
+       my $first_char = substr($input, 0, 1);
+       if ($first_char eq "+") {
+               my @output = split(/:/, $input);
+               if ($#output == 1) {
+                       return $output[1];
+               }
+       }
+
+       return $input;
+}
+
+sub get_vendor() {
+       my $self = shift;
+
+       return $self->_command("AT+GMI");
+}
+
+sub get_model() {
+       my $self = shift;
+
+       return $self->_command("AT+GMM");
+}
+
+sub get_software_version() {
+       my $self = shift;
+
+       return $self->_command("AT+GMR");
+}
+
+sub get_imei() {
+       my $self = shift;
+
+       return $self->_command("AT+GSN");
+}
+
+sub get_capabilities() {
+       my $self = shift;
+
+       my $output = $self->_command("AT+GCAP");
+       return split(/,/, $output);
+}
+
+sub is_sim_unlocked() {
+       my $self = shift;
+
+       # TODO
+       return 1;
+}
+
+sub get_sim_imsi() {
+       my $self = shift;
+
+       if ($self->is_sim_unlocked()) {
+               return $self->_command("AT+CIMI");
+       }
+}
+
+sub get_network_registration() {
+       my $self = shift;
+
+       my @elements;
+       foreach my $i ([0, 1]) {
+               my $output = $self->_command("AT+CREG?");
+
+               @elements = split(/,/, $output);
+               if ($#elements != 2) {
+                       # Output in wrong format. Resetting.
+                       $self->_command("AT+CREG=0");
+               }
+       }
+
+       if ($elements[0] == 0) {
+               if ($elements[1] == 0) {
+                       return "NOT REGISTERED, NOT SEARCHING";
+               } elsif ($elements[1] == 1) {
+                       return "REGISTERED TO HOME NETWORK";
+               } elsif ($elements[1] == 2) {
+                       return "NOT REGISTERED, SEARCHING";
+               } elsif ($elements[1] == 3) {
+                       return "REGISTRATION DENIED";
+               } elsif ($elements[1] == 5) {
+                       return "REGISTERED, ROAMING";
+               } else {
+                       return "UNKNOWN";
+               }
+       }
+}
+
+sub _get_network_operator() {
+       my $self = shift;
+
+       my $output = $self->_command("AT+COPS?");
+       $output =~ s/\"//g;
+
+       my @elements = split(/,/, $output);
+       if ($#elements == 3) {
+               return @elements;
+       }
+}
+
+sub get_network_operator() {
+       my $self = shift;
+
+       my ($mode, $format, $operator, $act) = $self->_get_network_operator();
+
+       return $operator;
+}
+
+sub get_network_mode() {
+       my $self = shift;
+
+       my ($mode, $format, $operator, $act) = $self->_get_network_operator();
+
+       if ($act == 0) {
+               return "GSM";
+       } elsif ($act == 1) {
+               return "Compact GSM";
+       } elsif ($act == 2) {
+               return "UMTS";
+       } elsif ($act == 3) {
+               return "GSM WITH EGPRS";
+       } elsif ($act == 4) {
+               return "UMTS WITH HSDPA";
+       } elsif ($act == 5) {
+               return "UMTS WITH HSUPA";
+       } elsif ($act == 6) {
+               return "UMTS WITH HSDPA+HSUPA";
+       } elsif ($act == 7) {
+               return "LTE";
+       } else {
+               return "UNKNOWN ($act)";
+       }
+}
+
+sub _get_signal_quality() {
+       my $self = shift;
+
+       my $output = $self->_command("AT+CSQ");
+
+       my @elements = split(/,/, $output);
+       if ($#elements == 1) {
+               return @elements;
+       }
+}
+
+sub get_signal_quality() {
+       my $self = shift;
+
+       my ($rssi, $ber) = $self->_get_signal_quality();
+
+       # 99 equals unknown.
+       unless ($rssi == 99) {
+               my $dbm = ($rssi * 2) - 113;
+               return $dbm;
+       }
+
+       return undef;
+}
+
+sub get_bit_error_rate() {
+       my $self = shift;
+
+       my ($rssi, $ber) = $self->_get_signal_quality();
+
+       # 99 indicates unknown.
+       unless ($ber == 99) {
+               return $ber;
+       }
+
+       return undef;
+}
+
+1;
index 96b9b2fe5aba650033a67c67c1b035599d3dd0e5..4ba1ace8cec12cee5aab07082e1c8d0cc107a053 100755 (executable)
@@ -57,6 +57,9 @@ HAVE_OPENVPN="true"
 
 # INPUT
 
+# Allow access from GREEN
+iptables -A POLICYIN -i "${GREEN_DEV}" -j ACCEPT
+
 # IPsec INPUT
 case "${HAVE_IPSEC},${POLICY}" in
        true,MODE1) ;;
diff --git a/config/icinga/icinga.conf b/config/icinga/icinga.conf
new file mode 100644 (file)
index 0000000..3771812
--- /dev/null
@@ -0,0 +1,37 @@
+Listen 1010
+
+<VirtualHost *:1010>
+       ScriptAlias /icinga/cgi-bin /usr/share/icinga/cgi-bin
+       Alias /icinga /usr/share/icinga/
+
+       RewriteEngine on
+       RewriteRule ^/$ /icinga/ [R]
+
+       <Directory /usr/share/icinga/cgi-bin>
+               Options ExecCGI
+               AllowOverride None
+
+               AuthName "Icinga Access"
+               AuthType Basic
+               AuthUserFile /etc/icinga/htpasswd.users
+
+               Order allow,deny
+               Allow from all
+
+               Require valid-user
+       </Directory>
+
+       <Directory /usr/share/icinga/>
+               Options None
+               AllowOverride All
+
+               AuthName "Icinga Access"
+               AuthType Basic
+               AuthUserFile /etc/icinga/htpasswd.users
+
+               Order allow,deny
+               Allow from all
+
+               Require valid-user
+       </Directory>
+</VirtualHost>
index 2d9b11521af814fe75e7d2379fca085df32f6c27..9bc1d43aff4d09da2c1c4da52951d9c3bca1386a 100644 (file)
@@ -953,6 +953,7 @@ CONFIG_NET_SCH_CHOKE=m
 CONFIG_NET_SCH_QFQ=m
 CONFIG_NET_SCH_CODEL=m
 CONFIG_NET_SCH_FQ_CODEL=m
+CONFIG_NET_SCH_PIE=m
 CONFIG_NET_SCH_INGRESS=m
 CONFIG_NET_SCH_PLUG=m
 
index dcc177d3ecf9ac10b5da9c31cfbadb98fc399abb..127542f9a49ee00f5bd1cfe2c0a2a312b5452001 100644 (file)
@@ -1142,6 +1142,7 @@ CONFIG_NET_SCH_CHOKE=m
 CONFIG_NET_SCH_QFQ=m
 CONFIG_NET_SCH_CODEL=m
 CONFIG_NET_SCH_FQ_CODEL=m
+CONFIG_NET_SCH_PIE=m
 CONFIG_NET_SCH_INGRESS=m
 CONFIG_NET_SCH_PLUG=m
 
index 0c9b3d20ecfcb2c50937e7cf7c6364c851c20921..2c709ccfca87f5beb40bb6b349828d4de4ca25dc 100644 (file)
@@ -888,6 +888,7 @@ CONFIG_NET_SCH_CHOKE=m
 CONFIG_NET_SCH_QFQ=m
 CONFIG_NET_SCH_CODEL=m
 CONFIG_NET_SCH_FQ_CODEL=m
+CONFIG_NET_SCH_PIE=m
 CONFIG_NET_SCH_INGRESS=m
 CONFIG_NET_SCH_PLUG=m
 
index 246e436ecbcabb1205adfb6f72a78a27cbc136ef..8a3e089dd0eab4985e9025efe620f94d3e724ea8 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Automatically generated file; DO NOT EDIT.
-# Linux/x86 3.10.33 Kernel Configuration
+# Linux/x86 3.10.40-ipfire Kernel Configuration
 #
 # CONFIG_64BIT is not set
 CONFIG_X86_32=y
@@ -582,29 +582,29 @@ CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
 # x86 CPU frequency scaling drivers
 #
 CONFIG_X86_INTEL_PSTATE=y
-CONFIG_X86_PCC_CPUFREQ=y
-CONFIG_X86_ACPI_CPUFREQ=y
+CONFIG_X86_PCC_CPUFREQ=m
+CONFIG_X86_ACPI_CPUFREQ=m
 # CONFIG_X86_ACPI_CPUFREQ_CPB is not set
-# CONFIG_X86_POWERNOW_K6 is not set
-CONFIG_X86_POWERNOW_K7=y
+CONFIG_X86_POWERNOW_K6=m
+CONFIG_X86_POWERNOW_K7=m
 CONFIG_X86_POWERNOW_K7_ACPI=y
-CONFIG_X86_POWERNOW_K8=y
-# CONFIG_X86_AMD_FREQ_SENSITIVITY is not set
-# CONFIG_X86_GX_SUSPMOD is not set
+CONFIG_X86_POWERNOW_K8=m
+CONFIG_X86_AMD_FREQ_SENSITIVITY=m
+CONFIG_X86_GX_SUSPMOD=m
 # CONFIG_X86_SPEEDSTEP_CENTRINO is not set
-CONFIG_X86_SPEEDSTEP_ICH=y
-CONFIG_X86_SPEEDSTEP_SMI=y
-CONFIG_X86_P4_CLOCKMOD=y
-# CONFIG_X86_CPUFREQ_NFORCE2 is not set
-CONFIG_X86_LONGRUN=y
-# CONFIG_X86_LONGHAUL is not set
+CONFIG_X86_SPEEDSTEP_ICH=m
+CONFIG_X86_SPEEDSTEP_SMI=m
+CONFIG_X86_P4_CLOCKMOD=m
+CONFIG_X86_CPUFREQ_NFORCE2=m
+CONFIG_X86_LONGRUN=m
+CONFIG_X86_LONGHAUL=m
 # CONFIG_X86_E_POWERSAVER is not set
 
 #
 # shared options
 #
-CONFIG_X86_SPEEDSTEP_LIB=y
-# CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK is not set
+CONFIG_X86_SPEEDSTEP_LIB=m
+CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK=y
 CONFIG_CPU_IDLE=y
 # CONFIG_CPU_IDLE_MULTIPLE_DRIVERS is not set
 CONFIG_CPU_IDLE_GOV_LADDER=y
@@ -913,6 +913,8 @@ CONFIG_NETFILTER_XT_MATCH_HELPER=m
 CONFIG_NETFILTER_XT_MATCH_HL=m
 CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
 # CONFIG_NETFILTER_XT_MATCH_IPVS is not set
+CONFIG_NETFILTER_XT_MATCH_LAYER7=m
+# CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG is not set
 CONFIG_NETFILTER_XT_MATCH_LENGTH=m
 CONFIG_NETFILTER_XT_MATCH_LIMIT=m
 CONFIG_NETFILTER_XT_MATCH_MAC=m
@@ -931,8 +933,6 @@ CONFIG_NETFILTER_XT_MATCH_RECENT=m
 CONFIG_NETFILTER_XT_MATCH_SCTP=m
 CONFIG_NETFILTER_XT_MATCH_SOCKET=m
 CONFIG_NETFILTER_XT_MATCH_STATE=m
-CONFIG_NETFILTER_XT_MATCH_LAYER7=m
-# CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG is not set
 CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
 CONFIG_NETFILTER_XT_MATCH_STRING=m
 CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
@@ -1140,6 +1140,7 @@ CONFIG_NET_SCH_CHOKE=m
 CONFIG_NET_SCH_QFQ=m
 CONFIG_NET_SCH_CODEL=m
 CONFIG_NET_SCH_FQ_CODEL=m
+CONFIG_NET_SCH_PIE=m
 CONFIG_NET_SCH_INGRESS=m
 CONFIG_NET_SCH_PLUG=m
 
index 8dc185bca39b731609e8ba53f51c68d14fd27786..4f713623f90df65682dcf59add71612b52820849 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Automatically generated file; DO NOT EDIT.
-# Linux/x86 3.10.33 Kernel Configuration
+# Linux/x86 3.10.40-ipfire Kernel Configuration
 #
 # CONFIG_64BIT is not set
 CONFIG_X86_32=y
@@ -594,29 +594,29 @@ CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
 # x86 CPU frequency scaling drivers
 #
 CONFIG_X86_INTEL_PSTATE=y
-CONFIG_X86_PCC_CPUFREQ=y
-CONFIG_X86_ACPI_CPUFREQ=y
+CONFIG_X86_PCC_CPUFREQ=m
+CONFIG_X86_ACPI_CPUFREQ=m
 # CONFIG_X86_ACPI_CPUFREQ_CPB is not set
-# CONFIG_X86_POWERNOW_K6 is not set
-CONFIG_X86_POWERNOW_K7=y
+CONFIG_X86_POWERNOW_K6=m
+CONFIG_X86_POWERNOW_K7=m
 CONFIG_X86_POWERNOW_K7_ACPI=y
-CONFIG_X86_POWERNOW_K8=y
-# CONFIG_X86_AMD_FREQ_SENSITIVITY is not set
-# CONFIG_X86_GX_SUSPMOD is not set
+CONFIG_X86_POWERNOW_K8=m
+CONFIG_X86_AMD_FREQ_SENSITIVITY=m
+CONFIG_X86_GX_SUSPMOD=m
 # CONFIG_X86_SPEEDSTEP_CENTRINO is not set
-CONFIG_X86_SPEEDSTEP_ICH=y
-CONFIG_X86_SPEEDSTEP_SMI=y
-CONFIG_X86_P4_CLOCKMOD=y
-# CONFIG_X86_CPUFREQ_NFORCE2 is not set
-CONFIG_X86_LONGRUN=y
-# CONFIG_X86_LONGHAUL is not set
+CONFIG_X86_SPEEDSTEP_ICH=m
+CONFIG_X86_SPEEDSTEP_SMI=m
+CONFIG_X86_P4_CLOCKMOD=m
+CONFIG_X86_CPUFREQ_NFORCE2=m
+CONFIG_X86_LONGRUN=m
+CONFIG_X86_LONGHAUL=m
 # CONFIG_X86_E_POWERSAVER is not set
 
 #
 # shared options
 #
-CONFIG_X86_SPEEDSTEP_LIB=y
-# CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK is not set
+CONFIG_X86_SPEEDSTEP_LIB=m
+CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK=y
 CONFIG_CPU_IDLE=y
 # CONFIG_CPU_IDLE_MULTIPLE_DRIVERS is not set
 CONFIG_CPU_IDLE_GOV_LADDER=y
@@ -925,6 +925,8 @@ CONFIG_NETFILTER_XT_MATCH_HELPER=m
 CONFIG_NETFILTER_XT_MATCH_HL=m
 CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
 # CONFIG_NETFILTER_XT_MATCH_IPVS is not set
+CONFIG_NETFILTER_XT_MATCH_LAYER7=m
+# CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG is not set
 CONFIG_NETFILTER_XT_MATCH_LENGTH=m
 CONFIG_NETFILTER_XT_MATCH_LIMIT=m
 CONFIG_NETFILTER_XT_MATCH_MAC=m
@@ -943,8 +945,6 @@ CONFIG_NETFILTER_XT_MATCH_RECENT=m
 CONFIG_NETFILTER_XT_MATCH_SCTP=m
 CONFIG_NETFILTER_XT_MATCH_SOCKET=m
 CONFIG_NETFILTER_XT_MATCH_STATE=m
-CONFIG_NETFILTER_XT_MATCH_LAYER7=m
-# CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG is not set
 CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
 CONFIG_NETFILTER_XT_MATCH_STRING=m
 CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
@@ -1152,6 +1152,7 @@ CONFIG_NET_SCH_CHOKE=m
 CONFIG_NET_SCH_QFQ=m
 CONFIG_NET_SCH_CODEL=m
 CONFIG_NET_SCH_FQ_CODEL=m
+CONFIG_NET_SCH_PIE=m
 CONFIG_NET_SCH_INGRESS=m
 CONFIG_NET_SCH_PLUG=m
 
index 8899310aaa8cad97f950b22fdd38663ab679a9e9..b159ed6109b0988cf4112ca450777776f73ad66f 100644 (file)
                                'title' => "$Lang::tr{'qos graphs'}",
                                'enabled' => 1,
                                };
+    $substatus->{'74.modem-status'} = {'caption' => $Lang::tr{'modem status'},
+                                 'uri' => '/cgi-bin/modem-status.cgi',
+                                 'title' => $Lang::tr{'modem status'},
+                                 'enabled' => 0,
+                                 };
     $substatus->{'75.atm-status'} = {'caption' => 'Atm-status',
                                  'uri' => '/cgi-bin/atm-status.cgi',
                                  'title' => 'Atm-status',
index 25ba090fc2e609428eaabc1b59bc77f949c9ddb4..08973de5a2943ea6f3b5267837d14b7011c60206 100644 (file)
                                 'title' => "$Lang::tr{'firewall logs port'}",
                                 'enabled' => 1
                                 };
+    $sublogs->{'43.firewallcountry'} = {'caption' => $Lang::tr{'firewall logs country'},
+                                'uri' => '/cgi-bin/logs.cgi/firewalllogcountry.dat',
+                                'title' => "$Lang::tr{'firewall logs country'}",
+                                'enabled' => 1
+                                };
     $sublogs->{'50.ids'} = {'caption' => $Lang::tr{'ids logs'},
                                'uri' => '/cgi-bin/logs.cgi/ids.dat',
                                'title' => "$Lang::tr{'ids logs'}",
index d82c04b904c3e216c933867671ac8d68141090c2..ab026c10951f98afa6e35d15b3ea7620501532ef 100644 (file)
@@ -1,46 +1,46 @@
-HOME           = .
-RANDFILE       = /var/ipfire/ovpn/ca/.rnd
-oid_section    = new_oids
+HOME                           = .
+RANDFILE                       = /var/ipfire/ovpn/ca/.rnd
+oid_section                    = new_oids
 
 [ new_oids ]
 
 [ ca ]
-default_ca     = openvpn
+default_ca                     = openvpn
 
 [ openvpn ]
-dir            = /var/ipfire/ovpn
-certs          = $dir/certs
-crl_dir                = $dir/crl
-database       = $dir/certs/index.txt
-new_certs_dir  = $dir/certs
-certificate    = $dir/ca/cacert.pem
-serial         = $dir/certs/serial
-crl            = $dir/crl.pem
-private_key    = $dir/ca/cakey.pem
-RANDFILE       = $dir/ca/.rand
-x509_extensions        = usr_cert
-default_days   = 999999
-default_crl_days= 30
-default_md     = md5
-preserve       = no
-policy         = policy_match
-email_in_dn    = no
+dir                            = /var/ipfire/ovpn
+certs                          = $dir/certs
+crl_dir                                = $dir/crl
+database                       = $dir/certs/index.txt
+new_certs_dir                  = $dir/certs
+certificate                    = $dir/ca/cacert.pem
+serial                         = $dir/certs/serial
+crl                            = $dir/crl.pem
+private_key                    = $dir/ca/cakey.pem
+RANDFILE                       = $dir/ca/.rand
+x509_extensions                        = usr_cert
+default_days                   = 999999
+default_crl_days               = 30
+default_md                     = sha256
+preserve                       = no
+policy                         = policy_match
+email_in_dn                    = no
 
 [ policy_match ]
-countryName            = optional
-stateOrProvinceName    = optional
-organizationName       = optional
-organizationalUnitName = optional
-commonName             = supplied
-emailAddress           = optional
+countryName                    = optional
+stateOrProvinceName            = optional
+organizationName               = optional
+organizationalUnitName         = optional
+commonName                     = supplied
+emailAddress                   = optional
 
 [ req ]
-default_bits           = 1024
-default_keyfile        = privkey.pem
-distinguished_name     = req_distinguished_name
-attributes             = req_attributes
-x509_extensions        = v3_ca
-string_mask = nombstr
+default_bits                   = 2048
+default_keyfile                = privkey.pem
+distinguished_name             = req_distinguished_name
+attributes                     = req_attributes
+x509_extensions                        = v3_ca
+string_mask                    = nombstr
 
 [ req_distinguished_name ]
 countryName                    = Country Name (2 letter code)
@@ -73,31 +73,31 @@ challengePassword_max               = 20
 unstructuredName               = An optional company name
 
 [ usr_cert ]
-basicConstraints=CA:FALSE
+basicConstraints               = CA:FALSE
 nsComment                      = "OpenSSL Generated Certificate"
-subjectKeyIdentifier=hash
-authorityKeyIdentifier=keyid,issuer:always
+subjectKeyIdentifier           = hash
+authorityKeyIdentifier         = keyid,issuer:always
 
 [ server ]
 
 # JY ADDED -- Make a cert with nsCertType set to "server"
-basicConstraints=CA:FALSE
+basicConstraints               = CA:FALSE
 nsCertType                     = server
 nsComment                      = "OpenSSL Generated Server Certificate"
-subjectKeyIdentifier=hash
-authorityKeyIdentifier=keyid,issuer:always 
+subjectKeyIdentifier           = hash
+authorityKeyIdentifier         = keyid,issuer:always 
 
 [ v3_req ]
-basicConstraints = CA:FALSE
-keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+basicConstraints               = CA:FALSE
+keyUsage                       = nonRepudiation, digitalSignature, keyEncipherment
 
 [ v3_ca ]
-subjectKeyIdentifier=hash
-authorityKeyIdentifier=keyid:always,issuer:always
-basicConstraints = CA:true
+subjectKeyIdentifier           = hash
+authorityKeyIdentifier         = keyid:always,issuer:always
+basicConstraints               = CA:true
 
 [ crl_ext ]
-authorityKeyIdentifier=keyid:always,issuer:always
+authorityKeyIdentifier         = keyid:always,issuer:always
 
 [ engine ]
-default = openssl
+default                        = openssl
index b78fc32d701c90c32008ec72fddc099b950b164f..8fa37fe07b27f8d42e8eb644d703ccb130dff58c 100644 (file)
@@ -1,6 +1,6 @@
 ENABLED=off
 ENABLED_BLUE=off
 ENABLED_ORANGE=off
-DDEST_PORT=1149
+DDEST_PORT=1194
 DPROTOCOL=udp
 VPN_IP=
index 2dd14cc2cbb4e1bee54fd54d05b137dd01313225..474e7a7dc1edb54578ccfc963ef9ce2175940fd4 100644 (file)
@@ -1415,6 +1415,7 @@ srv/web/ipfire/cgi-bin/mac.cgi
 srv/web/ipfire/cgi-bin/media.cgi
 srv/web/ipfire/cgi-bin/memory.cgi
 srv/web/ipfire/cgi-bin/modem.cgi
+srv/web/ipfire/cgi-bin/modem-status.cgi
 srv/web/ipfire/cgi-bin/netexternal.cgi
 srv/web/ipfire/cgi-bin/netinternal.cgi
 srv/web/ipfire/cgi-bin/netother.cgi
index 9cb3057d06703e5351e0a17439d92bde524e344e..4880b60ffe7a6bd4f18da36d5b0cee16cd14f7be 100644 (file)
@@ -2243,6 +2243,7 @@ lib/modules/KVER-ipfire-kirkwood
 #lib/modules/KVER-ipfire-kirkwood/kernel/net/sched/sch_mqprio.ko
 #lib/modules/KVER-ipfire-kirkwood/kernel/net/sched/sch_multiq.ko
 #lib/modules/KVER-ipfire-kirkwood/kernel/net/sched/sch_netem.ko
+#lib/modules/KVER-ipfire-kirkwood/kernel/net/sched/sch_pie.ko
 #lib/modules/KVER-ipfire-kirkwood/kernel/net/sched/sch_plug.ko
 #lib/modules/KVER-ipfire-kirkwood/kernel/net/sched/sch_prio.ko
 #lib/modules/KVER-ipfire-kirkwood/kernel/net/sched/sch_qfq.ko
index 1fd840c95e0f0fea857aca51c17e2bf945ecd93a..3c20c523634f8b7bdbd6ce1f38f90ccf4d0b2b09 100644 (file)
@@ -2195,6 +2195,7 @@ lib/modules/KVER-ipfire-multi
 #lib/modules/KVER-ipfire-multi/kernel/net/sched/sch_mqprio.ko
 #lib/modules/KVER-ipfire-multi/kernel/net/sched/sch_multiq.ko
 #lib/modules/KVER-ipfire-multi/kernel/net/sched/sch_netem.ko
+#lib/modules/KVER-ipfire-multi/kernel/net/sched/sch_pie.ko
 #lib/modules/KVER-ipfire-multi/kernel/net/sched/sch_plug.ko
 #lib/modules/KVER-ipfire-multi/kernel/net/sched/sch_prio.ko
 #lib/modules/KVER-ipfire-multi/kernel/net/sched/sch_qfq.ko
index 2ea9efe196523bb47d460b8a3ca7eafb57006b45..01f9312ee890ec7b24675bad898ca674b8bd95e9 100644 (file)
@@ -1804,6 +1804,7 @@ lib/modules/KVER-ipfire-rpi
 #lib/modules/KVER-ipfire-rpi/kernel/net/sched/sch_mqprio.ko
 #lib/modules/KVER-ipfire-rpi/kernel/net/sched/sch_multiq.ko
 #lib/modules/KVER-ipfire-rpi/kernel/net/sched/sch_netem.ko
+#lib/modules/KVER-ipfire-rpi/kernel/net/sched/sch_pie.ko
 #lib/modules/KVER-ipfire-rpi/kernel/net/sched/sch_plug.ko
 #lib/modules/KVER-ipfire-rpi/kernel/net/sched/sch_prio.ko
 #lib/modules/KVER-ipfire-rpi/kernel/net/sched/sch_qfq.ko
index b5de9891de9e0656abac8c5b47055d35f5325a47..6afe6cdf8840a3fbe4be5b5dbdd2ed061b71d40c 100644 (file)
@@ -116,6 +116,7 @@ var/ipfire/menu.d/70-log.menu
 var/ipfire/modem
 #var/ipfire/modem/defaults
 #var/ipfire/modem/settings
+var/ipfire/modem-lib.pl
 var/ipfire/net-traffic
 #var/ipfire/net-traffic/net-traffic-admin.pl
 #var/ipfire/net-traffic/net-traffic-lib.pl
index 4467545ae53a3fe999e2582fb54f5981c72089ea..b8a9fd4acac2bc9737f0a459d11e28658af7c004 100644 (file)
@@ -21,7 +21,7 @@ usr/lib/daq
 #usr/lib/libdaq.la
 #usr/lib/libdaq.so
 usr/lib/libdaq.so.2
-usr/lib/libdaq.so.2.0.1
+usr/lib/libdaq.so.2.0.2
 #usr/lib/libdaq_static.a
 #usr/lib/libdaq_static.la
 #usr/lib/libdaq_static_modules.a
index 48bd9ced554d2b70ae75740e0ce88193275e84e6..3f364aed55e54ad1ee68f0f475c1291b7bb1abc2 100644 (file)
@@ -240,10 +240,25 @@ lib/modules/KVER-ipfire
 #lib/modules/KVER-ipfire/kernel/drivers/clocksource/cs5535-clockevt.ko
 #lib/modules/KVER-ipfire/kernel/drivers/clocksource/scx200_hrt.ko
 #lib/modules/KVER-ipfire/kernel/drivers/cpufreq
+#lib/modules/KVER-ipfire/kernel/drivers/cpufreq/acpi-cpufreq.ko
+#lib/modules/KVER-ipfire/kernel/drivers/cpufreq/amd_freq_sensitivity.ko
+#lib/modules/KVER-ipfire/kernel/drivers/cpufreq/cpufreq-nforce2.ko
 #lib/modules/KVER-ipfire/kernel/drivers/cpufreq/cpufreq_conservative.ko
 #lib/modules/KVER-ipfire/kernel/drivers/cpufreq/cpufreq_ondemand.ko
 #lib/modules/KVER-ipfire/kernel/drivers/cpufreq/cpufreq_powersave.ko
 #lib/modules/KVER-ipfire/kernel/drivers/cpufreq/cpufreq_stats.ko
+#lib/modules/KVER-ipfire/kernel/drivers/cpufreq/gx-suspmod.ko
+#lib/modules/KVER-ipfire/kernel/drivers/cpufreq/longhaul.ko
+#lib/modules/KVER-ipfire/kernel/drivers/cpufreq/longrun.ko
+#lib/modules/KVER-ipfire/kernel/drivers/cpufreq/mperf.ko
+#lib/modules/KVER-ipfire/kernel/drivers/cpufreq/p4-clockmod.ko
+#lib/modules/KVER-ipfire/kernel/drivers/cpufreq/pcc-cpufreq.ko
+#lib/modules/KVER-ipfire/kernel/drivers/cpufreq/powernow-k6.ko
+#lib/modules/KVER-ipfire/kernel/drivers/cpufreq/powernow-k7.ko
+#lib/modules/KVER-ipfire/kernel/drivers/cpufreq/powernow-k8.ko
+#lib/modules/KVER-ipfire/kernel/drivers/cpufreq/speedstep-ich.ko
+#lib/modules/KVER-ipfire/kernel/drivers/cpufreq/speedstep-lib.ko
+#lib/modules/KVER-ipfire/kernel/drivers/cpufreq/speedstep-smi.ko
 #lib/modules/KVER-ipfire/kernel/drivers/crypto
 #lib/modules/KVER-ipfire/kernel/drivers/crypto/geode-aes.ko
 #lib/modules/KVER-ipfire/kernel/drivers/crypto/hifn_795x.ko
@@ -2663,6 +2678,7 @@ lib/modules/KVER-ipfire
 #lib/modules/KVER-ipfire/kernel/net/sched/sch_mqprio.ko
 #lib/modules/KVER-ipfire/kernel/net/sched/sch_multiq.ko
 #lib/modules/KVER-ipfire/kernel/net/sched/sch_netem.ko
+#lib/modules/KVER-ipfire/kernel/net/sched/sch_pie.ko
 #lib/modules/KVER-ipfire/kernel/net/sched/sch_plug.ko
 #lib/modules/KVER-ipfire/kernel/net/sched/sch_prio.ko
 #lib/modules/KVER-ipfire/kernel/net/sched/sch_qfq.ko
index 0c43b88be008a70aed3b4cc098ce0e5231b99de9..89cf5c844921b5230a663d6518381db95779498b 100644 (file)
@@ -1,6 +1,6 @@
 #sbin/extlinux
 #usr/bin/gethostip
-#usr/bin/isohybrid
+usr/bin/isohybrid
 #usr/bin/isohybrid.pl
 #usr/bin/keytab-lilo
 #usr/bin/lss16toppm
diff --git a/config/rootfiles/common/inetutils b/config/rootfiles/common/inetutils
deleted file mode 100644 (file)
index fb33fb0..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-bin/ping
-#usr/bin/ftp
-#usr/bin/rcp
-#usr/bin/rlogin
-#usr/bin/rsh
-#usr/bin/talk
-#usr/bin/tftp
-#usr/sbin/ftpd
-#usr/sbin/inetd
-#usr/sbin/rexecd
-#usr/sbin/rlogind
-#usr/sbin/rshd
-#usr/sbin/talkd
-#usr/sbin/tftpd
-#usr/sbin/uucpd
-#usr/share/info/inetutils.info
-#usr/share/info/inetutils.info-1
-#usr/share/info/inetutils.info-2
-#usr/share/info/inetutils.info-3
-#usr/share/man/man1/ftp.1
-#usr/share/man/man1/logger.1
-#usr/share/man/man1/rcp.1
-#usr/share/man/man1/rlogin.1
-#usr/share/man/man1/rsh.1
-#usr/share/man/man1/talk.1
-#usr/share/man/man1/telnet.1
-#usr/share/man/man1/tftp.1
-#usr/share/man/man5/syslog.conf.5
-#usr/share/man/man8/ftpd.8
-#usr/share/man/man8/inetd.8
-#usr/share/man/man8/ping.8
-#usr/share/man/man8/rexecd.8
-#usr/share/man/man8/rlogind.8
-#usr/share/man/man8/rshd.8
-#usr/share/man/man8/syslogd.8
-#usr/share/man/man8/talkd.8
-#usr/share/man/man8/telnetd.8
-#usr/share/man/man8/tftpd.8
index 12bab801dea1f90217ad9b154f6a6db72d5c5c9b..7fb0426750b66e718fbcf4a589513b9d81228480 100644 (file)
@@ -1 +1,2 @@
+bin/ping
 usr/bin/ping
diff --git a/config/rootfiles/common/perl-Device-Modem b/config/rootfiles/common/perl-Device-Modem
new file mode 100644 (file)
index 0000000..9e8da1c
--- /dev/null
@@ -0,0 +1,18 @@
+#usr/lib/perl5/site_perl/5.12.3/Device
+#usr/lib/perl5/site_perl/5.12.3/Device/Modem
+usr/lib/perl5/site_perl/5.12.3/Device/Modem.pm
+#usr/lib/perl5/site_perl/5.12.3/Device/Modem/FAQ.pod
+#usr/lib/perl5/site_perl/5.12.3/Device/Modem/Log
+usr/lib/perl5/site_perl/5.12.3/Device/Modem/Log/File.pm
+usr/lib/perl5/site_perl/5.12.3/Device/Modem/Log/Syslog.pm
+#usr/lib/perl5/site_perl/5.12.3/Device/Modem/Protocol
+usr/lib/perl5/site_perl/5.12.3/Device/Modem/Protocol/Xmodem.pm
+usr/lib/perl5/site_perl/5.12.3/Device/Modem/UsRobotics.pm
+#usr/lib/perl5/site_perl/5.12.3/MACHINE-linux-thread-multi/auto/Device/Modem
+#usr/lib/perl5/site_perl/5.12.3/MACHINE-linux-thread-multi/auto/Device/Modem/.packlist
+#usr/share/man/man3/Device::Modem.3
+#usr/share/man/man3/Device::Modem::FAQ.3
+#usr/share/man/man3/Device::Modem::Log::File.3
+#usr/share/man/man3/Device::Modem::Log::Syslog.3
+#usr/share/man/man3/Device::Modem::Protocol::Xmodem.3
+#usr/share/man/man3/Device::Modem::UsRobotics.3
diff --git a/config/rootfiles/common/perl-Device-SerialPort b/config/rootfiles/common/perl-Device-SerialPort
new file mode 100644 (file)
index 0000000..dccc425
--- /dev/null
@@ -0,0 +1,10 @@
+#usr/bin/modemtest
+usr/lib/perl5/site_perl/5.12.3/MACHINE-linux-thread-multi/Device
+usr/lib/perl5/site_perl/5.12.3/MACHINE-linux-thread-multi/Device/SerialPort.pm
+#usr/lib/perl5/site_perl/5.12.3/MACHINE-linux-thread-multi/auto/Device
+#usr/lib/perl5/site_perl/5.12.3/MACHINE-linux-thread-multi/auto/Device/SerialPort
+#usr/lib/perl5/site_perl/5.12.3/MACHINE-linux-thread-multi/auto/Device/SerialPort/.packlist
+#usr/lib/perl5/site_perl/5.12.3/MACHINE-linux-thread-multi/auto/Device/SerialPort/SerialPort.bs
+usr/lib/perl5/site_perl/5.12.3/MACHINE-linux-thread-multi/auto/Device/SerialPort/SerialPort.so
+#usr/share/man/man1/modemtest.1
+#usr/share/man/man3/Device::SerialPort.3
index 60e6f5b0806a81b8272851f83760d7bdff2d36fd..709e0d0e06498a40042b73e7ff269764d9e671b4 100644 (file)
@@ -14,8 +14,10 @@ etc/ppp/standardloginscript
 #usr/include/pppd/chap_ms.h
 #usr/include/pppd/eap.h
 #usr/include/pppd/ecp.h
+#usr/include/pppd/eui64.h
 #usr/include/pppd/fsm.h
 #usr/include/pppd/ipcp.h
+#usr/include/pppd/ipv6cp.h
 #usr/include/pppd/ipxcp.h
 #usr/include/pppd/lcp.h
 #usr/include/pppd/magic.h
@@ -31,18 +33,18 @@ etc/ppp/standardloginscript
 #usr/include/pppd/tdb.h
 #usr/include/pppd/upap.h
 usr/lib/pppd
-usr/lib/pppd/2.4.5
-usr/lib/pppd/2.4.5/minconn.so
-usr/lib/pppd/2.4.5/openl2tp.so
-usr/lib/pppd/2.4.5/passprompt.so
-usr/lib/pppd/2.4.5/passwordfd.so
-usr/lib/pppd/2.4.5/pppoatm.so
-usr/lib/pppd/2.4.5/pppol2tp.so
-usr/lib/pppd/2.4.5/radattr.so
-usr/lib/pppd/2.4.5/radius.so
-usr/lib/pppd/2.4.5/radrealms.so
-usr/lib/pppd/2.4.5/rp-pppoe.so
-usr/lib/pppd/2.4.5/winbind.so
+usr/lib/pppd/2.4.6
+usr/lib/pppd/2.4.6/minconn.so
+usr/lib/pppd/2.4.6/openl2tp.so
+usr/lib/pppd/2.4.6/passprompt.so
+usr/lib/pppd/2.4.6/passwordfd.so
+usr/lib/pppd/2.4.6/pppoatm.so
+usr/lib/pppd/2.4.6/pppol2tp.so
+usr/lib/pppd/2.4.6/radattr.so
+usr/lib/pppd/2.4.6/radius.so
+usr/lib/pppd/2.4.6/radrealms.so
+usr/lib/pppd/2.4.6/rp-pppoe.so
+usr/lib/pppd/2.4.6/winbind.so
 usr/sbin/chat
 usr/sbin/pppd
 usr/sbin/pppdump
index e35838d03529277de64107427bf41a128a08e17f..706c5f8523ab72090771ccb169e8ee046f90802c 100644 (file)
@@ -30,7 +30,6 @@ usr/bin/u2spewfoo
 #usr/include/snort/dynamic_preproc/bitop.h
 #usr/include/snort/dynamic_preproc/cpuclock.h
 #usr/include/snort/dynamic_preproc/file_api.h
-#usr/include/snort/dynamic_preproc/file_lib.h
 #usr/include/snort/dynamic_preproc/idle_processing.h
 #usr/include/snort/dynamic_preproc/ipv6_port.h
 #usr/include/snort/dynamic_preproc/mempool.h
@@ -180,11 +179,14 @@ usr/sbin/snort
 #usr/share/doc/snort/README.dnp3
 #usr/share/doc/snort/README.dns
 #usr/share/doc/snort/README.event_queue
+#usr/share/doc/snort/README.file
+#usr/share/doc/snort/README.file_ips
 #usr/share/doc/snort/README.filters
 #usr/share/doc/snort/README.flowbits
 #usr/share/doc/snort/README.frag3
 #usr/share/doc/snort/README.ftptelnet
 #usr/share/doc/snort/README.gre
+#usr/share/doc/snort/README.ha
 #usr/share/doc/snort/README.http_inspect
 #usr/share/doc/snort/README.imap
 #usr/share/doc/snort/README.ipip
index 9515dc3a0088008c7f4aa1a1defea0a94a0d8608..76abbe8516bf6fdce0e1fe1bcc702e0be92ad719 100644 (file)
@@ -34,7 +34,7 @@ usr/lib/squid/basic_smb_auth
 usr/lib/squid/basic_smb_auth.sh
 #usr/lib/squid/cachemgr.cgi
 usr/lib/squid/cert_tool
-usr/lib/squid/digest_edirectory_auth
+usr/lib/squid/cert_valid.pl
 usr/lib/squid/digest_file_auth
 usr/lib/squid/digest_ldap_auth
 usr/lib/squid/diskd
@@ -1374,6 +1374,7 @@ usr/lib/squid/errors/pl/error-details.txt
 #usr/lib/squid/errors/pt-br/ERR_WRITE_ERROR
 #usr/lib/squid/errors/pt-br/ERR_ZERO_SIZE_OBJECT
 #usr/lib/squid/errors/pt-br/error-details.txt
+#usr/lib/squid/errors/pt-bz
 #usr/lib/squid/errors/pt-pt
 #usr/lib/squid/errors/pt/ERR_ACCESS_DENIED
 #usr/lib/squid/errors/pt/ERR_ACL_TIME_QUOTA_EXCEEDED
@@ -2148,6 +2149,7 @@ usr/lib/squid/mib.txt
 usr/lib/squid/negotiate_wrapper_auth
 usr/lib/squid/ntlm_fake_auth
 usr/lib/squid/ntlm_smb_lm_auth
+usr/lib/squid/storeid_file_rewrite
 usr/lib/squid/unlinkd
 usr/lib/squid/url_fake_rewrite
 usr/lib/squid/url_fake_rewrite.sh
@@ -2173,6 +2175,7 @@ usr/sbin/updxlrator
 #usr/share/man/man8/ext_wbinfo_group_acl.8
 #usr/share/man/man8/log_db_daemon.8
 #usr/share/man/man8/squid.8
+#usr/share/man/man8/storeid_file_rewrite.8
 #var/cache/squid
 var/ipfire/proxy/errorpage-ipfire.css
 var/ipfire/proxy/errorpage-squid.css
@@ -2190,4 +2193,3 @@ var/log/cache
 var/log/squid/access.log
 var/log/updatexlrator
 #var/logs
-#var/run/squid
index 57c54dbef6d63c5c189eb2577091ce0e6567beb1..faabf47e8ae2041df0c94028574718e7cd46f1f8 100644 (file)
@@ -2,5 +2,10 @@
 #etc/cron.d/vnstat
 etc/vnstat.conf
 usr/bin/vnstat
+usr/bin/vnstati
+#usr/sbin/vnstatd
+#usr/share/man/man5/vnstat.conf.5
+#usr/share/man/man1/vnstatd.1
+#usr/share/man/man1/vnstati.1
 #usr/share/man/man1/vnstat.1
 #var/lib/vnstat
diff --git a/config/rootfiles/common/vnstati b/config/rootfiles/common/vnstati
deleted file mode 100644 (file)
index a40fc8c..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-usr/bin/vnstati
-#usr/share/man/man1/vnstati.1.gz
diff --git a/config/rootfiles/core/78/exclude b/config/rootfiles/core/78/exclude
new file mode 100644 (file)
index 0000000..18e9b4d
--- /dev/null
@@ -0,0 +1,20 @@
+boot/config.txt
+etc/collectd.custom
+etc/ipsec.conf
+etc/ipsec.secrets
+etc/ipsec.user.conf
+etc/ipsec.user.secrets
+etc/localtime
+etc/shadow
+etc/ssh/ssh_config
+etc/ssh/sshd_config
+etc/ssl/openssl.cnf
+etc/sudoers
+etc/sysconfig/firewall.local
+etc/sysconfig/rc.local
+etc/udev/rules.d/30-persistent-network.rules
+srv/web/ipfire/html/proxy.pac
+var/ipfire/ovpn
+var/log/cache
+var/state/dhcp/dhcpd.leases
+var/updatecache
diff --git a/config/rootfiles/core/78/filelists/armv5tel/linux-kirkwood b/config/rootfiles/core/78/filelists/armv5tel/linux-kirkwood
new file mode 120000 (symlink)
index 0000000..7217107
--- /dev/null
@@ -0,0 +1 @@
+../../../../common/armv5tel/linux-kirkwood
\ No newline at end of file
diff --git a/config/rootfiles/core/78/filelists/armv5tel/linux-multi b/config/rootfiles/core/78/filelists/armv5tel/linux-multi
new file mode 120000 (symlink)
index 0000000..204eb4c
--- /dev/null
@@ -0,0 +1 @@
+../../../../common/armv5tel/linux-multi
\ No newline at end of file
diff --git a/config/rootfiles/core/78/filelists/armv5tel/linux-rpi b/config/rootfiles/core/78/filelists/armv5tel/linux-rpi
new file mode 120000 (symlink)
index 0000000..a651a49
--- /dev/null
@@ -0,0 +1 @@
+../../../../common/armv5tel/linux-rpi
\ No newline at end of file
diff --git a/config/rootfiles/core/78/filelists/daq b/config/rootfiles/core/78/filelists/daq
new file mode 120000 (symlink)
index 0000000..d0e0956
--- /dev/null
@@ -0,0 +1 @@
+../../../common/daq
\ No newline at end of file
diff --git a/config/rootfiles/core/78/filelists/files b/config/rootfiles/core/78/filelists/files
new file mode 100644 (file)
index 0000000..6b9f795
--- /dev/null
@@ -0,0 +1,17 @@
+etc/system-release
+etc/issue
+etc/rc.d/init.d/sshd
+srv/web/ipfire/cgi-bin/ddns.cgi
+srv/web/ipfire/cgi-bin/ids.cgi
+srv/web/ipfire/cgi-bin/logs.cgi/firewalllogcountry.dat
+srv/web/ipfire/cgi-bin/logs.cgi/showrequestfromcountry.dat
+srv/web/ipfire/cgi-bin/modem-status.cgi
+srv/web/ipfire/cgi-bin/ovpnmain.cgi
+srv/web/ipfire/cgi-bin/proxy.cgi
+srv/web/ipfire/html/themes/ipfire/include/functions.pl
+usr/local/bin/setddns.pl
+var/ipfire/langs
+var/ipfire/menu.d/20-status.menu
+var/ipfire/menu.d/70-log.menu
+var/ipfire/modem-lib.pl
+var/ipfire/ovpn/openssl/ovpn.cnf
diff --git a/config/rootfiles/core/78/filelists/i586/grub b/config/rootfiles/core/78/filelists/i586/grub
new file mode 120000 (symlink)
index 0000000..feb236a
--- /dev/null
@@ -0,0 +1 @@
+../../../../common/i586/grub
\ No newline at end of file
diff --git a/config/rootfiles/core/78/filelists/i586/linux b/config/rootfiles/core/78/filelists/i586/linux
new file mode 120000 (symlink)
index 0000000..693ec4b
--- /dev/null
@@ -0,0 +1 @@
+../../../../common/i586/linux
\ No newline at end of file
diff --git a/config/rootfiles/core/78/filelists/i586/syslinux b/config/rootfiles/core/78/filelists/i586/syslinux
new file mode 120000 (symlink)
index 0000000..74a776d
--- /dev/null
@@ -0,0 +1 @@
+../../../../common/i586/syslinux
\ No newline at end of file
diff --git a/config/rootfiles/core/78/filelists/openvpn b/config/rootfiles/core/78/filelists/openvpn
new file mode 120000 (symlink)
index 0000000..493f3f7
--- /dev/null
@@ -0,0 +1 @@
+../../../common/openvpn
\ No newline at end of file
diff --git a/config/rootfiles/core/78/filelists/ppp b/config/rootfiles/core/78/filelists/ppp
new file mode 120000 (symlink)
index 0000000..4844a9b
--- /dev/null
@@ -0,0 +1 @@
+../../../common/ppp
\ No newline at end of file
diff --git a/config/rootfiles/core/78/filelists/snort b/config/rootfiles/core/78/filelists/snort
new file mode 120000 (symlink)
index 0000000..9406ce0
--- /dev/null
@@ -0,0 +1 @@
+../../../common/snort
\ No newline at end of file
diff --git a/config/rootfiles/core/78/filelists/squid b/config/rootfiles/core/78/filelists/squid
new file mode 120000 (symlink)
index 0000000..2dc8372
--- /dev/null
@@ -0,0 +1 @@
+../../../common/squid
\ No newline at end of file
diff --git a/config/rootfiles/core/78/filelists/vnstat b/config/rootfiles/core/78/filelists/vnstat
new file mode 120000 (symlink)
index 0000000..2e2e610
--- /dev/null
@@ -0,0 +1 @@
+../../../common/vnstat
\ No newline at end of file
diff --git a/config/rootfiles/core/78/meta b/config/rootfiles/core/78/meta
new file mode 100644 (file)
index 0000000..d547fa8
--- /dev/null
@@ -0,0 +1 @@
+DEPS=""
diff --git a/config/rootfiles/core/78/update.sh b/config/rootfiles/core/78/update.sh
new file mode 100644 (file)
index 0000000..cb9af9f
--- /dev/null
@@ -0,0 +1,292 @@
+#!/bin/bash
+############################################################################
+#                                                                          #
+# This file is part of the IPFire Firewall.                                #
+#                                                                          #
+# IPFire 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 3 of the License, or        #
+# (at your option) any later version.                                      #
+#                                                                          #
+# IPFire is distributed in the hope that it will be useful,                #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of           #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            #
+# GNU General Public License for more details.                             #
+#                                                                          #
+# You should have received a copy of the GNU General Public License        #
+# along with IPFire; if not, write to the Free Software                    #
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA #
+#                                                                          #
+# Copyright (C) 2014 IPFire-Team <info@ipfire.org>.                        #
+#                                                                          #
+############################################################################
+#
+. /opt/pakfire/lib/functions.sh
+/usr/local/bin/backupctrl exclude >/dev/null 2>&1
+
+function add_to_backup ()
+{
+       # Add path to ROOTFILES but remove old entries to prevent double
+       # files in the tar
+       grep -v "^$1" /opt/pakfire/tmp/ROOTFILES > /opt/pakfire/tmp/ROOTFILES.tmp
+       mv /opt/pakfire/tmp/ROOTFILES.tmp /opt/pakfire/tmp/ROOTFILES
+       echo $1 >> /opt/pakfire/tmp/ROOTFILES
+}
+
+#
+# Remove old core updates from pakfire cache to save space...
+core=78
+for (( i=1; i<=${core}; i++ ))
+do
+       rm -f /var/cache/pakfire/core-upgrade-*-$i.ipfire
+done
+
+#
+# Do some sanity checks.
+case $(uname -r) in
+       *-ipfire-versatile )
+               /usr/bin/logger -p syslog.emerg -t ipfire \
+                       "core-update-${core}: ERROR cannot update. versatile support is dropped."
+               # Report no error to pakfire. So it does not try to install it again.
+               exit 0
+               ;;
+       *-ipfire-xen )
+               BOOTSIZE=`df /boot -Pk | sed "s| * | |g" | cut -d" " -f2 | tail -n 1`
+               if [ $BOOTSIZE -lt 28000 ]; then
+                       /usr/bin/logger -p syslog.emerg -t ipfire \
+                               "core-update-${core}: ERROR cannot update because not enough space on boot."
+                       exit 2
+               fi
+               ;;
+       *-ipfire* )
+               # Ok.
+               ;;
+       * )
+               /usr/bin/logger -p syslog.emerg -t ipfire \
+                       "core-update-${core}: ERROR cannot update. No IPFire Kernel."
+               exit 1
+       ;;
+esac
+
+
+#
+#
+KVER="xxxKVERxxx"
+MOUNT=`grep "kernel" /boot/grub/grub.conf 2>/dev/null | tail -n 1 `
+# Nur den letzten Parameter verwenden
+echo $MOUNT > /dev/null
+MOUNT=$_
+if [ ! $MOUNT == "rw" ]; then
+       MOUNT="ro"
+fi
+
+#
+# check if we the backup file already exist
+if [ -e /var/ipfire/backup/core-upgrade${core}_${KVER}.tar.xz ]; then
+    echo Moving backup to backup-old ...
+    mv -f /var/ipfire/backup/core-upgrade${core}_${KVER}.tar.xz \
+       /var/ipfire/backup/core-upgrade${core}_${KVER}-old.tar.xz
+fi
+echo First we made a backup of all files that was inside of the
+echo update archive. This may take a while ...
+# Add some files that are not in the package to backup
+add_to_backup lib/modules
+add_to_backup boot
+
+# Backup the files
+tar cJvf /var/ipfire/backup/core-upgrade${core}_${KVER}.tar.xz \
+    -C / -T /opt/pakfire/tmp/ROOTFILES --exclude='#*' --exclude='/var/cache' > /dev/null 2>&1
+
+# Check diskspace on root
+ROOTSPACE=`df / -Pk | sed "s| * | |g" | cut -d" " -f4 | tail -n 1`
+
+if [ $ROOTSPACE -lt 100000 ]; then
+       /usr/bin/logger -p syslog.emerg -t ipfire \
+               "core-update-${core}: ERROR cannot update because not enough free space on root."
+       exit 2
+fi
+
+
+echo
+echo Update Kernel to $KVER ...
+#
+# Remove old kernel, configs, initrd, modules ...
+#
+rm -rf /boot/System.map-*
+rm -rf /boot/config-*
+rm -rf /boot/ipfirerd-*
+rm -rf /boot/vmlinuz-*
+rm -rf /boot/uImage-ipfire-*
+rm -rf /boot/uInit-ipfire-*
+rm -rf /lib/modules
+
+case $(uname -m) in
+       i?86 )
+               #
+               # Backup grub.conf
+               #
+               cp -vf /boot/grub/grub.conf /boot/grub/grub.conf.org
+       ;;
+esac
+#
+#Stop services
+/etc/init.d/snort stop
+/etc/init.d/squid stop
+/etc/init.d/ipsec stop
+/etc/init.d/apache stop
+
+# rename /etc/modprobe.d files
+for i in $(find /etc/modprobe.d/* | grep -v ".conf"); do
+       mv $i $i.conf
+done
+
+#
+#Extract files
+tar xavf /opt/pakfire/tmp/files* --no-overwrite-dir -p --numeric-owner -C /
+
+# Check diskspace on boot
+BOOTSPACE=`df /boot -Pk | sed "s| * | |g" | cut -d" " -f4 | tail -n 1`
+
+if [ $BOOTSPACE -lt 1000 ]; then
+       case $(uname -r) in
+               *-ipfire-kirkwood )
+                       # Special handling for old kirkwood images.
+                       # (install only kirkwood kernel)
+                       rm -rf /boot/*
+                       tar xavf /opt/pakfire/tmp/files* --no-overwrite-dir -p \
+                               --numeric-owner -C / --wildcards 'boot/*-kirkwood*'
+                       ;;
+               * )
+                       /usr/bin/logger -p syslog.emerg -t ipfire \
+                               "core-update-${core}: FATAL-ERROR space run out on boot. System is not bootable..."
+                       /etc/init.d/apache start
+                       exit 4
+                       ;;
+       esac
+fi
+
+
+# Update Language cache
+perl -e "require '/var/ipfire/lang.pl'; &Lang::BuildCacheLang"
+
+#
+# Start services
+#
+/etc/init.d/apache start
+/etc/init.d/squid start
+/etc/init.d/snort start
+if [ `grep "ENABLED=on" /var/ipfire/vpn/settings` ]; then
+       /etc/init.d/ipsec start
+fi
+
+case $(uname -m) in
+       i?86 )
+               #
+               # Modify grub.conf
+               #
+               echo
+               echo Update grub configuration ...
+               ROOT=`mount | grep " / " | cut -d" " -f1`
+
+               if [ ! -z $ROOT ]; then
+                       ROOTUUID=`blkid -c /dev/null -sUUID $ROOT | cut -d'"' -f2`
+               fi
+
+               if [ ! -z $ROOTUUID ]; then
+                       sed -i "s|ROOT|UUID=$ROOTUUID|g" /boot/grub/grub.conf
+               else
+                       sed -i "s|ROOT|$ROOT|g" /boot/grub/grub.conf
+               fi
+               sed -i "s|KVER|$KVER|g" /boot/grub/grub.conf
+               sed -i "s|MOUNT|$MOUNT|g" /boot/grub/grub.conf
+
+               if [ "$(grep "^serial" /boot/grub/grub.conf.org)" == "" ]; then
+                       echo "grub use default console ..."
+               else
+                       echo "grub use serial console ..."
+                       sed -i -e "s|splashimage|#splashimage|g" /boot/grub/grub.conf
+                       sed -i -e "s|#serial|serial|g" /boot/grub/grub.conf
+                       sed -i -e "s|#terminal|terminal|g" /boot/grub/grub.conf
+                       sed -i -e "s| panic=10 | console=ttyS0,115200n8 panic=10 |g" /boot/grub/grub.conf
+               fi
+
+               #
+               # ReInstall grub
+               #
+                       echo "(hd0) ${ROOT::`expr length $ROOT`-1}" > /boot/grub/device.map
+                       grub-install --no-floppy ${ROOT::`expr length $ROOT`-1}
+       ;;
+esac
+
+
+# Force (re)install pae kernel if pae is supported
+rm -rf /opt/pakfire/db/*/meta-linux-pae
+if [ ! "$(grep "^flags.* pae " /proc/cpuinfo)" == "" ]; then
+       ROOTSPACE=`df / -Pk | sed "s| * | |g" | cut -d" " -f4 | tail -n 1`
+       BOOTSPACE=`df /boot -Pk | sed "s| * | |g" | cut -d" " -f4 | tail -n 1`
+       if [ $BOOTSPACE -lt 12000 -o $ROOTSPACE -lt 90000 ]; then
+               /usr/bin/logger -p syslog.emerg -t ipfire \
+                       "core-update-${core}: WARNING not enough space for pae kernel."
+       else
+               echo "Name: linux-pae" > /opt/pakfire/db/installed/meta-linux-pae
+               echo "ProgVersion: 0" >> /opt/pakfire/db/installed/meta-linux-pae
+               echo "Release: 0"     >> /opt/pakfire/db/installed/meta-linux-pae
+               echo "Name: linux-pae" > /opt/pakfire/db/meta/meta-linux-pae
+               echo "ProgVersion: 0" >> /opt/pakfire/db/meta/meta-linux-pae
+               echo "Release: 0"     >> /opt/pakfire/db/meta/meta-linux-pae
+       fi
+fi
+
+# Force reinstall xen kernel if it was installed
+if [ -e "/opt/pakfire/db/installed/meta-linux-xen" ]; then
+       echo "Name: linux-xen" > /opt/pakfire/db/installed/meta-linux-xen
+       echo "ProgVersion: 0" >> /opt/pakfire/db/installed/meta-linux-xen
+       echo "Release: 0"     >> /opt/pakfire/db/installed/meta-linux-xen
+       echo "Name: linux-xen" > /opt/pakfire/db/meta/meta-linux-xen
+       echo "ProgVersion: 0" >> /opt/pakfire/db/meta/meta-linux-xen
+       echo "Release: 0"     >> /opt/pakfire/db/meta/meta-linux-xen
+       # Add xvc0 to /etc/securetty
+       echo "xvc0" >> /etc/securetty
+fi
+
+#
+# After pakfire has ended run it again and update the lists and do upgrade
+#
+echo '#!/bin/bash'                                        >  /tmp/pak_update
+echo 'while [ "$(ps -A | grep " update.sh")" != "" ]; do' >> /tmp/pak_update
+echo '    sleep 1'                                        >> /tmp/pak_update
+echo 'done'                                               >> /tmp/pak_update
+echo 'while [ "$(ps -A | grep " pakfire")" != "" ]; do'   >> /tmp/pak_update
+echo '    sleep 1'                                        >> /tmp/pak_update
+echo 'done'                                               >> /tmp/pak_update
+echo '/opt/pakfire/pakfire update -y --force'             >> /tmp/pak_update
+echo '/opt/pakfire/pakfire upgrade -y'                    >> /tmp/pak_update
+echo '/opt/pakfire/pakfire upgrade -y'                    >> /tmp/pak_update
+echo '/opt/pakfire/pakfire upgrade -y'                    >> /tmp/pak_update
+echo '/usr/bin/logger -p syslog.emerg -t ipfire "Core-upgrade finished. If you use a customized grub.cfg"' >> /tmp/pak_update
+echo '/usr/bin/logger -p syslog.emerg -t ipfire "Check it before reboot !!!"' >> /tmp/pak_update
+echo '/usr/bin/logger -p syslog.emerg -t ipfire " *** Please reboot... *** "' >> /tmp/pak_update
+echo 'touch /var/run/need_reboot ' >> /tmp/pak_update
+#
+killall -KILL pak_update
+chmod +x /tmp/pak_update
+/tmp/pak_update &
+
+sync
+
+#
+#Finish
+(
+       /etc/init.d/fireinfo start
+       sendprofile
+) >/dev/null 2>&1 &
+
+# Update Package list for addon installation
+/opt/pakfire/pakfire update -y --force
+
+echo
+echo Please wait until pakfire has ended...
+echo
+#Don't report the exitcode last command
+exit 0
+
index 2807f77c38a41e7e9a517048bb3ee54452a98e23..de0e2c7734cff2422acc7829bca0ced7ea7a4104 100644 (file)
@@ -1,5 +1,7 @@
 etc/fcron.cyclic/cacti.cron
 etc/httpd/conf/vhosts.d/cacti.conf
+#etc/logrotate.d
+etc/logrotate.d/cacti
 #usr/share/cacti
 #usr/share/cacti/LICENSE
 #usr/share/cacti/README
@@ -27,6 +29,7 @@ usr/share/cacti/cli/poller_graphs_reapply_names.php
 usr/share/cacti/cli/poller_output_empty.php
 usr/share/cacti/cli/poller_reindex_hosts.php
 usr/share/cacti/cli/rebuild_poller_cache.php
+usr/share/cacti/cli/reorder_data_query.php
 usr/share/cacti/cli/repair_database.php
 usr/share/cacti/cli/repair_templates.php
 usr/share/cacti/cli/structure_rra_paths.php
@@ -191,12 +194,17 @@ usr/share/cacti/images/cacti_logo.gif
 usr/share/cacti/images/calendar.gif
 usr/share/cacti/images/delete_icon.gif
 usr/share/cacti/images/delete_icon_large.gif
+usr/share/cacti/images/disable_icon.png
+usr/share/cacti/images/enable_icon.png
+usr/share/cacti/images/enable_icon_disabled.png
 usr/share/cacti/images/favicon.ico
 usr/share/cacti/images/graph_page_top.gif
 usr/share/cacti/images/graph_properties.gif
 usr/share/cacti/images/graph_query.png
 usr/share/cacti/images/graph_zoom.gif
 usr/share/cacti/images/hide.gif
+usr/share/cacti/images/install_icon.png
+usr/share/cacti/images/install_icon_disabled.png
 usr/share/cacti/images/left_border.gif
 usr/share/cacti/images/menu_line.gif
 usr/share/cacti/images/menuarrow.gif
@@ -222,6 +230,8 @@ usr/share/cacti/images/tab_mode_tree_down.gif
 usr/share/cacti/images/tab_settings.gif
 usr/share/cacti/images/tab_settings_down.gif
 usr/share/cacti/images/transparent_line.gif
+usr/share/cacti/images/uninstall_icon.gif
+usr/share/cacti/images/view_none.gif
 #usr/share/cacti/include
 usr/share/cacti/include/auth.php
 usr/share/cacti/include/bottom_footer.php
@@ -231,10 +241,28 @@ usr/share/cacti/include/global_arrays.php
 usr/share/cacti/include/global_constants.php
 usr/share/cacti/include/global_form.php
 usr/share/cacti/include/global_settings.php
-#usr/share/cacti/include/jscalendar
+usr/share/cacti/include/js
+usr/share/cacti/include/js/jquery
+usr/share/cacti/include/js/jquery/colorpicker.js
+usr/share/cacti/include/js/jquery/jquery-ui.js
+usr/share/cacti/include/js/jquery/jquery.cookie.js
+usr/share/cacti/include/js/jquery/jquery.dd.js
+usr/share/cacti/include/js/jquery/jquery.dropdown.js
+usr/share/cacti/include/js/jquery/jquery.js
+usr/share/cacti/include/js/jquery/jquery.jstree.js
+usr/share/cacti/include/js/jquery/jquery.tablednd.js
+usr/share/cacti/include/js/jquery/jquery.timepicker.js
+usr/share/cacti/include/js/jquery/jquery.zoom.js
+usr/share/cacti/include/js/jquery/themes
+usr/share/cacti/include/js/jquery/themes/default
+usr/share/cacti/include/js/jquery/themes/default/d.gif
+usr/share/cacti/include/js/jquery/themes/default/d.png
+usr/share/cacti/include/js/jquery/themes/default/style.css
+usr/share/cacti/include/js/jquery/themes/default/throbber.gif
+usr/share/cacti/include/jscalendar
 usr/share/cacti/include/jscalendar/calendar-setup.js
 usr/share/cacti/include/jscalendar/calendar.js
-#usr/share/cacti/include/jscalendar/lang
+usr/share/cacti/include/jscalendar/lang
 usr/share/cacti/include/jscalendar/lang/calendar-af.js
 usr/share/cacti/include/jscalendar/lang/calendar-al.js
 usr/share/cacti/include/jscalendar/lang/calendar-bg.js
@@ -280,20 +308,9 @@ usr/share/cacti/include/jscalendar/lang/calendar-zh.js
 usr/share/cacti/include/jscalendar/lang/cn_utf8.js
 usr/share/cacti/include/layout.js
 usr/share/cacti/include/main.css
+usr/share/cacti/include/plugins.php
 usr/share/cacti/include/top_graph_header.php
 usr/share/cacti/include/top_header.php
-#usr/share/cacti/include/treeview
-usr/share/cacti/include/treeview/ftiens4.js
-usr/share/cacti/include/treeview/ftiens4_export.js
-usr/share/cacti/include/treeview/ftv2blank.gif
-usr/share/cacti/include/treeview/ftv2lastnode.gif
-usr/share/cacti/include/treeview/ftv2mlastnode.gif
-usr/share/cacti/include/treeview/ftv2mnode.gif
-usr/share/cacti/include/treeview/ftv2node.gif
-usr/share/cacti/include/treeview/ftv2plastnode.gif
-usr/share/cacti/include/treeview/ftv2pnode.gif
-usr/share/cacti/include/treeview/ftv2vertline.gif
-usr/share/cacti/include/treeview/ua.js
 usr/share/cacti/include/zoom.js
 usr/share/cacti/index.php
 #usr/share/cacti/install
@@ -318,6 +335,10 @@ usr/share/cacti/install/0_8_7d_to_0_8_7e.php
 usr/share/cacti/install/0_8_7e_to_0_8_7f.php
 usr/share/cacti/install/0_8_7f_to_0_8_7g.php
 usr/share/cacti/install/0_8_7g_to_0_8_7h.php
+usr/share/cacti/install/0_8_7h_to_0_8_7i.php
+usr/share/cacti/install/0_8_7i_to_0_8_8.php
+usr/share/cacti/install/0_8_8_to_0_8_8a.php
+usr/share/cacti/install/0_8_8_to_0_8_8b.php
 usr/share/cacti/install/0_8_to_0_8_1.php
 usr/share/cacti/install/index.php
 usr/share/cacti/install/install_finish.gif
@@ -338,7 +359,7 @@ usr/share/cacti/lib/adodb/adodb-php4.inc.php
 usr/share/cacti/lib/adodb/adodb-time.inc.php
 usr/share/cacti/lib/adodb/adodb-xmlschema.inc.php
 usr/share/cacti/lib/adodb/adodb.inc.php
-#usr/share/cacti/lib/adodb/datadict
+usr/share/cacti/lib/adodb/datadict
 usr/share/cacti/lib/adodb/datadict/datadict-access.inc.php
 usr/share/cacti/lib/adodb/datadict/datadict-db2.inc.php
 usr/share/cacti/lib/adodb/datadict/datadict-firebird.inc.php
@@ -351,7 +372,7 @@ usr/share/cacti/lib/adodb/datadict/datadict-oci8.inc.php
 usr/share/cacti/lib/adodb/datadict/datadict-postgres.inc.php
 usr/share/cacti/lib/adodb/datadict/datadict-sapdb.inc.php
 usr/share/cacti/lib/adodb/datadict/datadict-sybase.inc.php
-#usr/share/cacti/lib/adodb/drivers
+usr/share/cacti/lib/adodb/drivers
 usr/share/cacti/lib/adodb/drivers/adodb-access.inc.php
 usr/share/cacti/lib/adodb/drivers/adodb-ado.inc.php
 usr/share/cacti/lib/adodb/drivers/adodb-ado5.inc.php
@@ -392,7 +413,7 @@ usr/share/cacti/lib/adodb/drivers/adodb-sqlite.inc.php
 usr/share/cacti/lib/adodb/drivers/adodb-sqlitepo.inc.php
 usr/share/cacti/lib/adodb/drivers/adodb-sybase.inc.php
 usr/share/cacti/lib/adodb/drivers/adodb-vfp.inc.php
-#usr/share/cacti/lib/adodb/lang
+usr/share/cacti/lib/adodb/lang
 usr/share/cacti/lib/adodb/lang/adodb-ar.inc.php
 usr/share/cacti/lib/adodb/lang/adodb-bg.inc.php
 usr/share/cacti/lib/adodb/lang/adodb-bgutf8.inc.php
@@ -437,6 +458,7 @@ usr/share/cacti/lib/html_validate.php
 usr/share/cacti/lib/import.php
 usr/share/cacti/lib/ldap.php
 usr/share/cacti/lib/ping.php
+usr/share/cacti/lib/plugins.php
 usr/share/cacti/lib/poller.php
 usr/share/cacti/lib/rrd.php
 usr/share/cacti/lib/snmp.php
@@ -450,6 +472,9 @@ usr/share/cacti/lib/variables.php
 usr/share/cacti/lib/xml.php
 usr/share/cacti/log
 usr/share/cacti/logout.php
+usr/share/cacti/plugins
+usr/share/cacti/plugins.php
+usr/share/cacti/plugins/index.php
 usr/share/cacti/poller.php
 usr/share/cacti/poller_commands.php
 usr/share/cacti/poller_export.php
diff --git a/config/rootfiles/packages/icinga b/config/rootfiles/packages/icinga
new file mode 100644 (file)
index 0000000..74bc4c5
--- /dev/null
@@ -0,0 +1,2370 @@
+etc/httpd/conf/vhosts.d/icinga.conf
+#etc/icinga
+etc/icinga/cgi.cfg
+etc/icinga/cgiauth.cfg
+etc/icinga/conf.d
+etc/icinga/icinga.cfg
+etc/icinga/modules
+etc/icinga/objects
+etc/icinga/objects/commands.cfg
+etc/icinga/objects/contacts.cfg
+etc/icinga/objects/localhost.cfg
+etc/icinga/objects/notifications.cfg
+etc/icinga/objects/printer.cfg
+etc/icinga/objects/switch.cfg
+etc/icinga/objects/templates.cfg
+etc/icinga/objects/timeperiods.cfg
+etc/icinga/objects/windows.cfg
+etc/icinga/resource.cfg
+etc/rc.d/init.d/icinga
+etc/rc.d/rc0.d/K33icinga
+etc/rc.d/rc3.d/S67icinga
+etc/rc.d/rc6.d/K33icinga
+#usr/bin/icinga
+usr/bin/icingastats
+usr/lib/icinga/p1.pl
+#usr/lib/icinga/plugins
+usr/lib/icinga/plugins/check_apt
+usr/lib/icinga/plugins/check_breeze
+usr/lib/icinga/plugins/check_by_ssh
+usr/lib/icinga/plugins/check_clamd
+usr/lib/icinga/plugins/check_cluster
+usr/lib/icinga/plugins/check_dhcp
+usr/lib/icinga/plugins/check_dig
+usr/lib/icinga/plugins/check_disk
+usr/lib/icinga/plugins/check_disk_smb
+usr/lib/icinga/plugins/check_dns
+usr/lib/icinga/plugins/check_dummy
+usr/lib/icinga/plugins/check_file_age
+usr/lib/icinga/plugins/check_flexlm
+usr/lib/icinga/plugins/check_fping
+usr/lib/icinga/plugins/check_ftp
+usr/lib/icinga/plugins/check_hpjd
+usr/lib/icinga/plugins/check_http
+usr/lib/icinga/plugins/check_icmp
+usr/lib/icinga/plugins/check_ide_smart
+usr/lib/icinga/plugins/check_ifoperstatus
+usr/lib/icinga/plugins/check_ifstatus
+usr/lib/icinga/plugins/check_imap
+usr/lib/icinga/plugins/check_ircd
+usr/lib/icinga/plugins/check_jabber
+usr/lib/icinga/plugins/check_ldap
+usr/lib/icinga/plugins/check_ldaps
+usr/lib/icinga/plugins/check_load
+usr/lib/icinga/plugins/check_log
+usr/lib/icinga/plugins/check_mailq
+usr/lib/icinga/plugins/check_mrtg
+usr/lib/icinga/plugins/check_mrtgtraf
+usr/lib/icinga/plugins/check_mysql
+usr/lib/icinga/plugins/check_mysql_query
+usr/lib/icinga/plugins/check_nagios
+usr/lib/icinga/plugins/check_nntp
+usr/lib/icinga/plugins/check_nntps
+usr/lib/icinga/plugins/check_nt
+usr/lib/icinga/plugins/check_ntp
+usr/lib/icinga/plugins/check_ntp_peer
+usr/lib/icinga/plugins/check_ntp_time
+usr/lib/icinga/plugins/check_nwstat
+usr/lib/icinga/plugins/check_oracle
+usr/lib/icinga/plugins/check_overcr
+usr/lib/icinga/plugins/check_ping
+usr/lib/icinga/plugins/check_pop
+usr/lib/icinga/plugins/check_procs
+usr/lib/icinga/plugins/check_real
+usr/lib/icinga/plugins/check_rpc
+usr/lib/icinga/plugins/check_sensors
+usr/lib/icinga/plugins/check_simap
+usr/lib/icinga/plugins/check_smtp
+usr/lib/icinga/plugins/check_snmp
+usr/lib/icinga/plugins/check_spop
+usr/lib/icinga/plugins/check_ssh
+usr/lib/icinga/plugins/check_ssmtp
+usr/lib/icinga/plugins/check_swap
+usr/lib/icinga/plugins/check_tcp
+usr/lib/icinga/plugins/check_time
+usr/lib/icinga/plugins/check_udp
+usr/lib/icinga/plugins/check_ups
+usr/lib/icinga/plugins/check_uptime
+usr/lib/icinga/plugins/check_users
+usr/lib/icinga/plugins/check_wave
+usr/lib/icinga/plugins/eventhandlers
+usr/lib/icinga/plugins/eventhandlers/disable_active_service_checks
+usr/lib/icinga/plugins/eventhandlers/disable_notifications
+usr/lib/icinga/plugins/eventhandlers/distributed-monitoring
+usr/lib/icinga/plugins/eventhandlers/distributed-monitoring/obsessive_svc_handler
+usr/lib/icinga/plugins/eventhandlers/distributed-monitoring/submit_check_result_via_nsca
+usr/lib/icinga/plugins/eventhandlers/enable_active_service_checks
+usr/lib/icinga/plugins/eventhandlers/enable_notifications
+usr/lib/icinga/plugins/eventhandlers/redundancy-scenario1
+usr/lib/icinga/plugins/eventhandlers/redundancy-scenario1/handle-master-host-event
+usr/lib/icinga/plugins/eventhandlers/redundancy-scenario1/handle-master-proc-event
+usr/lib/icinga/plugins/eventhandlers/submit_check_result
+usr/lib/icinga/plugins/negate
+usr/lib/icinga/plugins/urlize
+usr/lib/icinga/plugins/utils.pm
+usr/lib/icinga/plugins/utils.sh
+usr/share/icinga
+usr/share/icinga/cgi-bin
+usr/share/icinga/cgi-bin/avail.cgi
+usr/share/icinga/cgi-bin/cmd.cgi
+usr/share/icinga/cgi-bin/config.cgi
+usr/share/icinga/cgi-bin/extinfo.cgi
+usr/share/icinga/cgi-bin/histogram.cgi
+usr/share/icinga/cgi-bin/history.cgi
+usr/share/icinga/cgi-bin/notifications.cgi
+usr/share/icinga/cgi-bin/outages.cgi
+usr/share/icinga/cgi-bin/showlog.cgi
+usr/share/icinga/cgi-bin/status.cgi
+usr/share/icinga/cgi-bin/statusmap.cgi
+usr/share/icinga/cgi-bin/summary.cgi
+usr/share/icinga/cgi-bin/tac.cgi
+usr/share/icinga/cgi-bin/trends.cgi
+usr/share/icinga/docs
+usr/share/icinga/docs/de
+usr/share/icinga/docs/de/about.html
+usr/share/icinga/docs/de/activechecks.html
+usr/share/icinga/docs/de/adaptive.html
+usr/share/icinga/docs/de/addons.html
+usr/share/icinga/docs/de/beginners.html
+usr/share/icinga/docs/de/cachedchecks.html
+usr/share/icinga/docs/de/cgiauth.html
+usr/share/icinga/docs/de/cgicmd.html
+usr/share/icinga/docs/de/cgiincludes.html
+usr/share/icinga/docs/de/cgiparams.html
+usr/share/icinga/docs/de/cgis.html
+usr/share/icinga/docs/de/cgisecurity.html
+usr/share/icinga/docs/de/ch01.html
+usr/share/icinga/docs/de/ch02.html
+usr/share/icinga/docs/de/ch03.html
+usr/share/icinga/docs/de/ch04.html
+usr/share/icinga/docs/de/ch05.html
+usr/share/icinga/docs/de/ch06.html
+usr/share/icinga/docs/de/ch07.html
+usr/share/icinga/docs/de/ch08.html
+usr/share/icinga/docs/de/ch09.html
+usr/share/icinga/docs/de/ch10.html
+usr/share/icinga/docs/de/ch11.html
+usr/share/icinga/docs/de/ch12.html
+usr/share/icinga/docs/de/ch13.html
+usr/share/icinga/docs/de/checkscheduling.html
+usr/share/icinga/docs/de/clusters.html
+usr/share/icinga/docs/de/components.html
+usr/share/icinga/docs/de/config.html
+usr/share/icinga/docs/de/configcgi.html
+usr/share/icinga/docs/de/configido.html
+usr/share/icinga/docs/de/configmain.html
+usr/share/icinga/docs/de/configobject.html
+usr/share/icinga/docs/de/customobjectvars.html
+usr/share/icinga/docs/de/db_changes.html
+usr/share/icinga/docs/de/db_intro.html
+usr/share/icinga/docs/de/db_model.html
+usr/share/icinga/docs/de/dependencies.html
+usr/share/icinga/docs/de/dependencychecks.html
+usr/share/icinga/docs/de/distributed.html
+usr/share/icinga/docs/de/downtime.html
+usr/share/icinga/docs/de/embeddedperl.html
+usr/share/icinga/docs/de/epnplugins.html
+usr/share/icinga/docs/de/escalation_condition.html
+usr/share/icinga/docs/de/escalations.html
+usr/share/icinga/docs/de/eventhandlers.html
+usr/share/icinga/docs/de/example-configs.html
+usr/share/icinga/docs/de/extcommands.html
+usr/share/icinga/docs/de/extcommands2.html
+usr/share/icinga/docs/de/faststartup.html
+usr/share/icinga/docs/de/flapping.html
+usr/share/icinga/docs/de/freshness.html
+usr/share/icinga/docs/de/hostchecks.html
+usr/share/icinga/docs/de/howtos.html
+usr/share/icinga/docs/de/icinga-api.html
+usr/share/icinga/docs/de/icinga-web-api.html
+usr/share/icinga/docs/de/icinga-web-config.html
+usr/share/icinga/docs/de/icinga-web-intro.html
+usr/share/icinga/docs/de/icinga-web-introduction.html
+usr/share/icinga/docs/de/icinga-web-pnp.html
+usr/share/icinga/docs/de/icinga-web-scratch.html
+usr/share/icinga/docs/de/icinga-web.html
+usr/share/icinga/docs/de/icinga_packages.html
+usr/share/icinga/docs/de/icingastats.html
+usr/share/icinga/docs/de/index.html
+usr/share/icinga/docs/de/int-mklivestatus.html
+usr/share/icinga/docs/de/int-snmptrap.html
+usr/share/icinga/docs/de/int-tcpwrappers.html
+usr/share/icinga/docs/de/integration.html
+usr/share/icinga/docs/de/ix01.html
+usr/share/icinga/docs/de/largeinstalltweaks.html
+usr/share/icinga/docs/de/macrolist.html
+usr/share/icinga/docs/de/macros.html
+usr/share/icinga/docs/de/modified_attr.html
+usr/share/icinga/docs/de/monitoring-linux.html
+usr/share/icinga/docs/de/monitoring-netware.html
+usr/share/icinga/docs/de/monitoring-overview.html
+usr/share/icinga/docs/de/monitoring-printers.html
+usr/share/icinga/docs/de/monitoring-publicservices.html
+usr/share/icinga/docs/de/monitoring-routers.html
+usr/share/icinga/docs/de/monitoring-windows.html
+usr/share/icinga/docs/de/mrtggraphs.html
+usr/share/icinga/docs/de/networkreachability.html
+usr/share/icinga/docs/de/notifications.html
+usr/share/icinga/docs/de/notifications2.html
+usr/share/icinga/docs/de/nrpe.html
+usr/share/icinga/docs/de/nsca.html
+usr/share/icinga/docs/de/objectdefinitions.html
+usr/share/icinga/docs/de/objectinheritance.html
+usr/share/icinga/docs/de/objecttricks.html
+usr/share/icinga/docs/de/oncallrotation.html
+usr/share/icinga/docs/de/passivechecks.html
+usr/share/icinga/docs/de/passivestatetranslation.html
+usr/share/icinga/docs/de/perfdata.html
+usr/share/icinga/docs/de/perfgraphs.html
+usr/share/icinga/docs/de/pluginapi.html
+usr/share/icinga/docs/de/plugins.html
+usr/share/icinga/docs/de/quickstart-icinga-freebsd.html
+usr/share/icinga/docs/de/quickstart-icinga.html
+usr/share/icinga/docs/de/quickstart-idoutils-freebsd.html
+usr/share/icinga/docs/de/quickstart-idoutils.html
+usr/share/icinga/docs/de/quickstart.html
+usr/share/icinga/docs/de/recurring_downtimes.html
+usr/share/icinga/docs/de/redundancy.html
+usr/share/icinga/docs/de/reporting.html
+usr/share/icinga/docs/de/sample-cgi.html
+usr/share/icinga/docs/de/sample-commands.html
+usr/share/icinga/docs/de/sample-config.html
+usr/share/icinga/docs/de/sample-contacts.html
+usr/share/icinga/docs/de/sample-httpd.html
+usr/share/icinga/docs/de/sample-icinga.html
+usr/share/icinga/docs/de/sample-localhost.html
+usr/share/icinga/docs/de/sample-notifications.html
+usr/share/icinga/docs/de/sample-printer.html
+usr/share/icinga/docs/de/sample-resource.html
+usr/share/icinga/docs/de/sample-switch.html
+usr/share/icinga/docs/de/sample-templates.html
+usr/share/icinga/docs/de/sample-timeperiods.html
+usr/share/icinga/docs/de/sample-windows.html
+usr/share/icinga/docs/de/security.html
+usr/share/icinga/docs/de/servicechecks.html
+usr/share/icinga/docs/de/stalking.html
+usr/share/icinga/docs/de/startstop.html
+usr/share/icinga/docs/de/statetypes.html
+usr/share/icinga/docs/de/temp_data.html
+usr/share/icinga/docs/de/timeperiods.html
+usr/share/icinga/docs/de/tuning.html
+usr/share/icinga/docs/de/upgrading.html
+usr/share/icinga/docs/de/upgrading_icingaweb.html
+usr/share/icinga/docs/de/upgrading_idoutils.html
+usr/share/icinga/docs/de/verifyconfig.html
+usr/share/icinga/docs/de/volatileservices.html
+usr/share/icinga/docs/de/whatsnew.html
+usr/share/icinga/docs/en
+usr/share/icinga/docs/en/about.html
+usr/share/icinga/docs/en/activechecks.html
+usr/share/icinga/docs/en/adaptive.html
+usr/share/icinga/docs/en/addons.html
+usr/share/icinga/docs/en/beginners.html
+usr/share/icinga/docs/en/cachedchecks.html
+usr/share/icinga/docs/en/cgiauth.html
+usr/share/icinga/docs/en/cgicmd.html
+usr/share/icinga/docs/en/cgiincludes.html
+usr/share/icinga/docs/en/cgiparams.html
+usr/share/icinga/docs/en/cgis.html
+usr/share/icinga/docs/en/cgisecurity.html
+usr/share/icinga/docs/en/ch01.html
+usr/share/icinga/docs/en/ch010.html
+usr/share/icinga/docs/en/ch02.html
+usr/share/icinga/docs/en/ch03.html
+usr/share/icinga/docs/en/ch04.html
+usr/share/icinga/docs/en/ch05.html
+usr/share/icinga/docs/en/ch06.html
+usr/share/icinga/docs/en/ch07.html
+usr/share/icinga/docs/en/ch08.html
+usr/share/icinga/docs/en/ch09.html
+usr/share/icinga/docs/en/ch10.html
+usr/share/icinga/docs/en/ch11.html
+usr/share/icinga/docs/en/ch12.html
+usr/share/icinga/docs/en/ch13.html
+usr/share/icinga/docs/en/checkscheduling.html
+usr/share/icinga/docs/en/clusters.html
+usr/share/icinga/docs/en/config.html
+usr/share/icinga/docs/en/configcgi.html
+usr/share/icinga/docs/en/configido.html
+usr/share/icinga/docs/en/configmain.html
+usr/share/icinga/docs/en/configobject.html
+usr/share/icinga/docs/en/customobjectvars.html
+usr/share/icinga/docs/en/db_changes.html
+usr/share/icinga/docs/en/db_components.html
+usr/share/icinga/docs/en/db_example-configs.html
+usr/share/icinga/docs/en/db_intro.html
+usr/share/icinga/docs/en/db_model.html
+usr/share/icinga/docs/en/dependencies.html
+usr/share/icinga/docs/en/dependencychecks.html
+usr/share/icinga/docs/en/distributed.html
+usr/share/icinga/docs/en/downtime.html
+usr/share/icinga/docs/en/embeddedperl.html
+usr/share/icinga/docs/en/epnplugins.html
+usr/share/icinga/docs/en/escalation_condition.html
+usr/share/icinga/docs/en/escalations.html
+usr/share/icinga/docs/en/eventhandlers.html
+usr/share/icinga/docs/en/extcommands.html
+usr/share/icinga/docs/en/extcommands2.html
+usr/share/icinga/docs/en/faststartup.html
+usr/share/icinga/docs/en/flapping.html
+usr/share/icinga/docs/en/freshness.html
+usr/share/icinga/docs/en/hostchecks.html
+usr/share/icinga/docs/en/howtos.html
+usr/share/icinga/docs/en/icinga-api.html
+usr/share/icinga/docs/en/icinga-web-api.html
+usr/share/icinga/docs/en/icinga-web-config.html
+usr/share/icinga/docs/en/icinga-web-intro.html
+usr/share/icinga/docs/en/icinga-web-introduction.html
+usr/share/icinga/docs/en/icinga-web-pnp.html
+usr/share/icinga/docs/en/icinga-web-scratch.html
+usr/share/icinga/docs/en/icinga-web.html
+usr/share/icinga/docs/en/icinga_packages.html
+usr/share/icinga/docs/en/icingastats.html
+usr/share/icinga/docs/en/index.html
+usr/share/icinga/docs/en/int-mklivestatus.html
+usr/share/icinga/docs/en/int-snmptrap.html
+usr/share/icinga/docs/en/int-tcpwrappers.html
+usr/share/icinga/docs/en/integration.html
+usr/share/icinga/docs/en/ix01.html
+usr/share/icinga/docs/en/largeinstalltweaks.html
+usr/share/icinga/docs/en/macrolist.html
+usr/share/icinga/docs/en/macros.html
+usr/share/icinga/docs/en/modified_attr.html
+usr/share/icinga/docs/en/monitoring-linux.html
+usr/share/icinga/docs/en/monitoring-netware.html
+usr/share/icinga/docs/en/monitoring-overview.html
+usr/share/icinga/docs/en/monitoring-printers.html
+usr/share/icinga/docs/en/monitoring-publicservices.html
+usr/share/icinga/docs/en/monitoring-routers.html
+usr/share/icinga/docs/en/monitoring-windows.html
+usr/share/icinga/docs/en/mrtggraphs.html
+usr/share/icinga/docs/en/networkreachability.html
+usr/share/icinga/docs/en/notifications.html
+usr/share/icinga/docs/en/notifications2.html
+usr/share/icinga/docs/en/nrpe.html
+usr/share/icinga/docs/en/nsca.html
+usr/share/icinga/docs/en/objectdefinitions.html
+usr/share/icinga/docs/en/objectinheritance.html
+usr/share/icinga/docs/en/objecttricks.html
+usr/share/icinga/docs/en/oncallrotation.html
+usr/share/icinga/docs/en/passivechecks.html
+usr/share/icinga/docs/en/passivestatetranslation.html
+usr/share/icinga/docs/en/perfdata.html
+usr/share/icinga/docs/en/perfgraphs.html
+usr/share/icinga/docs/en/pluginapi.html
+usr/share/icinga/docs/en/plugins.html
+usr/share/icinga/docs/en/quickstart-icinga-freebsd.html
+usr/share/icinga/docs/en/quickstart-icinga.html
+usr/share/icinga/docs/en/quickstart-idoutils-freebsd.html
+usr/share/icinga/docs/en/quickstart-idoutils.html
+usr/share/icinga/docs/en/quickstart.html
+usr/share/icinga/docs/en/recurring_downtimes.html
+usr/share/icinga/docs/en/redundancy.html
+usr/share/icinga/docs/en/reporting.html
+usr/share/icinga/docs/en/sample-cgi.html
+usr/share/icinga/docs/en/sample-commands.html
+usr/share/icinga/docs/en/sample-config.html
+usr/share/icinga/docs/en/sample-contacts.html
+usr/share/icinga/docs/en/sample-httpd.html
+usr/share/icinga/docs/en/sample-icinga.html
+usr/share/icinga/docs/en/sample-localhost.html
+usr/share/icinga/docs/en/sample-notifications.html
+usr/share/icinga/docs/en/sample-printer.html
+usr/share/icinga/docs/en/sample-resource.html
+usr/share/icinga/docs/en/sample-switch.html
+usr/share/icinga/docs/en/sample-templates.html
+usr/share/icinga/docs/en/sample-timeperiods.html
+usr/share/icinga/docs/en/sample-windows.html
+usr/share/icinga/docs/en/security.html
+usr/share/icinga/docs/en/servicechecks.html
+usr/share/icinga/docs/en/stalking.html
+usr/share/icinga/docs/en/startstop.html
+usr/share/icinga/docs/en/statetypes.html
+usr/share/icinga/docs/en/temp_data.html
+usr/share/icinga/docs/en/timeperiods.html
+usr/share/icinga/docs/en/tuning.html
+usr/share/icinga/docs/en/upgrading.html
+usr/share/icinga/docs/en/upgrading_icingaweb.html
+usr/share/icinga/docs/en/upgrading_idoutils.html
+usr/share/icinga/docs/en/verifyconfig.html
+usr/share/icinga/docs/en/volatileservices.html
+usr/share/icinga/docs/en/whatsnew.html
+usr/share/icinga/docs/images
+usr/share/icinga/docs/images/Architecture_1.5_800px.png
+usr/share/icinga/docs/images/IcingaWeb_BusinessProcess-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_BusinessProcess.png
+usr/share/icinga/docs/images/IcingaWeb_Commands-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_Commands.png
+usr/share/icinga/docs/images/IcingaWeb_CronkBuilder-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_CronkBuilder.png
+usr/share/icinga/docs/images/IcingaWeb_Cronk_Configuration-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_Cronk_Configuration.png
+usr/share/icinga/docs/images/IcingaWeb_Cronk_HostFiltered-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_Downtimes-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_Downtimes.png
+usr/share/icinga/docs/images/IcingaWeb_HostStatus_Events-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_HostStatus_Events.png
+usr/share/icinga/docs/images/IcingaWeb_Host_filtered-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_Host_filtered.png
+usr/share/icinga/docs/images/IcingaWeb_LogViewer-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_LogViewer.png
+usr/share/icinga/docs/images/IcingaWeb_OpenProblems-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_OpenProblems.png
+usr/share/icinga/docs/images/IcingaWeb_Portal2-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_Portal2.png
+usr/share/icinga/docs/images/IcingaWeb_Reporting-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_Reporting.png
+usr/share/icinga/docs/images/IcingaWeb_Search-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_Search.png
+usr/share/icinga/docs/images/IcingaWeb_StatusMap-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_StatusMap.png
+usr/share/icinga/docs/images/IcingaWeb_TacticalOverview-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_TacticalOverview.png
+usr/share/icinga/docs/images/IcingaWeb_UserAdmin-150x150.png
+usr/share/icinga/docs/images/IcingaWeb_UserAdmin.png
+usr/share/icinga/docs/images/Icinga_Classic_CGIConfig-150x150.png
+usr/share/icinga/docs/images/Icinga_Classic_CGIConfig.png
+usr/share/icinga/docs/images/Icinga_Classic_Commands-150x150.png
+usr/share/icinga/docs/images/Icinga_Classic_Commands.png
+usr/share/icinga/docs/images/Icinga_Classic_DatePicker-150x150.png
+usr/share/icinga/docs/images/Icinga_Classic_DatePicker.png
+usr/share/icinga/docs/images/Icinga_Classic_Downtimes-150x150.png
+usr/share/icinga/docs/images/Icinga_Classic_Downtimes.png
+usr/share/icinga/docs/images/Icinga_Classic_HostGroup-150x150.png
+usr/share/icinga/docs/images/Icinga_Classic_HostGroup.png
+usr/share/icinga/docs/images/Icinga_Classic_PaginationLogs-150x150.png
+usr/share/icinga/docs/images/Icinga_Classic_PaginationLogs.png
+usr/share/icinga/docs/images/Icinga_Classic_ServiceStatus-150x150.png
+usr/share/icinga/docs/images/Icinga_Classic_ServiceStatus.png
+usr/share/icinga/docs/images/Icinga_Classic_TacticalOverview-150x150.png
+usr/share/icinga/docs/images/Icinga_Classic_TacticalOverview.png
+usr/share/icinga/docs/images/Icinga_Classic_Trending-150x150.png
+usr/share/icinga/docs/images/Icinga_Classic_Trending.png
+usr/share/icinga/docs/images/MyServiceStatus.png
+usr/share/icinga/docs/images/activechecks.png
+usr/share/icinga/docs/images/cachedcheckgraphs.png
+usr/share/icinga/docs/images/cachedchecks.png
+usr/share/icinga/docs/images/cachedchecks1.png
+usr/share/icinga/docs/images/caution.gif
+usr/share/icinga/docs/images/caution.png
+usr/share/icinga/docs/images/cgi-avail-a.png
+usr/share/icinga/docs/images/cgi-avail-b.png
+usr/share/icinga/docs/images/cgi-cmd.png
+usr/share/icinga/docs/images/cgi-commands.png
+usr/share/icinga/docs/images/cgi-config.png
+usr/share/icinga/docs/images/cgi-continue.png
+usr/share/icinga/docs/images/cgi-extinfo-a.png
+usr/share/icinga/docs/images/cgi-extinfo-b.png
+usr/share/icinga/docs/images/cgi-extinfo-c.png
+usr/share/icinga/docs/images/cgi-extinfo-d.png
+usr/share/icinga/docs/images/cgi-general.png
+usr/share/icinga/docs/images/cgi-histogram.png
+usr/share/icinga/docs/images/cgi-history.png
+usr/share/icinga/docs/images/cgi-notifications.png
+usr/share/icinga/docs/images/cgi-outages.png
+usr/share/icinga/docs/images/cgi-pause.png
+usr/share/icinga/docs/images/cgi-showlog.png
+usr/share/icinga/docs/images/cgi-status-a.png
+usr/share/icinga/docs/images/cgi-status-b.png
+usr/share/icinga/docs/images/cgi-status-c.png
+usr/share/icinga/docs/images/cgi-status-d.png
+usr/share/icinga/docs/images/cgi-statusinfo.png
+usr/share/icinga/docs/images/cgi-statusmap.png
+usr/share/icinga/docs/images/cgi-statuswml.png
+usr/share/icinga/docs/images/cgi-statuswrl.png
+usr/share/icinga/docs/images/cgi-summary.png
+usr/share/icinga/docs/images/cgi-tac.png
+usr/share/icinga/docs/images/cgi-trends.png
+usr/share/icinga/docs/images/checkmark.png
+usr/share/icinga/docs/images/checktiming.png
+usr/share/icinga/docs/images/configoverview.png
+usr/share/icinga/docs/images/db_model_cf.png
+usr/share/icinga/docs/images/db_model_ct.png
+usr/share/icinga/docs/images/db_model_cu.png
+usr/share/icinga/docs/images/db_model_dt.png
+usr/share/icinga/docs/images/db_model_ht.png
+usr/share/icinga/docs/images/distributed.png
+usr/share/icinga/docs/images/downtime.png
+usr/share/icinga/docs/images/epn.png
+usr/share/icinga/docs/images/eventhandlers.png
+usr/share/icinga/docs/images/externalcommands.png
+usr/share/icinga/docs/images/fast-startup.png
+usr/share/icinga/docs/images/fast-startup1.png
+usr/share/icinga/docs/images/fast-startup2.png
+usr/share/icinga/docs/images/fig1.png
+usr/share/icinga/docs/images/fig10.png
+usr/share/icinga/docs/images/fig11.png
+usr/share/icinga/docs/images/fig12.png
+usr/share/icinga/docs/images/fig13.png
+usr/share/icinga/docs/images/fig2.png
+usr/share/icinga/docs/images/fig3.png
+usr/share/icinga/docs/images/fig4.png
+usr/share/icinga/docs/images/fig5.png
+usr/share/icinga/docs/images/fig6.png
+usr/share/icinga/docs/images/fig7.png
+usr/share/icinga/docs/images/fig8.png
+usr/share/icinga/docs/images/fig9.png
+usr/share/icinga/docs/images/flags
+usr/share/icinga/docs/images/flags/de.png
+usr/share/icinga/docs/images/flags/um_gb.png
+usr/share/icinga/docs/images/freshness.png
+usr/share/icinga/docs/images/host-dependencies.png
+usr/share/icinga/docs/images/icinga-reporting-datasource-ido-mysql_1.8.png
+usr/share/icinga/docs/images/icinga-reporting-datasource-ido_1.8.png
+usr/share/icinga/docs/images/icinga-reporting-overview_1.8.png
+usr/share/icinga/docs/images/icinga-reporting_1.6.png
+usr/share/icinga/docs/images/icinga-web-admin_groups1.png
+usr/share/icinga/docs/images/icinga-web-admin_groups2.png
+usr/share/icinga/docs/images/icinga-web-admin_logs1.png
+usr/share/icinga/docs/images/icinga-web-admin_principals.png
+usr/share/icinga/docs/images/icinga-web-admin_tasks.png
+usr/share/icinga/docs/images/icinga-web-admin_users1.png
+usr/share/icinga/docs/images/icinga-web-admin_users2.png
+usr/share/icinga/docs/images/icinga-web-commands_hst.png
+usr/share/icinga/docs/images/icinga-web-commands_svc.png
+usr/share/icinga/docs/images/icinga-web-cronks-settings.png
+usr/share/icinga/docs/images/icinga-web-cronks1.png
+usr/share/icinga/docs/images/icinga-web-cronks2.png
+usr/share/icinga/docs/images/icinga-web-cronks2a.png
+usr/share/icinga/docs/images/icinga-web-cronks3.png
+usr/share/icinga/docs/images/icinga-web-cronks4.png
+usr/share/icinga/docs/images/icinga-web-cronks5.png
+usr/share/icinga/docs/images/icinga-web-cronks6.png
+usr/share/icinga/docs/images/icinga-web-exp_1.png
+usr/share/icinga/docs/images/icinga-web-exp_2.png
+usr/share/icinga/docs/images/icinga-web-exp_3.png
+usr/share/icinga/docs/images/icinga-web-exp_4.png
+usr/share/icinga/docs/images/icinga-web-exp_5.png
+usr/share/icinga/docs/images/icinga-web-filter1.png
+usr/share/icinga/docs/images/icinga-web-filter2.png
+usr/share/icinga/docs/images/icinga-web-filter3.png
+usr/share/icinga/docs/images/icinga-web-filter4.png
+usr/share/icinga/docs/images/icinga-web-filter5.png
+usr/share/icinga/docs/images/icinga-web-filter6.png
+usr/share/icinga/docs/images/icinga-web-host-obj.png
+usr/share/icinga/docs/images/icinga-web-host-obj1.png
+usr/share/icinga/docs/images/icinga-web-host.png
+usr/share/icinga/docs/images/icinga-web-hostgroup.png
+usr/share/icinga/docs/images/icinga-web-instance-down.png
+usr/share/icinga/docs/images/icinga-web-log.png
+usr/share/icinga/docs/images/icinga-web-login.png
+usr/share/icinga/docs/images/icinga-web-main_bar.png
+usr/share/icinga/docs/images/icinga-web-mainscreen.png
+usr/share/icinga/docs/images/icinga-web-open_problems.png
+usr/share/icinga/docs/images/icinga-web-overview.png
+usr/share/icinga/docs/images/icinga-web-search1.png
+usr/share/icinga/docs/images/icinga-web-settings.png
+usr/share/icinga/docs/images/icinga-web-srv.png
+usr/share/icinga/docs/images/icinga-web-srv_obj.png
+usr/share/icinga/docs/images/icinga-web-statuscronk.png
+usr/share/icinga/docs/images/icinga-web-tackle1.png
+usr/share/icinga/docs/images/icinga-web-tackle2.png
+usr/share/icinga/docs/images/icinga-web-tackle3.png
+usr/share/icinga/docs/images/icinga-web-tackle4.png
+usr/share/icinga/docs/images/icinga-web-topmenu1.png
+usr/share/icinga/docs/images/icinga-web-topmenu2.png
+usr/share/icinga/docs/images/icinga-web-topmenuadmin1.png
+usr/share/icinga/docs/images/icinga-web-user-prefs-logout.png
+usr/share/icinga/docs/images/idoutils.png
+usr/share/icinga/docs/images/important.gif
+usr/share/icinga/docs/images/important.png
+usr/share/icinga/docs/images/integrationoverview.png
+usr/share/icinga/docs/images/interleaved1.png
+usr/share/icinga/docs/images/interleaved2.png
+usr/share/icinga/docs/images/interleaved3.png
+usr/share/icinga/docs/images/logofullsize.png
+usr/share/icinga/docs/images/monitoring-printers.png
+usr/share/icinga/docs/images/monitoring-routers.png
+usr/share/icinga/docs/images/monitoring-windows.png
+usr/share/icinga/docs/images/multiple-templates1.png
+usr/share/icinga/docs/images/multiple-templates2.png
+usr/share/icinga/docs/images/nagios.jpg
+usr/share/icinga/docs/images/ndoutils.png
+usr/share/icinga/docs/images/network-outage1.png
+usr/share/icinga/docs/images/network-outage2.png
+usr/share/icinga/docs/images/noninterleaved1.png
+usr/share/icinga/docs/images/noninterleaved2.png
+usr/share/icinga/docs/images/note.gif
+usr/share/icinga/docs/images/note.png
+usr/share/icinga/docs/images/nrpe.png
+usr/share/icinga/docs/images/nrpe_remote.png
+usr/share/icinga/docs/images/nsca.png
+usr/share/icinga/docs/images/nscpp.png
+usr/share/icinga/docs/images/objects-commands.png
+usr/share/icinga/docs/images/objects-contacts.png
+usr/share/icinga/docs/images/objects-hosts.png
+usr/share/icinga/docs/images/objects-services.png
+usr/share/icinga/docs/images/objects-timeperiods.png
+usr/share/icinga/docs/images/passivechecks.png
+usr/share/icinga/docs/images/passivehosttranslation.png
+usr/share/icinga/docs/images/perfdata_cached.png
+usr/share/icinga/docs/images/perfdata_cached2.png
+usr/share/icinga/docs/images/perfdata_cmdbuf.png
+usr/share/icinga/docs/images/perfdata_exec.png
+usr/share/icinga/docs/images/perfdata_extcmd.png
+usr/share/icinga/docs/images/perfdata_host.png
+usr/share/icinga/docs/images/perfdata_lat.png
+usr/share/icinga/docs/images/perfdata_state_chg.png
+usr/share/icinga/docs/images/perfdata_svc.png
+usr/share/icinga/docs/images/plugins.png
+usr/share/icinga/docs/images/predictive-dependency-checks.png
+usr/share/icinga/docs/images/printer.png
+usr/share/icinga/docs/images/reachability1.png
+usr/share/icinga/docs/images/reachability2.png
+usr/share/icinga/docs/images/reachability3.png
+usr/share/icinga/docs/images/reachability4.png
+usr/share/icinga/docs/images/redundancy.png
+usr/share/icinga/docs/images/rep_avail.png
+usr/share/icinga/docs/images/reptop10.png
+usr/share/icinga/docs/images/security.png
+usr/share/icinga/docs/images/security1.png
+usr/share/icinga/docs/images/security2.png
+usr/share/icinga/docs/images/security3.png
+usr/share/icinga/docs/images/seealso.gif
+usr/share/icinga/docs/images/service-dependencies.png
+usr/share/icinga/docs/images/statetransitions.png
+usr/share/icinga/docs/images/statetransitions2.png
+usr/share/icinga/docs/images/stoprestart.png
+usr/share/icinga/docs/images/switch.png
+usr/share/icinga/docs/images/tac_header2.png
+usr/share/icinga/docs/images/tcpwrappers.png
+usr/share/icinga/docs/images/tip.gif
+usr/share/icinga/docs/images/tip.png
+usr/share/icinga/docs/images/tuning.png
+usr/share/icinga/docs/images/upto.gif
+usr/share/icinga/docs/index.html
+usr/share/icinga/docs/js
+usr/share/icinga/docs/js/icinga-docs.js
+usr/share/icinga/docs/js/jquery-min.js
+usr/share/icinga/docs/robots.txt
+usr/share/icinga/docs/stylesheets
+usr/share/icinga/docs/stylesheets/icinga-docs.css
+usr/share/icinga/images
+usr/share/icinga/images/Icinga_Header_Webinterface.jpg
+usr/share/icinga/images/Icinga_Header_Webinterface_Pixel.jpg
+usr/share/icinga/images/Icinga_TAC_Header_Webinterface.jpg
+usr/share/icinga/images/ack.gif
+usr/share/icinga/images/action.gif
+usr/share/icinga/images/application-monitor.png
+usr/share/icinga/images/cmd_shadow.gif
+usr/share/icinga/images/cmd_stop.png
+usr/share/icinga/images/command.png
+usr/share/icinga/images/comment.gif
+usr/share/icinga/images/contexthelp.gif
+usr/share/icinga/images/critical.png
+usr/share/icinga/images/database.gif
+usr/share/icinga/images/dd_arrow.gif
+usr/share/icinga/images/delay.gif
+usr/share/icinga/images/delete.gif
+usr/share/icinga/images/detail.gif
+usr/share/icinga/images/disabled.gif
+usr/share/icinga/images/down.gif
+usr/share/icinga/images/downtime.gif
+usr/share/icinga/images/empty.gif
+usr/share/icinga/images/enabled.gif
+usr/share/icinga/images/export_csv.png
+usr/share/icinga/images/export_json.png
+usr/share/icinga/images/export_link.png
+usr/share/icinga/images/export_xml.png
+usr/share/icinga/images/favicon.ico
+usr/share/icinga/images/flapping.gif
+usr/share/icinga/images/histogram.png
+usr/share/icinga/images/history.gif
+usr/share/icinga/images/hostevent.gif
+usr/share/icinga/images/hourglass-arrow.png
+usr/share/icinga/images/hourglass-exclamation.png
+usr/share/icinga/images/icon_collapse.gif
+usr/share/icinga/images/icon_expand.gif
+usr/share/icinga/images/icon_first_active.gif
+usr/share/icinga/images/icon_first_inactive.gif
+usr/share/icinga/images/icon_last_active.gif
+usr/share/icinga/images/icon_last_inactive.gif
+usr/share/icinga/images/icon_next_active.gif
+usr/share/icinga/images/icon_next_inactive.gif
+usr/share/icinga/images/icon_previous_active.gif
+usr/share/icinga/images/icon_previous_inactive.gif
+usr/share/icinga/images/icon_reload.png
+usr/share/icinga/images/info.png
+usr/share/icinga/images/left.gif
+usr/share/icinga/images/logofullsize.png
+usr/share/icinga/images/logos
+usr/share/icinga/images/logos/Stats1.gif
+usr/share/icinga/images/logos/Stats2.png
+usr/share/icinga/images/logos/equipment
+usr/share/icinga/images/logos/equipment/Nuvem.gif
+usr/share/icinga/images/logos/equipment/Nuvem.jpg
+usr/share/icinga/images/logos/equipment/Nuvem.png
+usr/share/icinga/images/logos/equipment/Nuvemp.gd2
+usr/share/icinga/images/logos/equipment/Nuvemp.gif
+usr/share/icinga/images/logos/equipment/Nuvemp.jpg
+usr/share/icinga/images/logos/equipment/Nuvemp.png
+usr/share/icinga/images/logos/equipment/accounting_server.gd2
+usr/share/icinga/images/logos/equipment/accounting_server.gif
+usr/share/icinga/images/logos/equipment/accounting_server.png
+usr/share/icinga/images/logos/equipment/antivirus.gd2
+usr/share/icinga/images/logos/equipment/antivirus.gif
+usr/share/icinga/images/logos/equipment/antivirus.png
+usr/share/icinga/images/logos/equipment/atm.gd2
+usr/share/icinga/images/logos/equipment/atm.gif
+usr/share/icinga/images/logos/equipment/atm.png
+usr/share/icinga/images/logos/equipment/backup.gd2
+usr/share/icinga/images/logos/equipment/backup.gif
+usr/share/icinga/images/logos/equipment/backup.png
+usr/share/icinga/images/logos/equipment/backup2.gd2
+usr/share/icinga/images/logos/equipment/backup2.gif
+usr/share/icinga/images/logos/equipment/backup2.png
+usr/share/icinga/images/logos/equipment/blackbox.gd2
+usr/share/icinga/images/logos/equipment/blackbox.gif
+usr/share/icinga/images/logos/equipment/blackbox.png
+usr/share/icinga/images/logos/equipment/cable_modem.gd2
+usr/share/icinga/images/logos/equipment/cable_modem.gif
+usr/share/icinga/images/logos/equipment/cable_modem.png
+usr/share/icinga/images/logos/equipment/cd_server.gd2
+usr/share/icinga/images/logos/equipment/cd_server.gif
+usr/share/icinga/images/logos/equipment/cd_server.png
+usr/share/icinga/images/logos/equipment/cd_server2.gd2
+usr/share/icinga/images/logos/equipment/cd_server2.gif
+usr/share/icinga/images/logos/equipment/cd_server2.png
+usr/share/icinga/images/logos/equipment/chat_server.gd2
+usr/share/icinga/images/logos/equipment/chat_server.gif
+usr/share/icinga/images/logos/equipment/chat_server.png
+usr/share/icinga/images/logos/equipment/chat_server2.gd2
+usr/share/icinga/images/logos/equipment/chat_server2.gif
+usr/share/icinga/images/logos/equipment/chat_server2.png
+usr/share/icinga/images/logos/equipment/chat_server3.gd2
+usr/share/icinga/images/logos/equipment/chat_server3.gif
+usr/share/icinga/images/logos/equipment/chat_server3.png
+usr/share/icinga/images/logos/equipment/cluster.gd2
+usr/share/icinga/images/logos/equipment/cluster.gif
+usr/share/icinga/images/logos/equipment/cluster.png
+usr/share/icinga/images/logos/equipment/cluster2.gd2
+usr/share/icinga/images/logos/equipment/cluster2.gif
+usr/share/icinga/images/logos/equipment/cluster2.png
+usr/share/icinga/images/logos/equipment/computer.gd2
+usr/share/icinga/images/logos/equipment/computer.gif
+usr/share/icinga/images/logos/equipment/computer.png
+usr/share/icinga/images/logos/equipment/computer2.gd2
+usr/share/icinga/images/logos/equipment/computer2.gif
+usr/share/icinga/images/logos/equipment/computer2.png
+usr/share/icinga/images/logos/equipment/computer3.gd2
+usr/share/icinga/images/logos/equipment/computer3.gif
+usr/share/icinga/images/logos/equipment/computer3.png
+usr/share/icinga/images/logos/equipment/computer4.gd2
+usr/share/icinga/images/logos/equipment/computer4.gif
+usr/share/icinga/images/logos/equipment/computer4.png
+usr/share/icinga/images/logos/equipment/computer5.gd2
+usr/share/icinga/images/logos/equipment/computer5.gif
+usr/share/icinga/images/logos/equipment/computer5.png
+usr/share/icinga/images/logos/equipment/computer6.gd2
+usr/share/icinga/images/logos/equipment/computer6.gif
+usr/share/icinga/images/logos/equipment/computer6.png
+usr/share/icinga/images/logos/equipment/concentrator.gd2
+usr/share/icinga/images/logos/equipment/concentrator.gif
+usr/share/icinga/images/logos/equipment/concentrator.png
+usr/share/icinga/images/logos/equipment/data_server.gd2
+usr/share/icinga/images/logos/equipment/data_server.gif
+usr/share/icinga/images/logos/equipment/data_server.png
+usr/share/icinga/images/logos/equipment/data_server2.gd2
+usr/share/icinga/images/logos/equipment/data_server2.gif
+usr/share/icinga/images/logos/equipment/data_server2.png
+usr/share/icinga/images/logos/equipment/database.gd2
+usr/share/icinga/images/logos/equipment/database.gif
+usr/share/icinga/images/logos/equipment/desktop-server.gd2
+usr/share/icinga/images/logos/equipment/desktop-server.gif
+usr/share/icinga/images/logos/equipment/dial-in.gd2
+usr/share/icinga/images/logos/equipment/dial-in.gif
+usr/share/icinga/images/logos/equipment/dial-in.png
+usr/share/icinga/images/logos/equipment/directory_services.gd2
+usr/share/icinga/images/logos/equipment/directory_services.gif
+usr/share/icinga/images/logos/equipment/directory_services.png
+usr/share/icinga/images/logos/equipment/directory_services2.gd2
+usr/share/icinga/images/logos/equipment/directory_services2.gif
+usr/share/icinga/images/logos/equipment/directory_services2.png
+usr/share/icinga/images/logos/equipment/directory_services3.gd2
+usr/share/icinga/images/logos/equipment/directory_services3.gif
+usr/share/icinga/images/logos/equipment/directory_services3.png
+usr/share/icinga/images/logos/equipment/disable_server.gd2
+usr/share/icinga/images/logos/equipment/disable_server.gif
+usr/share/icinga/images/logos/equipment/disable_server.png
+usr/share/icinga/images/logos/equipment/distributed_database.gd2
+usr/share/icinga/images/logos/equipment/distributed_database.gif
+usr/share/icinga/images/logos/equipment/distributed_database.png
+usr/share/icinga/images/logos/equipment/dmz_server.gd2
+usr/share/icinga/images/logos/equipment/dmz_server.gif
+usr/share/icinga/images/logos/equipment/dmz_server.png
+usr/share/icinga/images/logos/equipment/document_server.gd2
+usr/share/icinga/images/logos/equipment/document_server.gif
+usr/share/icinga/images/logos/equipment/document_server.png
+usr/share/icinga/images/logos/equipment/download_server.gd2
+usr/share/icinga/images/logos/equipment/download_server.gif
+usr/share/icinga/images/logos/equipment/download_server.png
+usr/share/icinga/images/logos/equipment/dumbterminal.gd2
+usr/share/icinga/images/logos/equipment/dumbterminal.gif
+usr/share/icinga/images/logos/equipment/dumbterminal.png
+usr/share/icinga/images/logos/equipment/e-shop.gd2
+usr/share/icinga/images/logos/equipment/e-shop.gif
+usr/share/icinga/images/logos/equipment/e-shop.png
+usr/share/icinga/images/logos/equipment/e-shop2.gd2
+usr/share/icinga/images/logos/equipment/e-shop2.gif
+usr/share/icinga/images/logos/equipment/e-shop2.png
+usr/share/icinga/images/logos/equipment/e-shop3.gd2
+usr/share/icinga/images/logos/equipment/e-shop3.gif
+usr/share/icinga/images/logos/equipment/e-shop3.png
+usr/share/icinga/images/logos/equipment/email_antivirus.gd2
+usr/share/icinga/images/logos/equipment/email_antivirus.gif
+usr/share/icinga/images/logos/equipment/email_antivirus.png
+usr/share/icinga/images/logos/equipment/email_server.gd2
+usr/share/icinga/images/logos/equipment/email_server.gif
+usr/share/icinga/images/logos/equipment/email_server.png
+usr/share/icinga/images/logos/equipment/email_server2.gd2
+usr/share/icinga/images/logos/equipment/email_server2.gif
+usr/share/icinga/images/logos/equipment/email_server2.png
+usr/share/icinga/images/logos/equipment/email_server3.gd2
+usr/share/icinga/images/logos/equipment/email_server3.gif
+usr/share/icinga/images/logos/equipment/email_server3.png
+usr/share/icinga/images/logos/equipment/enable_server.gd2
+usr/share/icinga/images/logos/equipment/enable_server.gif
+usr/share/icinga/images/logos/equipment/enable_server.png
+usr/share/icinga/images/logos/equipment/ethernet_card.png
+usr/share/icinga/images/logos/equipment/fax.gd2
+usr/share/icinga/images/logos/equipment/fax.gif
+usr/share/icinga/images/logos/equipment/firewall.gd2
+usr/share/icinga/images/logos/equipment/firewall.gif
+usr/share/icinga/images/logos/equipment/firewall.png
+usr/share/icinga/images/logos/equipment/firewall2.gd2
+usr/share/icinga/images/logos/equipment/firewall2.gif
+usr/share/icinga/images/logos/equipment/firewall2.png
+usr/share/icinga/images/logos/equipment/firewall3.gd2
+usr/share/icinga/images/logos/equipment/firewall3.gif
+usr/share/icinga/images/logos/equipment/firewall3.png
+usr/share/icinga/images/logos/equipment/firewall4.gd2
+usr/share/icinga/images/logos/equipment/firewall4.gif
+usr/share/icinga/images/logos/equipment/firewall_station.gd2
+usr/share/icinga/images/logos/equipment/firewall_station.gif
+usr/share/icinga/images/logos/equipment/firewall_station.png
+usr/share/icinga/images/logos/equipment/game_server.gd2
+usr/share/icinga/images/logos/equipment/game_server.gif
+usr/share/icinga/images/logos/equipment/game_server.png
+usr/share/icinga/images/logos/equipment/game_server2.gd2
+usr/share/icinga/images/logos/equipment/game_server2.gif
+usr/share/icinga/images/logos/equipment/game_server2.png
+usr/share/icinga/images/logos/equipment/game_server3.gd2
+usr/share/icinga/images/logos/equipment/game_server3.gif
+usr/share/icinga/images/logos/equipment/game_server3.png
+usr/share/icinga/images/logos/equipment/game_server4.gd2
+usr/share/icinga/images/logos/equipment/game_server4.gif
+usr/share/icinga/images/logos/equipment/game_server4.png
+usr/share/icinga/images/logos/equipment/hub.gd2
+usr/share/icinga/images/logos/equipment/hub.gif
+usr/share/icinga/images/logos/equipment/hub.png
+usr/share/icinga/images/logos/equipment/hub2.gd2
+usr/share/icinga/images/logos/equipment/hub2.gif
+usr/share/icinga/images/logos/equipment/information_cluster.gd2
+usr/share/icinga/images/logos/equipment/information_cluster.gif
+usr/share/icinga/images/logos/equipment/information_cluster.png
+usr/share/icinga/images/logos/equipment/integrated_office_system.gd2
+usr/share/icinga/images/logos/equipment/integrated_office_system.gif
+usr/share/icinga/images/logos/equipment/integrated_office_system.png
+usr/share/icinga/images/logos/equipment/internet_device.png
+usr/share/icinga/images/logos/equipment/ip-pbx.gd2
+usr/share/icinga/images/logos/equipment/ip-pbx.gif
+usr/share/icinga/images/logos/equipment/irc.gd2
+usr/share/icinga/images/logos/equipment/irc.gif
+usr/share/icinga/images/logos/equipment/irc.png
+usr/share/icinga/images/logos/equipment/laptop.gd2
+usr/share/icinga/images/logos/equipment/laptop.gif
+usr/share/icinga/images/logos/equipment/laptop.png
+usr/share/icinga/images/logos/equipment/laptop2.gd2
+usr/share/icinga/images/logos/equipment/laptop2.gif
+usr/share/icinga/images/logos/equipment/laptop2.png
+usr/share/icinga/images/logos/equipment/laptop3.gd2
+usr/share/icinga/images/logos/equipment/laptop3.gif
+usr/share/icinga/images/logos/equipment/laptop3.png
+usr/share/icinga/images/logos/equipment/laptop4.gd2
+usr/share/icinga/images/logos/equipment/laptop4.gif
+usr/share/icinga/images/logos/equipment/laptop4.png
+usr/share/icinga/images/logos/equipment/laptop5.gd2
+usr/share/icinga/images/logos/equipment/laptop5.gif
+usr/share/icinga/images/logos/equipment/laptop5.png
+usr/share/icinga/images/logos/equipment/loadbalancer.gd2
+usr/share/icinga/images/logos/equipment/loadbalancer.gif
+usr/share/icinga/images/logos/equipment/loadbalancer.png
+usr/share/icinga/images/logos/equipment/loadbalancer2.gd2
+usr/share/icinga/images/logos/equipment/loadbalancer2.gif
+usr/share/icinga/images/logos/equipment/loadbalancer2.png
+usr/share/icinga/images/logos/equipment/mainframe.gd2
+usr/share/icinga/images/logos/equipment/mainframe.gif
+usr/share/icinga/images/logos/equipment/modem.gd2
+usr/share/icinga/images/logos/equipment/modem.gif
+usr/share/icinga/images/logos/equipment/modem.png
+usr/share/icinga/images/logos/equipment/modem2.gd2
+usr/share/icinga/images/logos/equipment/modem2.gif
+usr/share/icinga/images/logos/equipment/modem2.png
+usr/share/icinga/images/logos/equipment/modem3.gd2
+usr/share/icinga/images/logos/equipment/modem3.gif
+usr/share/icinga/images/logos/equipment/modem3.png
+usr/share/icinga/images/logos/equipment/modem4.gd2
+usr/share/icinga/images/logos/equipment/modem4.gif
+usr/share/icinga/images/logos/equipment/modem4.png
+usr/share/icinga/images/logos/equipment/modem5.gd2
+usr/share/icinga/images/logos/equipment/modem5.gif
+usr/share/icinga/images/logos/equipment/modem5.png
+usr/share/icinga/images/logos/equipment/modem6.gd2
+usr/share/icinga/images/logos/equipment/modem6.gif
+usr/share/icinga/images/logos/equipment/modem6.png
+usr/share/icinga/images/logos/equipment/monitor.png
+usr/share/icinga/images/logos/equipment/monitoring.gd2
+usr/share/icinga/images/logos/equipment/monitoring.gif
+usr/share/icinga/images/logos/equipment/monitoring.png
+usr/share/icinga/images/logos/equipment/multimedia.gd2
+usr/share/icinga/images/logos/equipment/multimedia.gif
+usr/share/icinga/images/logos/equipment/multimedia.png
+usr/share/icinga/images/logos/equipment/multimedia2.gd2
+usr/share/icinga/images/logos/equipment/multimedia2.gif
+usr/share/icinga/images/logos/equipment/multimedia2.png
+usr/share/icinga/images/logos/equipment/multimedia3.gd2
+usr/share/icinga/images/logos/equipment/multimedia3.gif
+usr/share/icinga/images/logos/equipment/multimedia3.png
+usr/share/icinga/images/logos/equipment/mysql.gd2
+usr/share/icinga/images/logos/equipment/mysql.gif
+usr/share/icinga/images/logos/equipment/mysql.png
+usr/share/icinga/images/logos/equipment/mysql2.gd2
+usr/share/icinga/images/logos/equipment/mysql2.gif
+usr/share/icinga/images/logos/equipment/mysql2.png
+usr/share/icinga/images/logos/equipment/nas.gd2
+usr/share/icinga/images/logos/equipment/nas.gif
+usr/share/icinga/images/logos/equipment/nas.png
+usr/share/icinga/images/logos/equipment/nas2.gd2
+usr/share/icinga/images/logos/equipment/nas2.gif
+usr/share/icinga/images/logos/equipment/nas2.png
+usr/share/icinga/images/logos/equipment/nas3.gd2
+usr/share/icinga/images/logos/equipment/nas3.gif
+usr/share/icinga/images/logos/equipment/nas3.png
+usr/share/icinga/images/logos/equipment/nas4.gd2
+usr/share/icinga/images/logos/equipment/nas4.gif
+usr/share/icinga/images/logos/equipment/nas4.png
+usr/share/icinga/images/logos/equipment/nas_secured.gd2
+usr/share/icinga/images/logos/equipment/nas_secured.gif
+usr/share/icinga/images/logos/equipment/nas_secured.png
+usr/share/icinga/images/logos/equipment/network_node.gd2
+usr/share/icinga/images/logos/equipment/network_node.gif
+usr/share/icinga/images/logos/equipment/network_node.png
+usr/share/icinga/images/logos/equipment/news.gd2
+usr/share/icinga/images/logos/equipment/news.gif
+usr/share/icinga/images/logos/equipment/news.png
+usr/share/icinga/images/logos/equipment/news2.gd2
+usr/share/icinga/images/logos/equipment/news2.gif
+usr/share/icinga/images/logos/equipment/news2.png
+usr/share/icinga/images/logos/equipment/notebook.gd2
+usr/share/icinga/images/logos/equipment/notebook.gif
+usr/share/icinga/images/logos/equipment/office_app_server.gd2
+usr/share/icinga/images/logos/equipment/office_app_server.gif
+usr/share/icinga/images/logos/equipment/office_app_server.png
+usr/share/icinga/images/logos/equipment/outlook_remote.gd2
+usr/share/icinga/images/logos/equipment/outlook_remote.gif
+usr/share/icinga/images/logos/equipment/outlook_remote.png
+usr/share/icinga/images/logos/equipment/phone.gd2
+usr/share/icinga/images/logos/equipment/phone.gif
+usr/share/icinga/images/logos/equipment/phone.png
+usr/share/icinga/images/logos/equipment/phone2.gd2
+usr/share/icinga/images/logos/equipment/phone2.gif
+usr/share/icinga/images/logos/equipment/phone2.png
+usr/share/icinga/images/logos/equipment/print_server.gd2
+usr/share/icinga/images/logos/equipment/print_server.gif
+usr/share/icinga/images/logos/equipment/print_server.png
+usr/share/icinga/images/logos/equipment/printer.gd2
+usr/share/icinga/images/logos/equipment/printer.gif
+usr/share/icinga/images/logos/equipment/printer.png
+usr/share/icinga/images/logos/equipment/printer2.gd2
+usr/share/icinga/images/logos/equipment/printer2.gif
+usr/share/icinga/images/logos/equipment/printer2.png
+usr/share/icinga/images/logos/equipment/printer3.gd2
+usr/share/icinga/images/logos/equipment/printer3.gif
+usr/share/icinga/images/logos/equipment/printer3.png
+usr/share/icinga/images/logos/equipment/printer4.gd2
+usr/share/icinga/images/logos/equipment/printer4.gif
+usr/share/icinga/images/logos/equipment/proxy_server.gd2
+usr/share/icinga/images/logos/equipment/proxy_server.gif
+usr/share/icinga/images/logos/equipment/proxy_server.png
+usr/share/icinga/images/logos/equipment/rack-server.gd2
+usr/share/icinga/images/logos/equipment/rack-server.gif
+usr/share/icinga/images/logos/equipment/rack1.gd2
+usr/share/icinga/images/logos/equipment/rack1.gif
+usr/share/icinga/images/logos/equipment/rack1.png
+usr/share/icinga/images/logos/equipment/rack2.gd2
+usr/share/icinga/images/logos/equipment/rack2.gif
+usr/share/icinga/images/logos/equipment/rack2.png
+usr/share/icinga/images/logos/equipment/rack3.gd2
+usr/share/icinga/images/logos/equipment/rack3.gif
+usr/share/icinga/images/logos/equipment/rack3.png
+usr/share/icinga/images/logos/equipment/rack4.gd2
+usr/share/icinga/images/logos/equipment/rack4.gif
+usr/share/icinga/images/logos/equipment/rack4.png
+usr/share/icinga/images/logos/equipment/radiolink.gd2
+usr/share/icinga/images/logos/equipment/radiolink.gif
+usr/share/icinga/images/logos/equipment/radiolink.png
+usr/share/icinga/images/logos/equipment/raid_cluster.gd2
+usr/share/icinga/images/logos/equipment/raid_cluster.gif
+usr/share/icinga/images/logos/equipment/raid_cluster.png
+usr/share/icinga/images/logos/equipment/raid_cluster2.gd2
+usr/share/icinga/images/logos/equipment/raid_cluster2.gif
+usr/share/icinga/images/logos/equipment/raid_cluster2.png
+usr/share/icinga/images/logos/equipment/redundancy.gd2
+usr/share/icinga/images/logos/equipment/redundancy.gif
+usr/share/icinga/images/logos/equipment/redundancy.png
+usr/share/icinga/images/logos/equipment/redundancy2.gd2
+usr/share/icinga/images/logos/equipment/redundancy2.gif
+usr/share/icinga/images/logos/equipment/redundancy2.png
+usr/share/icinga/images/logos/equipment/remote_desktop.gd2
+usr/share/icinga/images/logos/equipment/remote_desktop.gif
+usr/share/icinga/images/logos/equipment/remote_desktop.png
+usr/share/icinga/images/logos/equipment/remote_desktop2.gd2
+usr/share/icinga/images/logos/equipment/remote_desktop2.gif
+usr/share/icinga/images/logos/equipment/remote_desktop2.png
+usr/share/icinga/images/logos/equipment/remote_installator.gd2
+usr/share/icinga/images/logos/equipment/remote_installator.gif
+usr/share/icinga/images/logos/equipment/remote_installator.png
+usr/share/icinga/images/logos/equipment/router.gd2
+usr/share/icinga/images/logos/equipment/router.gif
+usr/share/icinga/images/logos/equipment/router.png
+usr/share/icinga/images/logos/equipment/router2.gd2
+usr/share/icinga/images/logos/equipment/router2.gif
+usr/share/icinga/images/logos/equipment/san.gd2
+usr/share/icinga/images/logos/equipment/san.gif
+usr/share/icinga/images/logos/equipment/satellite.png
+usr/share/icinga/images/logos/equipment/satlink.gd2
+usr/share/icinga/images/logos/equipment/satlink.gif
+usr/share/icinga/images/logos/equipment/satlink.png
+usr/share/icinga/images/logos/equipment/satlink2.gd2
+usr/share/icinga/images/logos/equipment/satlink2.gif
+usr/share/icinga/images/logos/equipment/satlink2.png
+usr/share/icinga/images/logos/equipment/satlink3.gd2
+usr/share/icinga/images/logos/equipment/satlink3.gif
+usr/share/icinga/images/logos/equipment/satlink3.png
+usr/share/icinga/images/logos/equipment/scanner.gd2
+usr/share/icinga/images/logos/equipment/scanner.gif
+usr/share/icinga/images/logos/equipment/scanner.png
+usr/share/icinga/images/logos/equipment/screen.gd2
+usr/share/icinga/images/logos/equipment/screen.gif
+usr/share/icinga/images/logos/equipment/screen.png
+usr/share/icinga/images/logos/equipment/screen2.gd2
+usr/share/icinga/images/logos/equipment/screen2.gif
+usr/share/icinga/images/logos/equipment/screen2.png
+usr/share/icinga/images/logos/equipment/screen3.gd2
+usr/share/icinga/images/logos/equipment/screen3.gif
+usr/share/icinga/images/logos/equipment/screen3.png
+usr/share/icinga/images/logos/equipment/screen4.gd2
+usr/share/icinga/images/logos/equipment/screen4.gif
+usr/share/icinga/images/logos/equipment/screen4.png
+usr/share/icinga/images/logos/equipment/screen5.gd2
+usr/share/icinga/images/logos/equipment/screen5.gif
+usr/share/icinga/images/logos/equipment/screen5.png
+usr/share/icinga/images/logos/equipment/search_server.gd2
+usr/share/icinga/images/logos/equipment/search_server.gif
+usr/share/icinga/images/logos/equipment/search_server.png
+usr/share/icinga/images/logos/equipment/search_server2.gd2
+usr/share/icinga/images/logos/equipment/search_server2.gif
+usr/share/icinga/images/logos/equipment/search_server2.png
+usr/share/icinga/images/logos/equipment/search_server3.gd2
+usr/share/icinga/images/logos/equipment/search_server3.gif
+usr/share/icinga/images/logos/equipment/search_server3.png
+usr/share/icinga/images/logos/equipment/secure_server.gd2
+usr/share/icinga/images/logos/equipment/secure_server.gif
+usr/share/icinga/images/logos/equipment/secure_server.png
+usr/share/icinga/images/logos/equipment/security.gd2
+usr/share/icinga/images/logos/equipment/security.gif
+usr/share/icinga/images/logos/equipment/security.png
+usr/share/icinga/images/logos/equipment/security2.gd2
+usr/share/icinga/images/logos/equipment/security2.gif
+usr/share/icinga/images/logos/equipment/security2.png
+usr/share/icinga/images/logos/equipment/server.gd2
+usr/share/icinga/images/logos/equipment/server.gif
+usr/share/icinga/images/logos/equipment/server.png
+usr/share/icinga/images/logos/equipment/server2.gd2
+usr/share/icinga/images/logos/equipment/server2.gif
+usr/share/icinga/images/logos/equipment/server2.png
+usr/share/icinga/images/logos/equipment/server3.gd2
+usr/share/icinga/images/logos/equipment/server3.gif
+usr/share/icinga/images/logos/equipment/server3.png
+usr/share/icinga/images/logos/equipment/server4.gd2
+usr/share/icinga/images/logos/equipment/server4.gif
+usr/share/icinga/images/logos/equipment/server4.png
+usr/share/icinga/images/logos/equipment/shoutcast.gd2
+usr/share/icinga/images/logos/equipment/shoutcast.gif
+usr/share/icinga/images/logos/equipment/shoutcast.png
+usr/share/icinga/images/logos/equipment/shoutcast2.gd2
+usr/share/icinga/images/logos/equipment/shoutcast2.gif
+usr/share/icinga/images/logos/equipment/shoutcast2.png
+usr/share/icinga/images/logos/equipment/shoutcast3.gd2
+usr/share/icinga/images/logos/equipment/shoutcast3.gif
+usr/share/icinga/images/logos/equipment/shoutcast3.png
+usr/share/icinga/images/logos/equipment/signal.png
+usr/share/icinga/images/logos/equipment/soho.gd2
+usr/share/icinga/images/logos/equipment/soho.gif
+usr/share/icinga/images/logos/equipment/soho.png
+usr/share/icinga/images/logos/equipment/soho2.gd2
+usr/share/icinga/images/logos/equipment/soho2.gif
+usr/share/icinga/images/logos/equipment/soho2.png
+usr/share/icinga/images/logos/equipment/soho3.gd2
+usr/share/icinga/images/logos/equipment/soho3.gif
+usr/share/icinga/images/logos/equipment/soho3.png
+usr/share/icinga/images/logos/equipment/soho4.gd2
+usr/share/icinga/images/logos/equipment/soho4.gif
+usr/share/icinga/images/logos/equipment/soho4.png
+usr/share/icinga/images/logos/equipment/sql.gd2
+usr/share/icinga/images/logos/equipment/sql.gif
+usr/share/icinga/images/logos/equipment/sql.png
+usr/share/icinga/images/logos/equipment/sql2.gd2
+usr/share/icinga/images/logos/equipment/sql2.gif
+usr/share/icinga/images/logos/equipment/sql2.png
+usr/share/icinga/images/logos/equipment/sql3.gd2
+usr/share/icinga/images/logos/equipment/sql3.gif
+usr/share/icinga/images/logos/equipment/sql3.png
+usr/share/icinga/images/logos/equipment/sql4.gd2
+usr/share/icinga/images/logos/equipment/sql4.gif
+usr/share/icinga/images/logos/equipment/sql4.png
+usr/share/icinga/images/logos/equipment/ssh.gd2
+usr/share/icinga/images/logos/equipment/ssh.gif
+usr/share/icinga/images/logos/equipment/ssh.png
+usr/share/icinga/images/logos/equipment/ssh2.gd2
+usr/share/icinga/images/logos/equipment/ssh2.gif
+usr/share/icinga/images/logos/equipment/ssh2.png
+usr/share/icinga/images/logos/equipment/station.gd2
+usr/share/icinga/images/logos/equipment/storage.gd2
+usr/share/icinga/images/logos/equipment/storage.gif
+usr/share/icinga/images/logos/equipment/storage.png
+usr/share/icinga/images/logos/equipment/subnet.gd2
+usr/share/icinga/images/logos/equipment/subnet.gif
+usr/share/icinga/images/logos/equipment/subnet.png
+usr/share/icinga/images/logos/equipment/switch.gd2
+usr/share/icinga/images/logos/equipment/switch.gif
+usr/share/icinga/images/logos/equipment/switch.png
+usr/share/icinga/images/logos/equipment/switch2.gd2
+usr/share/icinga/images/logos/equipment/switch2.gif
+usr/share/icinga/images/logos/equipment/switch2.png
+usr/share/icinga/images/logos/equipment/switch3.gd2
+usr/share/icinga/images/logos/equipment/switch3.gif
+usr/share/icinga/images/logos/equipment/switch3.png
+usr/share/icinga/images/logos/equipment/switch4.gd2
+usr/share/icinga/images/logos/equipment/switch4.gif
+usr/share/icinga/images/logos/equipment/tablet.gd2
+usr/share/icinga/images/logos/equipment/tablet.gif
+usr/share/icinga/images/logos/equipment/tablet.png
+usr/share/icinga/images/logos/equipment/tablet2.gd2
+usr/share/icinga/images/logos/equipment/tablet2.gif
+usr/share/icinga/images/logos/equipment/tablet2.png
+usr/share/icinga/images/logos/equipment/thin-client.gd2
+usr/share/icinga/images/logos/equipment/thin-client.gif
+usr/share/icinga/images/logos/equipment/time_server.gd2
+usr/share/icinga/images/logos/equipment/time_server.gif
+usr/share/icinga/images/logos/equipment/time_server.png
+usr/share/icinga/images/logos/equipment/time_server2.gd2
+usr/share/icinga/images/logos/equipment/time_server2.gif
+usr/share/icinga/images/logos/equipment/time_server2.png
+usr/share/icinga/images/logos/equipment/time_server3.gd2
+usr/share/icinga/images/logos/equipment/time_server3.gif
+usr/share/icinga/images/logos/equipment/time_server3.png
+usr/share/icinga/images/logos/equipment/time_server4.gd2
+usr/share/icinga/images/logos/equipment/time_server4.gif
+usr/share/icinga/images/logos/equipment/time_server4.png
+usr/share/icinga/images/logos/equipment/time_server5.gd2
+usr/share/icinga/images/logos/equipment/time_server5.gif
+usr/share/icinga/images/logos/equipment/time_server5.png
+usr/share/icinga/images/logos/equipment/upload_server.gd2
+usr/share/icinga/images/logos/equipment/upload_server.gif
+usr/share/icinga/images/logos/equipment/upload_server.png
+usr/share/icinga/images/logos/equipment/video_server.gd2
+usr/share/icinga/images/logos/equipment/video_server.gif
+usr/share/icinga/images/logos/equipment/video_server.png
+usr/share/icinga/images/logos/equipment/video_server2.gd2
+usr/share/icinga/images/logos/equipment/video_server2.gif
+usr/share/icinga/images/logos/equipment/video_server2.png
+usr/share/icinga/images/logos/equipment/video_server3.gd2
+usr/share/icinga/images/logos/equipment/video_server3.gif
+usr/share/icinga/images/logos/equipment/video_server3.png
+usr/share/icinga/images/logos/equipment/video_server4.gd2
+usr/share/icinga/images/logos/equipment/video_server4.gif
+usr/share/icinga/images/logos/equipment/video_server4.png
+usr/share/icinga/images/logos/equipment/voip.gd2
+usr/share/icinga/images/logos/equipment/voip.gif
+usr/share/icinga/images/logos/equipment/voip.png
+usr/share/icinga/images/logos/equipment/voip2.gd2
+usr/share/icinga/images/logos/equipment/voip2.gif
+usr/share/icinga/images/logos/equipment/voip2.png
+usr/share/icinga/images/logos/equipment/voip_client.gd2
+usr/share/icinga/images/logos/equipment/voip_client.gif
+usr/share/icinga/images/logos/equipment/voip_client.png
+usr/share/icinga/images/logos/equipment/voip_client2.gd2
+usr/share/icinga/images/logos/equipment/voip_client2.gif
+usr/share/icinga/images/logos/equipment/voip_client2.png
+usr/share/icinga/images/logos/equipment/webcamera.png
+usr/share/icinga/images/logos/equipment/webmail.gd2
+usr/share/icinga/images/logos/equipment/webmail.gif
+usr/share/icinga/images/logos/equipment/webmail.png
+usr/share/icinga/images/logos/equipment/webmail2.gd2
+usr/share/icinga/images/logos/equipment/webmail2.gif
+usr/share/icinga/images/logos/equipment/webmail2.png
+usr/share/icinga/images/logos/equipment/wifi.gd2
+usr/share/icinga/images/logos/equipment/wifi.gif
+usr/share/icinga/images/logos/equipment/wifi.png
+usr/share/icinga/images/logos/equipment/wifi2.gd2
+usr/share/icinga/images/logos/equipment/wifi2.gif
+usr/share/icinga/images/logos/equipment/wifi2.png
+usr/share/icinga/images/logos/equipment/wifi3.gd2
+usr/share/icinga/images/logos/equipment/wifi3.gif
+usr/share/icinga/images/logos/equipment/wifi3.png
+usr/share/icinga/images/logos/equipment/wifi4.gd2
+usr/share/icinga/images/logos/equipment/wifi4.gif
+usr/share/icinga/images/logos/equipment/wifi4.png
+usr/share/icinga/images/logos/equipment/wifi5.gd2
+usr/share/icinga/images/logos/equipment/wifi5.gif
+usr/share/icinga/images/logos/equipment/wifi_bridge.gd2
+usr/share/icinga/images/logos/equipment/wifi_bridge.gif
+usr/share/icinga/images/logos/equipment/wifi_bridge.png
+usr/share/icinga/images/logos/equipment/wifi_modem.png
+usr/share/icinga/images/logos/equipment/workstation.gd2
+usr/share/icinga/images/logos/equipment/workstation.gif
+usr/share/icinga/images/logos/equipment/workstation.png
+usr/share/icinga/images/logos/equipment/workstation_locked.png
+usr/share/icinga/images/logos/equipment/www_server.gd2
+usr/share/icinga/images/logos/equipment/www_server.gif
+usr/share/icinga/images/logos/equipment/www_server.png
+usr/share/icinga/images/logos/hardware
+usr/share/icinga/images/logos/hardware/3ComSS2h500.gif
+usr/share/icinga/images/logos/hardware/3ComSS2h500.jpg
+usr/share/icinga/images/logos/hardware/3ComSS2h500.png
+usr/share/icinga/images/logos/hardware/3ComSS2h500p.gif
+usr/share/icinga/images/logos/hardware/3ComSS2h500p.jpg
+usr/share/icinga/images/logos/hardware/3ComSS2h500p.png
+usr/share/icinga/images/logos/hardware/3ComSS3s3300.gif
+usr/share/icinga/images/logos/hardware/3ComSS3s3300.jpg
+usr/share/icinga/images/logos/hardware/3ComSS3s3300.png
+usr/share/icinga/images/logos/hardware/3ComSS3s3300p.gif
+usr/share/icinga/images/logos/hardware/3ComSS3s3300p.jpg
+usr/share/icinga/images/logos/hardware/3ComSS3s3300p.png
+usr/share/icinga/images/logos/hardware/Brocade3800.gif
+usr/share/icinga/images/logos/hardware/Brocade3800.jpg
+usr/share/icinga/images/logos/hardware/Brocade3800.png
+usr/share/icinga/images/logos/hardware/Brocade3800p.gif
+usr/share/icinga/images/logos/hardware/Brocade3800p.jpg
+usr/share/icinga/images/logos/hardware/Brocade3800p.png
+usr/share/icinga/images/logos/hardware/Cisco1600.gif
+usr/share/icinga/images/logos/hardware/Cisco1600.jpg
+usr/share/icinga/images/logos/hardware/Cisco1600.png
+usr/share/icinga/images/logos/hardware/Cisco1600p.gif
+usr/share/icinga/images/logos/hardware/Cisco1600p.jpg
+usr/share/icinga/images/logos/hardware/Cisco1600p.png
+usr/share/icinga/images/logos/hardware/Cisco1720.gif
+usr/share/icinga/images/logos/hardware/Cisco1720.jpg
+usr/share/icinga/images/logos/hardware/Cisco1720.png
+usr/share/icinga/images/logos/hardware/Cisco1720p.gif
+usr/share/icinga/images/logos/hardware/Cisco1720p.jpg
+usr/share/icinga/images/logos/hardware/Cisco1720p.png
+usr/share/icinga/images/logos/hardware/Cisco2500.gif
+usr/share/icinga/images/logos/hardware/Cisco2500.jpg
+usr/share/icinga/images/logos/hardware/Cisco2500.png
+usr/share/icinga/images/logos/hardware/Cisco2500p.gif
+usr/share/icinga/images/logos/hardware/Cisco2500p.jpg
+usr/share/icinga/images/logos/hardware/Cisco2500p.png
+usr/share/icinga/images/logos/hardware/Cisco2600.gif
+usr/share/icinga/images/logos/hardware/Cisco2600.jpg
+usr/share/icinga/images/logos/hardware/Cisco2600.png
+usr/share/icinga/images/logos/hardware/Cisco2600p.gd2
+usr/share/icinga/images/logos/hardware/Cisco2600p.gif
+usr/share/icinga/images/logos/hardware/Cisco2600p.jpg
+usr/share/icinga/images/logos/hardware/Cisco2600p.png
+usr/share/icinga/images/logos/hardware/Cisco4500.gif
+usr/share/icinga/images/logos/hardware/Cisco4500.jpg
+usr/share/icinga/images/logos/hardware/Cisco4500.png
+usr/share/icinga/images/logos/hardware/Cisco4500p.gif
+usr/share/icinga/images/logos/hardware/Cisco4500p.jpg
+usr/share/icinga/images/logos/hardware/Cisco4500p.png
+usr/share/icinga/images/logos/hardware/ClariionFC4700.gif
+usr/share/icinga/images/logos/hardware/ClariionFC4700.jpg
+usr/share/icinga/images/logos/hardware/ClariionFC4700.png
+usr/share/icinga/images/logos/hardware/ClariionFC4700p.gif
+usr/share/icinga/images/logos/hardware/ClariionFC4700p.jpg
+usr/share/icinga/images/logos/hardware/ClariionFC4700p.png
+usr/share/icinga/images/logos/hardware/Compaq_EXD.gif
+usr/share/icinga/images/logos/hardware/Compaq_EXD.jpg
+usr/share/icinga/images/logos/hardware/Compaq_EXD.png
+usr/share/icinga/images/logos/hardware/Compaq_EXDs.gif
+usr/share/icinga/images/logos/hardware/Compaq_EXDs.jpg
+usr/share/icinga/images/logos/hardware/Compaq_EXDs.png
+usr/share/icinga/images/logos/hardware/Compaq_Pro_1600.gif
+usr/share/icinga/images/logos/hardware/Compaq_Pro_1600.jpg
+usr/share/icinga/images/logos/hardware/Compaq_Pro_1600.png
+usr/share/icinga/images/logos/hardware/Compaq_Pro_1600p.gif
+usr/share/icinga/images/logos/hardware/Compaq_Pro_1600p.jpg
+usr/share/icinga/images/logos/hardware/Compaq_Pro_1600p.png
+usr/share/icinga/images/logos/hardware/Compaq_Pro_5500.gif
+usr/share/icinga/images/logos/hardware/Compaq_Pro_5500.jpg
+usr/share/icinga/images/logos/hardware/Compaq_Pro_5500.png
+usr/share/icinga/images/logos/hardware/Compaq_Pro_5500p.gif
+usr/share/icinga/images/logos/hardware/Compaq_Pro_5500p.jpg
+usr/share/icinga/images/logos/hardware/Compaq_Pro_5500p.png
+usr/share/icinga/images/logos/hardware/Compaq_pc_EXD.gif
+usr/share/icinga/images/logos/hardware/Compaq_pc_EXD.jpg
+usr/share/icinga/images/logos/hardware/Compaq_pc_EXD.png
+usr/share/icinga/images/logos/hardware/Compaq_pc_EXDp.gif
+usr/share/icinga/images/logos/hardware/Compaq_pc_EXDp.jpg
+usr/share/icinga/images/logos/hardware/Compaq_pc_EXDp.png
+usr/share/icinga/images/logos/hardware/Dell_1650.gif
+usr/share/icinga/images/logos/hardware/Dell_1650.jpg
+usr/share/icinga/images/logos/hardware/Dell_1650.png
+usr/share/icinga/images/logos/hardware/Dell_1650p.gif
+usr/share/icinga/images/logos/hardware/Dell_1650p.jpg
+usr/share/icinga/images/logos/hardware/Dell_1650p.png
+usr/share/icinga/images/logos/hardware/HPdj2200.gif
+usr/share/icinga/images/logos/hardware/HPdj2200.jpg
+usr/share/icinga/images/logos/hardware/HPdj2200.png
+usr/share/icinga/images/logos/hardware/HPdj2200p.gif
+usr/share/icinga/images/logos/hardware/HPdj2200p.jpg
+usr/share/icinga/images/logos/hardware/HPdj2200p.png
+usr/share/icinga/images/logos/hardware/HPdj2500.gif
+usr/share/icinga/images/logos/hardware/HPdj2500.jpg
+usr/share/icinga/images/logos/hardware/HPdj2500.png
+usr/share/icinga/images/logos/hardware/HPdj2500p.gif
+usr/share/icinga/images/logos/hardware/HPdj2500p.jpg
+usr/share/icinga/images/logos/hardware/HPdj2500p.png
+usr/share/icinga/images/logos/hardware/HPlj4550.gif
+usr/share/icinga/images/logos/hardware/HPlj4550.jpg
+usr/share/icinga/images/logos/hardware/HPlj4550.png
+usr/share/icinga/images/logos/hardware/HPlj4550p.gif
+usr/share/icinga/images/logos/hardware/HPlj4550p.jpg
+usr/share/icinga/images/logos/hardware/HPlj4550p.png
+usr/share/icinga/images/logos/hardware/HPlj5000.gif
+usr/share/icinga/images/logos/hardware/HPlj5000.jpg
+usr/share/icinga/images/logos/hardware/HPlj5000.png
+usr/share/icinga/images/logos/hardware/HPlj5000p.gif
+usr/share/icinga/images/logos/hardware/HPlj5000p.jpg
+usr/share/icinga/images/logos/hardware/HPlj5000p.png
+usr/share/icinga/images/logos/hardware/HPlj8500.gif
+usr/share/icinga/images/logos/hardware/HPlj8500.jpg
+usr/share/icinga/images/logos/hardware/HPlj8500.png
+usr/share/icinga/images/logos/hardware/HPlj8500p.gif
+usr/share/icinga/images/logos/hardware/HPlj8500p.jpg
+usr/share/icinga/images/logos/hardware/HPlj8500p.png
+usr/share/icinga/images/logos/hardware/HPvectraXe320.gif
+usr/share/icinga/images/logos/hardware/HPvectraXe320.jpg
+usr/share/icinga/images/logos/hardware/HPvectraXe320.png
+usr/share/icinga/images/logos/hardware/HPvectraXe320p.gif
+usr/share/icinga/images/logos/hardware/HPvectraXe320p.jpg
+usr/share/icinga/images/logos/hardware/HPvectraXe320p.png
+usr/share/icinga/images/logos/hardware/Nokia_IP440.gif
+usr/share/icinga/images/logos/hardware/Nokia_IP440.jpg
+usr/share/icinga/images/logos/hardware/Nokia_IP440.png
+usr/share/icinga/images/logos/hardware/Nokia_IP440p.gif
+usr/share/icinga/images/logos/hardware/Nokia_IP440p.jpg
+usr/share/icinga/images/logos/hardware/Nokia_IP440p.png
+usr/share/icinga/images/logos/hardware/OptraC710.gif
+usr/share/icinga/images/logos/hardware/OptraC710.jpg
+usr/share/icinga/images/logos/hardware/OptraC710.png
+usr/share/icinga/images/logos/hardware/OptraC710p.gif
+usr/share/icinga/images/logos/hardware/OptraC710p.jpg
+usr/share/icinga/images/logos/hardware/OptraC710p.png
+usr/share/icinga/images/logos/hardware/OptraC750.gif
+usr/share/icinga/images/logos/hardware/OptraC750.jpg
+usr/share/icinga/images/logos/hardware/OptraC750.png
+usr/share/icinga/images/logos/hardware/OptraC750p.gif
+usr/share/icinga/images/logos/hardware/OptraC750p.jpg
+usr/share/icinga/images/logos/hardware/OptraC750p.png
+usr/share/icinga/images/logos/hardware/SunE450.gif
+usr/share/icinga/images/logos/hardware/SunE450.jpg
+usr/share/icinga/images/logos/hardware/SunE450.png
+usr/share/icinga/images/logos/hardware/SunE4500.gif
+usr/share/icinga/images/logos/hardware/SunE4500.jpg
+usr/share/icinga/images/logos/hardware/SunE4500.png
+usr/share/icinga/images/logos/hardware/SunE4500p.gif
+usr/share/icinga/images/logos/hardware/SunE4500p.jpg
+usr/share/icinga/images/logos/hardware/SunE4500p.png
+usr/share/icinga/images/logos/hardware/SunE450p.gif
+usr/share/icinga/images/logos/hardware/SunE450p.jpg
+usr/share/icinga/images/logos/hardware/SunE450p.png
+usr/share/icinga/images/logos/hardware/SunU5.gif
+usr/share/icinga/images/logos/hardware/SunU5.jpg
+usr/share/icinga/images/logos/hardware/SunU5.png
+usr/share/icinga/images/logos/hardware/SunU5p.gif
+usr/share/icinga/images/logos/hardware/SunU5p.jpg
+usr/share/icinga/images/logos/hardware/SunU5p.png
+usr/share/icinga/images/logos/hardware/SunV880.gif
+usr/share/icinga/images/logos/hardware/SunV880.jpg
+usr/share/icinga/images/logos/hardware/SunV880.png
+usr/share/icinga/images/logos/hardware/SunV880p.gif
+usr/share/icinga/images/logos/hardware/SunV880p.jpg
+usr/share/icinga/images/logos/hardware/SunV880p.png
+usr/share/icinga/images/logos/hardware/TCEricoh1015.gif
+usr/share/icinga/images/logos/hardware/TCEricoh1015.jpg
+usr/share/icinga/images/logos/hardware/TCEricoh1015.png
+usr/share/icinga/images/logos/hardware/TCEricoh1015p.gif
+usr/share/icinga/images/logos/hardware/TCEricoh1015p.jpg
+usr/share/icinga/images/logos/hardware/TCEricoh1015p.png
+usr/share/icinga/images/logos/hardware/Tektronix750.gif
+usr/share/icinga/images/logos/hardware/Tektronix750.jpg
+usr/share/icinga/images/logos/hardware/Tektronix750.png
+usr/share/icinga/images/logos/hardware/Tektronix750p.gif
+usr/share/icinga/images/logos/hardware/Tektronix750p.jpg
+usr/share/icinga/images/logos/hardware/Tektronix750p.png
+usr/share/icinga/images/logos/hardware/airo350.gd2
+usr/share/icinga/images/logos/hardware/airo350.gif
+usr/share/icinga/images/logos/hardware/airo350.jpg
+usr/share/icinga/images/logos/hardware/airo350.png
+usr/share/icinga/images/logos/hardware/cat1900.gd2
+usr/share/icinga/images/logos/hardware/cat2900.gd2
+usr/share/icinga/images/logos/hardware/cat3500.gd2
+usr/share/icinga/images/logos/hardware/cat3500.gif
+usr/share/icinga/images/logos/hardware/cat3500.jpg
+usr/share/icinga/images/logos/hardware/cat3500.png
+usr/share/icinga/images/logos/hardware/cat5000.gd2
+usr/share/icinga/images/logos/hardware/codin9000.gif
+usr/share/icinga/images/logos/hardware/codin9000.jpg
+usr/share/icinga/images/logos/hardware/codin9000.png
+usr/share/icinga/images/logos/hardware/codin9000p.gif
+usr/share/icinga/images/logos/hardware/codin9000p.jpg
+usr/share/icinga/images/logos/hardware/codin9000p.png
+usr/share/icinga/images/logos/hardware/hp-printer40.gd2
+usr/share/icinga/images/logos/hardware/hp-printer40.gif
+usr/share/icinga/images/logos/hardware/hp-printer40.jpg
+usr/share/icinga/images/logos/hardware/hp-printer40.png
+usr/share/icinga/images/logos/hardware/hp5000.gif
+usr/share/icinga/images/logos/hardware/hp5000.jpg
+usr/share/icinga/images/logos/hardware/hp5000.png
+usr/share/icinga/images/logos/hardware/ng-switch40.gd2
+usr/share/icinga/images/logos/hardware/ng-switch40.gif
+usr/share/icinga/images/logos/hardware/ng-switch40.jpg
+usr/share/icinga/images/logos/hardware/ng-switch40.png
+usr/share/icinga/images/logos/hardware/router40.gd2
+usr/share/icinga/images/logos/hardware/router40.gif
+usr/share/icinga/images/logos/hardware/router40.jpg
+usr/share/icinga/images/logos/hardware/router40.png
+usr/share/icinga/images/logos/hardware/server.png
+usr/share/icinga/images/logos/hardware/switch40.gd2
+usr/share/icinga/images/logos/hardware/switch40.gif
+usr/share/icinga/images/logos/hardware/switch40.jpg
+usr/share/icinga/images/logos/hardware/switch40.png
+usr/share/icinga/images/logos/icinga.gd2
+usr/share/icinga/images/logos/icinga.gif
+usr/share/icinga/images/logos/icingavrml.png
+usr/share/icinga/images/logos/other
+usr/share/icinga/images/logos/other/1.gd2
+usr/share/icinga/images/logos/other/1.gif
+usr/share/icinga/images/logos/other/1.png
+usr/share/icinga/images/logos/other/2.gd2
+usr/share/icinga/images/logos/other/2.gif
+usr/share/icinga/images/logos/other/2.png
+usr/share/icinga/images/logos/other/3.gd2
+usr/share/icinga/images/logos/other/3.gif
+usr/share/icinga/images/logos/other/3.png
+usr/share/icinga/images/logos/other/4.gd2
+usr/share/icinga/images/logos/other/4.gif
+usr/share/icinga/images/logos/other/4.png
+usr/share/icinga/images/logos/other/5.gd2
+usr/share/icinga/images/logos/other/5.gif
+usr/share/icinga/images/logos/other/5.png
+usr/share/icinga/images/logos/other/bluetooth.png
+usr/share/icinga/images/logos/other/burst.gd2
+usr/share/icinga/images/logos/other/burst.gif
+usr/share/icinga/images/logos/other/burst.png
+usr/share/icinga/images/logos/other/community.gd2
+usr/share/icinga/images/logos/other/community.gif
+usr/share/icinga/images/logos/other/community.png
+usr/share/icinga/images/logos/other/community2.gd2
+usr/share/icinga/images/logos/other/community2.gif
+usr/share/icinga/images/logos/other/community2.png
+usr/share/icinga/images/logos/other/crashed_node.gd2
+usr/share/icinga/images/logos/other/crashed_node.gif
+usr/share/icinga/images/logos/other/crashed_node.png
+usr/share/icinga/images/logos/other/exchange.gd2
+usr/share/icinga/images/logos/other/exchange.gif
+usr/share/icinga/images/logos/other/exchange.png
+usr/share/icinga/images/logos/other/eye.gd2
+usr/share/icinga/images/logos/other/eye.gif
+usr/share/icinga/images/logos/other/eye.png
+usr/share/icinga/images/logos/other/flow.gd2
+usr/share/icinga/images/logos/other/flow.gif
+usr/share/icinga/images/logos/other/flow.png
+usr/share/icinga/images/logos/other/garbage_collection.gd2
+usr/share/icinga/images/logos/other/garbage_collection.gif
+usr/share/icinga/images/logos/other/garbage_collection.png
+usr/share/icinga/images/logos/other/globe.gd2
+usr/share/icinga/images/logos/other/globe.gif
+usr/share/icinga/images/logos/other/globe.png
+usr/share/icinga/images/logos/other/globe2.gd2
+usr/share/icinga/images/logos/other/globe2.gif
+usr/share/icinga/images/logos/other/globe2.png
+usr/share/icinga/images/logos/other/globe3.gd2
+usr/share/icinga/images/logos/other/globe3.gif
+usr/share/icinga/images/logos/other/globe3.png
+usr/share/icinga/images/logos/other/globe4.gd2
+usr/share/icinga/images/logos/other/globe4.gif
+usr/share/icinga/images/logos/other/globe4.png
+usr/share/icinga/images/logos/other/globe5.gd2
+usr/share/icinga/images/logos/other/globe5.gif
+usr/share/icinga/images/logos/other/globe5.png
+usr/share/icinga/images/logos/other/globe6.png
+usr/share/icinga/images/logos/other/happy_user.gd2
+usr/share/icinga/images/logos/other/happy_user.gif
+usr/share/icinga/images/logos/other/happy_user.png
+usr/share/icinga/images/logos/other/heartbeat.gd2
+usr/share/icinga/images/logos/other/heartbeat.gif
+usr/share/icinga/images/logos/other/heartbeat.png
+usr/share/icinga/images/logos/other/heartbeat2.gd2
+usr/share/icinga/images/logos/other/heartbeat2.gif
+usr/share/icinga/images/logos/other/heartbeat2.png
+usr/share/icinga/images/logos/other/home.gd2
+usr/share/icinga/images/logos/other/home.gif
+usr/share/icinga/images/logos/other/home.png
+usr/share/icinga/images/logos/other/home2.gd2
+usr/share/icinga/images/logos/other/home2.gif
+usr/share/icinga/images/logos/other/home2.png
+usr/share/icinga/images/logos/other/hotspot.gd2
+usr/share/icinga/images/logos/other/hotspot.gif
+usr/share/icinga/images/logos/other/hotspot.png
+usr/share/icinga/images/logos/other/information.gd2
+usr/share/icinga/images/logos/other/information.gif
+usr/share/icinga/images/logos/other/information.png
+usr/share/icinga/images/logos/other/interconnect.gd2
+usr/share/icinga/images/logos/other/interconnect.gif
+usr/share/icinga/images/logos/other/interconnect.png
+usr/share/icinga/images/logos/other/internet.gd2
+usr/share/icinga/images/logos/other/internet.gif
+usr/share/icinga/images/logos/other/internet_route.gd2
+usr/share/icinga/images/logos/other/internet_route.gif
+usr/share/icinga/images/logos/other/internet_route.png
+usr/share/icinga/images/logos/other/internet_route2.gd2
+usr/share/icinga/images/logos/other/internet_route2.gif
+usr/share/icinga/images/logos/other/internet_route2.png
+usr/share/icinga/images/logos/other/intrusion.gd2
+usr/share/icinga/images/logos/other/intrusion.gif
+usr/share/icinga/images/logos/other/intrusion.png
+usr/share/icinga/images/logos/other/long_distance.gd2
+usr/share/icinga/images/logos/other/long_distance.gif
+usr/share/icinga/images/logos/other/long_distance.png
+usr/share/icinga/images/logos/other/measurement.gd2
+usr/share/icinga/images/logos/other/measurement.gif
+usr/share/icinga/images/logos/other/measurement.png
+usr/share/icinga/images/logos/other/node.gd2
+usr/share/icinga/images/logos/other/node.gif
+usr/share/icinga/images/logos/other/node.png
+usr/share/icinga/images/logos/other/remote.gd2
+usr/share/icinga/images/logos/other/remote.gif
+usr/share/icinga/images/logos/other/remote.png
+usr/share/icinga/images/logos/other/scripting.gd2
+usr/share/icinga/images/logos/other/scripting.gif
+usr/share/icinga/images/logos/other/scripting.png
+usr/share/icinga/images/logos/other/slice.gd2
+usr/share/icinga/images/logos/other/slice.gif
+usr/share/icinga/images/logos/other/slice.png
+usr/share/icinga/images/logos/other/snag.gd2
+usr/share/icinga/images/logos/other/snag.gif
+usr/share/icinga/images/logos/other/snag.png
+usr/share/icinga/images/logos/other/star.gd2
+usr/share/icinga/images/logos/other/star.gif
+usr/share/icinga/images/logos/other/star.png
+usr/share/icinga/images/logos/other/tag1.gd2
+usr/share/icinga/images/logos/other/tag1.gif
+usr/share/icinga/images/logos/other/tag1.png
+usr/share/icinga/images/logos/other/tag2.gd2
+usr/share/icinga/images/logos/other/tag2.gif
+usr/share/icinga/images/logos/other/tag2.png
+usr/share/icinga/images/logos/other/tag3.gd2
+usr/share/icinga/images/logos/other/tag3.gif
+usr/share/icinga/images/logos/other/tag3.png
+usr/share/icinga/images/logos/other/tag4.gd2
+usr/share/icinga/images/logos/other/tag4.gif
+usr/share/icinga/images/logos/other/tag4.png
+usr/share/icinga/images/logos/other/tokens.gd2
+usr/share/icinga/images/logos/other/tokens.gif
+usr/share/icinga/images/logos/other/tokens.png
+usr/share/icinga/images/logos/other/trusted.gd2
+usr/share/icinga/images/logos/other/trusted.gif
+usr/share/icinga/images/logos/other/trusted.png
+usr/share/icinga/images/logos/other/untrusted.gd2
+usr/share/icinga/images/logos/other/untrusted.gif
+usr/share/icinga/images/logos/other/untrusted.png
+usr/share/icinga/images/logos/other/uplink.gd2
+usr/share/icinga/images/logos/other/uplink.gif
+usr/share/icinga/images/logos/other/uplink.png
+usr/share/icinga/images/logos/other/user.gd2
+usr/share/icinga/images/logos/other/user.gif
+usr/share/icinga/images/logos/other/user.png
+usr/share/icinga/images/logos/other/user2.gd2
+usr/share/icinga/images/logos/other/user2.gif
+usr/share/icinga/images/logos/other/user2.png
+usr/share/icinga/images/logos/other/user3.gd2
+usr/share/icinga/images/logos/other/user3.gif
+usr/share/icinga/images/logos/other/user3.png
+usr/share/icinga/images/logos/other/utils.gd2
+usr/share/icinga/images/logos/other/utils.gif
+usr/share/icinga/images/logos/other/utils.png
+usr/share/icinga/images/logos/other/utils2.gd2
+usr/share/icinga/images/logos/other/utils2.gif
+usr/share/icinga/images/logos/other/utils2.png
+usr/share/icinga/images/logos/other/utils3.gd2
+usr/share/icinga/images/logos/other/utils3.gif
+usr/share/icinga/images/logos/other/utils3.png
+usr/share/icinga/images/logos/other/warning.gd2
+usr/share/icinga/images/logos/other/warning.gif
+usr/share/icinga/images/logos/other/warning.png
+usr/share/icinga/images/logos/other/warning2.gd2
+usr/share/icinga/images/logos/other/warning2.gif
+usr/share/icinga/images/logos/other/warning2.png
+usr/share/icinga/images/logos/other/whirl.gd2
+usr/share/icinga/images/logos/other/whirl.gif
+usr/share/icinga/images/logos/other/whirl.png
+usr/share/icinga/images/logos/printer.png
+usr/share/icinga/images/logos/router.png
+usr/share/icinga/images/logos/s.gif
+usr/share/icinga/images/logos/switch.png
+usr/share/icinga/images/logos/unknown.gd2
+usr/share/icinga/images/logos/unknown.gif
+usr/share/icinga/images/logos/vendors
+usr/share/icinga/images/logos/vendors/3com.gd2
+usr/share/icinga/images/logos/vendors/3com.gif
+usr/share/icinga/images/logos/vendors/3com.png
+usr/share/icinga/images/logos/vendors/3com2.gd2
+usr/share/icinga/images/logos/vendors/3com2.gif
+usr/share/icinga/images/logos/vendors/3com2.png
+usr/share/icinga/images/logos/vendors/9lives.gd2
+usr/share/icinga/images/logos/vendors/9lives.jpg
+usr/share/icinga/images/logos/vendors/9lives.png
+usr/share/icinga/images/logos/vendors/LVS.gif
+usr/share/icinga/images/logos/vendors/LVS.jpg
+usr/share/icinga/images/logos/vendors/LVS.png
+usr/share/icinga/images/logos/vendors/LVSp.gif
+usr/share/icinga/images/logos/vendors/LVSp.jpg
+usr/share/icinga/images/logos/vendors/LVSp.png
+usr/share/icinga/images/logos/vendors/UT-icon.png
+usr/share/icinga/images/logos/vendors/acer.gd2
+usr/share/icinga/images/logos/vendors/acer.gif
+usr/share/icinga/images/logos/vendors/acer.png
+usr/share/icinga/images/logos/vendors/adobe.gd2
+usr/share/icinga/images/logos/vendors/adobe.gif
+usr/share/icinga/images/logos/vendors/adobe.png
+usr/share/icinga/images/logos/vendors/adobe2.gd2
+usr/share/icinga/images/logos/vendors/adobe2.gif
+usr/share/icinga/images/logos/vendors/adobe2.png
+usr/share/icinga/images/logos/vendors/agilent.gd2
+usr/share/icinga/images/logos/vendors/agilent.gif
+usr/share/icinga/images/logos/vendors/agilent.png
+usr/share/icinga/images/logos/vendors/aix.gd2
+usr/share/icinga/images/logos/vendors/aix.gif
+usr/share/icinga/images/logos/vendors/aix.png
+usr/share/icinga/images/logos/vendors/aix2.gd2
+usr/share/icinga/images/logos/vendors/aix2.gif
+usr/share/icinga/images/logos/vendors/aix2.jpg
+usr/share/icinga/images/logos/vendors/aix2.png
+usr/share/icinga/images/logos/vendors/alcatel.gd2
+usr/share/icinga/images/logos/vendors/alcatel.gif
+usr/share/icinga/images/logos/vendors/alcatel.png
+usr/share/icinga/images/logos/vendors/allied.gd2
+usr/share/icinga/images/logos/vendors/allied.gif
+usr/share/icinga/images/logos/vendors/allied.png
+usr/share/icinga/images/logos/vendors/amd.gd2
+usr/share/icinga/images/logos/vendors/amd.gif
+usr/share/icinga/images/logos/vendors/amd.png
+usr/share/icinga/images/logos/vendors/amd2.gd2
+usr/share/icinga/images/logos/vendors/amd2.gif
+usr/share/icinga/images/logos/vendors/amd2.png
+usr/share/icinga/images/logos/vendors/amiga.gd2
+usr/share/icinga/images/logos/vendors/amiga.gif
+usr/share/icinga/images/logos/vendors/amiga.png
+usr/share/icinga/images/logos/vendors/amiga2.gd2
+usr/share/icinga/images/logos/vendors/amiga2.gif
+usr/share/icinga/images/logos/vendors/amiga2.jpg
+usr/share/icinga/images/logos/vendors/amiga2.png
+usr/share/icinga/images/logos/vendors/amstrad.gd2
+usr/share/icinga/images/logos/vendors/amstrad.gif
+usr/share/icinga/images/logos/vendors/amstrad.png
+usr/share/icinga/images/logos/vendors/apache.gd2
+usr/share/icinga/images/logos/vendors/apache.gif
+usr/share/icinga/images/logos/vendors/apache.png
+usr/share/icinga/images/logos/vendors/apc.gd2
+usr/share/icinga/images/logos/vendors/apc.gif
+usr/share/icinga/images/logos/vendors/apc.png
+usr/share/icinga/images/logos/vendors/apple.gd2
+usr/share/icinga/images/logos/vendors/apple.gif
+usr/share/icinga/images/logos/vendors/apple.png
+usr/share/icinga/images/logos/vendors/apple2.gd2
+usr/share/icinga/images/logos/vendors/apple2.gif
+usr/share/icinga/images/logos/vendors/apple2.png
+usr/share/icinga/images/logos/vendors/apple3.gd2
+usr/share/icinga/images/logos/vendors/apple3.gif
+usr/share/icinga/images/logos/vendors/apple3.png
+usr/share/icinga/images/logos/vendors/apple4.gd2
+usr/share/icinga/images/logos/vendors/apple4.gif
+usr/share/icinga/images/logos/vendors/apple4.jpg
+usr/share/icinga/images/logos/vendors/apple4.png
+usr/share/icinga/images/logos/vendors/asmax.gd2
+usr/share/icinga/images/logos/vendors/asmax.gif
+usr/share/icinga/images/logos/vendors/asmax.png
+usr/share/icinga/images/logos/vendors/asterisk.gd2
+usr/share/icinga/images/logos/vendors/asterisk.gif
+usr/share/icinga/images/logos/vendors/asterisk.png
+usr/share/icinga/images/logos/vendors/asus.gd2
+usr/share/icinga/images/logos/vendors/asus.gif
+usr/share/icinga/images/logos/vendors/asus.png
+usr/share/icinga/images/logos/vendors/atandt.gd2
+usr/share/icinga/images/logos/vendors/atandt.gif
+usr/share/icinga/images/logos/vendors/atandt.png
+usr/share/icinga/images/logos/vendors/atari.gd2
+usr/share/icinga/images/logos/vendors/atari.gif
+usr/share/icinga/images/logos/vendors/atari.png
+usr/share/icinga/images/logos/vendors/benq.gd2
+usr/share/icinga/images/logos/vendors/benq.gif
+usr/share/icinga/images/logos/vendors/benq.png
+usr/share/icinga/images/logos/vendors/beos.gd2
+usr/share/icinga/images/logos/vendors/beos.gif
+usr/share/icinga/images/logos/vendors/beos.jpg
+usr/share/icinga/images/logos/vendors/beos.png
+usr/share/icinga/images/logos/vendors/bosch.gd2
+usr/share/icinga/images/logos/vendors/bosch.gif
+usr/share/icinga/images/logos/vendors/bosch.png
+usr/share/icinga/images/logos/vendors/bosch2.gd2
+usr/share/icinga/images/logos/vendors/bosch2.gif
+usr/share/icinga/images/logos/vendors/bosch2.png
+usr/share/icinga/images/logos/vendors/broadcom.gd2
+usr/share/icinga/images/logos/vendors/broadcom.gif
+usr/share/icinga/images/logos/vendors/broadcom.png
+usr/share/icinga/images/logos/vendors/caldera.gd2
+usr/share/icinga/images/logos/vendors/caldera.gif
+usr/share/icinga/images/logos/vendors/caldera.jpg
+usr/share/icinga/images/logos/vendors/caldera.png
+usr/share/icinga/images/logos/vendors/canon.gd2
+usr/share/icinga/images/logos/vendors/canon.gif
+usr/share/icinga/images/logos/vendors/canon.png
+usr/share/icinga/images/logos/vendors/canyon.gd2
+usr/share/icinga/images/logos/vendors/canyon.gif
+usr/share/icinga/images/logos/vendors/canyon.png
+usr/share/icinga/images/logos/vendors/centos.gd2
+usr/share/icinga/images/logos/vendors/centos.gif
+usr/share/icinga/images/logos/vendors/centos.png
+usr/share/icinga/images/logos/vendors/centos2.gd2
+usr/share/icinga/images/logos/vendors/centos2.png
+usr/share/icinga/images/logos/vendors/cisco.gd2
+usr/share/icinga/images/logos/vendors/cisco.gif
+usr/share/icinga/images/logos/vendors/cisco.png
+usr/share/icinga/images/logos/vendors/cisco2.gd2
+usr/share/icinga/images/logos/vendors/cisco2.gif
+usr/share/icinga/images/logos/vendors/cisco2.png
+usr/share/icinga/images/logos/vendors/cisco3.gd2
+usr/share/icinga/images/logos/vendors/cisco3.gif
+usr/share/icinga/images/logos/vendors/cisco3.png
+usr/share/icinga/images/logos/vendors/citrix.gd2
+usr/share/icinga/images/logos/vendors/citrix.gif
+usr/share/icinga/images/logos/vendors/citrix.png
+usr/share/icinga/images/logos/vendors/citrix2.gd2
+usr/share/icinga/images/logos/vendors/citrix2.gif
+usr/share/icinga/images/logos/vendors/citrix2.jpg
+usr/share/icinga/images/logos/vendors/citrix2.png
+usr/share/icinga/images/logos/vendors/commodore.gd2
+usr/share/icinga/images/logos/vendors/commodore.gif
+usr/share/icinga/images/logos/vendors/commodore.png
+usr/share/icinga/images/logos/vendors/compaq.gd2
+usr/share/icinga/images/logos/vendors/compaq.gif
+usr/share/icinga/images/logos/vendors/compaq.png
+usr/share/icinga/images/logos/vendors/conexant.gd2
+usr/share/icinga/images/logos/vendors/conexant.gif
+usr/share/icinga/images/logos/vendors/conexant.png
+usr/share/icinga/images/logos/vendors/dbase.gd2
+usr/share/icinga/images/logos/vendors/dbase.gif
+usr/share/icinga/images/logos/vendors/dbase.png
+usr/share/icinga/images/logos/vendors/debian.gd2
+usr/share/icinga/images/logos/vendors/debian.gif
+usr/share/icinga/images/logos/vendors/debian.png
+usr/share/icinga/images/logos/vendors/debian2.gd2
+usr/share/icinga/images/logos/vendors/debian2.gif
+usr/share/icinga/images/logos/vendors/debian2.jpg
+usr/share/icinga/images/logos/vendors/debian2.png
+usr/share/icinga/images/logos/vendors/dell.gd2
+usr/share/icinga/images/logos/vendors/dell.gif
+usr/share/icinga/images/logos/vendors/dell.png
+usr/share/icinga/images/logos/vendors/dell2.gd2
+usr/share/icinga/images/logos/vendors/dell2.gif
+usr/share/icinga/images/logos/vendors/dell2.png
+usr/share/icinga/images/logos/vendors/digital.gd2
+usr/share/icinga/images/logos/vendors/digital.gif
+usr/share/icinga/images/logos/vendors/digital.png
+usr/share/icinga/images/logos/vendors/dlink.gd2
+usr/share/icinga/images/logos/vendors/dlink.gif
+usr/share/icinga/images/logos/vendors/dlink.png
+usr/share/icinga/images/logos/vendors/dos.gd2
+usr/share/icinga/images/logos/vendors/dos.gif
+usr/share/icinga/images/logos/vendors/dos.png
+usr/share/icinga/images/logos/vendors/dos2.gd2
+usr/share/icinga/images/logos/vendors/dos2.gif
+usr/share/icinga/images/logos/vendors/dos2.png
+usr/share/icinga/images/logos/vendors/edimax.gd2
+usr/share/icinga/images/logos/vendors/edimax.gif
+usr/share/icinga/images/logos/vendors/edimax.png
+usr/share/icinga/images/logos/vendors/epson.gd2
+usr/share/icinga/images/logos/vendors/epson.gif
+usr/share/icinga/images/logos/vendors/epson.png
+usr/share/icinga/images/logos/vendors/ericsson.gd2
+usr/share/icinga/images/logos/vendors/ericsson.gif
+usr/share/icinga/images/logos/vendors/ericsson.png
+usr/share/icinga/images/logos/vendors/ericsson2.gd2
+usr/share/icinga/images/logos/vendors/ericsson2.gif
+usr/share/icinga/images/logos/vendors/ericsson2.png
+usr/share/icinga/images/logos/vendors/etherwerx.gd2
+usr/share/icinga/images/logos/vendors/etherwerx.gif
+usr/share/icinga/images/logos/vendors/etherwerx.png
+usr/share/icinga/images/logos/vendors/fedora.gd2
+usr/share/icinga/images/logos/vendors/fedora.gif
+usr/share/icinga/images/logos/vendors/fedora.png
+usr/share/icinga/images/logos/vendors/freebsd.gd2
+usr/share/icinga/images/logos/vendors/freebsd.gif
+usr/share/icinga/images/logos/vendors/freebsd.png
+usr/share/icinga/images/logos/vendors/freebsd2.gd2
+usr/share/icinga/images/logos/vendors/freebsd2.gif
+usr/share/icinga/images/logos/vendors/freebsd2.png
+usr/share/icinga/images/logos/vendors/freebsd40.gd2
+usr/share/icinga/images/logos/vendors/freebsd40.gif
+usr/share/icinga/images/logos/vendors/freebsd40.jpg
+usr/share/icinga/images/logos/vendors/freebsd40.png
+usr/share/icinga/images/logos/vendors/freenas.gd2
+usr/share/icinga/images/logos/vendors/freenas.gif
+usr/share/icinga/images/logos/vendors/freenas.png
+usr/share/icinga/images/logos/vendors/fujitsu.gd2
+usr/share/icinga/images/logos/vendors/fujitsu.gif
+usr/share/icinga/images/logos/vendors/fujitsu.png
+usr/share/icinga/images/logos/vendors/gentoo.gd2
+usr/share/icinga/images/logos/vendors/gentoo.gif
+usr/share/icinga/images/logos/vendors/gentoo.png
+usr/share/icinga/images/logos/vendors/hp-ux.gd2
+usr/share/icinga/images/logos/vendors/hp-ux.gif
+usr/share/icinga/images/logos/vendors/hp-ux.png
+usr/share/icinga/images/logos/vendors/hp-ux2.gd2
+usr/share/icinga/images/logos/vendors/hp-ux2.gif
+usr/share/icinga/images/logos/vendors/hp-ux2.jpg
+usr/share/icinga/images/logos/vendors/hp-ux2.png
+usr/share/icinga/images/logos/vendors/hp.gd2
+usr/share/icinga/images/logos/vendors/hp.gif
+usr/share/icinga/images/logos/vendors/hp.png
+usr/share/icinga/images/logos/vendors/hp2.gd2
+usr/share/icinga/images/logos/vendors/hp2.gif
+usr/share/icinga/images/logos/vendors/hp2.png
+usr/share/icinga/images/logos/vendors/iana.gd2
+usr/share/icinga/images/logos/vendors/iana.gif
+usr/share/icinga/images/logos/vendors/iana.png
+usr/share/icinga/images/logos/vendors/ibm.gd2
+usr/share/icinga/images/logos/vendors/ibm.gif
+usr/share/icinga/images/logos/vendors/ibm.png
+usr/share/icinga/images/logos/vendors/intel.gd2
+usr/share/icinga/images/logos/vendors/intel.gif
+usr/share/icinga/images/logos/vendors/intel.png
+usr/share/icinga/images/logos/vendors/intel2.gd2
+usr/share/icinga/images/logos/vendors/intel2.gif
+usr/share/icinga/images/logos/vendors/intel2.png
+usr/share/icinga/images/logos/vendors/irix.gd2
+usr/share/icinga/images/logos/vendors/irix.gif
+usr/share/icinga/images/logos/vendors/irix.png
+usr/share/icinga/images/logos/vendors/irix2.gd2
+usr/share/icinga/images/logos/vendors/irix2.gif
+usr/share/icinga/images/logos/vendors/irix2.jpg
+usr/share/icinga/images/logos/vendors/irix2.png
+usr/share/icinga/images/logos/vendors/juniper.gd2
+usr/share/icinga/images/logos/vendors/juniper.gif
+usr/share/icinga/images/logos/vendors/juniper.png
+usr/share/icinga/images/logos/vendors/jvc.gd2
+usr/share/icinga/images/logos/vendors/jvc.gif
+usr/share/icinga/images/logos/vendors/jvc.png
+usr/share/icinga/images/logos/vendors/kodak.gd2
+usr/share/icinga/images/logos/vendors/kodak.gif
+usr/share/icinga/images/logos/vendors/kodak.png
+usr/share/icinga/images/logos/vendors/kodak2.gd2
+usr/share/icinga/images/logos/vendors/kodak2.gif
+usr/share/icinga/images/logos/vendors/kodak2.png
+usr/share/icinga/images/logos/vendors/konica.gd2
+usr/share/icinga/images/logos/vendors/konica.gif
+usr/share/icinga/images/logos/vendors/konica.png
+usr/share/icinga/images/logos/vendors/konica2.gd2
+usr/share/icinga/images/logos/vendors/konica2.gif
+usr/share/icinga/images/logos/vendors/konica2.png
+usr/share/icinga/images/logos/vendors/kyocera.gd2
+usr/share/icinga/images/logos/vendors/kyocera.gif
+usr/share/icinga/images/logos/vendors/kyocera.png
+usr/share/icinga/images/logos/vendors/kyocera2.gd2
+usr/share/icinga/images/logos/vendors/kyocera2.gif
+usr/share/icinga/images/logos/vendors/kyocera2.png
+usr/share/icinga/images/logos/vendors/lexmark.gd2
+usr/share/icinga/images/logos/vendors/lexmark.gif
+usr/share/icinga/images/logos/vendors/lexmark.png
+usr/share/icinga/images/logos/vendors/lg.gd2
+usr/share/icinga/images/logos/vendors/lg.gif
+usr/share/icinga/images/logos/vendors/lg.png
+usr/share/icinga/images/logos/vendors/lg2.gd2
+usr/share/icinga/images/logos/vendors/lg2.gif
+usr/share/icinga/images/logos/vendors/lg2.png
+usr/share/icinga/images/logos/vendors/linksys.gd2
+usr/share/icinga/images/logos/vendors/linksys.gif
+usr/share/icinga/images/logos/vendors/linksys.png
+usr/share/icinga/images/logos/vendors/linux.gd2
+usr/share/icinga/images/logos/vendors/linux.gif
+usr/share/icinga/images/logos/vendors/linux.png
+usr/share/icinga/images/logos/vendors/linux40.gd2
+usr/share/icinga/images/logos/vendors/linux40.gif
+usr/share/icinga/images/logos/vendors/linux40.jpg
+usr/share/icinga/images/logos/vendors/linux40.png
+usr/share/icinga/images/logos/vendors/livebox.gd2
+usr/share/icinga/images/logos/vendors/livebox.gif
+usr/share/icinga/images/logos/vendors/livebox.png
+usr/share/icinga/images/logos/vendors/lucent.gd2
+usr/share/icinga/images/logos/vendors/lucent.gif
+usr/share/icinga/images/logos/vendors/lucent.png
+usr/share/icinga/images/logos/vendors/mac40.gd2
+usr/share/icinga/images/logos/vendors/mac40.gif
+usr/share/icinga/images/logos/vendors/mac40.jpg
+usr/share/icinga/images/logos/vendors/mac40.png
+usr/share/icinga/images/logos/vendors/macos.gd2
+usr/share/icinga/images/logos/vendors/macos.gif
+usr/share/icinga/images/logos/vendors/macos.png
+usr/share/icinga/images/logos/vendors/macos2.gd2
+usr/share/icinga/images/logos/vendors/macos2.gif
+usr/share/icinga/images/logos/vendors/macos2.png
+usr/share/icinga/images/logos/vendors/mandrake.gd2
+usr/share/icinga/images/logos/vendors/mandrake.gif
+usr/share/icinga/images/logos/vendors/mandrake.jpg
+usr/share/icinga/images/logos/vendors/mandrake.png
+usr/share/icinga/images/logos/vendors/mandriva.gd2
+usr/share/icinga/images/logos/vendors/mandriva.gif
+usr/share/icinga/images/logos/vendors/mandriva.png
+usr/share/icinga/images/logos/vendors/microsoft.gd2
+usr/share/icinga/images/logos/vendors/microsoft.gif
+usr/share/icinga/images/logos/vendors/microsoft.png
+usr/share/icinga/images/logos/vendors/mikrotik.gd2
+usr/share/icinga/images/logos/vendors/mikrotik.gif
+usr/share/icinga/images/logos/vendors/mikrotik.png
+usr/share/icinga/images/logos/vendors/mint.gd2
+usr/share/icinga/images/logos/vendors/mint.gif
+usr/share/icinga/images/logos/vendors/mint.png
+usr/share/icinga/images/logos/vendors/monowall.gd2
+usr/share/icinga/images/logos/vendors/monowall.gif
+usr/share/icinga/images/logos/vendors/monowall.png
+usr/share/icinga/images/logos/vendors/monowall2.gd2
+usr/share/icinga/images/logos/vendors/monowall2.gif
+usr/share/icinga/images/logos/vendors/monowall2.png
+usr/share/icinga/images/logos/vendors/motorola.gd2
+usr/share/icinga/images/logos/vendors/motorola.gif
+usr/share/icinga/images/logos/vendors/motorola.png
+usr/share/icinga/images/logos/vendors/motorola2.gd2
+usr/share/icinga/images/logos/vendors/motorola2.gif
+usr/share/icinga/images/logos/vendors/motorola2.png
+usr/share/icinga/images/logos/vendors/nec.gd2
+usr/share/icinga/images/logos/vendors/nec.gif
+usr/share/icinga/images/logos/vendors/nec.png
+usr/share/icinga/images/logos/vendors/netapp.gd2
+usr/share/icinga/images/logos/vendors/netapp.gif
+usr/share/icinga/images/logos/vendors/netapp.jpg
+usr/share/icinga/images/logos/vendors/netapp.png
+usr/share/icinga/images/logos/vendors/netbsd.gd2
+usr/share/icinga/images/logos/vendors/netbsd.gif
+usr/share/icinga/images/logos/vendors/netbsd.png
+usr/share/icinga/images/logos/vendors/netgear.gd2
+usr/share/icinga/images/logos/vendors/netgear.gif
+usr/share/icinga/images/logos/vendors/netgear.png
+usr/share/icinga/images/logos/vendors/next.gd2
+usr/share/icinga/images/logos/vendors/next.gif
+usr/share/icinga/images/logos/vendors/next.jpg
+usr/share/icinga/images/logos/vendors/next.png
+usr/share/icinga/images/logos/vendors/nokia.gd2
+usr/share/icinga/images/logos/vendors/nokia.gif
+usr/share/icinga/images/logos/vendors/nokia.png
+usr/share/icinga/images/logos/vendors/nortel.gd2
+usr/share/icinga/images/logos/vendors/nortel.gif
+usr/share/icinga/images/logos/vendors/nortel.png
+usr/share/icinga/images/logos/vendors/nortel2.gd2
+usr/share/icinga/images/logos/vendors/nortel2.gif
+usr/share/icinga/images/logos/vendors/nortel2.png
+usr/share/icinga/images/logos/vendors/novell.gd2
+usr/share/icinga/images/logos/vendors/novell.gif
+usr/share/icinga/images/logos/vendors/novell.png
+usr/share/icinga/images/logos/vendors/novell40.gd2
+usr/share/icinga/images/logos/vendors/novell40.gif
+usr/share/icinga/images/logos/vendors/novell40.jpg
+usr/share/icinga/images/logos/vendors/novell40.png
+usr/share/icinga/images/logos/vendors/oki.gd2
+usr/share/icinga/images/logos/vendors/oki.gif
+usr/share/icinga/images/logos/vendors/oki.png
+usr/share/icinga/images/logos/vendors/olivetti.gd2
+usr/share/icinga/images/logos/vendors/olivetti.gif
+usr/share/icinga/images/logos/vendors/olivetti.png
+usr/share/icinga/images/logos/vendors/openbsd.gd2
+usr/share/icinga/images/logos/vendors/openbsd.gif
+usr/share/icinga/images/logos/vendors/openbsd.png
+usr/share/icinga/images/logos/vendors/openbsd2.gd2
+usr/share/icinga/images/logos/vendors/openbsd2.gif
+usr/share/icinga/images/logos/vendors/openbsd2.jpg
+usr/share/icinga/images/logos/vendors/openbsd2.png
+usr/share/icinga/images/logos/vendors/oracle.gd2
+usr/share/icinga/images/logos/vendors/oracle.gif
+usr/share/icinga/images/logos/vendors/oracle.png
+usr/share/icinga/images/logos/vendors/orinoco.gd2
+usr/share/icinga/images/logos/vendors/orinoco.gif
+usr/share/icinga/images/logos/vendors/orinoco.png
+usr/share/icinga/images/logos/vendors/os2.gd2
+usr/share/icinga/images/logos/vendors/os2.gif
+usr/share/icinga/images/logos/vendors/os2.png
+usr/share/icinga/images/logos/vendors/panasonic.gd2
+usr/share/icinga/images/logos/vendors/panasonic.gif
+usr/share/icinga/images/logos/vendors/panasonic.png
+usr/share/icinga/images/logos/vendors/paradox.gd2
+usr/share/icinga/images/logos/vendors/paradox.gif
+usr/share/icinga/images/logos/vendors/paradox.png
+usr/share/icinga/images/logos/vendors/pentagram.gd2
+usr/share/icinga/images/logos/vendors/pentagram.gif
+usr/share/icinga/images/logos/vendors/pentagram.png
+usr/share/icinga/images/logos/vendors/philips.gd2
+usr/share/icinga/images/logos/vendors/philips.gif
+usr/share/icinga/images/logos/vendors/philips.png
+usr/share/icinga/images/logos/vendors/php.gd2
+usr/share/icinga/images/logos/vendors/php.gif
+usr/share/icinga/images/logos/vendors/php.png
+usr/share/icinga/images/logos/vendors/pix.gd2
+usr/share/icinga/images/logos/vendors/pix.gif
+usr/share/icinga/images/logos/vendors/pix.jpg
+usr/share/icinga/images/logos/vendors/pix.png
+usr/share/icinga/images/logos/vendors/plan9.gd2
+usr/share/icinga/images/logos/vendors/plan9.gif
+usr/share/icinga/images/logos/vendors/plan9.png
+usr/share/icinga/images/logos/vendors/planet.gd2
+usr/share/icinga/images/logos/vendors/planet.gif
+usr/share/icinga/images/logos/vendors/planet.png
+usr/share/icinga/images/logos/vendors/procurve.gd2
+usr/share/icinga/images/logos/vendors/procurve.gif
+usr/share/icinga/images/logos/vendors/procurve.png
+usr/share/icinga/images/logos/vendors/proxim.gd2
+usr/share/icinga/images/logos/vendors/proxim.gif
+usr/share/icinga/images/logos/vendors/proxim.png
+usr/share/icinga/images/logos/vendors/redback.gd2
+usr/share/icinga/images/logos/vendors/redback.gif
+usr/share/icinga/images/logos/vendors/redback.png
+usr/share/icinga/images/logos/vendors/redhat.gd2
+usr/share/icinga/images/logos/vendors/redhat.gif
+usr/share/icinga/images/logos/vendors/redhat.png
+usr/share/icinga/images/logos/vendors/redhat2.gd2
+usr/share/icinga/images/logos/vendors/redhat2.gif
+usr/share/icinga/images/logos/vendors/redhat2.png
+usr/share/icinga/images/logos/vendors/redhat3.gd2
+usr/share/icinga/images/logos/vendors/redhat3.gif
+usr/share/icinga/images/logos/vendors/redhat3.jpg
+usr/share/icinga/images/logos/vendors/redhat3.png
+usr/share/icinga/images/logos/vendors/samsung.gd2
+usr/share/icinga/images/logos/vendors/samsung.gif
+usr/share/icinga/images/logos/vendors/samsung.png
+usr/share/icinga/images/logos/vendors/sco.gd2
+usr/share/icinga/images/logos/vendors/sco.gif
+usr/share/icinga/images/logos/vendors/sco.jpg
+usr/share/icinga/images/logos/vendors/sco.png
+usr/share/icinga/images/logos/vendors/siemens.gd2
+usr/share/icinga/images/logos/vendors/siemens.gif
+usr/share/icinga/images/logos/vendors/siemens.png
+usr/share/icinga/images/logos/vendors/sinix.gd2
+usr/share/icinga/images/logos/vendors/sinix.gif
+usr/share/icinga/images/logos/vendors/sinix.jpg
+usr/share/icinga/images/logos/vendors/sinix.png
+usr/share/icinga/images/logos/vendors/sis.gd2
+usr/share/icinga/images/logos/vendors/sis.gif
+usr/share/icinga/images/logos/vendors/sis.png
+usr/share/icinga/images/logos/vendors/sis2.gd2
+usr/share/icinga/images/logos/vendors/sis2.gif
+usr/share/icinga/images/logos/vendors/sis2.png
+usr/share/icinga/images/logos/vendors/slackware.gd2
+usr/share/icinga/images/logos/vendors/slackware.gif
+usr/share/icinga/images/logos/vendors/slackware.png
+usr/share/icinga/images/logos/vendors/slackware2.gd2
+usr/share/icinga/images/logos/vendors/slackware2.gif
+usr/share/icinga/images/logos/vendors/slackware2.jpg
+usr/share/icinga/images/logos/vendors/slackware2.png
+usr/share/icinga/images/logos/vendors/solaris.gd2
+usr/share/icinga/images/logos/vendors/solaris.gif
+usr/share/icinga/images/logos/vendors/solaris.png
+usr/share/icinga/images/logos/vendors/sony.gd2
+usr/share/icinga/images/logos/vendors/sony.gif
+usr/share/icinga/images/logos/vendors/sony.png
+usr/share/icinga/images/logos/vendors/sphairon.gd2
+usr/share/icinga/images/logos/vendors/sphairon.gif
+usr/share/icinga/images/logos/vendors/sphairon.png
+usr/share/icinga/images/logos/vendors/stampede.gd2
+usr/share/icinga/images/logos/vendors/stampede.gif
+usr/share/icinga/images/logos/vendors/stampede.jpg
+usr/share/icinga/images/logos/vendors/stampede.png
+usr/share/icinga/images/logos/vendors/storm.gd2
+usr/share/icinga/images/logos/vendors/storm.gif
+usr/share/icinga/images/logos/vendors/storm.jpg
+usr/share/icinga/images/logos/vendors/storm.png
+usr/share/icinga/images/logos/vendors/sun.gd2
+usr/share/icinga/images/logos/vendors/sun.gif
+usr/share/icinga/images/logos/vendors/sun.png
+usr/share/icinga/images/logos/vendors/sun2.gd2
+usr/share/icinga/images/logos/vendors/sun2.gif
+usr/share/icinga/images/logos/vendors/sun2.png
+usr/share/icinga/images/logos/vendors/sun40.gd2
+usr/share/icinga/images/logos/vendors/sun40.gif
+usr/share/icinga/images/logos/vendors/sun40.jpg
+usr/share/icinga/images/logos/vendors/sun40.png
+usr/share/icinga/images/logos/vendors/sunlogo.gd2
+usr/share/icinga/images/logos/vendors/sunlogo.gif
+usr/share/icinga/images/logos/vendors/sunlogo.jpg
+usr/share/icinga/images/logos/vendors/sunlogo.png
+usr/share/icinga/images/logos/vendors/surecom.gd2
+usr/share/icinga/images/logos/vendors/surecom.gif
+usr/share/icinga/images/logos/vendors/surecom.png
+usr/share/icinga/images/logos/vendors/suse.gd2
+usr/share/icinga/images/logos/vendors/suse.gif
+usr/share/icinga/images/logos/vendors/suse.png
+usr/share/icinga/images/logos/vendors/suse2.gd2
+usr/share/icinga/images/logos/vendors/suse2.gif
+usr/share/icinga/images/logos/vendors/suse2.png
+usr/share/icinga/images/logos/vendors/suse3.gd2
+usr/share/icinga/images/logos/vendors/suse3.gif
+usr/share/icinga/images/logos/vendors/suse3.jpg
+usr/share/icinga/images/logos/vendors/suse3.png
+usr/share/icinga/images/logos/vendors/tcom.gd2
+usr/share/icinga/images/logos/vendors/tcom.gif
+usr/share/icinga/images/logos/vendors/tcom.png
+usr/share/icinga/images/logos/vendors/texasinstruments.gd2
+usr/share/icinga/images/logos/vendors/texasinstruments.gif
+usr/share/icinga/images/logos/vendors/texasinstruments.png
+usr/share/icinga/images/logos/vendors/thomson.gd2
+usr/share/icinga/images/logos/vendors/thomson.gif
+usr/share/icinga/images/logos/vendors/thomson.png
+usr/share/icinga/images/logos/vendors/toshiba.gd2
+usr/share/icinga/images/logos/vendors/toshiba.gif
+usr/share/icinga/images/logos/vendors/toshiba.png
+usr/share/icinga/images/logos/vendors/tplink.gd2
+usr/share/icinga/images/logos/vendors/tplink.gif
+usr/share/icinga/images/logos/vendors/tplink.png
+usr/share/icinga/images/logos/vendors/tru64.gd2
+usr/share/icinga/images/logos/vendors/tru64.gif
+usr/share/icinga/images/logos/vendors/tru64.png
+usr/share/icinga/images/logos/vendors/turbolinux.gd2
+usr/share/icinga/images/logos/vendors/turbolinux.gif
+usr/share/icinga/images/logos/vendors/turbolinux.jpg
+usr/share/icinga/images/logos/vendors/turbolinux.png
+usr/share/icinga/images/logos/vendors/ubuntu.gd2
+usr/share/icinga/images/logos/vendors/ubuntu.gif
+usr/share/icinga/images/logos/vendors/ubuntu.png
+usr/share/icinga/images/logos/vendors/ubuntu2.gd2
+usr/share/icinga/images/logos/vendors/ubuntu2.gif
+usr/share/icinga/images/logos/vendors/ubuntu2.png
+usr/share/icinga/images/logos/vendors/ultrapenguin.gd2
+usr/share/icinga/images/logos/vendors/ultrapenguin.gif
+usr/share/icinga/images/logos/vendors/ultrapenguin.jpg
+usr/share/icinga/images/logos/vendors/ultrapenguin.png
+usr/share/icinga/images/logos/vendors/unicos.gd2
+usr/share/icinga/images/logos/vendors/unicos.gif
+usr/share/icinga/images/logos/vendors/unicos.jpg
+usr/share/icinga/images/logos/vendors/unicos.png
+usr/share/icinga/images/logos/vendors/usrobotics.gd2
+usr/share/icinga/images/logos/vendors/usrobotics.gif
+usr/share/icinga/images/logos/vendors/usrobotics.png
+usr/share/icinga/images/logos/vendors/virtual.gd2
+usr/share/icinga/images/logos/vendors/virtual.gif
+usr/share/icinga/images/logos/vendors/virtual.png
+usr/share/icinga/images/logos/vendors/vista.gd2
+usr/share/icinga/images/logos/vendors/vista.gif
+usr/share/icinga/images/logos/vendors/vista.png
+usr/share/icinga/images/logos/vendors/vmware.gd2
+usr/share/icinga/images/logos/vendors/vmware.gif
+usr/share/icinga/images/logos/vendors/vmware.png
+usr/share/icinga/images/logos/vendors/vmware2.gd2
+usr/share/icinga/images/logos/vendors/vmware2.gif
+usr/share/icinga/images/logos/vendors/vmware2.png
+usr/share/icinga/images/logos/vendors/vyatta.gd2
+usr/share/icinga/images/logos/vendors/vyatta.gif
+usr/share/icinga/images/logos/vendors/vyatta.png
+usr/share/icinga/images/logos/vendors/vyatta2.gd2
+usr/share/icinga/images/logos/vendors/vyatta2.gif
+usr/share/icinga/images/logos/vendors/vyatta2.png
+usr/share/icinga/images/logos/vendors/win40.gd2
+usr/share/icinga/images/logos/vendors/win40.gif
+usr/share/icinga/images/logos/vendors/win40.jpg
+usr/share/icinga/images/logos/vendors/win40.png
+usr/share/icinga/images/logos/vendors/win9x.gd2
+usr/share/icinga/images/logos/vendors/win9x.gif
+usr/share/icinga/images/logos/vendors/win9x.png
+usr/share/icinga/images/logos/vendors/windows7.gd2
+usr/share/icinga/images/logos/vendors/windows7.gif
+usr/share/icinga/images/logos/vendors/windows7.png
+usr/share/icinga/images/logos/vendors/windows7_2.gd2
+usr/share/icinga/images/logos/vendors/windows7_2.gif
+usr/share/icinga/images/logos/vendors/windows7_2.png
+usr/share/icinga/images/logos/vendors/windowsme.gd2
+usr/share/icinga/images/logos/vendors/windowsme.gif
+usr/share/icinga/images/logos/vendors/windowsme.png
+usr/share/icinga/images/logos/vendors/windowsxp.gd2
+usr/share/icinga/images/logos/vendors/windowsxp.gif
+usr/share/icinga/images/logos/vendors/windowsxp.png
+usr/share/icinga/images/logos/vendors/winnt.gd2
+usr/share/icinga/images/logos/vendors/winnt.gif
+usr/share/icinga/images/logos/vendors/winnt.png
+usr/share/icinga/images/logos/vendors/xen.gd2
+usr/share/icinga/images/logos/vendors/xen.gif
+usr/share/icinga/images/logos/vendors/xen.png
+usr/share/icinga/images/logos/vendors/xerox.gd2
+usr/share/icinga/images/logos/vendors/xerox.gif
+usr/share/icinga/images/logos/vendors/xerox.png
+usr/share/icinga/images/logos/vendors/xerox2.gd2
+usr/share/icinga/images/logos/vendors/xerox2.gif
+usr/share/icinga/images/logos/vendors/xerox2.png
+usr/share/icinga/images/logos/vendors/xerox3.gd2
+usr/share/icinga/images/logos/vendors/xerox3.gif
+usr/share/icinga/images/logos/vendors/xerox3.png
+usr/share/icinga/images/logos/vendors/xircom.gd2
+usr/share/icinga/images/logos/vendors/xircom.gif
+usr/share/icinga/images/logos/vendors/xircom.png
+usr/share/icinga/images/logos/vendors/xirrus.gd2
+usr/share/icinga/images/logos/vendors/xirrus.gif
+usr/share/icinga/images/logos/vendors/xirrus.png
+usr/share/icinga/images/logos/vendors/xirrus2.gd2
+usr/share/icinga/images/logos/vendors/xirrus2.gif
+usr/share/icinga/images/logos/vendors/xirrus2.png
+usr/share/icinga/images/logos/vendors/xserver.gd2
+usr/share/icinga/images/logos/vendors/xserver.gif
+usr/share/icinga/images/logos/vendors/xserver.png
+usr/share/icinga/images/logos/vendors/xserver2.gd2
+usr/share/icinga/images/logos/vendors/xserver2.gif
+usr/share/icinga/images/logos/vendors/xserver2.png
+usr/share/icinga/images/logos/vendors/yellowdog.gd2
+usr/share/icinga/images/logos/vendors/yellowdog.gif
+usr/share/icinga/images/logos/vendors/yellowdog.jpg
+usr/share/icinga/images/logos/vendors/yellowdog.png
+usr/share/icinga/images/logos/vendors/zoltrix.gd2
+usr/share/icinga/images/logos/vendors/zoltrix.gif
+usr/share/icinga/images/logos/vendors/zoltrix.png
+usr/share/icinga/images/logos/vendors/zoom.gd2
+usr/share/icinga/images/logos/vendors/zoom.gif
+usr/share/icinga/images/logos/vendors/zoom.png
+usr/share/icinga/images/logos/vendors/zyxel.gd2
+usr/share/icinga/images/logos/vendors/zyxel.gif
+usr/share/icinga/images/logos/vendors/zyxel.png
+usr/share/icinga/images/logrotate.png
+usr/share/icinga/images/menu_bar.gif
+usr/share/icinga/images/menu_blank.gif
+usr/share/icinga/images/menu_body.gif
+usr/share/icinga/images/menu_cat_gray.png
+usr/share/icinga/images/menu_less.gif
+usr/share/icinga/images/menu_li1.gif
+usr/share/icinga/images/menu_li2.gif
+usr/share/icinga/images/menu_more.gif
+usr/share/icinga/images/ndisabled.gif
+usr/share/icinga/images/noack.gif
+usr/share/icinga/images/notes.gif
+usr/share/icinga/images/notify.gif
+usr/share/icinga/images/passiveonly.gif
+usr/share/icinga/images/recovery.png
+usr/share/icinga/images/restart.gif
+usr/share/icinga/images/right.gif
+usr/share/icinga/images/save.gif
+usr/share/icinga/images/server.png
+usr/share/icinga/images/serviceevent.gif
+usr/share/icinga/images/splunk1.gif
+usr/share/icinga/images/splunk2.gif
+usr/share/icinga/images/start.gif
+usr/share/icinga/images/stats.gif
+usr/share/icinga/images/stats2.png
+usr/share/icinga/images/status_detail.gif
+usr/share/icinga/images/status_map.gif
+usr/share/icinga/images/stop.gif
+usr/share/icinga/images/tacdisabled.png
+usr/share/icinga/images/tacenabled.png
+usr/share/icinga/images/thermcrit.png
+usr/share/icinga/images/thermok.png
+usr/share/icinga/images/thermwarn.png
+usr/share/icinga/images/trends.gif
+usr/share/icinga/images/trendshost.png
+usr/share/icinga/images/trendssvc.png
+usr/share/icinga/images/unknown.png
+usr/share/icinga/images/up.gif
+usr/share/icinga/images/warning.png
+usr/share/icinga/images/warning_triangle.gif
+usr/share/icinga/images/zoom1.gif
+usr/share/icinga/images/zoom2.gif
+usr/share/icinga/index.html
+usr/share/icinga/jquery-ui
+usr/share/icinga/jquery-ui-addon
+usr/share/icinga/jquery-ui-addon/jquery.ui.timepicker-addon.css
+usr/share/icinga/jquery-ui-addon/jquery.ui.timepicker-addon.js
+usr/share/icinga/jquery-ui-addon/jquery.ui.timepicker-addon.min.js
+usr/share/icinga/jquery-ui/themes
+usr/share/icinga/jquery-ui/themes/base
+usr/share/icinga/jquery-ui/themes/base/images
+usr/share/icinga/jquery-ui/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png
+usr/share/icinga/jquery-ui/themes/base/images/ui-bg_flat_75_ffffff_40x100.png
+usr/share/icinga/jquery-ui/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png
+usr/share/icinga/jquery-ui/themes/base/images/ui-bg_glass_65_ffffff_1x400.png
+usr/share/icinga/jquery-ui/themes/base/images/ui-bg_glass_75_dadada_1x400.png
+usr/share/icinga/jquery-ui/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png
+usr/share/icinga/jquery-ui/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png
+usr/share/icinga/jquery-ui/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png
+usr/share/icinga/jquery-ui/themes/base/images/ui-icons_222222_256x240.png
+usr/share/icinga/jquery-ui/themes/base/images/ui-icons_2e83ff_256x240.png
+usr/share/icinga/jquery-ui/themes/base/images/ui-icons_454545_256x240.png
+usr/share/icinga/jquery-ui/themes/base/images/ui-icons_888888_256x240.png
+usr/share/icinga/jquery-ui/themes/base/images/ui-icons_cd0a0a_256x240.png
+usr/share/icinga/jquery-ui/themes/base/jquery.ui.all.css
+usr/share/icinga/jquery-ui/themes/base/jquery.ui.base.css
+usr/share/icinga/jquery-ui/themes/base/jquery.ui.button.css
+usr/share/icinga/jquery-ui/themes/base/jquery.ui.core.css
+usr/share/icinga/jquery-ui/themes/base/jquery.ui.datepicker.css
+usr/share/icinga/jquery-ui/themes/base/jquery.ui.slider.css
+usr/share/icinga/jquery-ui/themes/base/jquery.ui.theme.css
+usr/share/icinga/jquery-ui/ui
+usr/share/icinga/jquery-ui/ui/jquery.ui.autocomplete.js
+usr/share/icinga/jquery-ui/ui/jquery.ui.button.js
+usr/share/icinga/jquery-ui/ui/jquery.ui.core.js
+usr/share/icinga/jquery-ui/ui/jquery.ui.datepicker.js
+usr/share/icinga/jquery-ui/ui/jquery.ui.effect-blind.js
+usr/share/icinga/jquery-ui/ui/jquery.ui.effect.js
+usr/share/icinga/jquery-ui/ui/jquery.ui.menu.js
+usr/share/icinga/jquery-ui/ui/jquery.ui.mouse.js
+usr/share/icinga/jquery-ui/ui/jquery.ui.position.js
+usr/share/icinga/jquery-ui/ui/jquery.ui.slider.js
+usr/share/icinga/jquery-ui/ui/jquery.ui.widget.js
+usr/share/icinga/js
+usr/share/icinga/js/autocomplete.js
+usr/share/icinga/js/checkbox_functions.js
+usr/share/icinga/js/common_functions.js
+usr/share/icinga/js/jquery-1.8.0.js
+usr/share/icinga/js/jquery-1.8.0.min.js
+usr/share/icinga/js/jquery.dd.js
+usr/share/icinga/js/jquery.dd.min.js
+usr/share/icinga/js/menu.js
+usr/share/icinga/js/page_refresh.js
+usr/share/icinga/js/skinnytip.js
+usr/share/icinga/js/status_filter_functions.js
+usr/share/icinga/log
+usr/share/icinga/log/.htaccess
+usr/share/icinga/log/index.htm
+usr/share/icinga/main.html
+usr/share/icinga/media
+usr/share/icinga/menu.html
+usr/share/icinga/robots.txt
+usr/share/icinga/ssi
+usr/share/icinga/stylesheets
+usr/share/icinga/stylesheets/avail.css
+usr/share/icinga/stylesheets/checksanity.css
+usr/share/icinga/stylesheets/cmd.css
+usr/share/icinga/stylesheets/common.css
+usr/share/icinga/stylesheets/config.css
+usr/share/icinga/stylesheets/dd.css
+usr/share/icinga/stylesheets/extinfo.css
+usr/share/icinga/stylesheets/histogram.css
+usr/share/icinga/stylesheets/history.css
+usr/share/icinga/stylesheets/menu.css
+usr/share/icinga/stylesheets/notifications.css
+usr/share/icinga/stylesheets/outages.css
+usr/share/icinga/stylesheets/showlog.css
+usr/share/icinga/stylesheets/status.css
+usr/share/icinga/stylesheets/statusmap.css
+usr/share/icinga/stylesheets/summary.css
+usr/share/icinga/stylesheets/tac.css
+usr/share/icinga/stylesheets/tacheader.css
+usr/share/icinga/stylesheets/trends.css
+var/icinga
+var/icinga/archives
+var/icinga/rw
+var/icinga/spool
+var/icinga/spool/checkresults
+var/ipfire/backup/addons/includes/icinga
index eaaa3e589e6c6fdd1e74d4425ce99f8fb10f3689..9b198c2bdfbae9a082f2d3ef3455fb15abd8b6fd 100644 (file)
@@ -238,10 +238,25 @@ lib/modules/KVER-ipfire-pae
 #lib/modules/KVER-ipfire-pae/kernel/drivers/clocksource
 #lib/modules/KVER-ipfire-pae/kernel/drivers/clocksource/cs5535-clockevt.ko
 #lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq
+#lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/acpi-cpufreq.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/amd_freq_sensitivity.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/cpufreq-nforce2.ko
 #lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/cpufreq_conservative.ko
 #lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/cpufreq_ondemand.ko
 #lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/cpufreq_powersave.ko
 #lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/cpufreq_stats.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/gx-suspmod.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/longhaul.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/longrun.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/mperf.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/p4-clockmod.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/pcc-cpufreq.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/powernow-k6.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/powernow-k7.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/powernow-k8.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/speedstep-ich.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/speedstep-lib.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/cpufreq/speedstep-smi.ko
 #lib/modules/KVER-ipfire-pae/kernel/drivers/crypto
 #lib/modules/KVER-ipfire-pae/kernel/drivers/crypto/geode-aes.ko
 #lib/modules/KVER-ipfire-pae/kernel/drivers/crypto/padlock-aes.ko
@@ -2675,6 +2690,7 @@ lib/modules/KVER-ipfire-pae
 #lib/modules/KVER-ipfire-pae/kernel/net/sched/sch_mqprio.ko
 #lib/modules/KVER-ipfire-pae/kernel/net/sched/sch_multiq.ko
 #lib/modules/KVER-ipfire-pae/kernel/net/sched/sch_netem.ko
+#lib/modules/KVER-ipfire-pae/kernel/net/sched/sch_pie.ko
 #lib/modules/KVER-ipfire-pae/kernel/net/sched/sch_plug.ko
 #lib/modules/KVER-ipfire-pae/kernel/net/sched/sch_prio.ko
 #lib/modules/KVER-ipfire-pae/kernel/net/sched/sch_qfq.ko
index 53935f0f21fa19b29d5197177afa44d7bc674589..4e6167e0d6a0fbef39a2c06058da53dd358d9423 100644 (file)
@@ -6,8 +6,10 @@ etc/nut/upsd.users.sample
 etc/nut/upsmon.conf.sample
 etc/nut/upssched.conf.sample
 etc/udev/rules.d/52-nut-usbups.rules
+usr/bin/al175
 usr/bin/apcsmart
 usr/bin/apcsmart-old
+usr/bin/apcupsd-ups
 usr/bin/bcmxcp
 usr/bin/bcmxcp_usb
 usr/bin/belkin
@@ -34,14 +36,18 @@ usr/bin/metasys
 usr/bin/mge-shut
 usr/bin/mge-utalk
 usr/bin/microdowell
-usr/bin/newmge-shut
 usr/bin/nut-scanner
+usr/bin/nutdrv_atcl_usb
+usr/bin/nutdrv_qx
+usr/bin/oldmge-shut
 usr/bin/oneac
 usr/bin/optiups
 usr/bin/powercom
 usr/bin/powerpanel
 usr/bin/rhino
 usr/bin/richcomm_usb
+usr/bin/riello_ser
+usr/bin/riello_usb
 usr/bin/safenet
 usr/bin/skel
 usr/bin/snmp-ups
@@ -52,14 +58,16 @@ usr/bin/tripplitesu
 usr/bin/upsc
 usr/bin/upscmd
 usr/bin/upscode2
-usr/bin/upsdrvctl
 usr/bin/upslog
 usr/bin/upsrw
 usr/bin/upssched-cmd
 usr/bin/usbhid-ups
 usr/bin/victronups
-#usr/cgi-bin
-#usr/html
+#usr/lib/libnutclient.a
+#usr/lib/libnutclient.la
+usr/lib/libnutclient.so
+usr/lib/libnutclient.so.0
+usr/lib/libnutclient.so.0.0.0
 #usr/lib/libnutscan.a
 #usr/lib/libnutscan.la
 usr/lib/libnutscan.so
@@ -68,9 +76,10 @@ usr/lib/libnutscan.so.1.0.0
 #usr/lib/libupsclient.a
 #usr/lib/libupsclient.la
 usr/lib/libupsclient.so
-usr/lib/libupsclient.so.1
-usr/lib/libupsclient.so.1.1.0
+usr/lib/libupsclient.so.4
+usr/lib/libupsclient.so.4.0.0
 usr/sbin/upsd
+usr/sbin/upsdrvctl
 usr/sbin/upsmon
 usr/sbin/upssched
 usr/share/cmdvartab
@@ -81,8 +90,10 @@ usr/share/driver.list
 #usr/share/man/man5/upsd.users.5
 #usr/share/man/man5/upsmon.conf.5
 #usr/share/man/man5/upssched.conf.5
+#usr/share/man/man8/al175.8
 #usr/share/man/man8/apcsmart-old.8
 #usr/share/man/man8/apcsmart.8
+#usr/share/man/man8/apcupsd-ups.8
 #usr/share/man/man8/bcmxcp.8
 #usr/share/man/man8/bcmxcp_usb.8
 #usr/share/man/man8/belkin.8
@@ -91,7 +102,8 @@ usr/share/driver.list
 #usr/share/man/man8/bestfortress.8
 #usr/share/man/man8/bestuferrups.8
 #usr/share/man/man8/bestups.8
-#usr/share/man/man8/blazer.8
+#usr/share/man/man8/blazer_ser.8
+#usr/share/man/man8/blazer_usb.8
 #usr/share/man/man8/clone.8
 #usr/share/man/man8/dummy-ups.8
 #usr/share/man/man8/etapro.8
@@ -107,7 +119,10 @@ usr/share/driver.list
 #usr/share/man/man8/mge-shut.8
 #usr/share/man/man8/mge-utalk.8
 #usr/share/man/man8/microdowell.8
+#usr/share/man/man8/nut-recorder.8
 #usr/share/man/man8/nut-scanner.8
+#usr/share/man/man8/nutdrv_atcl_usb.8
+#usr/share/man/man8/nutdrv_qx.8
 #usr/share/man/man8/nutupsdrv.8
 #usr/share/man/man8/oneac.8
 #usr/share/man/man8/optiups.8
@@ -115,6 +130,8 @@ usr/share/driver.list
 #usr/share/man/man8/powerpanel.8
 #usr/share/man/man8/rhino.8
 #usr/share/man/man8/richcomm_usb.8
+#usr/share/man/man8/riello_ser.8
+#usr/share/man/man8/riello_usb.8
 #usr/share/man/man8/safenet.8
 #usr/share/man/man8/snmp-ups.8
 #usr/share/man/man8/solis.8
diff --git a/config/rootfiles/packages/sslscan b/config/rootfiles/packages/sslscan
new file mode 100644 (file)
index 0000000..603c36e
--- /dev/null
@@ -0,0 +1,2 @@
+usr/bin/sslscan
+#usr/share/man/man1/sslscan.1
index 3813572e00287031349e7abb0d67c46125a99ca4..574812166f72a9a01654d5b066891e5a99a2bbcf 100644 (file)
@@ -18,3 +18,7 @@ other usefull commands from the Dom0:
 - shutdown the fire: "xm shutdown ipfire-xen"
 - reset the fire: "xm destroy ipfire-xen"
 - look what is going on: "xm top" or "xm list"
+
+This script can also build a Citrix XenCenter xva image.
+- run "XEN_IMG_TYPE=xva sh xen-image-maker.sh" to build an xva image.
+- import the vm with "xe vm-import file=ipfire.xfa"
index 594c82a5f9c3fcf844662069e4369ec847fa9986..38bfdff5e5146aa6f182f1cacc051bab1d5bb43a 100644 (file)
@@ -17,8 +17,8 @@ vif         = [
 
 
 disk = [
-               'file:/mnt/test/ipfire-boot.img,xvda1,w',
-               'file:/mnt/test/ipfire-swap.img,xvda2,w',
-               'file:/mnt/test/ipfire-root.img,xvda3,w',
-               'file:/mnt/test/ipfire-var.img,xvda4,w'
+               'file:./ipfire-boot.img,xvda1,w',
+               'file:./ipfire-swap.img,xvda2,w',
+               'file:./ipfire-root.img,xvda3,w',
+               'file:./ipfire-var.img,xvda4,w'
        ] #### Change path
index a42ad5bf06df70ca96f82716de1053d3e79b7905..4f632805e130a72379f7e0857ef263bfb04f1911 100644 (file)
@@ -28,23 +28,12 @@ KVER=xxxKVERxxx
 KERN_PACK=xxxKERN_PACKxxx
 KRNDOWN=http://mirror0.ipfire.org/pakfire2/$VERSION/paks
 CONSOLE=hvc0
-###############################################################################
-# If you really want to use  outdated legacy kernel uncomment this lines. #####
-# Not recommended!!! ##########################################################
-######################
-#KERN_TYPE=xen
-#KVER=2.6.32.61
-#KERN_PACK=29
-#KRNDOWN=http://mirror0.ipfire.org/pakfire2/2.15/paks
-#CONSOLE=xvc0
-###############################################################################
 
 SIZEboot=64
 SIZEswap=512
 SIZEroot=1024
 SIZEvar=1024
-# ct'server does not support ext4 so change this to ext3.
-FSTYPE=ext4
+FSTYPE=ext3
 
 ##############################################################################
 
@@ -62,6 +51,25 @@ IMGvar=./$SNAME-var.img
 
 KERNEL=linux-$KERN_TYPE-$KVER-$KERN_PACK.ipfire
 
+if [ "$XEN_IMG_TYPE" == "xva" ]; then
+       # download xva.py if it not exist.
+       if [ ! -e xva.py ]; then
+               wget http://source.ipfire.org/source-2.x/xva.py
+       fi
+       # XenCenter use other devicenames and
+       # xvdd seems to be reserved (converter bug?).
+       P1=xvda
+       P2=xvdb
+       P3=xvdc
+       P4=xvde
+else
+       # old style xen image partition names
+       P1=xvda1
+       P2=xvda2
+       P3=xvda3
+       P4=xvda4
+fi
+
 rm -rf $TMPDIR && mkdir -p $MNThdd && mkdir -p $ISODIR
 echo --------------------------------------------------------
 echo - Download $SOURCEISO ...
@@ -108,7 +116,8 @@ mount -o loop $IMGboot $MNThdd/boot
 mount -o loop $IMGvar $MNThdd/var
 
 # Install IPFire without kernel modules
-tar -C $MNThdd/ -xvf $ISODIR/$SNAME-$VERSION.tlz --lzma \
+xz -d < $ISODIR/$SNAME-$VERSION.tlz > $TMPDIR/$SNAME-$VERSION.tar
+tar -C $MNThdd/ -xvf $TMPDIR/$SNAME-$VERSION.tar \
        --exclude=lib/modules* --exclude=boot* --numeric-owner
 
 #Install Kernel
@@ -121,7 +130,7 @@ mkdir $MNThdd/boot/grub
 echo "timeout 10"                          > $MNThdd/boot/grub/grub.conf
 echo "default 0"                          >> $MNThdd/boot/grub/grub.conf
 echo "title IPFire ($KERN_TYPE-kernel)"   >> $MNThdd/boot/grub/grub.conf
-echo "  kernel /vmlinuz-$KVER-ipfire-xen root=/dev/xvda3 rootdelay=10 panic=10 console=$CONSOLE ro" \
+echo "  kernel /vmlinuz-$KVER-ipfire-$KERN_TYPE root=/dev/$P3 rootdelay=10 panic=10 console=$CONSOLE ro" \
                                          >> $MNThdd/boot/grub/grub.conf
 echo "  initrd /ipfirerd-$KVER-$KERN_TYPE.img" >> $MNThdd/boot/grub/grub.conf
 echo "# savedefault 0" >> $MNThdd/boot/grub/grub.conf
@@ -129,16 +138,16 @@ echo "# savedefault 0" >> $MNThdd/boot/grub/grub.conf
 ln -s grub.conf $MNThdd/boot/grub/menu.lst
 
 #create the meta-info of linux-kernel package
-echo ""                       >  $MNThdd/opt/pakfire/db/meta/linux-$KERN_TYPE
-echo "Name: linux-$KERN_TYPE" >> $MNThdd/opt/pakfire/db/meta/linux-$KERN_TYPE
-echo "ProgVersion: $KVER"     >> $MNThdd/opt/pakfire/db/meta/linux-$KERN_TYPE
-echo "Release: $KERN_PACK"    >> $MNThdd/opt/pakfire/db/meta/linux-$KERN_TYPE
-echo ""                       >> $MNThdd/opt/pakfire/db/meta/linux-$KERN_TYPE
-echo ""                       >  $MNThdd/opt/pakfire/db/installed/linux-$KERN_TYPE
-echo "Name: linux-$KERN_TYPE" >> $MNThdd/opt/pakfire/db/installed/linux-$KERN_TYPE
-echo "ProgVersion: $KVER"     >> $MNThdd/opt/pakfire/db/installed/linux-$KERN_TYPE
-echo "Release: $KERN_PACK"    >> $MNThdd/opt/pakfire/db/installed/linux-$KERN_TYPE
-echo ""                       >> $MNThdd/opt/pakfire/db/installed/linux-$KERN_TYPE
+echo ""                       >  $MNThdd/opt/pakfire/db/meta/meta-linux-$KERN_TYPE
+echo "Name: linux-$KERN_TYPE" >> $MNThdd/opt/pakfire/db/meta/meta-linux-$KERN_TYPE
+echo "ProgVersion: $KVER"     >> $MNThdd/opt/pakfire/db/meta/meta-linux-$KERN_TYPE
+echo "Release: $KERN_PACK"    >> $MNThdd/opt/pakfire/db/meta/meta-linux-$KERN_TYPE
+echo ""                       >> $MNThdd/opt/pakfire/db/meta/meta-linux-$KERN_TYPE
+echo ""                       >  $MNThdd/opt/pakfire/db/installed/meta-linux-$KERN_TYPE
+echo "Name: linux-$KERN_TYPE" >> $MNThdd/opt/pakfire/db/installed/meta-linux-$KERN_TYPE
+echo "ProgVersion: $KVER"     >> $MNThdd/opt/pakfire/db/installed/meta-linux-$KERN_TYPE
+echo "Release: $KERN_PACK"    >> $MNThdd/opt/pakfire/db/installed/meta-linux-$KERN_TYPE
+echo ""                       >> $MNThdd/opt/pakfire/db/installed/meta-linux-$KERN_TYPE
 
 #Set default configuration
 echo "LANGUAGE=en" >> $MNThdd/var/ipfire/main/settings
@@ -150,10 +159,10 @@ mount --bind /proc $MNThdd/proc
 mount --bind /dev  $MNThdd/dev
 mount --bind /sys  $MNThdd/sys
 chroot $MNThdd /usr/bin/perl -e "require '/var/ipfire/lang.pl'; &Lang::BuildCacheLang"
-sed -i -e "s|DEVICE1|/dev/xvda1|g" $MNThdd/etc/fstab
-sed -i -e "s|DEVICE2|/dev/xvda2|g" $MNThdd/etc/fstab
-sed -i -e "s|DEVICE3|/dev/xvda3|g" $MNThdd/etc/fstab
-sed -i -e "s|DEVICE4|/dev/xvda4|g" $MNThdd/etc/fstab
+sed -i -e "s|DEVICE1|/dev/$P1|g" $MNThdd/etc/fstab
+sed -i -e "s|DEVICE2|/dev/$P2|g" $MNThdd/etc/fstab
+sed -i -e "s|DEVICE3|/dev/$P3|g" $MNThdd/etc/fstab
+sed -i -e "s|DEVICE4|/dev/$P4|g" $MNThdd/etc/fstab
 
 sed -i -e "s|FSTYPE|$FSTYPE|g" $MNThdd/etc/fstab
 
@@ -192,6 +201,11 @@ umount $MNThdd
 
 umount $ISODIR
 rm -rf ./ipfire-tmp
+
+if [ "$XEN_IMG_TYPE" == "xva" ]; then
+       python xva.py --sparse -c $SNAME.cfg -f $SNAME.xva
+       rm -f $SNAME*.img
+fi
 echo --------------------------------------------------------
 echo - Done.
 echo --------------------------------------------------------
index 25612b5b74e6f1c2656da3869da7e7632e66f96b..2140296c7d4b3dd4947918b1cb2da104d2b1ebd5 100644 (file)
@@ -1,4 +1,3 @@
-WARNING: translation string unused: Client status and controlc
 WARNING: translation string unused: ConnSched scheduler
 WARNING: translation string unused: ConnSched select profile
 WARNING: translation string unused: HDD temperature
@@ -364,6 +363,7 @@ WARNING: translation string unused: network time
 WARNING: translation string unused: network traffic graphs
 WARNING: translation string unused: network updated
 WARNING: translation string unused: networks settings
+WARNING: translation string unused: never
 WARNING: translation string unused: new optionsfw must boot
 WARNING: translation string unused: no alcatelusb firmware
 WARNING: translation string unused: no cfg upload
@@ -386,7 +386,6 @@ WARNING: translation string unused: optionsfw portlist hint
 WARNING: translation string unused: optionsfw warning
 WARNING: translation string unused: or
 WARNING: translation string unused: original
-WARNING: translation string unused: other countries
 WARNING: translation string unused: our donors
 WARNING: translation string unused: out
 WARNING: translation string unused: outgoing firewall
@@ -409,10 +408,11 @@ WARNING: translation string unused: outgoing firewall reset
 WARNING: translation string unused: outgoing firewall view group
 WARNING: translation string unused: outgoing firewall warning
 WARNING: translation string unused: override mtu
-WARNING: translation string unused: ovpn
 WARNING: translation string unused: ovpn config
 WARNING: translation string unused: ovpn dl
+WARNING: translation string unused: ovpn engines
 WARNING: translation string unused: ovpn log
+WARNING: translation string unused: ovpn reneg sec
 WARNING: translation string unused: ovpn_fastio
 WARNING: translation string unused: ovpn_fragment
 WARNING: translation string unused: ovpn_mssfix
@@ -459,16 +459,12 @@ WARNING: translation string unused: released
 WARNING: translation string unused: removable device advice
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: requested data
-WARNING: translation string unused: reserved dst port
-WARNING: translation string unused: reserved src port
 WARNING: translation string unused: restore hardware settings
 WARNING: translation string unused: root
 WARNING: translation string unused: root path
 WARNING: translation string unused: root user password
 WARNING: translation string unused: route subnet is invalid
 WARNING: translation string unused: router ip
-WARNING: translation string unused: rsvd dst port overlap
-WARNING: translation string unused: rsvd src port overlap
 WARNING: translation string unused: rules already up to date
 WARNING: translation string unused: safe removal of umounted device
 WARNING: translation string unused: save error
@@ -619,10 +615,15 @@ WARNING: untranslated string: addons
 WARNING: untranslated string: bytes
 WARNING: untranslated string: community rules
 WARNING: untranslated string: dead peer detection
+WARNING: untranslated string: downlink
 WARNING: untranslated string: emerging rules
+WARNING: untranslated string: first
 WARNING: untranslated string: fwhost err hostip
+WARNING: untranslated string: last
+WARNING: untranslated string: monitor interface
 WARNING: untranslated string: qos add subclass
 WARNING: untranslated string: route config changed
 WARNING: untranslated string: routing config added
 WARNING: untranslated string: routing config changed
 WARNING: untranslated string: routing table
+WARNING: untranslated string: uplink
index e6af830a5d47d90f302ff5094fa3d37a3016700e..3a0a4c704d5e04937fc2a43c4e98ecbdb5aea121 100644 (file)
@@ -1,4 +1,3 @@
-WARNING: translation string unused: Client status and controlc
 WARNING: translation string unused: ConnSched scheduler
 WARNING: translation string unused: ConnSched select profile
 WARNING: translation string unused: HDD temperature
@@ -146,6 +145,7 @@ WARNING: translation string unused: destination ip bad
 WARNING: translation string unused: destination ip or net
 WARNING: translation string unused: destination net
 WARNING: translation string unused: destination port overlaps
+WARNING: translation string unused: dh name is invalid
 WARNING: translation string unused: dhcp base ip fixed lease
 WARNING: translation string unused: dhcp create fixed leases
 WARNING: translation string unused: dhcp fixed lease err1
@@ -389,6 +389,7 @@ WARNING: translation string unused: network time
 WARNING: translation string unused: network traffic graphs
 WARNING: translation string unused: network updated
 WARNING: translation string unused: networks settings
+WARNING: translation string unused: never
 WARNING: translation string unused: new optionsfw must boot
 WARNING: translation string unused: no alcatelusb firmware
 WARNING: translation string unused: no cfg upload
@@ -412,7 +413,6 @@ WARNING: translation string unused: optionsfw portlist hint
 WARNING: translation string unused: optionsfw warning
 WARNING: translation string unused: or
 WARNING: translation string unused: original
-WARNING: translation string unused: other countries
 WARNING: translation string unused: our donors
 WARNING: translation string unused: out
 WARNING: translation string unused: outgoing firewall
@@ -435,12 +435,12 @@ WARNING: translation string unused: outgoing firewall reset
 WARNING: translation string unused: outgoing firewall view group
 WARNING: translation string unused: outgoing firewall warning
 WARNING: translation string unused: override mtu
-WARNING: translation string unused: ovpn
 WARNING: translation string unused: ovpn config
 WARNING: translation string unused: ovpn dl
+WARNING: translation string unused: ovpn engines
 WARNING: translation string unused: ovpn log
+WARNING: translation string unused: ovpn reneg sec
 WARNING: translation string unused: ovpn_fastio
-WARNING: translation string unused: ovpn_fragment
 WARNING: translation string unused: ovpn_mssfix
 WARNING: translation string unused: ovpn_mtudisc
 WARNING: translation string unused: ovpn_processprio
@@ -486,16 +486,12 @@ WARNING: translation string unused: released
 WARNING: translation string unused: removable device advice
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: requested data
-WARNING: translation string unused: reserved dst port
-WARNING: translation string unused: reserved src port
 WARNING: translation string unused: restore hardware settings
 WARNING: translation string unused: root
 WARNING: translation string unused: root path
 WARNING: translation string unused: root user password
 WARNING: translation string unused: route subnet is invalid
 WARNING: translation string unused: router ip
-WARNING: translation string unused: rsvd dst port overlap
-WARNING: translation string unused: rsvd src port overlap
 WARNING: translation string unused: rules already up to date
 WARNING: translation string unused: safe removal of umounted device
 WARNING: translation string unused: save error
@@ -550,6 +546,7 @@ WARNING: translation string unused: successfully refreshed updates list
 WARNING: translation string unused: system graphs
 WARNING: translation string unused: system log viewer
 WARNING: translation string unused: system status information
+WARNING: translation string unused: teovpn_fragment
 WARNING: translation string unused: test
 WARNING: translation string unused: test email could not be sent
 WARNING: translation string unused: test email was sent
@@ -650,8 +647,13 @@ WARNING: translation string unused: year-graph
 WARNING: translation string unused: yearly firewallhits
 WARNING: untranslated string: Scan for Songs
 WARNING: untranslated string: bytes
+WARNING: untranslated string: downlink
+WARNING: untranslated string: first
 WARNING: untranslated string: fwhost err hostip
+WARNING: untranslated string: last
+WARNING: untranslated string: monitor interface
 WARNING: untranslated string: route config changed
 WARNING: untranslated string: routing config added
 WARNING: untranslated string: routing config changed
 WARNING: untranslated string: routing table
+WARNING: untranslated string: uplink
index b854a2b7a661cd648cc7d7e9ca4df61b2ea563c9..7b59a5e6c28425651931db78295db7d1bb4d64df 100644 (file)
@@ -360,7 +360,6 @@ WARNING: translation string unused: optionsfw portlist hint
 WARNING: translation string unused: optionsfw warning
 WARNING: translation string unused: or
 WARNING: translation string unused: original
-WARNING: translation string unused: other countries
 WARNING: translation string unused: out
 WARNING: translation string unused: outgoing firewall
 WARNING: translation string unused: outgoing firewall mode0
@@ -371,7 +370,6 @@ WARNING: translation string unused: outgoing firewall p2p description
 WARNING: translation string unused: outgoing firewall reset
 WARNING: translation string unused: outgoing firewall warning
 WARNING: translation string unused: override mtu
-WARNING: translation string unused: ovpn
 WARNING: translation string unused: ovpn config
 WARNING: translation string unused: ovpn dl
 WARNING: translation string unused: ovpn log
@@ -422,16 +420,12 @@ WARNING: translation string unused: released
 WARNING: translation string unused: removable device advice
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: requested data
-WARNING: translation string unused: reserved dst port
-WARNING: translation string unused: reserved src port
 WARNING: translation string unused: restore hardware settings
 WARNING: translation string unused: root
 WARNING: translation string unused: root path
 WARNING: translation string unused: root user password
 WARNING: translation string unused: route subnet is invalid
 WARNING: translation string unused: router ip
-WARNING: translation string unused: rsvd dst port overlap
-WARNING: translation string unused: rsvd src port overlap
 WARNING: translation string unused: rules already up to date
 WARNING: translation string unused: safe removal of umounted device
 WARNING: translation string unused: save error
@@ -558,6 +552,7 @@ WARNING: translation string unused: use dov
 WARNING: translation string unused: use ibod
 WARNING: translation string unused: view log
 WARNING: translation string unused: vpn aggrmode
+WARNING: translation string unused: vpn configuration main
 WARNING: translation string unused: vpn incompatible use of defaultroute
 WARNING: translation string unused: vpn mtu invalid
 WARNING: translation string unused: vpn on blue
@@ -580,6 +575,8 @@ WARNING: untranslated string: ConnSched reboot
 WARNING: untranslated string: ConnSched shutdown
 WARNING: untranslated string: MB read
 WARNING: untranslated string: MB written
+WARNING: untranslated string: MTU settings
+WARNING: untranslated string: Number of Countries for the pie chart
 WARNING: untranslated string: Scan for Songs
 WARNING: untranslated string: Set time on boot
 WARNING: untranslated string: addons
@@ -592,6 +589,7 @@ WARNING: untranslated string: atm device
 WARNING: untranslated string: attention
 WARNING: untranslated string: bit
 WARNING: untranslated string: bytes
+WARNING: untranslated string: capabilities
 WARNING: untranslated string: ccd add
 WARNING: untranslated string: ccd choose net
 WARNING: untranslated string: ccd client options
@@ -634,8 +632,14 @@ WARNING: untranslated string: countries
 WARNING: untranslated string: country codes and flags
 WARNING: untranslated string: countrycode
 WARNING: untranslated string: dead peer detection
+WARNING: untranslated string: default
 WARNING: untranslated string: deprecated fs warn
 WARNING: untranslated string: details
+WARNING: untranslated string: dh
+WARNING: untranslated string: dh key move failed
+WARNING: untranslated string: dh key warn
+WARNING: untranslated string: dh key warn1
+WARNING: untranslated string: dh parameter
 WARNING: untranslated string: dnat address
 WARNING: untranslated string: dns servers
 WARNING: untranslated string: dnsforward
@@ -646,6 +650,7 @@ WARNING: untranslated string: dnsforward entries
 WARNING: untranslated string: dnsforward forward_server
 WARNING: untranslated string: dnsforward zone
 WARNING: untranslated string: downlink
+WARNING: untranslated string: download dh parameter
 WARNING: untranslated string: dpd delay
 WARNING: untranslated string: dpd timeout
 WARNING: untranslated string: drop action
@@ -674,6 +679,7 @@ WARNING: untranslated string: fireinfo why descr2
 WARNING: untranslated string: fireinfo why enable
 WARNING: untranslated string: fireinfo why read more
 WARNING: untranslated string: fireinfo your profile id
+WARNING: untranslated string: firewall logs country
 WARNING: untranslated string: firewall rules
 WARNING: untranslated string: first
 WARNING: untranslated string: flag
@@ -820,8 +826,12 @@ WARNING: untranslated string: fwhost stdnet
 WARNING: untranslated string: fwhost type
 WARNING: untranslated string: fwhost used
 WARNING: untranslated string: fwhost welcome
+WARNING: untranslated string: gen dh
+WARNING: untranslated string: generate dh key
 WARNING: untranslated string: grouptype
 WARNING: untranslated string: hardware support
+WARNING: untranslated string: imei
+WARNING: untranslated string: imsi
 WARNING: untranslated string: incoming firewall access
 WARNING: untranslated string: integrity
 WARNING: untranslated string: invalid input for dpd delay
@@ -835,8 +845,23 @@ WARNING: untranslated string: mac filter
 WARNING: untranslated string: maximum
 WARNING: untranslated string: minimum
 WARNING: untranslated string: minute
+WARNING: untranslated string: model
+WARNING: untranslated string: modem hardware details
+WARNING: untranslated string: modem information
+WARNING: untranslated string: modem network bit error rate
+WARNING: untranslated string: modem network information
+WARNING: untranslated string: modem network mode
+WARNING: untranslated string: modem network operator
+WARNING: untranslated string: modem network registration
+WARNING: untranslated string: modem network signal quality
+WARNING: untranslated string: modem no connection
+WARNING: untranslated string: modem no connection message
+WARNING: untranslated string: modem sim information
+WARNING: untranslated string: modem status
+WARNING: untranslated string: monitor interface
 WARNING: untranslated string: most preferred
 WARNING: untranslated string: no hardware random number generator
+WARNING: untranslated string: not a valid dh key
 WARNING: untranslated string: notice
 WARNING: untranslated string: openvpn default
 WARNING: untranslated string: openvpn destination port used
@@ -851,8 +876,16 @@ WARNING: untranslated string: other
 WARNING: untranslated string: outgoing firewall access
 WARNING: untranslated string: outgoing firewall p2p allow
 WARNING: untranslated string: outgoing firewall p2p deny
+WARNING: untranslated string: ovpn crypt options
+WARNING: untranslated string: ovpn dh
+WARNING: untranslated string: ovpn dh new key
+WARNING: untranslated string: ovpn dh parameters
+WARNING: untranslated string: ovpn dh upload
 WARNING: untranslated string: ovpn errmsg green already pushed
 WARNING: untranslated string: ovpn errmsg invalid ip or mask
+WARNING: untranslated string: ovpn generating the root and host certificates
+WARNING: untranslated string: ovpn ha
+WARNING: untranslated string: ovpn hmac
 WARNING: untranslated string: ovpn mgmt in root range
 WARNING: untranslated string: ovpn mtu-disc
 WARNING: untranslated string: ovpn mtu-disc and mtu not 1500
@@ -881,7 +914,10 @@ WARNING: untranslated string: routing config added
 WARNING: untranslated string: routing config changed
 WARNING: untranslated string: routing table
 WARNING: untranslated string: server restart
+WARNING: untranslated string: show dh
 WARNING: untranslated string: snat new source ip address
+WARNING: untranslated string: software version
+WARNING: untranslated string: source ip country
 WARNING: untranslated string: ssh
 WARNING: untranslated string: static routes
 WARNING: untranslated string: support donation
@@ -937,8 +973,10 @@ WARNING: untranslated string: tor traffic limit soft
 WARNING: untranslated string: tor traffic read written
 WARNING: untranslated string: tor use exit nodes
 WARNING: untranslated string: uplink
+WARNING: untranslated string: upload dh key
 WARNING: untranslated string: uptime load average
 WARNING: untranslated string: urlfilter redirect template
+WARNING: untranslated string: vendor
 WARNING: untranslated string: visit us at
 WARNING: untranslated string: vpn keyexchange
 WARNING: untranslated string: wlan client
index 6ab29e8bb64b4f8e67d1eb0895f72668dd7244f2..2446583c0c609cdab793f39fa4bee7afe21ff6dd 100644 (file)
@@ -360,7 +360,6 @@ WARNING: translation string unused: optionsfw portlist hint
 WARNING: translation string unused: optionsfw warning
 WARNING: translation string unused: or
 WARNING: translation string unused: original
-WARNING: translation string unused: other countries
 WARNING: translation string unused: out
 WARNING: translation string unused: outgoing firewall
 WARNING: translation string unused: outgoing firewall add ip group
@@ -382,7 +381,6 @@ WARNING: translation string unused: outgoing firewall reset
 WARNING: translation string unused: outgoing firewall view group
 WARNING: translation string unused: outgoing firewall warning
 WARNING: translation string unused: override mtu
-WARNING: translation string unused: ovpn
 WARNING: translation string unused: ovpn config
 WARNING: translation string unused: ovpn dl
 WARNING: translation string unused: ovpn log
@@ -433,16 +431,12 @@ WARNING: translation string unused: released
 WARNING: translation string unused: removable device advice
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: requested data
-WARNING: translation string unused: reserved dst port
-WARNING: translation string unused: reserved src port
 WARNING: translation string unused: restore hardware settings
 WARNING: translation string unused: root
 WARNING: translation string unused: root path
 WARNING: translation string unused: root user password
 WARNING: translation string unused: route subnet is invalid
 WARNING: translation string unused: router ip
-WARNING: translation string unused: rsvd dst port overlap
-WARNING: translation string unused: rsvd src port overlap
 WARNING: translation string unused: rules already up to date
 WARNING: translation string unused: safe removal of umounted device
 WARNING: translation string unused: save error
@@ -571,6 +565,7 @@ WARNING: translation string unused: use dov
 WARNING: translation string unused: use ibod
 WARNING: translation string unused: view log
 WARNING: translation string unused: vpn aggrmode
+WARNING: translation string unused: vpn configuration main
 WARNING: translation string unused: vpn incompatible use of defaultroute
 WARNING: translation string unused: vpn mtu invalid
 WARNING: translation string unused: vpn on blue
@@ -591,6 +586,8 @@ WARNING: untranslated string: ConnSched reboot
 WARNING: untranslated string: ConnSched shutdown
 WARNING: untranslated string: MB read
 WARNING: untranslated string: MB written
+WARNING: untranslated string: MTU settings
+WARNING: untranslated string: Number of Countries for the pie chart
 WARNING: untranslated string: Scan for Songs
 WARNING: untranslated string: addons
 WARNING: untranslated string: advproxy cache-digest
@@ -602,6 +599,7 @@ WARNING: untranslated string: atm device
 WARNING: untranslated string: attention
 WARNING: untranslated string: bit
 WARNING: untranslated string: bytes
+WARNING: untranslated string: capabilities
 WARNING: untranslated string: ccd add
 WARNING: untranslated string: ccd choose net
 WARNING: untranslated string: ccd client options
@@ -644,8 +642,14 @@ WARNING: untranslated string: countries
 WARNING: untranslated string: country codes and flags
 WARNING: untranslated string: countrycode
 WARNING: untranslated string: dead peer detection
+WARNING: untranslated string: default
 WARNING: untranslated string: deprecated fs warn
 WARNING: untranslated string: details
+WARNING: untranslated string: dh
+WARNING: untranslated string: dh key move failed
+WARNING: untranslated string: dh key warn
+WARNING: untranslated string: dh key warn1
+WARNING: untranslated string: dh parameter
 WARNING: untranslated string: dnat address
 WARNING: untranslated string: dns address deleted txt
 WARNING: untranslated string: dns servers
@@ -657,6 +661,7 @@ WARNING: untranslated string: dnsforward entries
 WARNING: untranslated string: dnsforward forward_server
 WARNING: untranslated string: dnsforward zone
 WARNING: untranslated string: downlink
+WARNING: untranslated string: download dh parameter
 WARNING: untranslated string: dpd delay
 WARNING: untranslated string: dpd timeout
 WARNING: untranslated string: drop action
@@ -685,6 +690,7 @@ WARNING: untranslated string: fireinfo why descr2
 WARNING: untranslated string: fireinfo why enable
 WARNING: untranslated string: fireinfo why read more
 WARNING: untranslated string: fireinfo your profile id
+WARNING: untranslated string: firewall logs country
 WARNING: untranslated string: firewall rules
 WARNING: untranslated string: first
 WARNING: untranslated string: flag
@@ -831,8 +837,12 @@ WARNING: untranslated string: fwhost stdnet
 WARNING: untranslated string: fwhost type
 WARNING: untranslated string: fwhost used
 WARNING: untranslated string: fwhost welcome
+WARNING: untranslated string: gen dh
+WARNING: untranslated string: generate dh key
 WARNING: untranslated string: grouptype
 WARNING: untranslated string: hardware support
+WARNING: untranslated string: imei
+WARNING: untranslated string: imsi
 WARNING: untranslated string: incoming firewall access
 WARNING: untranslated string: integrity
 WARNING: untranslated string: invalid input for dpd delay
@@ -846,8 +856,23 @@ WARNING: untranslated string: mac filter
 WARNING: untranslated string: maximum
 WARNING: untranslated string: minimum
 WARNING: untranslated string: minute
+WARNING: untranslated string: model
+WARNING: untranslated string: modem hardware details
+WARNING: untranslated string: modem information
+WARNING: untranslated string: modem network bit error rate
+WARNING: untranslated string: modem network information
+WARNING: untranslated string: modem network mode
+WARNING: untranslated string: modem network operator
+WARNING: untranslated string: modem network registration
+WARNING: untranslated string: modem network signal quality
+WARNING: untranslated string: modem no connection
+WARNING: untranslated string: modem no connection message
+WARNING: untranslated string: modem sim information
+WARNING: untranslated string: modem status
+WARNING: untranslated string: monitor interface
 WARNING: untranslated string: most preferred
 WARNING: untranslated string: no hardware random number generator
+WARNING: untranslated string: not a valid dh key
 WARNING: untranslated string: notice
 WARNING: untranslated string: ntp common settings
 WARNING: untranslated string: ntp sync
@@ -862,6 +887,14 @@ WARNING: untranslated string: openvpn prefix remote subnet
 WARNING: untranslated string: openvpn subnet is used
 WARNING: untranslated string: other
 WARNING: untranslated string: outgoing firewall access
+WARNING: untranslated string: ovpn crypt options
+WARNING: untranslated string: ovpn dh
+WARNING: untranslated string: ovpn dh new key
+WARNING: untranslated string: ovpn dh parameters
+WARNING: untranslated string: ovpn dh upload
+WARNING: untranslated string: ovpn generating the root and host certificates
+WARNING: untranslated string: ovpn ha
+WARNING: untranslated string: ovpn hmac
 WARNING: untranslated string: ovpn mgmt in root range
 WARNING: untranslated string: ovpn mtu-disc
 WARNING: untranslated string: ovpn mtu-disc and mtu not 1500
@@ -888,8 +921,11 @@ WARNING: untranslated string: routing config added
 WARNING: untranslated string: routing config changed
 WARNING: untranslated string: routing table
 WARNING: untranslated string: server restart
+WARNING: untranslated string: show dh
 WARNING: untranslated string: snat new source ip address
 WARNING: untranslated string: snort working
+WARNING: untranslated string: software version
+WARNING: untranslated string: source ip country
 WARNING: untranslated string: ssh
 WARNING: untranslated string: static routes
 WARNING: untranslated string: support donation
@@ -945,11 +981,13 @@ WARNING: untranslated string: tor traffic limit soft
 WARNING: untranslated string: tor traffic read written
 WARNING: untranslated string: tor use exit nodes
 WARNING: untranslated string: uplink
+WARNING: untranslated string: upload dh key
 WARNING: untranslated string: upload new ruleset
 WARNING: untranslated string: uptime load average
 WARNING: untranslated string: urlfilter file ext block
 WARNING: untranslated string: urlfilter mode block
 WARNING: untranslated string: urlfilter redirect template
+WARNING: untranslated string: vendor
 WARNING: untranslated string: visit us at
 WARNING: untranslated string: vpn keyexchange
 WARNING: untranslated string: wlan client
index 6245eefbf175f98fd03d87ebf82e17f5763d752c..8dd0a3c9496b763fb1c42f745584b3fcd7cdb394 100644 (file)
@@ -413,7 +413,6 @@ WARNING: translation string unused: optionsfw portlist hint
 WARNING: translation string unused: optionsfw warning
 WARNING: translation string unused: or
 WARNING: translation string unused: original
-WARNING: translation string unused: other countries
 WARNING: translation string unused: our donors
 WARNING: translation string unused: out
 WARNING: translation string unused: outgoing firewall
@@ -436,7 +435,6 @@ WARNING: translation string unused: outgoing firewall reset
 WARNING: translation string unused: outgoing firewall view group
 WARNING: translation string unused: outgoing firewall warning
 WARNING: translation string unused: override mtu
-WARNING: translation string unused: ovpn
 WARNING: translation string unused: ovpn config
 WARNING: translation string unused: ovpn dl
 WARNING: translation string unused: ovpn log
@@ -487,16 +485,12 @@ WARNING: translation string unused: released
 WARNING: translation string unused: removable device advice
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: requested data
-WARNING: translation string unused: reserved dst port
-WARNING: translation string unused: reserved src port
 WARNING: translation string unused: restore hardware settings
 WARNING: translation string unused: root
 WARNING: translation string unused: root path
 WARNING: translation string unused: root user password
 WARNING: translation string unused: route subnet is invalid
 WARNING: translation string unused: router ip
-WARNING: translation string unused: rsvd dst port overlap
-WARNING: translation string unused: rsvd src port overlap
 WARNING: translation string unused: rules already up to date
 WARNING: translation string unused: safe removal of umounted device
 WARNING: translation string unused: save error
@@ -634,6 +628,7 @@ WARNING: translation string unused: use dov
 WARNING: translation string unused: use ibod
 WARNING: translation string unused: view log
 WARNING: translation string unused: vpn aggrmode
+WARNING: translation string unused: vpn configuration main
 WARNING: translation string unused: vpn incompatible use of defaultroute
 WARNING: translation string unused: vpn mtu invalid
 WARNING: translation string unused: vpn on blue
@@ -649,14 +644,57 @@ WARNING: translation string unused: xtaccess all error
 WARNING: translation string unused: xtaccess bad transfert
 WARNING: translation string unused: year-graph
 WARNING: translation string unused: yearly firewallhits
+WARNING: untranslated string: MTU settings
+WARNING: untranslated string: Number of Countries for the pie chart
 WARNING: untranslated string: Scan for Songs
 WARNING: untranslated string: atm device
 WARNING: untranslated string: bytes
+WARNING: untranslated string: capabilities
+WARNING: untranslated string: default
+WARNING: untranslated string: dh
+WARNING: untranslated string: dh key move failed
+WARNING: untranslated string: dh key warn
+WARNING: untranslated string: dh key warn1
+WARNING: untranslated string: dh parameter
 WARNING: untranslated string: dns servers
+WARNING: untranslated string: download dh parameter
 WARNING: untranslated string: drop outgoing
+WARNING: untranslated string: firewall logs country
 WARNING: untranslated string: fwhost err hostip
+WARNING: untranslated string: gen dh
+WARNING: untranslated string: generate dh key
+WARNING: untranslated string: imei
+WARNING: untranslated string: imsi
+WARNING: untranslated string: model
+WARNING: untranslated string: modem hardware details
+WARNING: untranslated string: modem information
+WARNING: untranslated string: modem network bit error rate
+WARNING: untranslated string: modem network information
+WARNING: untranslated string: modem network mode
+WARNING: untranslated string: modem network operator
+WARNING: untranslated string: modem network registration
+WARNING: untranslated string: modem network signal quality
+WARNING: untranslated string: modem no connection
+WARNING: untranslated string: modem no connection message
+WARNING: untranslated string: modem sim information
+WARNING: untranslated string: modem status
+WARNING: untranslated string: monitor interface
+WARNING: untranslated string: not a valid dh key
+WARNING: untranslated string: ovpn crypt options
+WARNING: untranslated string: ovpn dh
+WARNING: untranslated string: ovpn dh new key
+WARNING: untranslated string: ovpn dh parameters
+WARNING: untranslated string: ovpn dh upload
+WARNING: untranslated string: ovpn generating the root and host certificates
+WARNING: untranslated string: ovpn ha
+WARNING: untranslated string: ovpn hmac
 WARNING: untranslated string: random number generator daemon
 WARNING: untranslated string: route config changed
 WARNING: untranslated string: routing config added
 WARNING: untranslated string: routing config changed
 WARNING: untranslated string: routing table
+WARNING: untranslated string: show dh
+WARNING: untranslated string: software version
+WARNING: untranslated string: source ip country
+WARNING: untranslated string: upload dh key
+WARNING: untranslated string: vendor
index b854a2b7a661cd648cc7d7e9ca4df61b2ea563c9..7b59a5e6c28425651931db78295db7d1bb4d64df 100644 (file)
@@ -360,7 +360,6 @@ WARNING: translation string unused: optionsfw portlist hint
 WARNING: translation string unused: optionsfw warning
 WARNING: translation string unused: or
 WARNING: translation string unused: original
-WARNING: translation string unused: other countries
 WARNING: translation string unused: out
 WARNING: translation string unused: outgoing firewall
 WARNING: translation string unused: outgoing firewall mode0
@@ -371,7 +370,6 @@ WARNING: translation string unused: outgoing firewall p2p description
 WARNING: translation string unused: outgoing firewall reset
 WARNING: translation string unused: outgoing firewall warning
 WARNING: translation string unused: override mtu
-WARNING: translation string unused: ovpn
 WARNING: translation string unused: ovpn config
 WARNING: translation string unused: ovpn dl
 WARNING: translation string unused: ovpn log
@@ -422,16 +420,12 @@ WARNING: translation string unused: released
 WARNING: translation string unused: removable device advice
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: requested data
-WARNING: translation string unused: reserved dst port
-WARNING: translation string unused: reserved src port
 WARNING: translation string unused: restore hardware settings
 WARNING: translation string unused: root
 WARNING: translation string unused: root path
 WARNING: translation string unused: root user password
 WARNING: translation string unused: route subnet is invalid
 WARNING: translation string unused: router ip
-WARNING: translation string unused: rsvd dst port overlap
-WARNING: translation string unused: rsvd src port overlap
 WARNING: translation string unused: rules already up to date
 WARNING: translation string unused: safe removal of umounted device
 WARNING: translation string unused: save error
@@ -558,6 +552,7 @@ WARNING: translation string unused: use dov
 WARNING: translation string unused: use ibod
 WARNING: translation string unused: view log
 WARNING: translation string unused: vpn aggrmode
+WARNING: translation string unused: vpn configuration main
 WARNING: translation string unused: vpn incompatible use of defaultroute
 WARNING: translation string unused: vpn mtu invalid
 WARNING: translation string unused: vpn on blue
@@ -580,6 +575,8 @@ WARNING: untranslated string: ConnSched reboot
 WARNING: untranslated string: ConnSched shutdown
 WARNING: untranslated string: MB read
 WARNING: untranslated string: MB written
+WARNING: untranslated string: MTU settings
+WARNING: untranslated string: Number of Countries for the pie chart
 WARNING: untranslated string: Scan for Songs
 WARNING: untranslated string: Set time on boot
 WARNING: untranslated string: addons
@@ -592,6 +589,7 @@ WARNING: untranslated string: atm device
 WARNING: untranslated string: attention
 WARNING: untranslated string: bit
 WARNING: untranslated string: bytes
+WARNING: untranslated string: capabilities
 WARNING: untranslated string: ccd add
 WARNING: untranslated string: ccd choose net
 WARNING: untranslated string: ccd client options
@@ -634,8 +632,14 @@ WARNING: untranslated string: countries
 WARNING: untranslated string: country codes and flags
 WARNING: untranslated string: countrycode
 WARNING: untranslated string: dead peer detection
+WARNING: untranslated string: default
 WARNING: untranslated string: deprecated fs warn
 WARNING: untranslated string: details
+WARNING: untranslated string: dh
+WARNING: untranslated string: dh key move failed
+WARNING: untranslated string: dh key warn
+WARNING: untranslated string: dh key warn1
+WARNING: untranslated string: dh parameter
 WARNING: untranslated string: dnat address
 WARNING: untranslated string: dns servers
 WARNING: untranslated string: dnsforward
@@ -646,6 +650,7 @@ WARNING: untranslated string: dnsforward entries
 WARNING: untranslated string: dnsforward forward_server
 WARNING: untranslated string: dnsforward zone
 WARNING: untranslated string: downlink
+WARNING: untranslated string: download dh parameter
 WARNING: untranslated string: dpd delay
 WARNING: untranslated string: dpd timeout
 WARNING: untranslated string: drop action
@@ -674,6 +679,7 @@ WARNING: untranslated string: fireinfo why descr2
 WARNING: untranslated string: fireinfo why enable
 WARNING: untranslated string: fireinfo why read more
 WARNING: untranslated string: fireinfo your profile id
+WARNING: untranslated string: firewall logs country
 WARNING: untranslated string: firewall rules
 WARNING: untranslated string: first
 WARNING: untranslated string: flag
@@ -820,8 +826,12 @@ WARNING: untranslated string: fwhost stdnet
 WARNING: untranslated string: fwhost type
 WARNING: untranslated string: fwhost used
 WARNING: untranslated string: fwhost welcome
+WARNING: untranslated string: gen dh
+WARNING: untranslated string: generate dh key
 WARNING: untranslated string: grouptype
 WARNING: untranslated string: hardware support
+WARNING: untranslated string: imei
+WARNING: untranslated string: imsi
 WARNING: untranslated string: incoming firewall access
 WARNING: untranslated string: integrity
 WARNING: untranslated string: invalid input for dpd delay
@@ -835,8 +845,23 @@ WARNING: untranslated string: mac filter
 WARNING: untranslated string: maximum
 WARNING: untranslated string: minimum
 WARNING: untranslated string: minute
+WARNING: untranslated string: model
+WARNING: untranslated string: modem hardware details
+WARNING: untranslated string: modem information
+WARNING: untranslated string: modem network bit error rate
+WARNING: untranslated string: modem network information
+WARNING: untranslated string: modem network mode
+WARNING: untranslated string: modem network operator
+WARNING: untranslated string: modem network registration
+WARNING: untranslated string: modem network signal quality
+WARNING: untranslated string: modem no connection
+WARNING: untranslated string: modem no connection message
+WARNING: untranslated string: modem sim information
+WARNING: untranslated string: modem status
+WARNING: untranslated string: monitor interface
 WARNING: untranslated string: most preferred
 WARNING: untranslated string: no hardware random number generator
+WARNING: untranslated string: not a valid dh key
 WARNING: untranslated string: notice
 WARNING: untranslated string: openvpn default
 WARNING: untranslated string: openvpn destination port used
@@ -851,8 +876,16 @@ WARNING: untranslated string: other
 WARNING: untranslated string: outgoing firewall access
 WARNING: untranslated string: outgoing firewall p2p allow
 WARNING: untranslated string: outgoing firewall p2p deny
+WARNING: untranslated string: ovpn crypt options
+WARNING: untranslated string: ovpn dh
+WARNING: untranslated string: ovpn dh new key
+WARNING: untranslated string: ovpn dh parameters
+WARNING: untranslated string: ovpn dh upload
 WARNING: untranslated string: ovpn errmsg green already pushed
 WARNING: untranslated string: ovpn errmsg invalid ip or mask
+WARNING: untranslated string: ovpn generating the root and host certificates
+WARNING: untranslated string: ovpn ha
+WARNING: untranslated string: ovpn hmac
 WARNING: untranslated string: ovpn mgmt in root range
 WARNING: untranslated string: ovpn mtu-disc
 WARNING: untranslated string: ovpn mtu-disc and mtu not 1500
@@ -881,7 +914,10 @@ WARNING: untranslated string: routing config added
 WARNING: untranslated string: routing config changed
 WARNING: untranslated string: routing table
 WARNING: untranslated string: server restart
+WARNING: untranslated string: show dh
 WARNING: untranslated string: snat new source ip address
+WARNING: untranslated string: software version
+WARNING: untranslated string: source ip country
 WARNING: untranslated string: ssh
 WARNING: untranslated string: static routes
 WARNING: untranslated string: support donation
@@ -937,8 +973,10 @@ WARNING: untranslated string: tor traffic limit soft
 WARNING: untranslated string: tor traffic read written
 WARNING: untranslated string: tor use exit nodes
 WARNING: untranslated string: uplink
+WARNING: untranslated string: upload dh key
 WARNING: untranslated string: uptime load average
 WARNING: untranslated string: urlfilter redirect template
+WARNING: untranslated string: vendor
 WARNING: untranslated string: visit us at
 WARNING: untranslated string: vpn keyexchange
 WARNING: untranslated string: wlan client
index 4058098609168fbc2f48ed489da08ac8929b9e24..2d12fc6040b0677ae48b926bfb00b2260eab00d7 100644 (file)
@@ -354,7 +354,6 @@ WARNING: translation string unused: optionsfw portlist hint
 WARNING: translation string unused: optionsfw warning
 WARNING: translation string unused: or
 WARNING: translation string unused: original
-WARNING: translation string unused: other countries
 WARNING: translation string unused: out
 WARNING: translation string unused: outgoing firewall
 WARNING: translation string unused: outgoing firewall add ip group
@@ -376,7 +375,6 @@ WARNING: translation string unused: outgoing firewall reset
 WARNING: translation string unused: outgoing firewall view group
 WARNING: translation string unused: outgoing firewall warning
 WARNING: translation string unused: override mtu
-WARNING: translation string unused: ovpn
 WARNING: translation string unused: ovpn config
 WARNING: translation string unused: ovpn dl
 WARNING: translation string unused: ovpn log
@@ -427,16 +425,12 @@ WARNING: translation string unused: released
 WARNING: translation string unused: removable device advice
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: requested data
-WARNING: translation string unused: reserved dst port
-WARNING: translation string unused: reserved src port
 WARNING: translation string unused: restore hardware settings
 WARNING: translation string unused: root
 WARNING: translation string unused: root path
 WARNING: translation string unused: root user password
 WARNING: translation string unused: route subnet is invalid
 WARNING: translation string unused: router ip
-WARNING: translation string unused: rsvd dst port overlap
-WARNING: translation string unused: rsvd src port overlap
 WARNING: translation string unused: rules already up to date
 WARNING: translation string unused: safe removal of umounted device
 WARNING: translation string unused: save error
@@ -563,6 +557,7 @@ WARNING: translation string unused: use dov
 WARNING: translation string unused: use ibod
 WARNING: translation string unused: view log
 WARNING: translation string unused: vpn aggrmode
+WARNING: translation string unused: vpn configuration main
 WARNING: translation string unused: vpn incompatible use of defaultroute
 WARNING: translation string unused: vpn mtu invalid
 WARNING: translation string unused: vpn on blue
@@ -584,6 +579,8 @@ WARNING: untranslated string: ConnSched shutdown
 WARNING: untranslated string: Edit an existing route
 WARNING: untranslated string: MB read
 WARNING: untranslated string: MB written
+WARNING: untranslated string: MTU settings
+WARNING: untranslated string: Number of Countries for the pie chart
 WARNING: untranslated string: Scan for Songs
 WARNING: untranslated string: addons
 WARNING: untranslated string: advproxy cache-digest
@@ -595,6 +592,7 @@ WARNING: untranslated string: atm device
 WARNING: untranslated string: attention
 WARNING: untranslated string: bit
 WARNING: untranslated string: bytes
+WARNING: untranslated string: capabilities
 WARNING: untranslated string: ccd add
 WARNING: untranslated string: ccd choose net
 WARNING: untranslated string: ccd client options
@@ -638,8 +636,14 @@ WARNING: untranslated string: countries
 WARNING: untranslated string: country codes and flags
 WARNING: untranslated string: countrycode
 WARNING: untranslated string: dead peer detection
+WARNING: untranslated string: default
 WARNING: untranslated string: deprecated fs warn
 WARNING: untranslated string: details
+WARNING: untranslated string: dh
+WARNING: untranslated string: dh key move failed
+WARNING: untranslated string: dh key warn
+WARNING: untranslated string: dh key warn1
+WARNING: untranslated string: dh parameter
 WARNING: untranslated string: disk access per
 WARNING: untranslated string: dnat address
 WARNING: untranslated string: dns servers
@@ -651,6 +655,7 @@ WARNING: untranslated string: dnsforward entries
 WARNING: untranslated string: dnsforward forward_server
 WARNING: untranslated string: dnsforward zone
 WARNING: untranslated string: downlink
+WARNING: untranslated string: download dh parameter
 WARNING: untranslated string: dpd delay
 WARNING: untranslated string: dpd timeout
 WARNING: untranslated string: drop action
@@ -669,6 +674,7 @@ WARNING: untranslated string: extrahd maybe the device is in use
 WARNING: untranslated string: extrahd to
 WARNING: untranslated string: extrahd to root
 WARNING: untranslated string: extrahd you cant mount
+WARNING: untranslated string: firewall logs country
 WARNING: untranslated string: firewall rules
 WARNING: untranslated string: first
 WARNING: untranslated string: flag
@@ -815,8 +821,12 @@ WARNING: untranslated string: fwhost stdnet
 WARNING: untranslated string: fwhost type
 WARNING: untranslated string: fwhost used
 WARNING: untranslated string: fwhost welcome
+WARNING: untranslated string: gen dh
+WARNING: untranslated string: generate dh key
 WARNING: untranslated string: grouptype
 WARNING: untranslated string: hardware support
+WARNING: untranslated string: imei
+WARNING: untranslated string: imsi
 WARNING: untranslated string: incoming firewall access
 WARNING: untranslated string: incoming traffic in bytes per second
 WARNING: untranslated string: integrity
@@ -831,8 +841,23 @@ WARNING: untranslated string: mac filter
 WARNING: untranslated string: maximum
 WARNING: untranslated string: minimum
 WARNING: untranslated string: minute
+WARNING: untranslated string: model
+WARNING: untranslated string: modem hardware details
+WARNING: untranslated string: modem information
+WARNING: untranslated string: modem network bit error rate
+WARNING: untranslated string: modem network information
+WARNING: untranslated string: modem network mode
+WARNING: untranslated string: modem network operator
+WARNING: untranslated string: modem network registration
+WARNING: untranslated string: modem network signal quality
+WARNING: untranslated string: modem no connection
+WARNING: untranslated string: modem no connection message
+WARNING: untranslated string: modem sim information
+WARNING: untranslated string: modem status
+WARNING: untranslated string: monitor interface
 WARNING: untranslated string: most preferred
 WARNING: untranslated string: no hardware random number generator
+WARNING: untranslated string: not a valid dh key
 WARNING: untranslated string: notice
 WARNING: untranslated string: openvpn default
 WARNING: untranslated string: openvpn destination port used
@@ -846,6 +871,14 @@ WARNING: untranslated string: openvpn subnet is used
 WARNING: untranslated string: other
 WARNING: untranslated string: outgoing firewall access
 WARNING: untranslated string: outgoing traffic in bytes per second
+WARNING: untranslated string: ovpn crypt options
+WARNING: untranslated string: ovpn dh
+WARNING: untranslated string: ovpn dh new key
+WARNING: untranslated string: ovpn dh parameters
+WARNING: untranslated string: ovpn dh upload
+WARNING: untranslated string: ovpn generating the root and host certificates
+WARNING: untranslated string: ovpn ha
+WARNING: untranslated string: ovpn hmac
 WARNING: untranslated string: ovpn mgmt in root range
 WARNING: untranslated string: ovpn mtu-disc
 WARNING: untranslated string: ovpn mtu-disc and mtu not 1500
@@ -871,7 +904,10 @@ WARNING: untranslated string: routing config added
 WARNING: untranslated string: routing config changed
 WARNING: untranslated string: routing table
 WARNING: untranslated string: server restart
+WARNING: untranslated string: show dh
 WARNING: untranslated string: snat new source ip address
+WARNING: untranslated string: software version
+WARNING: untranslated string: source ip country
 WARNING: untranslated string: ssh
 WARNING: untranslated string: static routes
 WARNING: untranslated string: support donation
@@ -926,8 +962,10 @@ WARNING: untranslated string: tor traffic limit soft
 WARNING: untranslated string: tor traffic read written
 WARNING: untranslated string: tor use exit nodes
 WARNING: untranslated string: uplink
+WARNING: untranslated string: upload dh key
 WARNING: untranslated string: uptime load average
 WARNING: untranslated string: urlfilter redirect template
+WARNING: untranslated string: vendor
 WARNING: untranslated string: visit us at
 WARNING: untranslated string: vpn keyexchange
 WARNING: untranslated string: wlan client
index e6af830a5d47d90f302ff5094fa3d37a3016700e..7ce95e02af53360fbb422bc8c5f57033a770d0c1 100644 (file)
@@ -412,7 +412,6 @@ WARNING: translation string unused: optionsfw portlist hint
 WARNING: translation string unused: optionsfw warning
 WARNING: translation string unused: or
 WARNING: translation string unused: original
-WARNING: translation string unused: other countries
 WARNING: translation string unused: our donors
 WARNING: translation string unused: out
 WARNING: translation string unused: outgoing firewall
@@ -435,7 +434,6 @@ WARNING: translation string unused: outgoing firewall reset
 WARNING: translation string unused: outgoing firewall view group
 WARNING: translation string unused: outgoing firewall warning
 WARNING: translation string unused: override mtu
-WARNING: translation string unused: ovpn
 WARNING: translation string unused: ovpn config
 WARNING: translation string unused: ovpn dl
 WARNING: translation string unused: ovpn log
@@ -486,16 +484,12 @@ WARNING: translation string unused: released
 WARNING: translation string unused: removable device advice
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: requested data
-WARNING: translation string unused: reserved dst port
-WARNING: translation string unused: reserved src port
 WARNING: translation string unused: restore hardware settings
 WARNING: translation string unused: root
 WARNING: translation string unused: root path
 WARNING: translation string unused: root user password
 WARNING: translation string unused: route subnet is invalid
 WARNING: translation string unused: router ip
-WARNING: translation string unused: rsvd dst port overlap
-WARNING: translation string unused: rsvd src port overlap
 WARNING: translation string unused: rules already up to date
 WARNING: translation string unused: safe removal of umounted device
 WARNING: translation string unused: save error
@@ -633,6 +627,7 @@ WARNING: translation string unused: use dov
 WARNING: translation string unused: use ibod
 WARNING: translation string unused: view log
 WARNING: translation string unused: vpn aggrmode
+WARNING: translation string unused: vpn configuration main
 WARNING: translation string unused: vpn incompatible use of defaultroute
 WARNING: translation string unused: vpn mtu invalid
 WARNING: translation string unused: vpn on blue
@@ -648,10 +643,53 @@ WARNING: translation string unused: xtaccess all error
 WARNING: translation string unused: xtaccess bad transfert
 WARNING: translation string unused: year-graph
 WARNING: translation string unused: yearly firewallhits
+WARNING: untranslated string: MTU settings
+WARNING: untranslated string: Number of Countries for the pie chart
 WARNING: untranslated string: Scan for Songs
 WARNING: untranslated string: bytes
+WARNING: untranslated string: capabilities
+WARNING: untranslated string: default
+WARNING: untranslated string: dh
+WARNING: untranslated string: dh key move failed
+WARNING: untranslated string: dh key warn
+WARNING: untranslated string: dh key warn1
+WARNING: untranslated string: dh parameter
+WARNING: untranslated string: download dh parameter
+WARNING: untranslated string: firewall logs country
 WARNING: untranslated string: fwhost err hostip
+WARNING: untranslated string: gen dh
+WARNING: untranslated string: generate dh key
+WARNING: untranslated string: imei
+WARNING: untranslated string: imsi
+WARNING: untranslated string: model
+WARNING: untranslated string: modem hardware details
+WARNING: untranslated string: modem information
+WARNING: untranslated string: modem network bit error rate
+WARNING: untranslated string: modem network information
+WARNING: untranslated string: modem network mode
+WARNING: untranslated string: modem network operator
+WARNING: untranslated string: modem network registration
+WARNING: untranslated string: modem network signal quality
+WARNING: untranslated string: modem no connection
+WARNING: untranslated string: modem no connection message
+WARNING: untranslated string: modem sim information
+WARNING: untranslated string: modem status
+WARNING: untranslated string: monitor interface
+WARNING: untranslated string: not a valid dh key
+WARNING: untranslated string: ovpn crypt options
+WARNING: untranslated string: ovpn dh
+WARNING: untranslated string: ovpn dh new key
+WARNING: untranslated string: ovpn dh parameters
+WARNING: untranslated string: ovpn dh upload
+WARNING: untranslated string: ovpn generating the root and host certificates
+WARNING: untranslated string: ovpn ha
+WARNING: untranslated string: ovpn hmac
 WARNING: untranslated string: route config changed
 WARNING: untranslated string: routing config added
 WARNING: untranslated string: routing config changed
 WARNING: untranslated string: routing table
+WARNING: untranslated string: show dh
+WARNING: untranslated string: software version
+WARNING: untranslated string: source ip country
+WARNING: untranslated string: upload dh key
+WARNING: untranslated string: vendor
index 1a386c19c23e1affcf211fec821fc91c669d8013..7ae53f8a228252d7ae371883b482a027f64ef633 100644 (file)
@@ -6,6 +6,7 @@
 ############################################################################
 < addon
 < ccd maxclients
+< ovpn_fragment
 ############################################################################
 # Checking install/setup translations for language: fr                     #
 ############################################################################
@@ -26,6 +27,7 @@
 < atm device
 < attention
 < bit
+< capabilities
 < ccd add
 < ccd choose net
 < ccd clientip
 < countries
 < countrycode
 < country codes and flags
+< default
 < default ip
 < deprecated fs warn
 < details
+< dh
+< dh key move failed
+< dh key warn
+< dh key warn1
+< dh parameter
 < dnat address
 < dns address deleted txt
 < dnsforward
@@ -87,7 +95,7 @@
 < dnsforward forward_server
 < dnsforward zone
 < dns servers
-< downlink
+< download dh parameter
 < dpd delay
 < dpd timeout
 < drop action
 < fireinfo why enable
 < fireinfo why read more
 < fireinfo your profile id
+< firewall logs country
 < firewall rules
-< first
 < flag
 < forward firewall
 < fw default drop
 < fw settings dropdown
 < fw settings remark
 < fw settings ruletable
+< gen dh
+< generate dh key
 < grouptype
 < hardware support
+< imei
+< imsi
 < incoming firewall access
 < integrity
 < invalid input for dpd delay
 < ipsec
 < ipsec network
 < ipsec no connections
-< last
 < least preferred
 < lifetime
 < mac filter
 < MB written
 < minimum
 < minute
+< model
+< modem hardware details
+< modem information
+< modem network bit error rate
+< modem network information
+< modem network mode
+< modem network operator
+< modem network registration
+< modem network signal quality
+< modem no connection
+< modem no connection message
+< modem sim information
+< modem status
 < most preferred
+< MTU settings
+< never
 < no hardware random number generator
+< not a valid dh key
 < notice
 < ntp common settings
 < ntp sync
+< Number of Countries for the pie chart
 < openvpn default
 < openvpn destination port used
 < openvpn disabled
 < other
 < our donors
 < outgoing firewall access
+< ovpn crypt options
+< ovpn dh
+< ovpn dh new key
+< ovpn dh parameters
+< ovpn dh upload
+< ovpn engines
+< ovpn generating the root and host certificates
+< ovpn ha
+< ovpn hmac
 < ovpn mgmt in root range
 < ovpn mtu-disc
 < ovpn mtu-disc and mtu not 1500
 < ovpn mtu-disc yes
 < ovpn no connections
 < ovpn port in root range
+< ovpn reneg sec
 < p2p block
 < p2p block save notice
 < proxy reports
 < random number generator daemon
 < red1
 < server restart
+< show dh
 < snat new source ip address
 < snort working
+< software version
+< source ip country
 < ssh
 < static routes
 < support donation
 < tor use exit nodes
 < updxlrtr sources
 < updxlrtr standard view
-< uplink
+< upload dh key
 < upload new ruleset
 < uptime
 < uptime load average
 < urlfilter file ext block
 < urlfilter mode block
 < urlfilter redirect template
+< vendor
 < visit us at
 < vpn keyexchange
 < wlanap access point
 < atm device
 < attention
 < bit
+< capabilities
 < ccd add
 < ccd choose net
 < ccd clientip
 < countries
 < countrycode
 < country codes and flags
+< default
 < default ip
 < deprecated fs warn
 < details
+< dh
+< dh key move failed
+< dh key warn
+< dh key warn1
+< dh parameter
 < dnat address
 < dnsforward
 < dnsforward add a new entry
 < dnsforward forward_server
 < dnsforward zone
 < dns servers
-< downlink
+< download dh parameter
 < dpd delay
 < dpd timeout
 < drop action
 < fireinfo why enable
 < fireinfo why read more
 < fireinfo your profile id
+< firewall logs country
 < firewall rules
-< first
 < flag
 < forward firewall
 < fw default drop
 < fw settings dropdown
 < fw settings remark
 < fw settings ruletable
+< gen dh
+< generate dh key
 < grouptype
 < hardware support
+< imei
+< imsi
 < incoming firewall access
 < integrity
 < invalid input for dpd delay
 < ipsec
 < ipsec network
 < ipsec no connections
-< last
 < least preferred
 < lifetime
 < mac filter
 < MB written
 < minimum
 < minute
+< model
+< modem hardware details
+< modem information
+< modem network bit error rate
+< modem network information
+< modem network mode
+< modem network operator
+< modem network registration
+< modem network signal quality
+< modem no connection
+< modem no connection message
+< modem sim information
+< modem status
 < most preferred
+< MTU settings
+< never
 < no hardware random number generator
+< not a valid dh key
 < notice
+< Number of Countries for the pie chart
 < openvpn default
 < openvpn destination port used
 < openvpn disabled
 < outgoing firewall p2p description 2
 < outgoing firewall p2p description 3
 < outgoing firewall view group
+< ovpn crypt options
+< ovpn dh
+< ovpn dh new key
+< ovpn dh parameters
+< ovpn dh upload
+< ovpn engines
 < ovpn errmsg green already pushed
 < ovpn errmsg invalid ip or mask
+< ovpn generating the root and host certificates
+< ovpn ha
+< ovpn hmac
 < ovpn mgmt in root range
 < ovpn mtu-disc
 < ovpn mtu-disc and mtu not 1500
 < ovpn mtu-disc yes
 < ovpn no connections
 < ovpn port in root range
+< ovpn reneg sec
 < ovpn routes push
 < ovpn routes push options
 < p2p block
 < red1
 < server restart
 < Set time on boot
+< show dh
 < snat new source ip address
+< software version
+< source ip country
 < ssh
 < static routes
 < support donation
 < tor use exit nodes
 < updxlrtr sources
 < updxlrtr standard view
-< uplink
+< upload dh key
 < uptime
 < uptime load average
 < urlfilter redirect template
+< vendor
 < visit us at
 < vpn keyexchange
 < wlanap country
 < atm device
 < attention
 < bit
+< capabilities
 < ccd add
 < ccd choose net
 < ccd clientip
 < countries
 < countrycode
 < country codes and flags
+< default
 < default ip
 < deprecated fs warn
 < details
+< dh
+< dh key move failed
+< dh key warn
+< dh key warn1
+< dh parameter
 < dnat address
 < dnsforward
 < dnsforward add a new entry
 < dnsforward forward_server
 < dnsforward zone
 < dns servers
-< downlink
+< download dh parameter
 < dpd delay
 < dpd timeout
 < drop action
 < extrahd unable to read
 < extrahd unable to write
 < extrahd you cant mount
+< firewall logs country
 < firewall rules
-< first
 < flag
 < forward firewall
 < fw default drop
 < fw settings dropdown
 < fw settings remark
 < fw settings ruletable
+< gen dh
+< generate dh key
 < grouptype
 < hardware support
+< imei
+< imsi
 < incoming firewall access
 < integrity
 < invalid input for dpd delay
 < ipsec
 < ipsec network
 < ipsec no connections
-< last
 < least preferred
 < lifetime
 < mac filter
 < MB written
 < minimum
 < minute
+< model
+< modem hardware details
+< modem information
+< modem network bit error rate
+< modem network information
+< modem network mode
+< modem network operator
+< modem network registration
+< modem network signal quality
+< modem no connection
+< modem no connection message
+< modem sim information
+< modem status
 < most preferred
+< MTU settings
+< never
 < no hardware random number generator
+< not a valid dh key
 < notice
+< Number of Countries for the pie chart
 < openvpn default
 < openvpn destination port used
 < openvpn disabled
 < other
 < our donors
 < outgoing firewall access
+< ovpn crypt options
+< ovpn dh
+< ovpn dh new key
+< ovpn dh parameters
+< ovpn dh upload
+< ovpn engines
 < ovpn errmsg green already pushed
 < ovpn errmsg invalid ip or mask
+< ovpn generating the root and host certificates
+< ovpn ha
+< ovpn hmac
 < ovpn mgmt in root range
 < ovpn mtu-disc
 < ovpn mtu-disc and mtu not 1500
 < ovpn mtu-disc yes
 < ovpn no connections
 < ovpn port in root range
+< ovpn reneg sec
 < ovpn routes push
 < ovpn routes push options
 < p2p block
 < random number generator daemon
 < red1
 < server restart
+< show dh
 < snat new source ip address
+< software version
+< source ip country
 < ssh
 < static routes
 < support donation
 < tor use exit nodes
 < updxlrtr sources
 < updxlrtr standard view
-< uplink
+< upload dh key
 < uptime
 < uptime load average
 < urlfilter redirect template
+< vendor
 < visit us at
 < vpn keyexchange
 < wlanap country
 < atm device
 < attention
 < bit
+< capabilities
 < ccd add
 < ccd choose net
 < ccd clientip
 < countrycode
 < country codes and flags
 < day-graph
+< default
 < default ip
 < deprecated fs warn
 < details
+< dh
+< dh key move failed
+< dh key warn
+< dh key warn1
+< dh parameter
 < disk access per
 < dnat address
 < dnsforward
 < dnsforward forward_server
 < dnsforward zone
 < dns servers
-< downlink
+< download dh parameter
 < dpd delay
 < dpd timeout
 < drop action
 < extrahd unable to read
 < extrahd unable to write
 < extrahd you cant mount
+< firewall logs country
 < firewall rules
-< first
 < flag
 < forward firewall
 < frequency
 < fw settings dropdown
 < fw settings remark
 < fw settings ruletable
+< gen dh
+< generate dh key
 < grouptype
 < hardware support
 < hour-graph
+< imei
+< imsi
 < incoming firewall access
 < incoming traffic in bytes per second
 < integrity
 < ipsec
 < ipsec network
 < ipsec no connections
-< last
 < least preferred
 < lifetime
 < mac filter
 < MB written
 < minimum
 < minute
+< model
+< modem hardware details
+< modem information
+< modem network bit error rate
+< modem network information
+< modem network mode
+< modem network operator
+< modem network registration
+< modem network signal quality
+< modem no connection
+< modem no connection message
+< modem sim information
+< modem status
 < month-graph
 < most preferred
+< MTU settings
+< never
 < no hardware random number generator
+< not a valid dh key
 < notice
+< Number of Countries for the pie chart
 < openvpn default
 < openvpn destination port used
 < openvpn disabled
 < our donors
 < outgoing firewall access
 < outgoing traffic in bytes per second
+< ovpn crypt options
+< ovpn dh
+< ovpn dh new key
+< ovpn dh parameters
+< ovpn dh upload
+< ovpn engines
+< ovpn generating the root and host certificates
+< ovpn ha
+< ovpn hmac
 < ovpn mgmt in root range
 < ovpn mtu-disc
 < ovpn mtu-disc and mtu not 1500
 < ovpn mtu-disc yes
 < ovpn no connections
 < ovpn port in root range
+< ovpn reneg sec
 < p2p block
 < p2p block save notice
 < proxy reports
 < random number generator daemon
 < red1
 < server restart
+< show dh
 < snat new source ip address
+< software version
+< source ip country
 < ssh
 < static routes
 < support donation
 < tor use exit nodes
 < updxlrtr sources
 < updxlrtr standard view
-< uplink
+< upload dh key
 < uptime
 < uptime load average
 < urlfilter redirect template
+< vendor
 < visit us at
 < vpn keyexchange
 < week-graph
index c025a5c32e663042a4b07a754d079cd673bb25bb..78a73efacbbce7c881805c9c499a650c474911c8 100644 (file)
@@ -13,3 +13,11 @@ Maintainer / advanced commands
     toolchain : Create our own toolchain package to save 20% of build time.
         shell : Enter a shell inside the chroot, used to tune lfs script
                  and / or during kernel upgrade to rebuild a new .config
+
+
+Options:
+    --target=[armv5tel|i586] : Cross-compile for this target architecture.
+                               Uses the QEMU emulator if needed to virtualise
+                               the desired target architecture.
+                               Can be permanently set with TARGET_ARCH= in
+                               .config.
index 4e51ab6fd27ea8fb20e38e88ba4e74fe0fd51624..4b4bc63d7fbea9b346fe7dbeadfdc3a265e29a41 100644 (file)
@@ -253,8 +253,11 @@ $checked{'SERVICE'}{'nsupdate'} = '';
 $checked{'SERVICE'}{'ovh.com'} = '';
 $checked{'SERVICE'}{'regfish.com'} = '';
 $checked{'SERVICE'}{'selfhost.de'} = '';
+$checked{'SERVICE'}{'spdns.org'} = '';
 $checked{'SERVICE'}{'strato.com'} = '';
+$checked{'SERVICE'}{'twodns.de'} = '';
 $checked{'SERVICE'}{'tzo.com'} = '';
+$checked{'SERVICE'}{'variomedia.de'} = '';
 $checked{'SERVICE'}{'zoneedit.com'} = '';
 $checked{'SERVICE'}{$settings{'SERVICE'}} = "selected='selected'";
 
@@ -349,8 +352,11 @@ print <<END
     <option $checked{'SERVICE'}{'ovh.com'}>ovh.com</option>
     <option $checked{'SERVICE'}{'regfish.com'}>regfish.com</option>
     <option $checked{'SERVICE'}{'selfhost.de'}>selfhost.de</option>
+    <option $checked{'SERVICE'}{'spdns.org'}>spdns.org</option>
     <option $checked{'SERVICE'}{'strato.com'}>strato.com</option>
+    <option $checked{'SERVICE'}{'twodns.de'}>twodns.de</option>
 <!--    <option $checked{'SERVICE'}{'tzo.com'}>tzo.com</option>        comment this service out until a working fix is developed -->
+    <option $checked{'SERVICE'}{'variomedia.de'}>variomedia.de</option>
     <option $checked{'SERVICE'}{'zoneedit.com'}>zoneedit.com</option>
     </select></td>
     <td width='20%' class='base'>$Lang::tr{'hostname'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
index 55e2645061c659ba7406cd83d5e39ad25258a63a..5a28daaedd2b5118b554b29f70429f5fc395bd5d 100644 (file)
@@ -263,9 +263,9 @@ if (-e "/etc/snort/snort.conf") {
 #######################  End added for snort rules control  #################################
 
 if ($snortsettings{'RULES'} eq 'subscripted') {
-       $url=" http://www.snort.org/sub-rules/snortrules-snapshot-2953.tar.gz/$snortsettings{'OINKCODE'}";
+       $url=" http://www.snort.org/sub-rules/snortrules-snapshot-2961.tar.gz/$snortsettings{'OINKCODE'}";
 } elsif ($snortsettings{'RULES'} eq 'registered') {
-       $url=" http://www.snort.org/reg-rules/snortrules-snapshot-2950.tar.gz/$snortsettings{'OINKCODE'}";
+       $url=" http://www.snort.org/reg-rules/snortrules-snapshot-2960.tar.gz/$snortsettings{'OINKCODE'}";
 } elsif ($snortsettings{'RULES'} eq 'community') {
        $url=" http://s3.amazonaws.com/snort-org/www/rules/community/community-rules.tar.gz";
 } else {
diff --git a/html/cgi-bin/logs.cgi/firewalllogcountry.dat b/html/cgi-bin/logs.cgi/firewalllogcountry.dat
new file mode 100644 (file)
index 0000000..af14279
--- /dev/null
@@ -0,0 +1,523 @@
+#!/usr/bin/perl
+#
+# SmoothWall CGIs
+#
+# This code is distributed under the terms of the GPL
+#
+# JC HERITIER 
+# page inspired from the initial firewalllog.dat
+#
+# Modified for IPFire by Christian Schmidt
+#                            and Michael Tremer (www.ipfire.org)
+
+use strict;
+use Geo::IP::PurePerl;
+use Getopt::Std;
+
+# enable only the following on debugging purpose
+#use warnings;
+#use CGI::Carp 'fatalsToBrowser';
+
+require '/var/ipfire/general-functions.pl';
+require "${General::swroot}/lang.pl";
+require "${General::swroot}/header.pl";
+
+use POSIX();
+
+my %cgiparams=();
+my %settings=();
+my $pienumber;
+my $otherspie;
+my $showpie;
+my $sortcolumn;
+my $errormessage = '';
+
+$cgiparams{'pienumber'} = 10;
+$cgiparams{'otherspie'} = 1;
+$cgiparams{'showpie'} = 1;
+$cgiparams{'sortcolumn'} = 1;
+
+my @shortmonths = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug',
+        'Sep', 'Oct', 'Nov', 'Dec' );
+my @longmonths = ( $Lang::tr{'january'}, $Lang::tr{'february'}, $Lang::tr{'march'},
+        $Lang::tr{'april'}, $Lang::tr{'may'}, $Lang::tr{'june'}, $Lang::tr{'july'}, $Lang::tr{'august'},
+        $Lang::tr{'september'}, $Lang::tr{'october'}, $Lang::tr{'november'},
+        $Lang::tr{'december'} );
+
+my @now = localtime();
+my $dow = $now[6];
+my $doy = $now[7];
+my $tdoy = $now[7];
+my $year = $now[5]+1900;
+
+$cgiparams{'DAY'} = $now[3];
+$cgiparams{'MONTH'} = $now[4];
+$cgiparams{'ACTION'} = '';
+
+&General::readhash("${General::swroot}/fwlogs/ipsettings", \%settings);
+if ($settings{'pienumber'} != 0) { $cgiparams{'pienumber'} = $settings{'pienumber'} };
+if ($settings{'otherspie'} != 0) { $cgiparams{'otherspie'} = $settings{'otherspie'} };
+if ($settings{'showpie'} != 0) { $cgiparams{'showpie'} = $settings{'showpie'} };
+if ($settings{'sortcolumn'} != 0) { $cgiparams{'sortcolumn'} = $settings{'sortcolumn'} };
+
+&Header::getcgihash(\%cgiparams);
+if ($cgiparams{'pienumber'} != 0) { $settings{'pienumber'} = $cgiparams{'pienumber'} };
+if ($cgiparams{'otherspie'} != 0) { $settings{'otherspie'} = $cgiparams{'otherspie'} };
+if ($cgiparams{'showpie'} != 0) { $settings{'showpie'} = $cgiparams{'showpie'} };
+if ($cgiparams{'sortcolumn'} != 0) { $settings{'sortcolumn'} = $cgiparams{'sortcolumn'} };
+
+if ($cgiparams{'ACTION'} eq $Lang::tr{'save'})
+{
+   &General::writehash("${General::swroot}/fwlogs/ipsettings", \%settings);
+}
+
+my $start = -1;
+if ($ENV{'QUERY_STRING'} && $cgiparams{'ACTION'} ne $Lang::tr{'update'})
+{
+        my @temp = split(',',$ENV{'QUERY_STRING'});
+        $start = $temp[0];
+        $cgiparams{'MONTH'} = $temp[1];
+        $cgiparams{'DAY'} = $temp[2];
+}
+
+if (!($cgiparams{'MONTH'} =~ /^(0|1|2|3|4|5|6|7|8|9|10|11)$/) ||
+    !($cgiparams{'DAY'} =~ /^(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)$/))
+{
+        $cgiparams{'DAY'} = $now[3];
+        $cgiparams{'MONTH'} = $now[4];
+}
+elsif($cgiparams{'ACTION'} eq '>>')
+{
+        my @temp_then=();
+        my @temp_now = localtime(time);
+        $temp_now[4] = $cgiparams{'MONTH'};
+        $temp_now[3] = $cgiparams{'DAY'};
+        @temp_then = localtime(POSIX::mktime(@temp_now) + 86400);
+           ## Retrieve the same time on the next day -
+           ## 86400 seconds in a day
+        $cgiparams{'MONTH'} = $temp_then[4];
+        $cgiparams{'DAY'} = $temp_then[3];
+}
+elsif($cgiparams{'ACTION'} eq '<<')
+{
+        my @temp_then=();
+        my @temp_now = localtime(time);
+        $temp_now[4] = $cgiparams{'MONTH'};
+        $temp_now[3] = $cgiparams{'DAY'};
+        @temp_then = localtime(POSIX::mktime(@temp_now) - 86400);
+           ## Retrieve the same time on the previous day -
+           ## 86400 seconds in a day
+        $cgiparams{'MONTH'} = $temp_then[4];
+        $cgiparams{'DAY'} = $temp_then[3];
+}
+
+if (($cgiparams{'DAY'} ne $now[3]) || ($cgiparams{'MONTH'} ne $now[4]))
+{
+        my @then = ();
+        if ( (  $cgiparams{'MONTH'} eq $now[4]) && ($cgiparams{'DAY'} > $now[3]) ||
+                        ( $cgiparams{'MONTH'} > $now[4] ) ) {
+                @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1901 ));
+        } else {
+                @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1900 ));
+        }
+        $tdoy = $then[7];
+        my $lastleap=($year-1)%4;
+        if ($tdoy>$doy) {
+                if ($lastleap == 0 && $tdoy < 60) {
+                        $doy=$tdoy+366;
+                } else {
+                        $doy=$doy+365;
+                }
+        }
+}
+
+my $datediff=0;
+my $dowd=0;
+my $multifile=0;
+if ($tdoy ne $doy) {
+        $datediff=int(($doy-$tdoy)/7);
+        $dowd=($doy-$tdoy)%7;
+        if (($dow-$dowd)<1) {
+                $datediff=$datediff+1;
+        }
+        if (($dow-$dowd)==0) {
+                $multifile=1;
+        }
+}
+
+my $monthstr = $shortmonths[$cgiparams{'MONTH'}];
+my $longmonthstr = $longmonths[$cgiparams{'MONTH'}];
+my $day = $cgiparams{'DAY'};
+my $daystr='';
+if ($day <= 9) {
+        $daystr = " $day"; }
+else {
+        $daystr = $day;
+}
+
+my $skip=0;
+my $filestr='';
+if ($datediff==0) {
+        $filestr="/var/log/messages";
+} else {
+       $filestr="/var/log/messages.$datediff";
+       $filestr = "$filestr.gz" if -f "$filestr.gz";
+}
+
+if (!(open (FILE,($filestr =~ /.gz$/ ? "gzip -dc $filestr |" : $filestr)))) {
+        $errormessage = "$Lang::tr{'date not in logs'}: $filestr $Lang::tr{'could not be opened'}";
+        $skip=1;
+        # Note: This is in case the log does not exist for that date
+}
+my $lines = 0;
+my @log=();
+
+if (!$skip)
+{
+        while (<FILE>)
+        {
+                if (/(^${monthstr} ${daystr} ..:..:..) [\w\-]+ kernel:.*(IN=.*)$/) {
+                        $log[$lines] = $_;
+                        $lines++;
+                }
+        }
+        close (FILE);   
+}
+
+$skip=0;
+if ($multifile) {
+        $datediff=$datediff-1;
+        if ($datediff==0) {
+                $filestr="/var/log/messages";
+        } else {
+                $filestr="/var/log/messages.$datediff";
+                $filestr = "$filestr.gz" if -f "$filestr.gz";
+        }
+        if (!(open (FILE,($filestr =~ /.gz$/ ? "gzip -dc $filestr |" : $filestr)))) {
+                $errormessage="$Lang::tr{'date not in logs'}: $filestr $Lang::tr{'could not be opened'}";
+                $skip=1;
+        }
+        if (!$skip) {
+                while (<FILE>) {
+                        if (/(^${monthstr} ${daystr} ..:..:..) [\w\-]+ kernel:.*(IN=.*)$/) {
+                                $log[$lines] = $_;
+                                $lines++;
+                        }
+                }
+                close (FILE);
+        }
+}
+
+my $MODNAME="fwlogs";
+
+&Header::showhttpheaders();
+&Header::openpage($Lang::tr{'firewall log'}, 1, '');
+&Header::openbigbox('100%', 'left', '', $errormessage);
+
+
+if ($errormessage) {
+        &Header::openbox('100%', 'left', $Lang::tr{'error messages'});
+        print "<font class='base'>$errormessage&nbsp;</font>\n";
+        &Header::closebox();
+}
+
+&Header::openbox('100%', 'left', "$Lang::tr{'settings'}");
+
+print <<END
+<form method='post' action='$ENV{'SCRIPT_NAME'}'>
+<table width='100%'>
+<tr>
+        <td width='10%' class='base'>$Lang::tr{'month'}:&nbsp;</td>
+        <td width='10%'>
+        <select name='MONTH'>
+END
+;
+my $month;
+for ($month = 0; $month < 12; $month++)
+{
+        print "\t<option ";
+        if ($month == $cgiparams{'MONTH'}) {
+                print "selected='selected' "; }
+        print "value='$month'>$longmonths[$month]</option>\n";
+}
+print <<END
+        </select>
+        </td>
+        <td width='10%' class='base' align='right'>&nbsp;$Lang::tr{'day'}:&nbsp;</td>
+        <td width='40%'>
+        <select name='DAY'>
+END
+;
+for ($day = 1; $day <= 31; $day++) 
+{
+        print "\t<option ";
+        if ($day == $cgiparams{'DAY'}) {
+                print "selected='selected' "; }
+        print "value='$day'>$day</option>\n";
+}
+
+if( $cgiparams{'pienumber'} != 0){$pienumber=$cgiparams{'pienumber'};}
+if( $cgiparams{'otherspie'} != 0){$otherspie=$cgiparams{'otherspie'};}
+if( $cgiparams{'showpie'} != 0){$showpie=$cgiparams{'showpie'};}
+if( $cgiparams{'sortcolumn'} != 0){$sortcolumn=$cgiparams{'sortcolumn'};}
+
+print <<END
+</select>
+</td>
+<td width='5%'  align='center'><input type='submit' name='ACTION' title='$Lang::tr{'day before'}' value='&lt;&lt;' /></td>
+<td width='5%'  align='center'><input type='submit' name='ACTION' title='$Lang::tr{'day after'}' value='&gt;&gt;' /></td>
+<td width='20%' align='right'><input type='submit' name='ACTION' value='$Lang::tr{'update'}' /></td>
+</tr>
+<tr>
+       <td colspan='3' align='left' valign="left">$Lang::tr{'Number of Countries for the pie chart'}:</td>
+       <td colspan='3' align='left' valign="center"><input type='text' name='pienumber' value='$pienumber' size='4'></td>
+       <td align='right'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td>
+</tr>
+</table>
+</form>
+END
+;
+
+&Header::closebox();
+
+&Header::openbox('100%', 'left', 'Firewall Logs');
+print "<p><b>$Lang::tr{'firewall hits'} $longmonthstr $daystr: $lines</b></p>";
+
+my $linesjc = 0;
+my %tabjc;
+my $gi = Geo::IP::PurePerl->new();
+
+if ($pienumber == -1 || $pienumber > $lines || $sortcolumn == 2) { $pienumber = $lines; };
+$lines = 0;
+foreach $_ (@log)
+{
+  /^... (..) (..:..:..) [\w\-]+ kernel:(.*)(IN=.*)$/;
+  my $packet = $4;
+  $packet =~ /IN=(\w+)/;       my $iface=$1; if ( $1 =~ /2./ ){ $iface="";}
+  $packet =~ /SRC=([\d\.]+)/;  my $srcaddr=$1;
+
+  if($iface eq 'red0') {
+    if($srcaddr ne '') {
+      my $ccode = $gi->country_code_by_name($srcaddr);
+      if( $ccode eq '') {
+          $ccode = 'unknown';
+      }
+      $tabjc{$ccode} = $tabjc{$ccode} + 1 ;
+      if(($tabjc{$ccode} == 1) && ($lines < $pienumber)) { $lines = $lines + 1; }
+      $linesjc++;
+    }
+  }
+  else {
+    if($iface ne '') {
+        $tabjc{$iface} = $tabjc{$iface} + 1 ;
+        if(($tabjc{$iface} == 1) && ($lines < $pienumber)) { $lines = $lines + 1; }
+        $linesjc++;
+    }
+  }
+}
+
+$pienumber = $lines;
+
+my @keytabjc = keys %tabjc;
+
+my @slice;
+my $go;
+my $nblinejc;
+
+if( $cgiparams{'linejc'} eq 'all' ){ $nblinejc = $linesjc; $go=1; }
+if( ($cgiparams{'linejc'} != 0) && ($cgiparams{'linejc'} ne 'all') ){ $nblinejc = $cgiparams{'linejc'}; $go=1;}
+if( $go != 1){ $nblinejc = 1000; }
+
+my @key;
+my @value;
+my $indice=0;
+my @tabjc2;
+
+if ($sortcolumn == 1)
+{
+        @tabjc2 = sort { $b <=> $a } values (%tabjc);
+}
+else
+{
+        @tabjc2 = sort { $a <=> $b } keys (%tabjc);
+}
+
+my $colour=1;
+
+##############################################
+#pie chart generation
+use GD::Graph::pie;
+use GD::Graph::colour;
+#ips sort by hits number
+my $v;
+
+if ($sortcolumn == 1)
+{
+        for ($v=0;$v<$pienumber;$v++){
+          findkey($tabjc2[$v]);
+        }
+}
+else
+{
+        foreach $v (@tabjc2) {
+          $key[$indice] = $v;
+          $value[$indice] = $tabjc{$v};
+          $indice++;
+        }
+}
+
+my @ips;
+my @numb;
+
+@ips = @key;
+@numb = @value;
+
+my $o;
+
+if($cgiparams{'otherspie'} == 2 ){}
+else{ 
+        my $numothers;
+        for($o=0;$o<$pienumber;$o++){
+          $numothers = $numothers + $numb[$o];
+        }
+        $numothers =  $linesjc - $numothers;
+        if ($numothers > 0) {
+                $ips[$pienumber]="$Lang::tr{'otherip'}";
+                $numb[$pienumber] =  $numothers;
+        }
+}
+
+my @data = (\@ips,\@numb);
+use GD::Graph::colour qw( :files );
+
+my $color=0;
+my %color = ();
+my %mainsettings = ();
+&General::readhash("${General::swroot}/main/settings", \%mainsettings);
+&General::readhash("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \%color);
+
+if ($showpie != 2 && $pienumber <= 50 && $pienumber != 0) {
+        my $mygraph = GD::Graph::pie->new(500, 350);
+        $mygraph->set(
+              'title' => '',
+              'pie_height' => 50,
+              'start_angle' => 89
+             ) or warn $mygraph->error;
+
+        $mygraph->set_value_font(GD::gdMediumBoldFont);
+        $mygraph->set( dclrs => [ "$color{'color1'}" , "$color{'color2'}" , "$color{'color3'}" , "$color{'color4'}" , "$color{'color5'}" , "$color{'color6'}" , "$color{'color7'}" , "$color{'color8'}" , "$color{'color9'}" , "$color{'color10'}" ] );
+        my $myimage = $mygraph->plot(\@data) or die $mygraph->error;
+
+        my @filenames = glob("/srv/web/ipfire/html/graphs/fwlog-country*.png");
+        unlink(@filenames);
+        my $imagerandom = rand(1000000);
+        my $imagename = "/srv/web/ipfire/html/graphs/fwlog-country$imagerandom.png";
+        open(FILE,">$imagename");
+        print FILE $myimage->png;
+        close(FILE);
+        #####################################################
+        print "<div style='text-align:center;'>";
+        print "<img src='/graphs/fwlog-country$imagerandom.png'>";
+        print "</div>";
+}
+
+print <<END
+<table width='100%' class='tbl'>
+<tr>
+<th width='10%' align='center' class='boldbase'></th>
+<th width='30%' align='center' class='boldbase'><b>$Lang::tr{'country'}</b></th>
+<th width='30%' align='center' class='boldbase'><b>Count</b></th>
+<th width='30%' align='center' class='boldbase'><b>$Lang::tr{'percentage'}</b></th>
+</tr>
+END
+;
+
+my $total=0;
+my $show=0;
+
+my $s;
+my $percent;
+my $col="";
+
+for($s=0;$s<$lines;$s++)
+{
+  $show++;
+  $percent = $value[$s] * 100 / $linesjc;
+  $percent = sprintf("%.f", $percent);
+  $total = $total + $value[$s];
+  my $colorIndex = $color % 10;
+  if($colorIndex == 0) {
+    $colorIndex = 10;
+  }
+  $col="bgcolor='$color{\"color$colorIndex\"}'";
+  $color++;
+  print "<tr>";
+
+  print "<td align='center' $col><form method='post' action='showrequestfromcountry.dat'><input type='hidden' name='MONTH' value='$cgiparams{'MONTH'}'> <input type='hidden' name='DAY' value='$cgiparams{'DAY'}'> <input type='hidden' name='country' value='$key[$s]'> <input type='submit' value='details'></form></td>";
+  if($key[$s] eq 'blue0' || $key[$s] eq 'green0' || $key[$s] eq 'orange0') {
+      print "<td align='center' $col>$key[$s]</td>";
+  }
+  else {
+      if($key[$s] ne 'unknown' ) {
+          my $fcode = lc($key[$s]);
+          print "<td align='center' $col><a href='/cgi-bin/country.cgi#$fcode'><img src='/images/flags/$fcode.png' border='0' align='absmiddle' alt='$key[$s]' title='$key[$s]'></a></td>";}
+      else {
+          print "<td align='center' $col>$key[$s]</td>";
+      }
+  }
+  print "<td align='center' $col>$value[$s]</td>";
+  print "<td align='center' $col>$percent</td>";
+  print "</tr>";
+}
+
+if($cgiparams{'otherspie'} == 2 ){}
+else{
+  my $colorIndex = $color % 10;
+  if($colorIndex == 0) {
+    $colorIndex = 10;
+  }
+  $col="bgcolor='$color{\"color$colorIndex\"}'";
+  print "<tr>";
+
+if ( $linesjc ne "0")
+{
+my $dif;
+$dif = $linesjc - $total;
+$percent = $dif * 100 / $linesjc;
+$percent = sprintf("%.f", $percent);
+print <<END
+<td align='center' $col></TD>
+<td align='center' $col>$Lang::tr{'other countries'}</td>
+<td align='center' $col>$dif</TD>
+<td align='center' $col>$percent</TD>
+</tr>
+END
+;
+}
+}
+print <<END
+</TABLE>
+END
+;
+
+&Header::closebox();
+&Header::closebigbox();
+&Header::closepage();
+
+sub findkey {
+  my $v;
+  foreach $v (@keytabjc) {
+    if ($tabjc{$v} eq $_[0]) {
+      delete $tabjc{$v};
+      $key[$indice] = "$v";
+      $value[$indice] = $_[0];
+      $indice++;
+      last;
+    }
+  }
+}
+sub checkversion {
+        #Automatic Updates is disabled
+        return "0","0";
+}
+
diff --git a/html/cgi-bin/logs.cgi/showrequestfromcountry.dat b/html/cgi-bin/logs.cgi/showrequestfromcountry.dat
new file mode 100644 (file)
index 0000000..5283c42
--- /dev/null
@@ -0,0 +1,412 @@
+#!/usr/bin/perl
+# SmoothWall CGIs
+#
+# This code is distributed under the terms of the GPL
+#
+# JC HERITIER 
+# page inspired from the initial firewalllog.dat
+#
+# Modified for IPFire by Christian Schmidt (www.ipfire.org)
+
+# enable only the following on debugging purpose
+#use warnings;
+#use CGI::Carp 'fatalsToBrowser';
+
+#use strict;
+use Geo::IP::PurePerl;
+
+require '/var/ipfire/general-functions.pl';
+require "${General::swroot}/lang.pl";
+require "${General::swroot}/header.pl";
+
+use POSIX();
+
+#workaround to suppress a warning when a variable is used only once
+my @dummy = ( ${Header::table2colour} );
+undef (@dummy);
+
+my %cgiparams=();
+my %logsettings=();
+my $errormessage = '';
+
+my @shortmonths = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug',
+       'Sep', 'Oct', 'Nov', 'Dec' );
+my @longmonths = ( $Lang::tr{'january'}, $Lang::tr{'february'}, $Lang::tr{'march'},
+       $Lang::tr{'april'}, $Lang::tr{'may'}, $Lang::tr{'june'}, $Lang::tr{'july'}, $Lang::tr{'august'},
+       $Lang::tr{'september'}, $Lang::tr{'october'}, $Lang::tr{'november'},
+       $Lang::tr{'december'} );
+
+my @now = localtime();
+my $dow = $now[6];
+my $doy = $now[7];
+my $tdoy = $now[7];
+my $year = $now[5]+1900;
+
+$cgiparams{'DAY'} = $now[3];
+$cgiparams{'MONTH'} = $now[4];
+$cgiparams{'ACTION'} = '';
+
+&Header::getcgihash(\%cgiparams);
+
+$logsettings{'LOGVIEW_REVERSE'} = 'off';
+&General::readhash("${General::swroot}/logging/settings", \%logsettings);
+
+my $start = -1;
+if ($ENV{'QUERY_STRING'} && $cgiparams{'ACTION'} ne $Lang::tr{'update'})
+{
+       my @temp = split(',',$ENV{'QUERY_STRING'});
+       $start = $temp[0];
+       $cgiparams{'MONTH'} = $temp[1];
+       $cgiparams{'DAY'} = $temp[2];
+       $cgiparams{country} = $temp[3];
+}
+
+if (!($cgiparams{'MONTH'} =~ /^(0|1|2|3|4|5|6|7|8|9|10|11)$/) ||
+       !($cgiparams{'DAY'} =~ /^(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)$/))
+{
+       $cgiparams{'DAY'} = $now[3];
+       $cgiparams{'MONTH'} = $now[4];
+}
+elsif($cgiparams{'ACTION'} eq '>>')
+{
+        my @temp_then=();
+        my @temp_now = localtime(time);
+        $temp_now[4] = $cgiparams{'MONTH'};
+        $temp_now[3] = $cgiparams{'DAY'};
+        @temp_then = localtime(POSIX::mktime(@temp_now) + 86400);
+           ## Retrieve the same time on the next day -
+           ## 86400 seconds in a day
+        $cgiparams{'MONTH'} = $temp_then[4];
+        $cgiparams{'DAY'} = $temp_then[3];
+}
+elsif($cgiparams{'ACTION'} eq '<<')
+{
+        my @temp_then=();
+        my @temp_now = localtime(time);
+        $temp_now[4] = $cgiparams{'MONTH'};
+        $temp_now[3] = $cgiparams{'DAY'};
+        @temp_then = localtime(POSIX::mktime(@temp_now) - 86400);
+           ## Retrieve the same time on the previous day -
+           ## 86400 seconds in a day
+        $cgiparams{'MONTH'} = $temp_then[4];
+        $cgiparams{'DAY'} = $temp_then[3];
+}
+
+if (($cgiparams{'DAY'} ne $now[3]) || ($cgiparams{'MONTH'} ne $now[4]))
+{
+        my @then = ();
+        if ( (  $cgiparams{'MONTH'} eq $now[4]) && ($cgiparams{'DAY'} > $now[3]) ||
+                        ( $cgiparams{'MONTH'} > $now[4] ) ) {
+                @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1901 ));
+        } else {
+                @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1900 ));
+        }
+        $tdoy = $then[7];
+        my $lastleap=($year-1)%4;
+        if ($tdoy>$doy) {
+                if ($lastleap == 0 && $tdoy < 60) {
+                        $doy=$tdoy+366;
+                } else {
+                        $doy=$doy+365;
+                }
+        }
+}
+my $datediff=0;
+my $dowd=0;
+my $multifile=0;
+if ($tdoy ne $doy) {
+        $datediff=int(($doy-$tdoy)/7);
+        $dowd=($doy-$tdoy)%7;
+        if (($dow-$dowd)<1) {
+                $datediff=$datediff+1;
+        }
+        if (($dow-$dowd)==0) {
+                $multifile=1;
+        }
+}
+
+my $monthstr = $shortmonths[$cgiparams{'MONTH'}];
+my $longmonthstr = $longmonths[$cgiparams{'MONTH'}];
+my $day = $cgiparams{'DAY'};
+my $daystr='';
+if ($day <= 9) {
+       $daystr = " $day"; }
+else {
+       $daystr = $day;
+}
+
+my $skip=0;
+my $filestr='';
+if ($datediff==0) {
+        $filestr="/var/log/messages";
+} else {
+       $filestr="/var/log/messages.$datediff";
+       $filestr = "$filestr.gz" if -f "$filestr.gz";
+}
+
+if (!(open (FILE,($filestr =~ /.gz$/ ? "gzip -dc $filestr |" : $filestr)))) {
+        $errormessage = "$Lang::tr{'date not in logs'}: $filestr $Lang::tr{'could not be opened'}";
+        $skip=1;
+        # Note: This is in case the log does not exist for that date
+}
+my $lines = 0;
+my @log=();
+my $country = $cgiparams{country};
+my $gi = Geo::IP::PurePerl->new();
+
+if (!$skip)
+{
+    while (<FILE>)
+    {
+               if (/(^${monthstr} ${daystr} ..:..:..) [\w\-]+ kernel:.*(IN=.*)$/) {
+            my $packet = $2;
+            $packet =~ /IN=(\w+)/;       my $iface=$1; if ( $1 =~ /2./ ){ $iface="";}
+            $packet =~ /SRC=([\d\.]+)/;  my $srcaddr=$1;
+
+            if($iface eq $country) {
+                $log[$lines] = $_;
+                $lines++;
+            }
+            elsif($srcaddr ne '') {
+                my $ccode = $gi->country_code_by_name($srcaddr);
+                if($ccode eq $country){
+                    $log[$lines] = $_;
+                    $lines++;
+                }
+            }
+               }
+       }
+       close (FILE);   
+}
+
+$skip=0;
+if ($multifile) {
+        $datediff=$datediff-1;
+        if ($datediff==0) {
+                $filestr="/var/log/messages";
+        } else {
+                $filestr="/var/log/messages.$datediff";
+                $filestr = "$filestr.gz" if -f "$filestr.gz";
+        }
+        if (!(open (FILE,($filestr =~ /.gz$/ ? "gzip -dc $filestr |" : $filestr)))) {
+                $errormessage="$Lang::tr{'date not in logs'}: $filestr $Lang::tr{'could not be opened'}";
+                $skip=1;
+        }
+        if (!$skip) {
+               while (<FILE>) {
+                       if (/(^${monthstr} ${daystr} ..:..:..) [\w\-]+ kernel:.*(IN=.*)$/) {
+                if($_ =~  /SRC\=([\d\.]+)/){
+                    my $srcaddr=$1;
+                    my $ccode = $gi->country_code_by_name($srcaddr);
+                    if($ccode eq $country){
+                        $log[$lines] = $_;
+                        $lines++;
+                    }
+                }
+                       }
+               }
+               close (FILE);
+       }
+}
+
+&Header::showhttpheaders();
+&Header::openpage($Lang::tr{'firewall log'}, 1, '');
+&Header::openbigbox('100%', 'left', '', $errormessage);
+
+if ($errormessage) {
+       &Header::openbox('100%', 'left', $Lang::tr{'error messages'});
+       print "<font class='base'>$errormessage&nbsp;</font>\n";
+       &Header::closebox();
+}
+
+&Header::openbox('100%', 'left', "$Lang::tr{'settings'}:");
+
+print <<END
+<form method='post' action='$ENV{'SCRIPT_NAME'}'>
+<table width='100%'>
+<tr>
+       <td width='10%' class='base'>$Lang::tr{'month'}:&nbsp;</td>
+       <td width='10%'>
+       <select name='MONTH'>
+END
+;
+my $month;
+for ($month = 0; $month < 12; $month++)
+{
+       print "\t<option ";
+       if ($month == $cgiparams{'MONTH'}) {
+               print "selected='selected' "; }
+       print "value='$month'>$longmonths[$month]</option>\n";
+}
+print <<END
+       </select>
+       </td>
+       <td width='10%' class='base' align='right'>&nbsp;$Lang::tr{'day'}:&nbsp;</td>
+       <td width='40%'>
+       <select name='DAY'>
+END
+;
+for ($day = 1; $day <= 31; $day++) 
+{
+       print "\t<option ";
+       if ($day == $cgiparams{'DAY'}) {
+               print "selected='selected' "; }
+       print "value='$day'>$day</option>\n";
+}
+print <<END
+</select>
+</td>
+<td width='5%'  align='center'><input type='submit' name='ACTION' title='$Lang::tr{'day before'}' value='&lt;&lt;' /></td>
+<td width='5%'  align='center'><input type='submit' name='ACTION' title='$Lang::tr{'day after'}' value='&gt;&gt;' /></td>
+<td width='10%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'update'}' /></td>
+<tr><td width='15%'>$Lang::tr{'source ip country'}</td><td><input type='text' name='country' value='$cgiparams{country}'size='15'></td></tr>
+</tr>
+</table>
+</form>
+END
+;
+
+&Header::closebox();
+
+&Header::openbox('100%', 'left', $Lang::tr{'firewall log'});
+print "<p><b>$Lang::tr{'firewall hits'} $longmonthstr $daystr: $lines</b></p>";
+
+if ($start == -1) {
+        $start = $lines - ${Header::viewsize}; }
+if ($start >= $lines - ${Header::viewsize}) { $start = $lines - ${Header::viewsize}; };
+if ($start < 0) { $start = 0; }
+
+my $prev = $start - ${Header::viewsize};
+my $next = $start + ${Header::viewsize};
+
+if ($prev < 0) { $prev = 0; }
+if ($next >= $lines) { $next = -1 }
+if ($start == 0) { $prev = -1; }
+
+if ($lines != 0) { &oldernewer(); }
+
+print <<END
+<table width='100%'>
+<tr>
+<td width='10%' align='center' class='boldbase'><b>$Lang::tr{'time'}</b></td>
+<td width='13%' align='center' class='boldbase'><b>$Lang::tr{'chain'}</b></td>
+<td width='5%' align='center' class='boldbase'><b>$Lang::tr{'iface'}</b></td>
+<td width='5%' align='center' class='boldbase'><b>$Lang::tr{'proto'}</b></td>
+<td width='16%' align='center' class='boldbase'><b>$Lang::tr{'source'}</b></td>
+<td width='10%' align='center' class='boldbase'><b>$Lang::tr{'src port'}</b></td>
+<td width='16%' align='center' class='boldbase'><b>$Lang::tr{'destination'}</b></td>
+<td width='16%' align='center' class='boldbase'><b>$Lang::tr{'dst port'}</b></td>
+</tr>
+END
+;
+
+my @slice = splice(@log, $start, ${Header::viewsize});
+
+if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @slice = reverse @slice; }
+
+$lines = 0;
+foreach $_ (@slice)
+{
+  $a = $_;
+  /^... (..) (..:..:..) [\w\-]+ kernel:(.*)(IN=.*)$/;
+  my $packet = $4;
+  $packet =~ /IN=(\w+)/;       my $iface=$1; if ( $1 =~ /2./ ){ $iface="";}
+  $packet =~ /SRC=([\d\.]+)/;  my $srcaddr=$1;
+
+  if($iface eq $country || $srcaddr ne '') {
+    my $ccode;
+    if($iface ne $country) {
+      $ccode = $gi->country_code_by_name($srcaddr);
+    }
+    if($iface eq $country || $ccode eq $country) {
+         my $chain = '';
+      my $in = '-'; my $out = '-';
+      my $srcaddr = ''; my $dstaddr = '';
+      my $protostr = '';
+      my $srcport = ''; my $dstport = '';
+
+      $_ =~ /(^.* ..:..:..) [\w\-]+ kernel:(.*)(IN=.*)$/;
+      my $timestamp = $1; my $chain = $2; my $packet = $3;
+      $timestamp =~ /(...) (..) (..:..:..)/;
+      my $month = $1; my $day = $2; my $time = $3;
+
+      if ($a =~ /IN\=(\w+)/) { $iface = $1; }
+      if ($a =~ /OUT\=(\w+)/) { $out = $1; }
+      if ($a =~ /SRC\=([\d\.]+)/) { $srcaddr = $1; }
+      if ($a =~ /DST\=([\d\.]+)/) { $dstaddr = $1; }
+      if ($a =~ /PROTO\=(\w+)/) { $protostr = $1; }
+      my $protostrlc = lc($protostr);
+      if ($a =~  /SPT\=([\d\.]+)/){ $srcport = $1; }
+      if ($a =~  /DPT\=([\d\.]+)/){ $dstport = $1; }
+
+      if ($lines % 2) {
+        print "<tr bgcolor='${Header::table1colour}'>\n"; }
+      else {
+        print "<tr bgcolor='${Header::table2colour}'>\n"; }
+      print <<END
+      <td align='center'>$time</td>
+      <td align='center'>$chain</td>
+      <td align='center'>$iface</td>
+      <td align='center'>$protostr</td>
+      <td align='center'>
+      <table width='100%' cellpadding='0' cellspacing='0'><tr>
+      <td align='center'><a href='/cgi-bin/ipinfo.cgi?ip=$srcaddr'>$srcaddr</a></td>
+      </tr></table>
+      </td>
+      <td align='center'>$srcport</td>
+      <td align='center'>
+      <table width='100%' cellpadding='0' cellspacing='0'><tr>
+      <td align='center'><a href='/cgi-bin/ipinfo.cgi?ip=$dstaddr'>$dstaddr</a></td>
+      </tr></table>
+      </td>
+      <td align='center'>$dstport</td>
+      </tr>
+END
+       ;
+      $lines++;
+    }
+  }
+}
+
+print <<END
+</table>
+END
+;
+
+&oldernewer();
+
+&Header::closebox();
+
+&Header::closebigbox();
+
+&Header::closepage();
+
+sub oldernewer
+{
+  print <<END
+  <table width='100%'>
+  <tr>
+END
+;
+
+  print "<td align='center' width='50%'>";
+  if ($prev != -1) {
+    print "<a href='/cgi-bin/logs.cgi/showrequestfromcountry.dat?$prev,$cgiparams{'MONTH'},$cgiparams{'DAY'},$cgiparams{country}'>$Lang::tr{'older'}</a>"; }
+  else {
+    print "$Lang::tr{'older'}"; }
+  print "</td>\n";
+
+  print "<td align='center' width='50%'>";
+  if ($next != -1) {
+    print "<a href='/cgi-bin/logs.cgi/showrequestfromcountry.dat?$next,$cgiparams{'MONTH'},$cgiparams{'DAY'},$cgiparams{country}'>$Lang::tr{'newer'}</a>"; }
+  else {
+   print "$Lang::tr{'newer'}"; }
+  print "</td>\n";
+
+print <<END
+  </tr>
+  </table>
+END
+;
+}
+
diff --git a/html/cgi-bin/modem-status.cgi b/html/cgi-bin/modem-status.cgi
new file mode 100755 (executable)
index 0000000..d278c77
--- /dev/null
@@ -0,0 +1,211 @@
+#!/usr/bin/perl
+###############################################################################
+#                                                                             #
+# IPFire.org - A linux based firewall                                         #
+# Copyright (C) 2008  Michael Tremer & Christian Schmidt                      #
+#                                                                             #
+# This 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 3 of the License, or           #
+# (at your option) any later version.                                         #
+#                                                                             #
+# This program is distributed in the hope that it will be useful,             #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of              #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
+# GNU General Public License for more details.                                #
+#                                                                             #
+# You should have received a copy of the GNU General Public License           #
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
+#                                                                             #
+###############################################################################
+
+use strict;
+
+# enable only the following on debugging purpose
+use warnings;
+use CGI::Carp 'fatalsToBrowser';
+
+require '/var/ipfire/general-functions.pl';
+require "${General::swroot}/lang.pl";
+require "${General::swroot}/header.pl";
+require "${General::swroot}/modem-lib.pl";
+
+my $modem;
+my %ethsettings = {};
+my %pppsettings = {};
+
+&General::readhash("${General::swroot}/ethernet/settings", \%ethsettings);
+
+if ($ethsettings{"RED_TYPE"} eq "PPPOE") {
+       &General::readhash("${General::swroot}/ppp/settings", \%pppsettings);
+
+       # Establish the connection to the modem.
+       my $port = $pppsettings{'MONPORT'};
+       if ($port) {
+               $port = "/dev/$port";
+               $modem = Modem->new($port, $pppsettings{"DTERATE"});
+       }
+}
+
+&Header::showhttpheaders();
+&Header::openpage($Lang::tr{'modem information'}, 1, '');
+&Header::openbigbox('100%', 'left');
+
+if ($modem) {
+       &Header::openbox("100%", "center", $Lang::tr{'modem hardware details'});
+
+       print <<END;
+               <table width="100%">
+                       <tbody>
+END
+
+       my $vendor = $modem->get_vendor();
+       if ($vendor) {
+               print <<END;
+                       <tr>
+                               <td width="33%">$Lang::tr{'vendor'}</td>
+                               <td>$vendor</td>
+                       </tr>
+END
+       }
+
+       my $model = $modem->get_model();
+       if ($model) {
+               print <<END;
+                       <tr>
+                               <td width="33%">$Lang::tr{'model'}</td>
+                               <td>$model</td>
+                       </tr>
+END
+       }
+
+       my $software_version = $modem->get_software_version();
+       if ($software_version) {
+               print <<END;
+                       <tr>
+                               <td width="33%">$Lang::tr{'software version'}</td>
+                               <td>$software_version</td>
+                       </tr>
+END
+       }
+
+       my $imei = $modem->get_imei();
+       if ($imei) {
+               print <<END;
+                       <tr>
+                               <td width="33%">$Lang::tr{'imei'}</td>
+                               <td>$imei</td>
+                       </tr>
+END
+       }
+
+       my @caps = $modem->get_capabilities();
+       if (@caps) {
+               my $caps_string = join(", ", @caps);
+
+               print <<END;
+                       <tr>
+                               <td width="33%">$Lang::tr{'capabilities'}</td>
+                               <td>$caps_string</td>
+                       </tr>
+END
+       }
+
+       print <<END;
+                       </tbody>
+               </table>
+END
+       &Header::closebox();
+
+
+       &Header::openbox("100%", "center", $Lang::tr{'modem sim information'});
+       print <<END;
+               <table width="100%">
+                       <tbody>
+END
+
+       my $imsi = $modem->get_sim_imsi();
+       if ($imsi) {
+               print <<END;
+                       <tr>
+                               <td width="33%">$Lang::tr{'imsi'}</td>
+                               <td>$imsi</td>
+                       </tr>
+END
+       }
+
+       print <<END;
+                       </tbody>
+               </table>
+END
+       &Header::closebox();
+
+       &Header::openbox("100%", "center", $Lang::tr{'modem network information'});
+       print <<END;
+               <table width="100%">
+                       <tbody>
+END
+
+       my $network_registration = $modem->get_network_registration();
+       if ($network_registration) {
+               print <<END;
+                       <tr>
+                               <td width="33%">$Lang::tr{'modem network registration'}</td>
+                               <td>$network_registration</td>
+                       </tr>
+END
+       }
+
+       my $network_operator = $modem->get_network_operator();
+       if ($network_operator) {
+               print <<END;
+                       <tr>
+                               <td width="33%">$Lang::tr{'modem network operator'}</td>
+                               <td>$network_operator</td>
+                       </tr>
+END
+       }
+
+       my $network_mode = $modem->get_network_mode();
+       if ($network_mode) {
+               print <<END;
+                       <tr>
+                               <td width="33%">$Lang::tr{'modem network mode'}</td>
+                               <td>$network_mode</td>
+                       </tr>
+END
+       }
+
+       my $signal_quality = $modem->get_signal_quality();
+       if ($signal_quality) {
+               print <<END;
+                       <tr>
+                               <td width="33%">$Lang::tr{'modem network signal quality'}</td>
+                               <td>$signal_quality dBm</td>
+                       </tr>
+END
+       }
+
+       my $bit_error_rate = $modem->get_bit_error_rate();
+       if ($bit_error_rate) {
+               print <<END;
+                       <tr>
+                               <td width="33%">$Lang::tr{'modem network bit error rate'}</td>
+                               <td>$bit_error_rate</td>
+                       </tr>
+END
+       }
+       print <<END;
+                       </tbody>
+               </table>
+END
+
+       &Header::closebox();
+} else {
+       &Header::openbox("100%", "center", $Lang::tr{'modem no connection'});
+       print "<p>$Lang::tr{'modem no connection message'}</p>";
+       &Header::closebox();
+}
+
+&Header::closebigbox();
+&Header::closepage();
index 877e09cb111f1d06b1ab0f89e362737749ce9d91..921009fc70ba194ffbcd22f9d1de34cca7756a88 100644 (file)
@@ -2,7 +2,7 @@
 ###############################################################################
 #                                                                             #
 # IPFire.org - A linux based firewall                                         #
-# Copyright (C) 2007-2013  IPFire Team  <info@ipfire.org>                     #
+# Copyright (C) 2007-2014  IPFire Team  <info@ipfire.org>                     #
 #                                                                             #
 # This program is free software: you can redistribute it and/or modify        #
 # it under the terms of the GNU General Public License as published by        #
@@ -19,7 +19,7 @@
 #                                                                             #
 ###############################################################################
 ###
-# Based on IPFireCore 55
+# Based on IPFireCore 77
 ###
 use CGI;
 use CGI qw/:standard/;
@@ -80,6 +80,8 @@ $cgiparams{'COMPRESSION'} = 'off';
 $cgiparams{'ONLY_PROPOSED'} = 'off';
 $cgiparams{'ACTION'} = '';
 $cgiparams{'CA_NAME'} = '';
+$cgiparams{'DH_NAME'} = 'dh1024.pem';
+$cgiparams{'DHLENGHT'} = '';
 $cgiparams{'DHCP_DOMAIN'} = '';
 $cgiparams{'DHCP_DNS'} = '';
 $cgiparams{'DHCP_WINS'} = '';
@@ -88,6 +90,9 @@ $cgiparams{'DCOMPLZO'} = 'off';
 $cgiparams{'MSSFIX'} = '';
 $cgiparams{'number'} = '';
 $cgiparams{'PMTU_DISCOVERY'} = '';
+$cgiparams{'DCIPHER'} = '';
+$cgiparams{'DAUTH'} = '';
+$cgiparams{'TLSAUTH'} = '';
 $routes_push_file = "${General::swroot}/ovpn/routes_push";
 unless (-e $routes_push_file)    { system("touch $routes_push_file"); }
 unless (-e "${General::swroot}/ovpn/ccd.conf")    { system("touch ${General::swroot}/ovpn/ccd.conf"); }
@@ -167,60 +172,6 @@ sub deletebackupcert
                unlink ("${General::swroot}/ovpn/certs/$hexvalue.pem");
        }
 }
-sub checkportfw {
-       my $DPORT = shift;
-       my $DPROT = shift;
-       my %natconfig =();
-       my $confignat = "${General::swroot}/firewall/config";
-       $DPROT= uc ($DPROT);
-       &General::readhasharray($confignat, \%natconfig);
-       foreach my $key (sort keys %natconfig){
-               my @portarray = split (/\|/,$natconfig{$key}[30]);
-               foreach my $value (@portarray){
-                       if ($value =~ /:/i){
-                               my ($a,$b) = split (":",$value);
-                               if ($DPROT eq $natconfig{$key}[12] && $DPORT gt $a && $DPORT lt $b){
-                                       $errormessage= "$Lang::tr{'source port in use'} $DPORT";
-                               }
-                       }else{
-                               if ($DPROT eq $natconfig{$key}[12] && $DPORT eq $value){
-                                       $errormessage= "$Lang::tr{'source port in use'} $DPORT";
-                               }
-                       }
-               }
-       }
-       return;
-}
-
-sub checkportoverlap
-{
-       my $portrange1 = $_[0]; # New port range
-       my $portrange2 = $_[1]; # existing port range
-       my @tempr1 = split(/\:/,$portrange1);
-       my @tempr2 = split(/\:/,$portrange2);
-
-       unless (&checkportinc($tempr1[0], $portrange2)){ return 0;}
-       unless (&checkportinc($tempr1[1], $portrange2)){ return 0;}
-       
-       unless (&checkportinc($tempr2[0], $portrange1)){ return 0;}
-       unless (&checkportinc($tempr2[1], $portrange1)){ return 0;}
-
-       return 1; # Everything checks out!
-}
-
-# Darren Critchley - we want to make sure that a port entry is not within an already existing range
-sub checkportinc
-{
-       my $port1 = $_[0]; # Port
-       my $portrange2 = $_[1]; # Port range
-       my @tempr1 = split(/\:/,$portrange2);
-
-       if ($port1 < $tempr1[0] || $port1 > $tempr1[1]) {
-               return 1; 
-       } else {
-               return 0; 
-       }
-}
 
 sub writeserverconf {
     my %sovpnsettings = ();  
@@ -243,14 +194,14 @@ sub writeserverconf {
     print CONF "ifconfig-pool-persist /var/ipfire/ovpn/ovpn-leases.db 3600\n";
     print CONF "client-config-dir /var/ipfire/ovpn/ccd\n";
     print CONF "tls-server\n";
-    print CONF "ca /var/ipfire/ovpn/ca/cacert.pem\n";
-    print CONF "cert /var/ipfire/ovpn/certs/servercert.pem\n";
-    print CONF "key /var/ipfire/ovpn/certs/serverkey.pem\n";
-    print CONF "dh /var/ipfire/ovpn/ca/dh1024.pem\n";
+    print CONF "ca ${General::swroot}/ovpn/ca/cacert.pem\n";
+    print CONF "cert ${General::swroot}/ovpn/certs/servercert.pem\n";
+    print CONF "key ${General::swroot}/ovpn/certs/serverkey.pem\n";
+    print CONF "dh ${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}\n";
     my @tempovpnsubnet = split("\/",$sovpnsettings{'DOVPN_SUBNET'});
     print CONF "server $tempovpnsubnet[0] $tempovpnsubnet[1]\n";
     #print CONF "push \"route $netsettings{'GREEN_NETADDRESS'} $netsettings{'GREEN_NETMASK'}\"\n";
-   
+
     # Check if we are using mssfix, fragment or mtu-disc and set the corretct mtu of 1500.
     # If we doesn't use one of them, we can use the configured mtu value.
     if ($sovpnsettings{'MSSFIX'} eq 'on') 
@@ -258,8 +209,8 @@ sub writeserverconf {
     elsif ($sovpnsettings{'FRAGMENT'} ne '' && $sovpnsettings{'DPROTOCOL'} ne 'tcp') 
        { print CONF "$sovpnsettings{'DDEVICE'}-mtu 1500\n"; }
     elsif (($sovpnsettings{'PMTU_DISCOVERY'} eq 'yes') ||
-          ($sovpnsettings{'PMTU_DISCOVERY'} eq 'maybe') ||
-          ($sovpnsettings{'PMTU_DISCOVERY'} eq 'no' ))
+       ($sovpnsettings{'PMTU_DISCOVERY'} eq 'maybe') ||
+       ($sovpnsettings{'PMTU_DISCOVERY'} eq 'no' ))
        { print CONF "$sovpnsettings{'DDEVICE'}-mtu 1500\n"; } 
     else 
        { print CONF "$sovpnsettings{'DDEVICE'}-mtu $sovpnsettings{'DMTU'}\n"; }
@@ -294,10 +245,10 @@ sub writeserverconf {
        print CONF "client-to-client\n";
     }
     if ($sovpnsettings{MSSFIX} eq 'on') {
-       print CONF "mssfix\n";
+               print CONF "mssfix\n";
     }
     if ($sovpnsettings{FRAGMENT} ne '' && $sovpnsettings{'DPROTOCOL'} ne 'tcp') {
-       print CONF "fragment $sovpnsettings{'FRAGMENT'}\n";   
+               print CONF "fragment $sovpnsettings{'FRAGMENT'}\n";
     }
 
     # Check if a valid operating mode has been choosen and use it.
@@ -313,6 +264,14 @@ sub writeserverconf {
     print CONF "status-version 1\n";
     print CONF "status /var/log/ovpnserver.log 30\n";
     print CONF "cipher $sovpnsettings{DCIPHER}\n";
+    if ($sovpnsettings{'DAUTH'} eq '') {
+        print CONF "";
+    } else {
+       print CONF "auth $sovpnsettings{'DAUTH'}\n";
+    }
+    if ($sovpnsettings{'TLSAUTH'} eq 'on') {
+       print CONF "tls-auth ${General::swroot}/ovpn/certs/ta.key\n";
+    }
     if ($sovpnsettings{DCOMPLZO} eq 'on') {
         print CONF "comp-lzo\n";
     }
@@ -731,6 +690,8 @@ if ($cgiparams{'ACTION'} eq $Lang::tr{'save-adv-options'}) {
     $vpnsettings{'DHCP_WINS'} = $cgiparams{'DHCP_WINS'};
     $vpnsettings{'ROUTES_PUSH'} = $cgiparams{'ROUTES_PUSH'};
     $vpnsettings{'PMTU_DISCOVERY'} = $cgiparams{'PMTU_DISCOVERY'};
+    $vpnsettings{'DAUTH'} = $cgiparams{'DAUTH'};
+    $vpnsettings{'TLSAUTH'} = $cgiparams{'TLSAUTH'};
     my @temp=();
     
     if ($cgiparams{'FRAGMENT'} eq '') {
@@ -743,6 +704,7 @@ if ($cgiparams{'ACTION'} eq $Lang::tr{'save-adv-options'}) {
                        $vpnsettings{'FRAGMENT'} = $cgiparams{'FRAGMENT'};
        }
     }
+
     if ($cgiparams{'MSSFIX'} ne 'on') {
        delete $vpnsettings{'MSSFIX'};
     } else {
@@ -847,6 +809,16 @@ if ($cgiparams{'ACTION'} eq $Lang::tr{'save-adv-options'}) {
         $errormessage = $Lang::tr{'invalid input for keepalive 1:2'};
         goto ADV_ERROR;        
     }
+    # Create ta.key for tls-auth if not presant
+    if ($cgiparams{'TLSAUTH'} eq 'on') {
+       if ( ! -e "${General::swroot}/ovpn/certs/ta.key") {
+               system('/usr/sbin/openvpn', '--genkey', '--secret', "${General::swroot}/ovpn/certs/ta.key");
+               if ($?) {
+               $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
+        goto ADV_ERROR;
+               }
+       }
+    }
     
     &General::writehash("${General::swroot}/ovpn/settings", \%vpnsettings);
     &writeserverconf();#hier ok
@@ -925,9 +897,15 @@ unless(-d "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}"){mkdir "${General
   print SERVERCONF "ca ${General::swroot}/ovpn/ca/cacert.pem\n"; 
   print SERVERCONF "cert ${General::swroot}/ovpn/certs/servercert.pem\n"; 
   print SERVERCONF "key ${General::swroot}/ovpn/certs/serverkey.pem\n"; 
-  print SERVERCONF "dh ${General::swroot}/ovpn/ca/dh1024.pem\n"; 
+  print SERVERCONF "dh ${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}\n";
   print SERVERCONF "# Cipher\n"; 
-  print SERVERCONF "cipher AES-256-CBC\n"; 
+  print SERVERCONF "cipher $cgiparams{'DCIPHER'}\n";
+  if ($cgiparams{'DAUTH'} eq '') {
+       print SERVERCONF "auth SHA1\n";
+  } else {
+       print SERVERCONF "# HMAC algorithm\n";
+       print SERVERCONF "auth $cgiparams{'DAUTH'}\n";
+  }
   if ($cgiparams{'COMPLZO'} eq 'on') {
    print SERVERCONF "# Enable Compression\n";
    print SERVERCONF "comp-lzo\r\n";
@@ -952,6 +930,7 @@ unless(-d "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}"){mkdir "${General
 
 if ($cgiparams{'ACTION'} eq $Lang::tr{'save'} && $cgiparams{'TYPE'} eq 'net' && $cgiparams{'SIDE'} eq 'client')
 {
+
         my @ovsubnettemp =  split(/\./,$cgiparams{'OVPN_SUBNET'});
         my $ovsubnet =  "$ovsubnettemp[0].$ovsubnettemp[1].$ovsubnettemp[2]";
         my @remsubnet =  split(/\//,$cgiparams{'REMOTE_SUBNET'});
@@ -1014,12 +993,18 @@ unless(-d "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}"){mkdir "${General
   print CLIENTCONF "# Auth. Client\n"; 
   print CLIENTCONF "tls-client\n"; 
   print CLIENTCONF "# Cipher\n"; 
-  print CLIENTCONF "cipher AES-256-CBC\n"; 
+  print CLIENTCONF "cipher $cgiparams{'DCIPHER'}\n";
   print CLIENTCONF "pkcs12 ${General::swroot}/ovpn/certs/$cgiparams{'NAME'}.p12\r\n";
+  if ($cgiparams{'DAUTH'} eq '') {
+       print CLIENTCONF "auth SHA1\n";
+  } else {
+       print CLIENTCONF "# HMAC algorithm\n";
+       print CLIENTCONF "auth $cgiparams{'DAUTH'}\n";
+  }
   if ($cgiparams{'COMPLZO'} eq 'on') {
    print CLIENTCONF "# Enable Compression\n";
    print CLIENTCONF "comp-lzo\r\n";
-     }
+  }
   print CLIENTCONF "# Debug Level\n"; 
   print CLIENTCONF "verb 3\n"; 
   print CLIENTCONF "# Tunnel check\n"; 
@@ -1038,7 +1023,6 @@ unless(-d "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}"){mkdir "${General
 ### Save main settings
 ###
 
-
 if ($cgiparams{'ACTION'} eq $Lang::tr{'save'} && $cgiparams{'TYPE'} eq '' && $cgiparams{'KEY'} eq '') {
     &General::readhash("${General::swroot}/ovpn/settings", \%vpnsettings);
     #DAN do we really need (to to check) this value? Besides if we listen on blue and orange too,
@@ -1049,16 +1033,10 @@ if ($cgiparams{'ACTION'} eq $Lang::tr{'save'} && $cgiparams{'TYPE'} eq '' && $cg
        goto SETTINGS_ERROR;
        }
     }
-    if ($errormessage) { goto SETTINGS_ERROR; }
 
-    if ($cgiparams{'ENABLED'} eq 'on'){
-       &checkportfw($cgiparams{'DDEST_PORT'},$cgiparams{'DPROTOCOL'});
-    }
-    if ($errormessage) { goto SETTINGS_ERROR; }
-    
     if (! &General::validipandmask($cgiparams{'DOVPN_SUBNET'})) {
             $errormessage = $Lang::tr{'ovpn subnet is invalid'};
-       goto SETTINGS_ERROR;
+                       goto SETTINGS_ERROR;
     }
     my @tmpovpnsubnet = split("\/",$cgiparams{'DOVPN_SUBNET'});
     
@@ -1114,11 +1092,6 @@ if ($cgiparams{'ACTION'} eq $Lang::tr{'save'} && $cgiparams{'TYPE'} eq '' && $cg
        $errormessage = $Lang::tr{'invalid port'};
        goto SETTINGS_ERROR;
     }
-       
-       if ($cgiparams{'DDEST_PORT'} <= 1023) {
-               $errormessage = $Lang::tr{'ovpn port in root range'};
-               goto SETTINGS_ERROR;
-       }
 
     $vpnsettings{'ENABLED_BLUE'} = $cgiparams{'ENABLED_BLUE'};
     $vpnsettings{'ENABLED_ORANGE'} =$cgiparams{'ENABLED_ORANGE'};
@@ -1144,7 +1117,7 @@ SETTINGS_ERROR:
 ###
 ### Reset all step 2
 ###
-}elsif ($cgiparams{'ACTION'} eq $Lang::tr{'reset'} && $cgiparams{'AREUSURE'} eq 'yes') {
+}elsif ($cgiparams{'ACTION'} eq $Lang::tr{'remove x509'} && $cgiparams{'AREUSURE'} eq 'yes') {
     my $file = '';
     &General::readhasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
 
@@ -1154,37 +1127,66 @@ SETTINGS_ERROR:
        }
     }
     while ($file = glob("${General::swroot}/ovpn/ca/*")) {
-       unlink $file
+       unlink $file;
     }
     while ($file = glob("${General::swroot}/ovpn/certs/*")) {
-       unlink $file
+       unlink $file;
     }
     while ($file = glob("${General::swroot}/ovpn/crls/*")) {
-       unlink $file
+       unlink $file;
     }
-    &cleanssldatabase();
+       &cleanssldatabase();
     if (open(FILE, ">${General::swroot}/ovpn/caconfig")) {
         print FILE "";
         close FILE;
     }
-    &General::writehasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
+    if (open(FILE, ">${General::swroot}/ovpn/ccdroute")) {
+       print FILE "";
+       close FILE;
+    }
+    if (open(FILE, ">${General::swroot}/ovpn/ccdroute2")) {
+       print FILE "";
+       close FILE;
+    }
+    while ($file = glob("${General::swroot}/ovpn/ccd/*")) {
+       unlink $file
+    }
+    if (open(FILE, ">${General::swroot}/ovpn/ovpn-leases.db")) {
+       print FILE "";
+       close FILE;
+    }
+    if (open(FILE, ">${General::swroot}/ovpn/ovpnconfig")) {
+       print FILE "";
+       close FILE;
+    }
+    while ($file = glob("${General::swroot}/ovpn/n2nconf/*")) {
+       system ("rm -rf $file");
+    }
+
     #&writeserverconf();
 ###
 ### Reset all step 1
 ###
-}elsif ($cgiparams{'ACTION'} eq $Lang::tr{'reset'}) {
+}elsif ($cgiparams{'ACTION'} eq $Lang::tr{'remove x509'}) {
     &Header::showhttpheaders();
-    &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
-    &Header::openbigbox('100%', 'LEFT', '', '');
-    &Header::openbox('100%', 'LEFT', $Lang::tr{'are you sure'});
-    print <<END
-       <table><form method='post'><input type='hidden' name='AREUSURE' value='yes' />
-           <tr><td align='center'>             
-               <b><font color='${Header::colourred}'>$Lang::tr{'capswarning'}</font></b>: 
-               $Lang::tr{'resetting the vpn configuration will remove the root ca, the host certificate and all certificate based connections'}
-           <tr><td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'reset'}' />
-               <input type='submit' name='ACTION' value='$Lang::tr{'cancel'}' /></td></tr>
-       </form></table>
+    &Header::openpage($Lang::tr{'ovpn'}, 1, '');
+    &Header::openbigbox('100%', 'left', '', '');
+    &Header::openbox('100%', 'left', $Lang::tr{'are you sure'});
+    print <<END;
+       <form method='post'>
+               <table width='100%'>
+                       <tr>
+                               <td align='center'>
+                               <input type='hidden' name='AREUSURE' value='yes' />
+                               <b><font color='${Header::colourred}'>$Lang::tr{'capswarning'}</font></b>:
+                               $Lang::tr{'resetting the vpn configuration will remove the root ca, the host certificate and all certificate based connections'}</td>
+                       </tr>
+                       <tr>
+                               <td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'remove x509'}' />
+                               <input type='submit' name='ACTION' value='$Lang::tr{'cancel'}' /></td>
+                       </tr>
+               </table>
+       </form>
 END
     ;
     &Header::closebox();
@@ -1192,6 +1194,104 @@ END
     &Header::closepage();
     exit (0);
 
+###
+### Generate DH key step 2
+###
+} elsif ($cgiparams{'ACTION'} eq $Lang::tr{'generate dh key'} && $cgiparams{'AREUSURE'} eq 'yes') {
+    # Delete if old key exists
+    if (-f "${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}") {
+        unlink "${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}";
+       }
+       # Create Diffie Hellmann Parameter
+       system('/usr/bin/openssl', 'dhparam', '-rand', '/proc/interrupts:/proc/net/rt_cache',
+       '-out', "${General::swroot}/ovpn/ca/dh1024.pem", "$cgiparams{'DHLENGHT'}");
+       if ($?) {
+               $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
+               unlink ("${General::swroot}/ovpn/ca/dh1024.pem");
+       }
+
+###
+### Generate DH key step 1
+###
+} elsif ($cgiparams{'ACTION'} eq $Lang::tr{'generate dh key'}) {
+       &Header::showhttpheaders();
+       &Header::openpage($Lang::tr{'ovpn'}, 1, '');
+       &Header::openbigbox('100%', 'LEFT', '', '');
+       &Header::openbox('100%', 'LEFT', "$Lang::tr{'gen dh'}:");
+       print <<END;
+       <table width='100%'>
+       <tr>
+               <td width='20%'> </td> <td width='15%'></td> <td width='65%'></td>
+       </tr>
+       <tr>
+               <td class='base'>$Lang::tr{'ovpn dh'}:</td>
+               <td align='center'>
+               <form method='post'><input type='hidden' name='AREUSURE' value='yes' />
+               <input type='hidden' name='KEY' value='$cgiparams{'KEY'}' />
+                       <select name='DHLENGHT'>
+                               <option value='1024' $selected{'DHLENGHT'}{'1024'}>1024 $Lang::tr{'bit'}</option>
+                               <option value='2048' $selected{'DHLENGHT'}{'2048'}>2048 $Lang::tr{'bit'}</option>
+                               <option value='3072' $selected{'DHLENGHT'}{'3072'}>3072 $Lang::tr{'bit'}</option>
+                               <option value='4096' $selected{'DHLENGHT'}{'4096'}>4096 $Lang::tr{'bit'}</option>
+                       </select>
+               </td>
+       </tr>
+       <tr><td colspan='4'><br></td></tr>
+       </table>
+       <table width='100%'>
+       <tr>
+               <b><font color='${Header::colourred}'>$Lang::tr{'capswarning'}: </font></b>$Lang::tr{'dh key warn'}
+       </tr>
+       <tr>
+               <td class='base'>$Lang::tr{'dh key warn1'}</td>
+       </tr>
+       <tr><td colspan='2'><br></td></tr>
+       <tr>
+               <td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'generate dh key'}' /></td>
+               </form>
+       </tr>
+       </table>
+
+END
+       ;
+       &Header::closebox();
+       print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
+       &Header::closebigbox();
+       &Header::closepage();
+       exit (0);
+
+###
+### Upload DH key
+###
+} elsif ($cgiparams{'ACTION'} eq $Lang::tr{'upload dh key'}) {
+    if (ref ($cgiparams{'FH'}) ne 'Fh') {
+         $errormessage = $Lang::tr{'there was no file upload'};
+         goto UPLOADCA_ERROR;
+    }
+    # Move uploaded dh key to a temporary file
+    (my $fh, my $filename) = tempfile( );
+    if (copy ($cgiparams{'FH'}, $fh) != 1) {
+        $errormessage = $!;
+       goto UPLOADCA_ERROR;
+    }
+    my $temp = `/usr/bin/openssl dhparam -text -in $filename`;
+    if ($temp !~ /DH Parameters: \((1024|2048|3072|4096) bit\)/) {
+        $errormessage = $Lang::tr{'not a valid dh key'};
+        unlink ($filename);
+        goto UPLOADCA_ERROR;
+    } else {
+    # Delete if old key exists
+    if (-f "${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}") {
+        unlink "${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}";
+       }
+    move($filename, "${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}");
+       if ($? ne 0) {
+               $errormessage = "$Lang::tr{'dh key move failed'}: $!";
+               unlink ($filename);
+               goto UPLOADCA_ERROR;
+       }
+    }
+
 ###
 ### Upload CA Certificate
 ###
@@ -1210,7 +1310,7 @@ END
 
     if ($cgiparams{'CA_NAME'} eq 'ca') {
        $errormessage = $Lang::tr{'name is invalid'};
-       goto UPLOAD_CA_ERROR;
+       goto UPLOADCA_ERROR;
     }
 
     # Check if there is no other entry with this name
@@ -1268,7 +1368,7 @@ END
 
     if ( -f "${General::swroot}/ovpn/ca/$cahash{$cgiparams{'KEY'}}[0]cert.pem") {
        &Header::showhttpheaders();
-       &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+       &Header::openpage($Lang::tr{'ovpn'}, 1, '');
        &Header::openbigbox('100%', 'LEFT', '', $errormessage);
        &Header::openbox('100%', 'LEFT', "$Lang::tr{'ca certificate'}:");
        my $output = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/ca/$cahash{$cgiparams{'KEY'}}[0]cert.pem`;
@@ -1345,10 +1445,10 @@ END
        }
        if ($assignedcerts) {
            &Header::showhttpheaders();
-           &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+           &Header::openpage($Lang::tr{'ovpn'}, 1, '');
            &Header::openbigbox('100%', 'LEFT', '', $errormessage);
            &Header::openbox('100%', 'LEFT', $Lang::tr{'are you sure'});
-           print <<END
+           print <<END;
                <table><form method='post'><input type='hidden' name='AREUSURE' value='yes' />
                       <input type='hidden' name='KEY' value='$cgiparams{'KEY'}' />
                    <tr><td align='center'>
@@ -1380,7 +1480,7 @@ END
     $cgiparams{'ACTION'} eq $Lang::tr{'show host certificate'}) {
     my $output;
     &Header::showhttpheaders();
-    &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+    &Header::openpage($Lang::tr{'ovpn'}, 1, '');
     &Header::openbigbox('100%', 'LEFT', '', '');
     if ($cgiparams{'ACTION'} eq $Lang::tr{'show root certificate'}) {
        &Header::openbox('100%', 'LEFT', "$Lang::tr{'root certificate'}:");
@@ -1418,6 +1518,18 @@ END
        print `/usr/bin/openssl x509 -in ${General::swroot}/ovpn/certs/servercert.pem`;
        exit(0);
     }
+
+###
+### Download Diffie-Hellman parameter
+###
+}elsif ($cgiparams{'ACTION'} eq $Lang::tr{'download dh parameter'}) {
+    if ( -f "${General::swroot}/ovpn/ca/dh1024.pem" ) {
+       print "Content-Type: application/octet-stream\r\n";
+       print "Content-Disposition: filename=dh1024.pem\r\n\r\n";
+       print `/usr/bin/openssl dhparam -in ${General::swroot}/ovpn/ca/dh1024.pem`;
+       exit(0);
+    }
+
 ###
 ### Form for generating a root certificate
 ###
@@ -1646,7 +1758,7 @@ END
            }
        } else {        # child
            unless (exec ('/usr/bin/openssl', 'req', '-x509', '-nodes', '-rand', '/proc/interrupts:/proc/net/rt_cache',
-                       '-days', '999999', '-newkey', 'rsa:2048',
+                       '-days', '999999', '-newkey', 'rsa:4096', '-sha512',
                        '-keyout', "${General::swroot}/ovpn/ca/cakey.pem",
                        '-out', "${General::swroot}/ovpn/ca/cacert.pem",
                        '-config',"${General::swroot}/ovpn/openssl/ovpn.cnf")) {
@@ -1677,7 +1789,7 @@ END
            }
        } else {        # child
            unless (exec ('/usr/bin/openssl', 'req', '-nodes', '-rand', '/proc/interrupts:/proc/net/rt_cache',
-                       '-newkey', 'rsa:1024',
+                       '-newkey', 'rsa:2048',
                        '-keyout', "${General::swroot}/ovpn/certs/serverkey.pem",
                        '-out', "${General::swroot}/ovpn/certs/serverreq.pem",
                        '-extensions', 'server',
@@ -1729,8 +1841,7 @@ END
        }
        # Create Diffie Hellmann Parameter
        system('/usr/bin/openssl', 'dhparam', '-rand', '/proc/interrupts:/proc/net/rt_cache',
-              '-out', "${General::swroot}/ovpn/ca/dh1024.pem",
-              '1024' );
+              '-out', "${General::swroot}/ovpn/ca/dh1024.pem", "$cgiparams{'DHLENGHT'}");
        if ($?) {
            $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
            unlink ("${General::swroot}/ovpn/certs/serverkey.pem");
@@ -1742,13 +1853,20 @@ END
            goto ROOTCERT_ERROR;
 #      } else {
 #          &cleanssldatabase();
-       }       
+       }
+       # Create ta.key for tls-auth
+       system('/usr/sbin/openvpn', '--genkey', '--secret', "${General::swroot}/ovpn/certs/ta.key");
+       if ($?) {
+           $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
+           &cleanssldatabase();
+           goto ROOTCERT_ERROR;
+       }
        goto ROOTCERT_SUCCESS;
     }
     ROOTCERT_ERROR:
     if ($cgiparams{'ACTION'} ne '') {
        &Header::showhttpheaders();
-       &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+       &Header::openpage($Lang::tr{'ovpn'}, 1, '');
        &Header::openbigbox('100%', 'LEFT', '', '');
        if ($errormessage) {
            &Header::openbox('100%', 'LEFT', $Lang::tr{'error messages'});
@@ -1757,7 +1875,7 @@ END
            &Header::closebox();
        }
        &Header::openbox('100%', 'LEFT', "$Lang::tr{'generate root/host certificates'}:");
-       print <<END
+       print <<END;
        <form method='post' enctype='multipart/form-data'>
        <table width='100%' border='0' cellspacing='1' cellpadding='0'>
        <tr><td width='30%' class='base'>$Lang::tr{'organization name'}:</td>
@@ -1790,19 +1908,38 @@ END
            }
            print ">$country</option>";
        }
-       print <<END
+       print <<END;
            </select></td>
-           <td colspan='2'>&nbsp;</td></tr>
+       <tr><td class='base'>$Lang::tr{'ovpn dh'}:</td>
+               <td class='base'><select name='DHLENGHT'>
+                               <option value='1024' $selected{'DHLENGHT'}{'1024'}>1024 $Lang::tr{'bit'}</option>
+                               <option value='2048' $selected{'DHLENGHT'}{'2048'}>2048 $Lang::tr{'bit'}</option>
+                               <option value='3072' $selected{'DHLENGHT'}{'3072'}>3072 $Lang::tr{'bit'}</option>
+                               <option value='4096' $selected{'DHLENGHT'}{'4096'}>4096 $Lang::tr{'bit'}</option>
+                       </select>
+               </td>
+       </tr>
+
        <tr><td>&nbsp;</td>
            <td><input type='submit' name='ACTION' value='$Lang::tr{'generate root/host certificates'}' /></td>
            <td>&nbsp;</td><td>&nbsp;</td></tr> 
        <tr><td class='base' colspan='4' align='left'>
            <img src='/blob.gif' valign='top' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td></tr>
-       <tr><td class='base' colspan='4' align='left'>
-           <b><font color='${Header::colourred}'>$Lang::tr{'capswarning'}</font></b>: 
-           $Lang::tr{'generating the root and host certificates may take a long time. it can take up to several minutes on older hardware. please be patient'}
-       </td></tr>
-       <tr><td colspan='4' bgcolor='#000000'><img src='/images/null.gif' width='1' height='1' border='0' /></td></tr>
+       <tr><td colspan='2'><br></td></tr>
+       <table width='100%'>
+       <tr>
+               <b><font color='${Header::colourred}'>$Lang::tr{'capswarning'}: </font></b>$Lang::tr{'ovpn generating the root and host certificates'}
+               <td class='base'>$Lang::tr{'dh key warn'}</td>
+       </tr>
+       <tr>
+               <td class='base'>$Lang::tr{'dh key warn1'}</td>
+       </tr>
+       <tr><td colspan='2'><br></td></tr>
+       <tr>
+       </table>
+
+       <table width='100%'>
+       <tr><td colspan='4'><hr></td></tr>
        <tr><td class='base' nowrap='nowrap'>$Lang::tr{'upload p12 file'}:</td>
            <td nowrap='nowrap'><input type='file' name='FH' size='32'></td>
            <td colspan='2'>&nbsp;</td></tr>
@@ -1813,12 +1950,13 @@ END
            <td><input type='submit' name='ACTION' value='$Lang::tr{'upload p12 file'}' /></td>
             <td colspan='2'>&nbsp;</td></tr>
        <tr><td class='base' colspan='4' align='left'>
-           <img src='/blob.gif' valign='top' al='*' >&nbsp;$Lang::tr{'this field may be blank'}</td></tr>
+           <img src='/blob.gif' valign='top' al='*' >&nbsp;$Lang::tr{'this field may be blank'}</td>
+       </tr>
        </form></table>
 END
        ;
        &Header::closebox();
-
+       print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
        &Header::closebigbox();
        &Header::closepage();
         exit(0)
@@ -1950,13 +2088,20 @@ if ($confighash{$cgiparams{'KEY'}}[3] eq 'net'){
    print CLIENTCONF "ns-cert-type server\n";   
    print CLIENTCONF "# Auth. Client\n"; 
    print CLIENTCONF "tls-client\n"; 
-   print CLIENTCONF "# Cipher\n"; 
-   print CLIENTCONF "cipher AES-256-CBC\n"; 
+   print CLIENTCONF "# Cipher\n";
+   print CLIENTCONF "cipher $confighash{$cgiparams{'KEY'}}[40]\n";
     if ($confighash{$cgiparams{'KEY'}}[4] eq 'cert' && -f "${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12") { 
         print CLIENTCONF "pkcs12 ${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12\r\n";
      $zip->addFile( "${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12", "$confighash{$cgiparams{'KEY'}}[1].p12") or die "Can't add file $confighash{$cgiparams{'KEY'}}[1].p12\n";
-   } 
-    if ($confighash{$cgiparams{'KEY'}}[30] eq 'on') {
+   }
+   if ($confighash{$cgiparams{'KEY'}}[39] eq '') {
+       print CLIENTCONF "# HMAC algorithm\n";
+       print CLIENTCONF "auth SHA1\n";
+   } else {
+   print CLIENTCONF "# HMAC algorithm\n";
+   print CLIENTCONF "auth $confighash{$cgiparams{'KEY'}}[39]\n";
+   }
+   if ($confighash{$cgiparams{'KEY'}}[30] eq 'on') {
    print CLIENTCONF "# Enable Compression\n";
    print CLIENTCONF "comp-lzo\r\n";
      }
@@ -2051,6 +2196,15 @@ else
        $zip->addFile( "${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1]cert.pem", "$confighash{$cgiparams{'KEY'}}[1]cert.pem") or die "Can't add file $confighash{$cgiparams{'KEY'}}[1]cert.pem\n";    
     }
     print CLIENTCONF "cipher $vpnsettings{DCIPHER}\r\n";
+    if ($vpnsettings{'DAUTH'} eq '') {
+        print CLIENTCONF "";
+    } else {
+       print CLIENTCONF "auth $vpnsettings{'DAUTH'}\r\n";
+    }
+    if ($vpnsettings{'TLSAUTH'} eq 'on') {
+       print CLIENTCONF "tls-auth ta.key\r\n";
+       $zip->addFile( "${General::swroot}/ovpn/certs/ta.key", "ta.key")  or die "Can't add file ta.key\n";
+    }
     if ($vpnsettings{DCOMPLZO} eq 'on') {
         print CLIENTCONF "comp-lzo\r\n";
     }
@@ -2180,7 +2334,7 @@ if ($confighash{$cgiparams{'KEY'}}[3] eq 'net') {
 
     if ( -f "${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1]cert.pem") {
        &Header::showhttpheaders();
-       &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+       &Header::openpage($Lang::tr{'ovpn'}, 1, '');
        &Header::openbigbox('100%', 'LEFT', '', '');
        &Header::openbox('100%', 'LEFT', "$Lang::tr{'certificate'}:");
        my $output = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1]cert.pem`;
@@ -2192,15 +2346,40 @@ if ($confighash{$cgiparams{'KEY'}}[3] eq 'net') {
        &Header::closepage();
        exit(0);
     }
+
+###
+### Display Diffie-Hellman key
+###
+} elsif ($cgiparams{'ACTION'} eq $Lang::tr{'show dh'}) {
+
+    if (! -e "${General::swroot}/ovpn/ca/dh1024.pem") {
+       $errormessage = $Lang::tr{'not present'};
+       } else {
+               &Header::showhttpheaders();
+               &Header::openpage($Lang::tr{'ovpn'}, 1, '');
+               &Header::openbigbox('100%', 'LEFT', '', '');
+               &Header::openbox('100%', 'LEFT', "$Lang::tr{'dh'}:");
+               my $output = `/usr/bin/openssl dhparam -text -in ${General::swroot}/ovpn/ca/dh1024.pem`;
+               $output = &Header::cleanhtml($output,"y");
+               print "<pre>$output</pre>\n";
+               &Header::closebox();
+               print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
+               &Header::closebigbox();
+               &Header::closepage();
+               exit(0);
+    }
+
 ###
 ### Display Certificate Revoke List
 ###
 } elsif ($cgiparams{'ACTION'} eq $Lang::tr{'show crl'}) {
 #    &General::readhasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
 
-    if ( -f "${General::swroot}/ovpn/crls/cacrl.pem") {
+    if (! -e "${General::swroot}/ovpn/crls/cacrl.pem") {
+       $errormessage = $Lang::tr{'not present'};
+       } else {
        &Header::showhttpheaders();
-       &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+       &Header::openpage($Lang::tr{'ovpn'}, 1, '');
        &Header::openbigbox('100%', 'LEFT', '', '');
        &Header::openbox('100%', 'LEFT', "$Lang::tr{'crl'}:");
        my $output = `/usr/bin/openssl crl -text -noout -in ${General::swroot}/ovpn/crls/cacrl.pem`;
@@ -2231,19 +2410,25 @@ if ($confighash{$cgiparams{'KEY'}}[3] eq 'net') {
 #    }
 ADV_ERROR:
     if ($cgiparams{'MAX_CLIENTS'} eq '') {
-       $cgiparams{'MAX_CLIENTS'} =  '100';     
+               $cgiparams{'MAX_CLIENTS'} =  '100';
     }
     if ($cgiparams{'KEEPALIVE_1'} eq '') {
-       $cgiparams{'KEEPALIVE_1'} =  '10';     
+               $cgiparams{'KEEPALIVE_1'} =  '10';
     }
     if ($cgiparams{'KEEPALIVE_2'} eq '') {
-       $cgiparams{'KEEPALIVE_2'} =  '60';     
+               $cgiparams{'KEEPALIVE_2'} =  '60';
     }
     if ($cgiparams{'LOG_VERB'} eq '') {
-       $cgiparams{'LOG_VERB'} =  '3';
+               $cgiparams{'LOG_VERB'} =  '3';
     }
     if ($cgiparams{'PMTU_DISCOVERY'} eq '') {
-       $cgiparams{'PMTU_DISCOVERY'} = 'off';
+               $cgiparams{'PMTU_DISCOVERY'} = 'off';
+    }
+    if ($cgiparams{'DAUTH'} eq '') {
+               $cgiparams{'DAUTH'} = 'SHA1';
+    }
+    if ($cgiparams{'TLSAUTH'} eq '') {
+               $cgiparams{'TLSAUTH'} = 'off';
     }
     $checked{'CLIENT2CLIENT'}{'off'} = '';
     $checked{'CLIENT2CLIENT'}{'on'} = '';
@@ -2251,11 +2436,11 @@ ADV_ERROR:
     $checked{'REDIRECT_GW_DEF1'}{'off'} = '';
     $checked{'REDIRECT_GW_DEF1'}{'on'} = '';
     $checked{'REDIRECT_GW_DEF1'}{$cgiparams{'REDIRECT_GW_DEF1'}} = 'CHECKED';
-    $selected{'ENGINES'}{$cgiparams{'ENGINES'}} = 'SELECTED';
     $checked{'MSSFIX'}{'off'} = '';
     $checked{'MSSFIX'}{'on'} = '';
     $checked{'MSSFIX'}{$cgiparams{'MSSFIX'}} = 'CHECKED';
     $checked{'PMTU_DISCOVERY'}{$cgiparams{'PMTU_DISCOVERY'}} = 'checked=\'checked\'';
+    $selected{'LOG_VERB'}{'0'} = '';
     $selected{'LOG_VERB'}{'1'} = '';
     $selected{'LOG_VERB'}{'2'} = '';
     $selected{'LOG_VERB'}{'3'} = '';
@@ -2267,8 +2452,16 @@ ADV_ERROR:
     $selected{'LOG_VERB'}{'9'} = '';
     $selected{'LOG_VERB'}{'10'} = '';
     $selected{'LOG_VERB'}{'11'} = '';
-    $selected{'LOG_VERB'}{'0'} = '';
     $selected{'LOG_VERB'}{$cgiparams{'LOG_VERB'}} = 'SELECTED';
+    $selected{'DAUTH'}{'whirlpool'} = '';
+    $selected{'DAUTH'}{'SHA512'} = '';
+    $selected{'DAUTH'}{'SHA384'} = '';
+    $selected{'DAUTH'}{'SHA256'} = '';
+    $selected{'DAUTH'}{'SHA1'} = '';
+    $selected{'DAUTH'}{$cgiparams{'DAUTH'}} = 'SELECTED';
+    $checked{'TLSAUTH'}{'off'} = '';
+    $checked{'TLSAUTH'}{'on'} = '';
+    $checked{'TLSAUTH'}{$cgiparams{'TLSAUTH'}} = 'CHECKED';
    
     &Header::showhttpheaders();
     &Header::openpage($Lang::tr{'status ovpn'}, 1, '');
@@ -2280,34 +2473,34 @@ ADV_ERROR:
        &Header::closebox();
     }
     &Header::openbox('100%', 'LEFT', $Lang::tr{'advanced server'});
-    print <<END
+    print <<END;
     <form method='post' enctype='multipart/form-data'>
-    <table width='100%' border='0'>
-    <tr>
-       <td colspan='4'><b>$Lang::tr{'dhcp-options'}</b></td>
+<table width='100%' border=0>
+       <tr>
+               <td colspan='4'><b>$Lang::tr{'dhcp-options'}</b></td>
     </tr>
     <tr>
-       <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
+               <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
     </tr>      
     <tr>               
-       <td class='base'>Domain</td>
+               <td class='base'>Domain</td>
         <td><input type='TEXT' name='DHCP_DOMAIN' value='$cgiparams{'DHCP_DOMAIN'}' size='30'  /></td>
     </tr>
     <tr>       
-       <td class='base'>DNS</td>
-       <td><input type='TEXT' name='DHCP_DNS' value='$cgiparams{'DHCP_DNS'}' size='30' /></td>
+               <td class='base'>DNS</td>
+               <td><input type='TEXT' name='DHCP_DNS' value='$cgiparams{'DHCP_DNS'}' size='30' /></td>
     </tr>      
     <tr>       
-       <td class='base'>WINS</td>
-       <td><input type='TEXT' name='DHCP_WINS' value='$cgiparams{'DHCP_WINS'}' size='30' /></td>
-       </tr>
+               <td class='base'>WINS</td>
+               <td><input type='TEXT' name='DHCP_WINS' value='$cgiparams{'DHCP_WINS'}' size='30' /></td>
+       </tr>
     <tr>
-       <td colspan='4'><b>$Lang::tr{'ovpn routes push options'}</b></td>
+               <td colspan='4'><b>$Lang::tr{'ovpn routes push options'}</b></td>
     </tr>
     <tr>       
-       <td class='base'>$Lang::tr{'ovpn routes push'}</td>
-  <td colspan='2'>
-       <textarea name='ROUTES_PUSH' cols='26' rows='6' wrap='off'>
+               <td class='base'>$Lang::tr{'ovpn routes push'}</td>
+               <td colspan='2'>
+               <textarea name='ROUTES_PUSH' cols='26' rows='6' wrap='off'>
 END
 ;
 
@@ -2322,40 +2515,39 @@ print <<END;
     </tr>
 </table>
 <hr size='1'>
-    <table width='100%'>
+<table width='100%'>
     <tr>
-       <td class'base'><b>$Lang::tr{'misc-options'}</b></td>
+               <td class'base'><b>$Lang::tr{'misc-options'}</b></td>
     </tr>
     <tr>
-       <td width='20%'></td> <td width='15%'> </td><td width='15%'> </td><td width='15%'></td><td width='35%'></td>
+               <td width='20%'></td> <td width='15%'> </td><td width='15%'> </td><td width='15%'></td><td width='35%'></td>
     </tr>
     <tr>
-       <td class='base'>Client-To-Client</td>
-       <td><input type='checkbox' name='CLIENT2CLIENT' $checked{'CLIENT2CLIENT'}{'on'} /></td>
+               <td class='base'>Client-To-Client</td>
+               <td><input type='checkbox' name='CLIENT2CLIENT' $checked{'CLIENT2CLIENT'}{'on'} /></td>
     </tr>
     <tr>       
-       <td class='base'>Redirect-Gateway def1</td>
-       <td><input type='checkbox' name='REDIRECT_GW_DEF1' $checked{'REDIRECT_GW_DEF1'}{'on'} /></td>
+               <td class='base'>Redirect-Gateway def1</td>
+               <td><input type='checkbox' name='REDIRECT_GW_DEF1' $checked{'REDIRECT_GW_DEF1'}{'on'} /></td>
     </tr>
     <tr>       
         <td class='base'>Max-Clients</td>
         <td><input type='text' name='MAX_CLIENTS' value='$cgiparams{'MAX_CLIENTS'}' size='10' /></td>
     </tr>      
-       <tr>
+       <tr>
          <td class='base'>Keepalive <br />
            (ping/ping-restart)</td>
          <td><input type='TEXT' name='KEEPALIVE_1' value='$cgiparams{'KEEPALIVE_1'}' size='10' /></td>
          <td><input type='TEXT' name='KEEPALIVE_2' value='$cgiparams{'KEEPALIVE_2'}' size='10' /></td>
     </tr>
-       <tr>
+       <tr>
          <td class='base'>fragment <br></td>
          <td><input type='TEXT' name='FRAGMENT' value='$cgiparams{'FRAGMENT'}' size='10' /></td>
-        <td>$Lang::tr{'openvpn default'}: <span class="base">1300</span></td>
       </tr>
        <tr>
          <td class='base'>mssfix</td>
          <td><input type='checkbox' name='MSSFIX' $checked{'MSSFIX'}{'on'} /></td>
-         <td>$Lang::tr{'openvpn default'}: on</td>
+         <td>$Lang::tr{'openvpn default'}: off</td>
          </tr>
 
        <tr>
@@ -2367,53 +2559,70 @@ print <<END;
        </tr>
 </table>
 
-<!--
 <hr size='1'>
-    <table width='100%'>
+<table width='100%'>
+    <tr>
+       <td class'base'><b>$Lang::tr{'log-options'}</b></td>
+    </tr>
     <tr>
<td class'base'><b>Crypto-Engines</b></td>
      <td width='20%'></td> <td width='30%'> </td><td width='25%'> </td><td width='25%'></td>
     </tr>
+
+    <tr><td class='base'>VERB</td>
+        <td><select name='LOG_VERB'>
+                       <option value='0'  $selected{'LOG_VERB'}{'0'}>0</option>
+                       <option value='1'  $selected{'LOG_VERB'}{'1'}>1</option>
+                       <option value='2'  $selected{'LOG_VERB'}{'2'}>2</option>
+                       <option value='3'  $selected{'LOG_VERB'}{'3'}>3</option>
+                       <option value='4'  $selected{'LOG_VERB'}{'4'}>4</option>
+                       <option value='5'  $selected{'LOG_VERB'}{'5'}>5</option>
+                       <option value='6'  $selected{'LOG_VERB'}{'6'}>6</option>
+                       <option value='7'  $selected{'LOG_VERB'}{'7'}>7</option>
+                       <option value='8'  $selected{'LOG_VERB'}{'8'}>8</option>
+                       <option value='9'  $selected{'LOG_VERB'}{'9'}>9</option>
+                       <option value='10' $selected{'LOG_VERB'}{'10'}>10</option>
+                       <option value='11' $selected{'LOG_VERB'}{'11'}>11</option>
+       </td></select>
+    </table>
+
+<hr size='1'>
+<table width='100%'>
     <tr>
-       <td width='15%'></td> <td width='30%'> </td><td width='25%'> </td><td width='30%'></td>
+               <td class'base'><b>$Lang::tr{'ovpn crypt options'}</b></td>
+       </tr>
+       <tr>
+               <td width='20%'></td> <td width='30%'> </td><td width='25%'> </td><td width='25%'></td>
     </tr>      
-    <tr><td class='base'>Engines:</td>        
-        <td><select name='ENGINES'><option value="none" $selected{'ENGINES'}{'none'}>none</option>
-                                   <option value="cryptodev" $selected{'ENGINES'}{'cryptodev'}>cryptodev</option>
-                                   <option value="padlock" $selected{'ENGINES'}{'padlock'}>padlock</option>
+    <tr><td class='base'>$Lang::tr{'ovpn ha'}</td>
+               <td><select name='DAUTH'>
+                               <option value='whirlpool'               $selected{'DAUTH'}{'whirlpool'}>Whirlpool (512 $Lang::tr{'bit'})</option>
+                               <option value='SHA512'                  $selected{'DAUTH'}{'SHA512'}>SHA2 (512 $Lang::tr{'bit'})</option>
+                               <option value='SHA384'                  $selected{'DAUTH'}{'SHA384'}>SHA2 (384 $Lang::tr{'bit'})</option>
+                               <option value='SHA256'                  $selected{'DAUTH'}{'SHA256'}>SHA2 (256 $Lang::tr{'bit'})</option>
+                               <option value='SHA1'                    $selected{'DAUTH'}{'SHA1'}>SHA1 (160 $Lang::tr{'bit'})</option>
                        </select>
-               </td>   
+               </td>
+               <td>$Lang::tr{'openvpn default'}: <span class="base">SHA1 (160 $Lang::tr{'bit'})</span></td>
+    </tr>
 </table>
--->
-<hr size='1'>
-    <table width='100%'>
+
+<table width='100%'>
     <tr>
-       <td class'base'><b>$Lang::tr{'log-options'}</b></td>
+       <td width='20%'></td> <td width='15%'> </td><td width='15%'> </td><td width='15%'></td><td width='35%'></td>
     </tr>
+
     <tr>
-       <td width='15%'></td> <td width='30%'> </td><td width='25%'> </td><td width='30%'></td>
-    </tr>      
-       
-    <tr><td class='base'>VERB</td>        
-        <td><select name='LOG_VERB'><option value='1'  $selected{'LOG_VERB'}{'1'}>1</option>
-                                   <option value='2'  $selected{'LOG_VERB'}{'2'}>2</option>
-                                   <option value='3'  $selected{'LOG_VERB'}{'3'}>3</option>
-                                   <option value='4'  $selected{'LOG_VERB'}{'4'}>4</option>
-                                   <option value='5'  $selected{'LOG_VERB'}{'5'}>5</option>
-                                   <option value='6'  $selected{'LOG_VERB'}{'6'}>6</option>                                                                
-                                   <option value='7'  $selected{'LOG_VERB'}{'7'}>7</option>
-                                   <option value='8'  $selected{'LOG_VERB'}{'8'}>8</option>
-                                   <option value='9'  $selected{'LOG_VERB'}{'9'}>9</option>
-                                   <option value='10' $selected{'LOG_VERB'}{'10'}>10</option>
-                                   <option value='11' $selected{'LOG_VERB'}{'11'}>11</option>
-                                   <option value='0'  $selected{'LOG_VERB'}{'0'}>0</option></select></td>      
-</table><hr>
+       <td class='base'>HMAC tls-auth</td>
+       <td><input type='checkbox' name='TLSAUTH' $checked{'TLSAUTH'}{'on'} /></td>
+    </tr>
+    </table><hr>
 END
 
 if ( -e "/var/run/openvpn.pid"){
 print" <br><b><font color='#990000'>$Lang::tr{'attention'}:</b></font><br>
                $Lang::tr{'server restart'}<br><br>
                <hr>";
-               print<<END
+       print<<END;
 <table width='100%'>
 <tr>
     <td>&nbsp;</td>
@@ -2429,7 +2638,7 @@ END
                
 }else{
 
-print<<END
+       print<<END;
 <table width='100%'>
 <tr>
     <td>&nbsp;</td>
@@ -2484,7 +2693,7 @@ if ($cgiparams{'ACTION'} eq "edit"){
        
        &Header::openbox('100%', 'LEFT', $Lang::tr{'ccd modify'});
 
-       print <<END
+       print <<END;
     <table width='100%' border='0'>
     <tr><form method='post'>
        <td width='10%' nowrap='nowrap'>$Lang::tr{'ccd name'}:</td><td><input type='TEXT' name='ccdname' value='$cgiparams{'ccdname'}' /></td>
@@ -2498,7 +2707,7 @@ END
        &Header::closebox();
 
        &Header::openbox('100%', 'LEFT',$Lang::tr{'ccd net'} );
-       print <<END
+       print <<END;
     <table width='100%' border='0'  cellpadding='0' cellspacing='1'>
     <tr>
        <td class='boldbase' align='center'><b>$Lang::tr{'ccd name'}</td><td class='boldbase' align='center'><b>$Lang::tr{'network'}</td><td class='boldbase' width='15%' align='center'><b>$Lang::tr{'ccd used'}</td><td width='3%'></td><td width='3%'></td></tr>
@@ -2508,7 +2717,7 @@ END
 else{
        if (! -e "/var/run/openvpn.pid"){
        &Header::openbox('100%', 'LEFT', $Lang::tr{'ccd add'});
-               print <<END;
+       print <<END;
            <table width='100%' border='0'>
            <tr><form method='post'>
                <td colspan='4'>$Lang::tr{'ccd hint'}<br><br></td></tr>
@@ -2528,7 +2737,7 @@ END
                print "$Lang::tr{'ccd noaddnet'}<br><hr>";
        }
        
-       print <<END
+    print <<END;
     <table width='100%' cellpadding='0' cellspacing='1'>
     <tr>
        <td class='boldbase' align='center' nowrap='nowrap' width='20%'><b>$Lang::tr{'ccd name'}</td><td class='boldbase' align='center' width='8%'><b>$Lang::tr{'network'}</td><td class='boldbase' width='8%' align='center' nowrap='nowrap'><b>$Lang::tr{'ccd used'}</td><td width='1%' align='center'></td><td width='1%' align='center'></td></tr>
@@ -2546,7 +2755,7 @@ END
                if ($count % 2){ print" <tr bgcolor='$color{'color22'}'>";}
                else{            print" <tr bgcolor='$color{'color20'}'>";}
                print"<td>$ccdconf[0]</td><td align='center'>$ccdconf[1]</td><td align='center'>$ccdhosts/".(&ccdmaxclients($ccdconf[1])+1)."</td><td>";
-print <<END
+        print <<END;
                <form method='post' />
                <input type='image' src='/images/edit.gif' align='middle' alt='$Lang::tr{'edit'}' title='$Lang::tr{'edit'}' />
                <input type='hidden' name='ACTION' value='edit'/>
@@ -2582,7 +2791,7 @@ END
 #
 #      <td><b>$Lang::tr{'protocol'}</b></td>
 # protocol temp removed 
-    print <<END
+    print <<END;
     <table width='100%' cellpadding='2' cellspacing='0' class='tbl'>
     <tr>
        <th><b>$Lang::tr{'common name'}</b></th>
@@ -2661,7 +2870,7 @@ END
        }
        
        print "</table>";
-       print <<END
+       print <<END;
        <table width='100%' border='0' cellpadding='2' cellspacing='0'>
        <tr><td></td></tr>
        <tr><td></td></tr>
@@ -2770,13 +2979,13 @@ END
 } elsif ($cgiparams{'ACTION'} eq $Lang::tr{'add'} && $cgiparams{'TYPE'} eq '') {
        &General::readhash("${General::swroot}/ovpn/settings", \%vpnsettings);
        &Header::showhttpheaders();
-       &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+       &Header::openpage($Lang::tr{'ovpn'}, 1, '');
        &Header::openbigbox('100%', 'LEFT', '', '');
        &Header::openbox('100%', 'LEFT', $Lang::tr{'connection type'});
 
 if ( -s "${General::swroot}/ovpn/settings") {
 
-       print <<END
+       print <<END;
            <b>$Lang::tr{'connection type'}:</b><br />
            <table border='0' width='100%'><form method='post' ENCTYPE="multipart/form-data">
            <tr><td><input type='radio' name='TYPE' value='host' checked /></td>
@@ -2797,7 +3006,7 @@ END
        
 
 } else {
-       print <<END
+       print <<END;
                    <b>$Lang::tr{'connection type'}:</b><br />
            <table border='0' width='100%'><form method='post' ENCTYPE="multipart/form-data">
            <tr><td><input type='radio' name='TYPE' value='host' checked /></td> <td class='base'>$Lang::tr{'host to net vpn'}</td></tr>
@@ -2809,6 +3018,7 @@ END
 }
 
        &Header::closebox();
+       print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
        &Header::closebigbox();
        &Header::closepage();
        exit (0);
@@ -2943,8 +3153,10 @@ END
        
 my $complzoactive;
 my $mssfixactive;
+my $authactive;
 my $n2nfragment;
-my @n2nmtudisc = split(/ /, (grep { /^mtu-disc/ } @firen2nconf)[0]);;
+my $authactive;
+my @n2nmtudisc = split(/ /, (grep { /^mtu-disc/ } @firen2nconf)[0]);
 my @n2nproto2 = split(/ /, (grep { /^proto/ } @firen2nconf)[0]);
 my @n2nproto = split(/-/, $n2nproto2[1]);
 my @n2nport = split(/ /, (grep { /^port/ } @firen2nconf)[0]);
@@ -2961,7 +3173,8 @@ my @n2novpnsub =  split(/\./,$n2novpnsuball[1]);
 my @n2nremsub = split(/ /, (grep { /^route/ } @firen2nconf)[0]);
 my @n2nmgmt =  split(/ /, (grep { /^management/ } @firen2nconf)[0]);
 my @n2nlocalsub  = split(/ /, (grep { /^# remsub/ } @firen2nconf)[0]);
-
+my @n2ncipher = split(/ /, (grep { /^cipher/ } @firen2nconf)[0]);
+my @n2nauth = split(/ /, (grep { /^auth/ } @firen2nconf)[0]);;
 
 ###
 # m.a.d delete CR and LF from arrays for this chomp doesnt work
@@ -2980,6 +3193,8 @@ $n2nlocalsub[2] =~ s/\n|\r//g;
 $n2nfragment[1] =~ s/\n|\r//g;
 $n2nmgmt[2] =~ s/\n|\r//g;
 $n2nmtudisc[1] =~ s/\n|\r//g;
+$n2ncipher[1] =~ s/\n|\r//g;
+$n2nauth[1] =~ s/\n|\r//g;
 chomp ($complzoactive);
 chomp ($mssfixactive);
 
@@ -3016,7 +3231,7 @@ foreach my $dkey (keys %confighash) {
        }
 
 ###
-# Check im Dest Port is vaild
+# Check if Dest Port is vaild
 ###
 
 foreach my $dkey (keys %confighash) {
@@ -3033,7 +3248,7 @@ foreach my $dkey (keys %confighash) {
        
   $key = &General::findhasharraykey (\%confighash);
 
-       foreach my $i (0 .. 39) { $confighash{$key}[$i] = "";}
+       foreach my $i (0 .. 42) { $confighash{$key}[$i] = "";}
 
        $confighash{$key}[0] = 'off';
        $confighash{$key}[1] = $n2nname[0];
@@ -3054,8 +3269,10 @@ foreach my $dkey (keys %confighash) {
        $confighash{$key}[29] = $n2nport[1];
        $confighash{$key}[30] = $complzoactive;
        $confighash{$key}[31] = $n2ntunmtu[1];
-       $confighash{$key}[38] = $n2nmtudisc[1]; 
-
+       $confighash{$key}[38] = $n2nmtudisc[1];
+       $confighash{$key}[39] = $n2nauth[1];
+       $confighash{$key}[40] = $n2ncipher[1];
+       $confighash{$key}[41] = 'disabled';
 
   &General::writehasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
  
@@ -3075,7 +3292,7 @@ foreach my $dkey (keys %confighash) {
                &Header::openbox('100%', 'LEFT', 'import ipfire net2net config');
        }
        if ($errormessage eq ''){
-               print <<END             
+       print <<END;
                <!-- ipfire net2net config gui -->
                <table width='100%'>
                <tr><td width='25%'>&nbsp;</td><td width='25%'>&nbsp;</td></tr>
@@ -3084,16 +3301,18 @@ foreach my $dkey (keys %confighash) {
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'Act as'}</td><td><b>$confighash{$key}[6]</b></td></tr>                                                              
                <tr><td class='boldbase' nowrap='nowrap'>Remote Host </td><td><b>$confighash{$key}[10]</b></td></tr>
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'local subnet'}</td><td><b>$confighash{$key}[8]</b></td></tr>
-               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'remote subnet'}</td><td><b>$confighash{$key}[11]</b></td></tr>
+               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'remote subnet'}:</td><td><b>$confighash{$key}[11]</b></td></tr>
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn subnet'}</td><td><b>$confighash{$key}[27]</b></td></tr>
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'protocol'}</td><td><b>$confighash{$key}[28]</b></td></tr>
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'destination port'}:</td><td><b>$confighash{$key}[29]</b></td></tr>
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'comp-lzo'}</td><td><b>$confighash{$key}[30]</b></td></tr>
-               <tr><td class='boldbase' nowrap='nowrap'>MSSFIX </td><td><b>$confighash{$key}[23]</b></td></tr>
-               <tr><td class='boldbase' nowrap='nowrap'>Fragment </td><td><b>$confighash{$key}[24]</b></td></tr>
+               <tr><td class='boldbase' nowrap='nowrap'>MSSFIX:</td><td><b>$confighash{$key}[23]</b></td></tr>
+               <tr><td class='boldbase' nowrap='nowrap'>Fragment:</td><td><b>$confighash{$key}[24]</b></td></tr>
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'MTU'}</td><td><b>$confighash{$key}[31]</b></td></tr>
                <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn mtu-disc'}</td><td><b>$confighash{$key}[38]</b></td></tr>
                <tr><td class='boldbase' nowrap='nowrap'>Management Port </td><td><b>$confighash{$key}[22]</b></td></tr>
+               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn hmac'}:</td><td><b>$confighash{$key}[39]</b></td></tr>
+               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'cipher'}</td><td><b>$confighash{$key}[40]</b></td></tr>
                <tr><td>&nbsp;</td><td>&nbsp;</td></tr> 
     </table>
 END
@@ -3111,7 +3330,7 @@ END
        }       
        &Header::closebigbox();
        &Header::closepage();
-       exit(0);        
+       exit(0);
 
 
 ##
@@ -3164,33 +3383,36 @@ if ($confighash{$cgiparams{'KEY'}}) {
                    $errormessage = $Lang::tr{'invalid key'};
                    goto VPNCONF_END;
                }
-               $cgiparams{'ENABLED'}                   = $confighash{$cgiparams{'KEY'}}[0];
-               $cgiparams{'NAME'}                              = $confighash{$cgiparams{'KEY'}}[1];
-               $cgiparams{'TYPE'}                              = $confighash{$cgiparams{'KEY'}}[3];
-               $cgiparams{'AUTH'}                              = $confighash{$cgiparams{'KEY'}}[4];
-               $cgiparams{'PSK'}                               = $confighash{$cgiparams{'KEY'}}[5];
-               $cgiparams{'SIDE'}                              = $confighash{$cgiparams{'KEY'}}[6];
-               $cgiparams{'LOCAL_SUBNET'}              = $confighash{$cgiparams{'KEY'}}[8];
-               $cgiparams{'REMOTE'}                    = $confighash{$cgiparams{'KEY'}}[10];
+               $cgiparams{'ENABLED'}           = $confighash{$cgiparams{'KEY'}}[0];
+               $cgiparams{'NAME'}              = $confighash{$cgiparams{'KEY'}}[1];
+               $cgiparams{'TYPE'}              = $confighash{$cgiparams{'KEY'}}[3];
+               $cgiparams{'AUTH'}              = $confighash{$cgiparams{'KEY'}}[4];
+               $cgiparams{'PSK'}               = $confighash{$cgiparams{'KEY'}}[5];
+               $cgiparams{'SIDE'}              = $confighash{$cgiparams{'KEY'}}[6];
+               $cgiparams{'LOCAL_SUBNET'}      = $confighash{$cgiparams{'KEY'}}[8];
+               $cgiparams{'REMOTE'}            = $confighash{$cgiparams{'KEY'}}[10];
                $cgiparams{'REMOTE_SUBNET'}     = $confighash{$cgiparams{'KEY'}}[11];
-               $cgiparams{'OVPN_MGMT'}                 = $confighash{$cgiparams{'KEY'}}[22];
-               $cgiparams{'MSSFIX'}                    = $confighash{$cgiparams{'KEY'}}[23];
-               $cgiparams{'FRAGMENT'}                  = $confighash{$cgiparams{'KEY'}}[24];
-               $cgiparams{'REMARK'}                    = $confighash{$cgiparams{'KEY'}}[25];
-               $cgiparams{'INTERFACE'}                 = $confighash{$cgiparams{'KEY'}}[26];
-               $cgiparams{'OVPN_SUBNET'}               = $confighash{$cgiparams{'KEY'}}[27];
-               $cgiparams{'PROTOCOL'}                  = $confighash{$cgiparams{'KEY'}}[28];
-               $cgiparams{'DEST_PORT'}                 = $confighash{$cgiparams{'KEY'}}[29];
-               $cgiparams{'COMPLZO'}                   = $confighash{$cgiparams{'KEY'}}[30];
-               $cgiparams{'MTU'}                               = $confighash{$cgiparams{'KEY'}}[31];
-               $cgiparams{'CHECK1'}                    = $confighash{$cgiparams{'KEY'}}[32];
+               $cgiparams{'OVPN_MGMT'}         = $confighash{$cgiparams{'KEY'}}[22];
+               $cgiparams{'MSSFIX'}            = $confighash{$cgiparams{'KEY'}}[23];
+               $cgiparams{'FRAGMENT'}          = $confighash{$cgiparams{'KEY'}}[24];
+               $cgiparams{'REMARK'}            = $confighash{$cgiparams{'KEY'}}[25];
+               $cgiparams{'INTERFACE'}         = $confighash{$cgiparams{'KEY'}}[26];
+               $cgiparams{'OVPN_SUBNET'}       = $confighash{$cgiparams{'KEY'}}[27];
+               $cgiparams{'PROTOCOL'}          = $confighash{$cgiparams{'KEY'}}[28];
+               $cgiparams{'DEST_PORT'}         = $confighash{$cgiparams{'KEY'}}[29];
+               $cgiparams{'COMPLZO'}           = $confighash{$cgiparams{'KEY'}}[30];
+               $cgiparams{'MTU'}               = $confighash{$cgiparams{'KEY'}}[31];
+               $cgiparams{'CHECK1'}            = $confighash{$cgiparams{'KEY'}}[32];
                $name=$cgiparams{'CHECK1'}      ;
-               $cgiparams{$name}                               = $confighash{$cgiparams{'KEY'}}[33];
-               $cgiparams{'RG'}                                = $confighash{$cgiparams{'KEY'}}[34];
-               $cgiparams{'CCD_DNS1'}                  = $confighash{$cgiparams{'KEY'}}[35];
-               $cgiparams{'CCD_DNS2'}                  = $confighash{$cgiparams{'KEY'}}[36];
-               $cgiparams{'CCD_WINS'}                  = $confighash{$cgiparams{'KEY'}}[37];
+               $cgiparams{$name}               = $confighash{$cgiparams{'KEY'}}[33];
+               $cgiparams{'RG'}                = $confighash{$cgiparams{'KEY'}}[34];
+               $cgiparams{'CCD_DNS1'}          = $confighash{$cgiparams{'KEY'}}[35];
+               $cgiparams{'CCD_DNS2'}          = $confighash{$cgiparams{'KEY'}}[36];
+               $cgiparams{'CCD_WINS'}          = $confighash{$cgiparams{'KEY'}}[37];
                $cgiparams{'PMTU_DISCOVERY'}    = $confighash{$cgiparams{'KEY'}}[38];
+               $cgiparams{'DAUTH'}             = $confighash{$cgiparams{'KEY'}}[39];
+               $cgiparams{'DCIPHER'}           = $confighash{$cgiparams{'KEY'}}[40];
+               $cgiparams{'TLSAUTH'}           = $confighash{$cgiparams{'KEY'}}[41];
        } elsif ($cgiparams{'ACTION'} eq $Lang::tr{'save'}) {
        $cgiparams{'REMARK'} = &Header::cleanhtml($cgiparams{'REMARK'});
        
@@ -3500,7 +3722,7 @@ if ($cgiparams{'TYPE'} eq 'net') {
                  goto VPNCONF_ERROR;
                }
 
-       if ($cgiparams{'OVPN_MGMT'} eq  '') {
+       if ($cgiparams{'OVPN_MGMT'} eq '') {
                $cgiparams{'OVPN_MGMT'} = $cgiparams{'DEST_PORT'};              
                }
        
@@ -3727,6 +3949,8 @@ if ($cgiparams{'TYPE'} eq 'net') {
            }
            if ($cgiparams{'CERT_NAME'} !~ /^[a-zA-Z0-9 ,\.\-_]+$/) {
                $errormessage = $Lang::tr{'invalid input for name'};
+               unlink ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Removing Configfile fail: $!";
+               rmdir ("${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}") || die "Removing Directory fail: $!";
                goto VPNCONF_ERROR;
            }
            if ($cgiparams{'CERT_EMAIL'} ne '' && (! &General::validemail($cgiparams{'CERT_EMAIL'}))) {
@@ -3799,7 +4023,7 @@ if ($cgiparams{'TYPE'} eq 'net') {
                }
            } else {    # child
                unless (exec ('/usr/bin/openssl', 'req', '-nodes', '-rand', '/proc/interrupts:/proc/net/rt_cache',
-                       '-newkey', 'rsa:1024',
+                       '-newkey', 'rsa:2048',
                        '-keyout', "${General::swroot}/ovpn/certs/$cgiparams{'NAME'}key.pem",
                        '-out', "${General::swroot}/ovpn/certs/$cgiparams{'NAME'}req.pem",
                        '-config',"${General::swroot}/ovpn/openssl/ovpn.cnf")) {
@@ -3868,7 +4092,7 @@ if ($cgiparams{'TYPE'} eq 'net') {
        
        if (! $key) {
            $key = &General::findhasharraykey (\%confighash);
-           foreach my $i (0 .. 38) { $confighash{$key}[$i] = "";}
+           foreach my $i (0 .. 43) { $confighash{$key}[$i] = "";}
        }
        $confighash{$key}[0]            = $cgiparams{'ENABLED'};
        $confighash{$key}[1]            = $cgiparams{'NAME'};
@@ -3887,13 +4111,13 @@ if ($cgiparams{'TYPE'} eq 'net') {
            $confighash{$key}[6]        = $cgiparams{'SIDE'};
            $confighash{$key}[11]       = $cgiparams{'REMOTE_SUBNET'};
        }
-       $confighash{$key}[8]                    = $cgiparams{'LOCAL_SUBNET'};
+       $confighash{$key}[8]            = $cgiparams{'LOCAL_SUBNET'};
        $confighash{$key}[10]           = $cgiparams{'REMOTE'};
-  if ($cgiparams{'OVPN_MGMT'} eq '') {
+       if ($cgiparams{'OVPN_MGMT'} eq '') {
        $confighash{$key}[22]           = $confighash{$key}[29];
-  } else {
+       } else {
        $confighash{$key}[22]           = $cgiparams{'OVPN_MGMT'};
-  }
+       }
        $confighash{$key}[23]           = $cgiparams{'MSSFIX'};
        $confighash{$key}[24]           = $cgiparams{'FRAGMENT'};
        $confighash{$key}[25]           = $cgiparams{'REMARK'};
@@ -3911,8 +4135,9 @@ if ($cgiparams{'TYPE'} eq 'net') {
        $confighash{$key}[35]           = $cgiparams{'CCD_DNS1'};
        $confighash{$key}[36]           = $cgiparams{'CCD_DNS2'};
        $confighash{$key}[37]           = $cgiparams{'CCD_WINS'};
-       $confighash{$key}[38]                   = $cgiparams{'PMTU_DISCOVERY'};
-
+       $confighash{$key}[38]           = $cgiparams{'PMTU_DISCOVERY'};
+       $confighash{$key}[39]           = $cgiparams{'DAUTH'};
+       $confighash{$key}[40]           = $cgiparams{'DCIPHER'};
 
        &General::writehasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
        
@@ -4023,10 +4248,11 @@ if ($cgiparams{'TYPE'} eq 'net') {
         $cgiparams{'MSSFIX'} = 'on';
         $cgiparams{'FRAGMENT'} = '1300';
        $cgiparams{'PMTU_DISCOVERY'} = 'off';
+       $cgiparams{'DAUTH'} = 'SHA1';
 ###
 # m.a.d n2n end
 ###    
-       $cgiparams{'SIDE'} = 'left';
+        $cgiparams{'SIDE'} = 'left';
        if ( ! -f "${General::swroot}/ovpn/ca/cakey.pem" ) {
            $cgiparams{'AUTH'} = 'psk';
        } elsif ( ! -f "${General::swroot}/ovpn/ca/cacert.pem") {
@@ -4087,10 +4313,40 @@ if ($cgiparams{'TYPE'} eq 'net') {
     }
     $checked{'PMTU_DISCOVERY'}{$cgiparams{'PMTU_DISCOVERY'}} = 'checked=\'checked\'';
 
+    $selected{'DCIPHER'}{'CAMELLIA-256-CBC'} = '';
+    $selected{'DCIPHER'}{'CAMELLIA-192-CBC'} = '';
+    $selected{'DCIPHER'}{'CAMELLIA-128-CBC'} = '';
+    $selected{'DCIPHER'}{'AES-256-CBC'} = '';
+    $selected{'DCIPHER'}{'AES-192-CBC'} = '';
+    $selected{'DCIPHER'}{'AES-128-CBC'} = '';
+    $selected{'DCIPHER'}{'DESX-CBC'} = '';
+    $selected{'DCIPHER'}{'SEED-CBC'} = '';
+    $selected{'DCIPHER'}{'DES-EDE3-CBC'} = '';
+    $selected{'DCIPHER'}{'DES-EDE-CBC'} = '';
+    $selected{'DCIPHER'}{'CAST5-CBC'} = '';
+    $selected{'DCIPHER'}{'BF-CBC'} = '';
+    $selected{'DCIPHER'}{'DES-CBC'} = '';
+    # If no cipher has been chossen yet, select
+    # the old default (AES-256-CBC) for compatiblity reasons.
+    if ($cgiparams{'DCIPHER'} eq '') {
+       $cgiparams{'DCIPHER'} = 'AES-256-CBC';
+    }
+    $selected{'DCIPHER'}{$cgiparams{'DCIPHER'}} = 'SELECTED';
+    $selected{'DAUTH'}{'whirlpool'} = '';
+    $selected{'DAUTH'}{'SHA512'} = '';
+    $selected{'DAUTH'}{'SHA384'} = '';
+    $selected{'DAUTH'}{'SHA256'} = '';
+    $selected{'DAUTH'}{'SHA1'} = '';
+    # If no hash algorythm has been choosen yet, select
+    # the old default value (SHA1) for compatiblity reasons.
+    if ($cgiparams{'DAUTH'} eq '') {
+       $cgiparams{'DAUTH'} = 'SHA1';
+    }
+    $selected{'DAUTH'}{$cgiparams{'DAUTH'}} = 'SELECTED';
 
     if (1) {
        &Header::showhttpheaders();
-       &Header::openpage($Lang::tr{'vpn configuration main'}, 1, '');
+       &Header::openpage($Lang::tr{'ovpn'}, 1, '');
        &Header::openbigbox('100%', 'LEFT', '', $errormessage);
        if ($errormessage) {
            &Header::openbox('100%', 'LEFT', $Lang::tr{'error messages'});
@@ -4116,28 +4372,25 @@ if ($cgiparams{'TYPE'} eq 'net') {
 
        &Header::openbox('100%', 'LEFT', "$Lang::tr{'connection'}:");
        print "<table width='100%'  border='0'>\n";
-       
-       
-       
+
        print "<tr><td width='14%' class='boldbase'>$Lang::tr{'name'}: </td>";
        
        if ($cgiparams{'TYPE'} eq 'host') {
            if ($cgiparams{'KEY'}) {
                print "<td width='35%' class='base'><input type='hidden' name='NAME' value='$cgiparams{'NAME'}' />$cgiparams{'NAME'}</td>";
            } else {
-                       
                print "<td width='35%'><input type='text' name='NAME' value='$cgiparams{'NAME'}' maxlength='20' size='30' /></td>";
            }
 #          print "<tr><td>$Lang::tr{'interface'}</td>";
 #          print "<td><select name='INTERFACE'>";
 #          print "<option value='RED' $selected{'INTERFACE'}{'RED'}>RED</option>";
-#          if ($netsettings{'BLUE_DEV'} ne '') {
-#              print "<option value='BLUE' $selected{'INTERFACE'}{'BLUE'}>BLUE</option>";
-#          }
-#          print "<option value='GREEN' $selected{'INTERFACE'}{'GREEN'}>GREEN</option>";
-#          print "<option value='ORANGE' $selected{'INTERFACE'}{'ORANGE'}>ORANGE</option>";
-#          print "</select></td></tr>";
-#          print <<END
+#              if ($netsettings{'BLUE_DEV'} ne '') {
+#                      print "<option value='BLUE' $selected{'INTERFACE'}{'BLUE'}>BLUE</option>";
+#              }
+#              print "<option value='GREEN' $selected{'INTERFACE'}{'GREEN'}>GREEN</option>";
+#              print "<option value='ORANGE' $selected{'INTERFACE'}{'ORANGE'}>ORANGE</option>";
+#              print "</select></td></tr>";
+#              print <<END;
        } else {
            print "<input type='hidden' name='INTERFACE' value='red' />";
            if ($cgiparams{'KEY'}) {
@@ -4145,51 +4398,70 @@ if ($cgiparams{'TYPE'} eq 'net') {
            } else {
                print "<td width='25%'><input type='text' name='NAME' value='$cgiparams{'NAME'}' maxlength='20' /></td>";
            }
-           
-           
-           
-           print <<END
+           print <<END;
                    <td width='25%'>&nbsp;</td>
-                   <td width='25%'>&nbsp;</td></tr>
-               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'Act as'}</td>
-                   <td><select name='SIDE'><option value='server' $selected{'SIDE'}{'server'}>$Lang::tr{'openvpn server'}</option>
-                                           <option value='client' $selected{'SIDE'}{'client'}>$Lang::tr{'openvpn client'}</option></select></td>
-                   <td class='boldbase'>$Lang::tr{'remote host/ip'}:</td>
-                   <td><input type='TEXT' name='REMOTE' value='$cgiparams{'REMOTE'}' /></td></tr>
-               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'local subnet'}</td>
-                   <td><input type='TEXT' name='LOCAL_SUBNET' value='$cgiparams{'LOCAL_SUBNET'}' /></td>
-                   <td class='boldbase' nowrap='nowrap'>$Lang::tr{'remote subnet'}</td>
-                   <td><input type='text' name='REMOTE_SUBNET' value='$cgiparams{'REMOTE_SUBNET'}' /></td></tr>
-               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn subnet'}</td>
-                   <td><input type='TEXT' name='OVPN_SUBNET' value='$cgiparams{'OVPN_SUBNET'}' /></td></tr>
-               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'protocol'}</td>
-                
-     <td><select name='PROTOCOL'><option value='udp' $selected{'PROTOCOL'}{'udp'}>UDP</option>
-                                               <option value='tcp' $selected{'PROTOCOL'}{'tcp'}>TCP</option></select></td>   
-                   
-        <td class='boldbase'>$Lang::tr{'destination port'}:</td>
-                   <td><input type='TEXT' name='DEST_PORT' value='$cgiparams{'DEST_PORT'}' size='5' /></td></tr>
-               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'comp-lzo'} &nbsp;<img src='/blob.gif'</td>
-                   <td><input type='checkbox' name='COMPLZO' $checked{'COMPLZO'}{'on'} /></td>
-                   
-                     <tr><td class='boldbase' nowrap='nowrap'>mssfix &nbsp;<img src='/blob.gif' /></td>
-                   <td><input type='checkbox' name='MSSFIX' $checked{'MSSFIX'}{'on'} /></td>
-        <td>$Lang::tr{'openvpn default'}: <span class="base">on</span></td>
-        
-          <tr><td class='boldbase' nowrap='nowrap'>fragment &nbsp;<img src='/blob.gif' /></td>
-                   <td><input type='TEXT' name='FRAGMENT' VALUE='$cgiparams{'FRAGMENT'}'size='5' /></td>
-                   <td>$Lang::tr{'openvpn default'}: <span class="base">1300</span></td>
-                   
-               <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'MTU'}&nbsp;<img src='/blob.gif' /></td>
-                   <td> <input type='TEXT' name='MTU' VALUE='$cgiparams{'MTU'}'size='5' /></td>
-        <td colspan='2'>$Lang::tr{'openvpn default'}: udp/tcp <span class="base">1500/1400</span></td>
-        
-        <tr><td class='boldbase' nowrap='nowrap'>Management Port&nbsp;<img src='/blob.gif' /></td>
-                   <td> <input type='TEXT' name='OVPN_MGMT' VALUE='$cgiparams{'OVPN_MGMT'}'size='5' /></td>
-        <td colspan='2'>$Lang::tr{'openvpn default'}: <span class="base">$Lang::tr{'destination port'}</span></td>
+                   <td width='25%'>&nbsp;</td></tr>    
+       <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'Act as'}</td>
+               <td><select name='SIDE'>
+                               <option value='server' $selected{'SIDE'}{'server'}>$Lang::tr{'openvpn server'}</option>
+                               <option value='client' $selected{'SIDE'}{'client'}>$Lang::tr{'openvpn client'}</option>
+                       </select>
+               </td>
+
+               <td class='boldbase'>$Lang::tr{'remote host/ip'}:</td>
+               <td><input type='TEXT' name='REMOTE' value='$cgiparams{'REMOTE'}' /></td>
+       </tr>
+
+       <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'local subnet'}</td>
+               <td><input type='TEXT' name='LOCAL_SUBNET' value='$cgiparams{'LOCAL_SUBNET'}' /></td>
+
+               <td class='boldbase' nowrap='nowrap'>$Lang::tr{'remote subnet'}</td>
+               <td><input type='text' name='REMOTE_SUBNET' value='$cgiparams{'REMOTE_SUBNET'}' /></td>
+       </tr>
+
+       <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn subnet'}</td>
+               <td><input type='TEXT' name='OVPN_SUBNET' value='$cgiparams{'OVPN_SUBNET'}' /></td>
 
+               <td class='boldbase' nowrap='nowrap'>$Lang::tr{'protocol'}</td>
+               <td><select name='PROTOCOL'>
+                       <option value='udp' $selected{'PROTOCOL'}{'udp'}>UDP</option>
+                       <option value='tcp' $selected{'PROTOCOL'}{'tcp'}>TCP</option></select></td>
+       </tr>
+       
+       <tr>
+               <td class='boldbase'>$Lang::tr{'destination port'}:</td>
+               <td><input type='TEXT' name='DEST_PORT' value='$cgiparams{'DEST_PORT'}' size='5' /></td>
+
+               <td class='boldbase' nowrap='nowrap'>Management Port ($Lang::tr{'openvpn default'}: <span class="base">$Lang::tr{'destination port'}): &nbsp;<img src='/blob.gif' /></td>
+               <td> <input type='TEXT' name='OVPN_MGMT' VALUE='$cgiparams{'OVPN_MGMT'}'size='5' /></td>
+       </tr>
+
+       <tr><td colspan=4><hr /></td></tr><tr>
+       
        <tr>
-               <td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn mtu-disc'}</td>
+               <td class'base'><b>$Lang::tr{'MTU settings'}</b></td>
+       </tr>
+
+        <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'MTU'}&nbsp;<img src='/blob.gif' /></td>
+               <td><input type='TEXT' name='MTU' VALUE='$cgiparams{'MTU'}'size='5' /></td>
+               <td colspan='2'>$Lang::tr{'openvpn default'}: udp/tcp <span class="base">1500/1400</span></td>
+       </tr>
+
+       <tr><td class='boldbase' nowrap='nowrap'>fragment &nbsp;<img src='/blob.gif' /></td>
+               <td><input type='TEXT' name='FRAGMENT' VALUE='$cgiparams{'FRAGMENT'}'size='5' /></td>
+               <td>$Lang::tr{'openvpn default'}: <span class="base">1300</span></td>
+       </tr>
+
+       <tr><td class='boldbase' nowrap='nowrap'>mssfix &nbsp;<img src='/blob.gif' /></td>
+               <td><input type='checkbox' name='MSSFIX' $checked{'MSSFIX'}{'on'} /></td>
+               <td>$Lang::tr{'openvpn default'}: <span class="base">on</span></td>
+       </tr>
+
+        <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'comp-lzo'} &nbsp;<img src='/blob.gif'</td>
+               <td><input type='checkbox' name='COMPLZO' $checked{'COMPLZO'}{'on'} /></td>
+       </tr>
+
+       <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn mtu-disc'}</td>
                <td colspan='3'>
                        <input type='radio' name='PMTU_DISCOVERY' value='yes' $checked{'PMTU_DISCOVERY'}{'yes'} /> $Lang::tr{'ovpn mtu-disc yes'}
                        <input type='radio' name='PMTU_DISCOVERY' value='maybe' $checked{'PMTU_DISCOVERY'}{'maybe'} /> $Lang::tr{'ovpn mtu-disc maybe'}
@@ -4198,6 +4470,40 @@ if ($cgiparams{'TYPE'} eq 'net') {
                </td>
        </tr>
 
+<tr><td colspan=4><hr /></td></tr><tr>
+       <tr>
+               <td class'base'><b>$Lang::tr{'ovpn crypt options'}:</b></td>
+       </tr>
+
+       <tr><td class='boldbase'>$Lang::tr{'cipher'}</td>
+               <td><select name='DCIPHER'>
+                               <option value='CAMELLIA-256-CBC'        $selected{'DCIPHER'}{'CAMELLIA-256-CBC'}>CAMELLIA-CBC (256 $Lang::tr{'bit'})</option>
+                               <option value='CAMELLIA-192-CBC'        $selected{'DCIPHER'}{'CAMELLIA-192-CBC'}>CAMELLIA-CBC (192 $Lang::tr{'bit'})</option>
+                               <option value='CAMELLIA-128-CBC'        $selected{'DCIPHER'}{'CAMELLIA-128-CBC'}>CAMELLIA-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='AES-256-CBC'             $selected{'DCIPHER'}{'AES-256-CBC'}>AES-CBC (256 $Lang::tr{'bit'}, $Lang::tr{'default'})</option>
+                               <option value='AES-192-CBC'             $selected{'DCIPHER'}{'AES-192-CBC'}>AES-CBC (192 $Lang::tr{'bit'})</option>
+                               <option value='AES-128-CBC'             $selected{'DCIPHER'}{'AES-128-CBC'}>AES-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='DES-EDE3-CBC'            $selected{'DCIPHER'}{'DES-EDE3-CBC'}>DES-EDE3-CBC (192 $Lang::tr{'bit'})</option>
+                               <option value='DESX-CBC'                $selected{'DCIPHER'}{'DESX-CBC'}>DESX-CBC (192 $Lang::tr{'bit'})</option>
+                               <option value='SEED-CBC'                $selected{'DCIPHER'}{'SEED-CBC'}>SEED-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='DES-EDE-CBC'             $selected{'DCIPHER'}{'DES-EDE-CBC'}>DES-EDE-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='BF-CBC'                  $selected{'DCIPHER'}{'BF-CBC'}>BF-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='CAST5-CBC'               $selected{'DCIPHER'}{'CAST5-CBC'}>CAST5-CBC (128 $Lang::tr{'bit'})</option>
+                       </select>
+               </td>
+
+               <td class='boldbase'>$Lang::tr{'ovpn ha'}:</td>
+               <td><select name='DAUTH'>
+                               <option value='whirlpool'               $selected{'DAUTH'}{'whirlpool'}>Whirlpool (512 $Lang::tr{'bit'})</option>
+                               <option value='SHA512'                  $selected{'DAUTH'}{'SHA512'}>SHA2 (512 $Lang::tr{'bit'})</option>
+                               <option value='SHA384'                  $selected{'DAUTH'}{'SHA384'}>SHA2 (384 $Lang::tr{'bit'})</option>
+                               <option value='SHA256'                  $selected{'DAUTH'}{'SHA256'}>SHA2 (256 $Lang::tr{'bit'})</option>
+                               <option value='SHA1'                    $selected{'DAUTH'}{'SHA1'}>SHA1 (160 $Lang::tr{'bit'} Default)</option>
+                       </select>
+               </td>
+       </tr>
+       <tr><td colspan=4><hr /></td></tr><tr>
+
 END
 ;
        }
@@ -4260,7 +4566,7 @@ if ($cgiparams{'TYPE'} eq 'host') {
  
  if ($cgiparams{'TYPE'} eq 'host') {
 
-print <<END
+       print <<END;
            <table width='100%' cellpadding='0' cellspacing='5' border='0'>
            
            <tr><td><input type='radio' name='AUTH' value='certreq' $checked{'AUTH'}{'certreq'} $cakeydisabled /></td><td class='base'>$Lang::tr{'upload a certificate request'}</td><td class='base' rowspan='2'><input type='file' name='FH' size='30' $cacrtdisabled></td></tr>
@@ -4285,7 +4591,7 @@ END
 
 } else {
 
-print <<END
+       print <<END;
            <table width='100%' cellpadding='0' cellspacing='5' border='0'>
       
            <tr><td><input type='radio' name='AUTH' value='certgen' $checked{'AUTH'}{'certgen'} $cakeydisabled /></td><td class='base'>$Lang::tr{'generate a certificate'}</td><td>&nbsp;</td></tr>
@@ -4319,7 +4625,7 @@ END
 ###
 
 if ($cgiparams{'TYPE'} eq 'host') {
-           print <<END
+       print <<END;
            </select></td></tr>
 
        <td>&nbsp;</td><td class='base'>$Lang::tr{'valid till'} (days):</td>
@@ -4335,7 +4641,7 @@ if ($cgiparams{'TYPE'} eq 'host') {
      </table>
 END
 }else{
-           print <<END
+       print <<END;
            </select></td></tr>
    <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
         <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
@@ -4463,7 +4769,7 @@ END
        if (&haveOrangeNet() && $selorange == '1'){ print"<option selected>$Lang::tr{'orange'}</option>";$selorange=0;}elsif(&haveOrangeNet() && $selorange == '0'){print"<option>$Lang::tr{'orange'}</option>";}                       
        if ($selgreen == '1' || $other == '0'){ print"<option selected>$Lang::tr{'green'}</option>";$set=0;}else{print"<option>$Lang::tr{'green'}</option>";};
        
-       print<<END
+       print<<END;
        </select></td><td valign='top'>DNS1:</td><td valign='top'><input type='TEXT' name='CCD_DNS1' value='$cgiparams{'CCD_DNS1'}' size='30' /></td></tr>
        <tr valign='top'><td>DNS2:</td><td><input type='TEXT' name='CCD_DNS2' value='$cgiparams{'CCD_DNS2'}' size='30' /></td></tr>
        <tr valign='top'><td valign='top'>WINS:</td><td><input type='TEXT' name='CCD_WINS' value='$cgiparams{'CCD_WINS'}' size='30' /></td></tr></table><br><hr>
@@ -4511,18 +4817,24 @@ END
     
 #default setzen
     if ($cgiparams{'DCIPHER'} eq '') {
-       $cgiparams{'DCIPHER'} =  'AES-256-CBC';
+               $cgiparams{'DCIPHER'} =  'AES-256-CBC';
     }
     if ($cgiparams{'DDEST_PORT'} eq '') {
-       $cgiparams{'DDEST_PORT'} =  '1194';     
+               $cgiparams{'DDEST_PORT'} =  '1194';
     }
     if ($cgiparams{'DMTU'} eq '') {
-       $cgiparams{'DMTU'} =  '1400';     
+               $cgiparams{'DMTU'} =  '1400';
+    }
+    if ($cgiparams{'MSSFIX'} eq '') {
+               $cgiparams{'MSSFIX'} = 'off';
+    }
+       if ($cgiparams{'DAUTH'} eq '') {
+               $cgiparams{'DAUTH'} = 'SHA1';
     }
     if ($cgiparams{'DOVPN_SUBNET'} eq '') {
-       $cgiparams{'DOVPN_SUBNET'} = '10.' . int(rand(256)) . '.' . int(rand(256)) . '.0/255.255.255.0';
+               $cgiparams{'DOVPN_SUBNET'} = '10.' . int(rand(256)) . '.' . int(rand(256)) . '.0/255.255.255.0';
     }
-       $checked{'ENABLED'}{'off'} = '';
+    $checked{'ENABLED'}{'off'} = '';
     $checked{'ENABLED'}{'on'} = '';
     $checked{'ENABLED'}{$cgiparams{'ENABLED'}} = 'CHECKED';
     $checked{'ENABLED_BLUE'}{'off'} = '';
@@ -4538,26 +4850,33 @@ END
     $selected{'DPROTOCOL'}{'udp'} = '';
     $selected{'DPROTOCOL'}{'tcp'} = '';
     $selected{'DPROTOCOL'}{$cgiparams{'DPROTOCOL'}} = 'SELECTED';
-    
-    $selected{'DCIPHER'}{'DES-CBC'} = '';
-    $selected{'DCIPHER'}{'DES-EDE-CBC'} = '';
+
+    $selected{'DCIPHER'}{'CAMELLIA-256-CBC'} = '';
+    $selected{'DCIPHER'}{'CAMELLIA-192-CBC'} = '';
+    $selected{'DCIPHER'}{'CAMELLIA-128-CBC'} = '';
+    $selected{'DCIPHER'}{'AES-256-CBC'} = '';
+    $selected{'DCIPHER'}{'AES-192-CBC'} = '';
+    $selected{'DCIPHER'}{'AES-128-CBC'} = '';
     $selected{'DCIPHER'}{'DES-EDE3-CBC'} = '';
     $selected{'DCIPHER'}{'DESX-CBC'} = '';
-    $selected{'DCIPHER'}{'RC2-CBC'} = '';
-    $selected{'DCIPHER'}{'RC2-40-CBC'} = '';
-    $selected{'DCIPHER'}{'RC2-64-CBC'} = '';
+    $selected{'DCIPHER'}{'SEED-CBC'} = '';
+    $selected{'DCIPHER'}{'DES-EDE-CBC'} = '';
+    $selected{'DCIPHER'}{'CAST5-CBC'} = '';
     $selected{'DCIPHER'}{'BF-CBC'} = '';
-    $selected{'DCIPHER'}{'CAST5-CBC'} = '';    
-    $selected{'DCIPHER'}{'AES-128-CBC'} = '';
-    $selected{'DCIPHER'}{'AES-192-CBC'} = '';
-    $selected{'DCIPHER'}{'AES-256-CBC'} = '';
-    $selected{'DCIPHER'}{'CAMELLIA-128-CBC'} = '';
-    $selected{'DCIPHER'}{'CAMELLIA-192-CBC'} = '';
-    $selected{'DCIPHER'}{'CAMELLIA-256-CBC'} = '';
+    $selected{'DCIPHER'}{'DES-CBC'} = '';
     $selected{'DCIPHER'}{$cgiparams{'DCIPHER'}} = 'SELECTED';
+
+    $selected{'DAUTH'}{'whirlpool'} = '';
+    $selected{'DAUTH'}{'SHA512'} = '';
+    $selected{'DAUTH'}{'SHA384'} = '';
+    $selected{'DAUTH'}{'SHA256'} = '';
+    $selected{'DAUTH'}{'SHA1'} = '';
+    $selected{'DAUTH'}{$cgiparams{'DAUTH'}} = 'SELECTED';
+
     $checked{'DCOMPLZO'}{'off'} = '';
     $checked{'DCOMPLZO'}{'on'} = '';
     $checked{'DCOMPLZO'}{$cgiparams{'DCOMPLZO'}} = 'CHECKED';
+
 # m.a.d
     $checked{'MSSFIX'}{'off'} = '';
     $checked{'MSSFIX'}{'on'} = '';
@@ -4595,7 +4914,7 @@ END
        $activeonrun = "disabled='disabled'";
     }  
     &Header::openbox('100%', 'LEFT', $Lang::tr{'global settings'});    
-       print <<END     
+       print <<END;
     <table width='100%' border='0'>
     <form method='post'>
     <td width='25%'>&nbsp;</td>
@@ -4615,7 +4934,7 @@ END
        print "<tr><td class='boldbase'>$Lang::tr{'ovpn on orange'}</td>";
        print "<td><input type='checkbox' name='ENABLED_ORANGE' $checked{'ENABLED_ORANGE'}{'on'} /></td>";
     }  
-    print <<END        
+    print <<END;
     <tr><td class='base' nowrap='nowrap' colspan='2'>$Lang::tr{'local vpn hostname/ip'}:<br /><input type='text' name='VPN_IP' value='$cgiparams{'VPN_IP'}' size='30' /></td>
        <td class='boldbase' nowrap='nowrap' colspan='2'>$Lang::tr{'ovpn subnet'}<br /><input type='TEXT' name='DOVPN_SUBNET' value='$cgiparams{'DOVPN_SUBNET'}' size='30' /></td></tr>
     <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'ovpn device'}</td>
@@ -4628,27 +4947,27 @@ END
         <td class='boldbase'>$Lang::tr{'destination port'}:</td>
         <td><input type='TEXT' name='DDEST_PORT' value='$cgiparams{'DDEST_PORT'}' size='5' /></td></tr>
     <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'MTU'}&nbsp;</td>
-        <td> <input type='TEXT' name='DMTU' VALUE='$cgiparams{'DMTU'}'size='5' /></td>
+        <td> <input type='TEXT' name='DMTU' VALUE='$cgiparams{'DMTU'}' size='5' /></td>
+
+               <td class='boldbase' nowrap='nowrap'>$Lang::tr{'cipher'}</td>
+               <td><select name='DCIPHER'>
+                               <option value='CAMELLIA-256-CBC' $selected{'DCIPHER'}{'CAMELLIA-256-CBC'}>CAMELLIA-CBC (256 $Lang::tr{'bit'})</option>
+                               <option value='CAMELLIA-192-CBC' $selected{'DCIPHER'}{'CAMELLIA-192-CBC'}>CAMELLIA-CBC (192 $Lang::tr{'bit'})</option>
+                               <option value='CAMELLIA-128-CBC' $selected{'DCIPHER'}{'CAMELLIA-128-CBC'}>CAMELLIA-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='AES-256-CBC' $selected{'DCIPHER'}{'AES-256-CBC'}>AES-CBC (256 $Lang::tr{'bit'})</option>
+                               <option value='AES-192-CBC' $selected{'DCIPHER'}{'AES-192-CBC'}>AES-CBC (192 $Lang::tr{'bit'})</option>
+                               <option value='AES-128-CBC' $selected{'DCIPHER'}{'AES-128-CBC'}>AES-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='DES-EDE3-CBC' $selected{'DCIPHER'}{'DES-EDE3-CBC'}>DES-EDE3-CBC (192 $Lang::tr{'bit'})</option>
+                               <option value='DESX-CBC' $selected{'DCIPHER'}{'DESX-CBC'}>DESX-CBC (192 $Lang::tr{'bit'})</option>
+                               <option value='SEED-CBC' $selected{'DCIPHER'}{'SEED-CBC'}>SEED-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='DES-EDE-CBC' $selected{'DCIPHER'}{'DES-EDE-CBC'}>DES-EDE-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='BF-CBC' $selected{'DCIPHER'}{'BF-CBC'}>BF-CBC (128 $Lang::tr{'bit'})</option>
+                               <option value='CAST5-CBC' $selected{'DCIPHER'}{'CAST5-CBC'}>CAST5-CBC (128 $Lang::tr{'bit'})</option>
+                       </select>
+               </td>
     <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'comp-lzo'}</td>
         <td><input type='checkbox' name='DCOMPLZO' $checked{'DCOMPLZO'}{'on'} /></td>
-        <td class='boldbase' nowrap='nowrap'>$Lang::tr{'cipher'}</td>
-        <td><select name='DCIPHER'>
-               <option value='CAMELLIA-256-CBC' $selected{'DCIPHER'}{'CAMELLIA-256-CBC'}>CAMELLIA-256-CBC</option>
-               <option value='CAMELLIA-192-CBC' $selected{'DCIPHER'}{'CAMELLIA-192-CBC'}>CAMELLIA-192-CBC</option>
-               <option value='CAMELLIA-128-CBC' $selected{'DCIPHER'}{'CAMELLIA-128-CBC'}>CAMELLIA-128-CBC</option>
-               <option value='AES-256-CBC' $selected{'DCIPHER'}{'AES-256-CBC'}>AES-256-CBC</option>
-               <option value='AES-192-CBC' $selected{'DCIPHER'}{'AES-192-CBC'}>AES-192-CBC</option>
-               <option value='AES-128-CBC' $selected{'DCIPHER'}{'AES-128-CBC'}>AES-128-CBC</option>
-               <option value='CAST5-CBC' $selected{'DCIPHER'}{'CAST5-CBC'}>CAST5-CBC</option>
-               <option value='RC2-64-CBC' $selected{'DCIPHER'}{'RC2-64-CBC'}>RC2-64-CBC</option>
-               <option value='RC2-40-CBC' $selected{'DCIPHER'}{'RC2-40-CBC'}>RC2-40-CBC</option>
-               <option value='RC2-CBC' $selected{'DCIPHER'}{'RC2-CBC'}>RC2-CBC</option>
-               <option value='BF-CBC' $selected{'DCIPHER'}{'BF-CBC'}>BF-CBC</option>
-               <option value='DES-CBC' $selected{'DCIPHER'}{'DES-CBC'}>DES-CBC</option>
-               <option value='DES-EDE-CBC' $selected{'DCIPHER'}{'DES-EDE-CBC'}>DES-EDE-CBC</option>
-               <option value='DES-EDE3-CBC' $selected{'DCIPHER'}{'DES-EDE3-CBC'}>DES-EDE3-CBC</option>
-               <option value='DESX-CBC' $selected{'DCIPHER'}{'DESX-CBC'}>DESX-CBC</option>
-       </select></td></tr>
+       </tr>
     <tr><td colspan='4'><br><br></td></tr>
 END
 ;                                 
@@ -4676,163 +4995,15 @@ END
     }
     print "</form></table>";
     &Header::closebox();
-    &Header::openbox('100%', 'LEFT', "$Lang::tr{'certificate authorities'}");
-    print <<EOF#'
-    <table width='100%' cellspacing='1' cellpadding='0' class='tbl'>
-    <tr>
-       <th width='25%' class='boldbase' align='center'><b>$Lang::tr{'name'}</b></th>
-       <th width='65%' class='boldbase' align='center'><b>$Lang::tr{'subject'}</b></th>
-       <th width='10%' class='boldbase' colspan='3' align='center'><b>$Lang::tr{'action'}</b></th>
-    </tr>
-EOF
-    ;
-    my $col1="bgcolor='$color{'color22'}'";
-       my $col2="bgcolor='$color{'color20'}'";
-    if (-f "${General::swroot}/ovpn/ca/cacert.pem") {
-       my $casubject = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/ca/cacert.pem`;
-       $casubject    =~ /Subject: (.*)[\n]/;
-       $casubject    = $1;
-       $casubject    =~ s+/Email+, E+;
-       $casubject    =~ s/ ST=/ S=/;
-       print <<END
-       <tr>
-       <td class='base' $col1>$Lang::tr{'root certificate'}</td>
-       <td class='base' $col1>$casubject</td>
-       <form method='post' name='frmrootcrta'><td width='3%' align='center' $col1>
-           <input type='hidden' name='ACTION' value='$Lang::tr{'show root certificate'}' />
-           <input type='image' name='$Lang::tr{'edit'}' src='/images/info.gif' alt='$Lang::tr{'show root certificate'}' title='$Lang::tr{'show root certificate'}' width='20' height='20' border='0' />
-       </td></form>
-       <form method='post' name='frmrootcrtb'><td width='3%' align='center' $col1>
-           <input type='image' name='$Lang::tr{'download root certificate'}' src='/images/media-floppy.png' alt='$Lang::tr{'download root certificate'}' title='$Lang::tr{'download root certificate'}' border='0' />
-           <input type='hidden' name='ACTION' value='$Lang::tr{'download root certificate'}' />
-       </td></form>
-       <td width='4%' $col1>&nbsp;</td></tr>
-END
-       ;
-    } else {
-       # display rootcert generation buttons
-       print <<END
-       <tr>
-       <td class='base' $col1>$Lang::tr{'root certificate'}:</td>
-       <td class='base' $col1>$Lang::tr{'not present'}</td>
-       <td colspan='3' $col1>&nbsp;</td></tr>
-END
-       ;
-    }
-
-    if (-f "${General::swroot}/ovpn/certs/servercert.pem") {
-       my $hostsubject = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/certs/servercert.pem`;
-       $hostsubject    =~ /Subject: (.*)[\n]/;
-       $hostsubject    = $1;
-       $hostsubject    =~ s+/Email+, E+;
-       $hostsubject    =~ s/ ST=/ S=/;
-
-       print <<END
-       <tr>
-       <td class='base' $col2>$Lang::tr{'host certificate'}</td>
-       <td class='base' $col2>$hostsubject</td>
-       <form method='post' name='frmhostcrta'><td width='3%' align='center' $col2>
-           <input type='hidden' name='ACTION' value='$Lang::tr{'show host certificate'}' />
-           <input type='image' name='$Lang::tr{'show host certificate'}' src='/images/info.gif' alt='$Lang::tr{'show host certificate'}' title='$Lang::tr{'show host certificate'}' width='20' height='20' border='0' />
-       </td></form>
-       <form method='post' name='frmhostcrtb'><td width='3%' align='center' $col2>
-           <input type='image' name="$Lang::tr{'download host certificate'}" src='/images/media-floppy.png' alt="$Lang::tr{'download host certificate'}" title="$Lang::tr{'download host certificate'}" border='0' />
-           <input type='hidden' name='ACTION' value="$Lang::tr{'download host certificate'}" />
-       </td></form>
-       <td width='4%' $col2>&nbsp;</td></tr>
-END
-       ;
-    } else {
-       # Nothing
-       print <<END
-       <tr>
-       <td width='25%' class='base' $col2>$Lang::tr{'host certificate'}:</td>
-       <td class='base' $col2>$Lang::tr{'not present'}</td>
-       </td><td colspan='3' $col2>&nbsp;</td></tr>
-END
-       ;
-    }
-
-    if (! -f "${General::swroot}/ovpn/ca/cacert.pem") {
-        print "<tr><td colspan='5' align='center'><form method='post'>";
-       print "<input type='submit' name='ACTION' value='$Lang::tr{'generate root/host certificates'}' />";
-        print "</form></td></tr>\n";
-    }
-
-    if (keys %cahash > 0) {
-       foreach my $key (keys %cahash) {
-           if (($key + 1) % 2) {
-               print "<tr bgcolor='$color{'color20'}'>\n";
-           } else {
-               print "<tr bgcolor='$color{'color22'}'>\n";
-           }
-           print "<td class='base'>$cahash{$key}[0]</td>\n";
-           print "<td class='base'>$cahash{$key}[1]</td>\n";
-           print <<END
-           <form method='post' name='cafrm${key}a'><td align='center'>
-               <input type='image' name='$Lang::tr{'show ca certificate'}' src='/images/info.gif' alt='$Lang::tr{'show ca certificate'}' title='$Lang::tr{'show ca certificate'}' border='0' />
-               <input type='hidden' name='ACTION' value='$Lang::tr{'show ca certificate'}' />
-               <input type='hidden' name='KEY' value='$key' />
-           </td></form>
-           <form method='post' name='cafrm${key}b'><td align='center'>
-               <input type='image' name='$Lang::tr{'download ca certificate'}' src='/images/media-floppy.png' alt='$Lang::tr{'download ca certificate'}' title='$Lang::tr{'download ca certificate'}' border='0' />
-               <input type='hidden' name='ACTION' value='$Lang::tr{'download ca certificate'}' />
-               <input type='hidden' name='KEY' value='$key' />
-           </td></form>
-           <form method='post' name='cafrm${key}c'><td align='center'>
-               <input type='hidden' name='ACTION' value='$Lang::tr{'remove ca certificate'}' />
-               <input type='image'  name='$Lang::tr{'remove ca certificate'}' src='/images/delete.gif' alt='$Lang::tr{'remove ca certificate'}' title='$Lang::tr{'remove ca certificate'}' width='20' height='20' border='0' />
-               <input type='hidden' name='KEY' value='$key' />
-           </td></form></tr>
-END
-           ;
-       }
-    }
-
-    print "</table>";
-
-    # If the file contains entries, print Key to action icons
-    if ( -f "${General::swroot}/ovpn/ca/cacert.pem") {
-    print <<END
-    <table>
-    <tr>
-       <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
-       <td>&nbsp; &nbsp; <img src='/images/info.gif' alt='$Lang::tr{'show certificate'}' /></td>
-       <td class='base'>$Lang::tr{'show certificate'}</td>
-       <td>&nbsp; &nbsp; <img src='/images/media-floppy.png' alt='$Lang::tr{'download certificate'}' /></td>
-       <td class='base'>$Lang::tr{'download certificate'}</td>
-    </tr>
-    </table>
-END
-;
-    }
-    
-print <<END
-<form method='post' enctype='multipart/form-data'>
-<table width='100%' border='0'>
-<tr><td class='base' nowrap='nowrap'>$Lang::tr{'ca name'}:</td><td nowrap='nowrap' width='8%'><input type='text' name='CA_NAME' value='$cgiparams{'CA_NAME'}' size='15' align='left'/></td><td nowrap='nowrap' align='right'><input type='file' name='FH' size='25' /><input type='submit' name='ACTION' value='$Lang::tr{'upload ca certificate'}' /></td></tr>
-<tr><td colspan='4'><br></td></tr>
-<tr align='right'><td colspan='4' align='right' width='80%'><input type='submit' name='ACTION' value='$Lang::tr{'show crl'}' /></td></tr>
-</table>
-END
-;
 
-    &Header::closebox();
-    if ( $srunning eq "yes" ) {    
-       print "<div align='center'><form method='post'><input type='submit' name='ACTION' value='$Lang::tr{'reset'}' disabled='disabled' /></div></form>\n";    
-    }else{
-       print "<div align='center'><form method='post'><input type='submit' name='ACTION' value='$Lang::tr{'reset'}' /></div></form>\n";
-    }      
     if ( -f "${General::swroot}/ovpn/ca/cacert.pem" ) {
-
 ###
 # m.a.d net2net
 #<td width='25%' class='boldbase' align='center'><b>$Lang::tr{'remark'}</b><br /><img src='/images/null.gif' width='125' height='1' border='0' alt='L2089' /></td>
 ###
 
-    &Header::openbox('100%', 'LEFT', $Lang::tr{'Client status and controlc' });
-    print <<END
+    &Header::openbox('100%', 'LEFT', $Lang::tr{'connection status and controlc' });
+    print <<END;
 
 
     <table width='100%' cellspacing='1' cellpadding='0' class='tbl'>
@@ -4938,7 +5109,7 @@ END
 }
 
 
-       print <<END
+    print <<END;
        <td align='center' $col1>$active</td>
                
        <form method='post' name='frm${key}a'><td align='center' $col>
@@ -4949,7 +5120,7 @@ END
 END
        ;
        if ($confighash{$key}[4] eq 'cert') {
-           print <<END
+           print <<END;
            <form method='post' name='frm${key}b'><td align='center' $col>
                <input type='image' name='$Lang::tr{'show certificate'}' src='/images/info.gif' alt='$Lang::tr{'show certificate'}' title='$Lang::tr{'show certificate'}' border='0' />
                <input type='hidden' name='ACTION' value='$Lang::tr{'show certificate'}' />
@@ -4960,7 +5131,7 @@ END
            print "<td>&nbsp;</td>";
        }
        if ($confighash{$key}[4] eq 'cert' && -f "${General::swroot}/ovpn/certs/$confighash{$key}[1].p12") { 
-           print <<END
+           print <<END;
            <form method='post' name='frm${key}c'><td align='center' $col>
                <input type='image' name='$Lang::tr{'download pkcs12 file'}' src='/images/media-floppy.png' alt='$Lang::tr{'download pkcs12 file'}' title='$Lang::tr{'download pkcs12 file'}' border='0' />
                <input type='hidden' name='ACTION' value='$Lang::tr{'download pkcs12 file'}' />
@@ -4968,7 +5139,7 @@ END
            </td></form>
 END
        ; } elsif ($confighash{$key}[4] eq 'cert') {
-           print <<END
+           print <<END;
            <form method='post' name='frm${key}c'><td align='center' $col>
                <input type='image' name='$Lang::tr{'download certificate'}' src='/images/media-floppy.png' alt='$Lang::tr{'download certificate'}' title='$Lang::tr{'download certificate'}' border='0' />
                <input type='hidden' name='ACTION' value='$Lang::tr{'download certificate'}' />
@@ -5004,45 +5175,257 @@ END
 
     # If the config file contains entries, print Key to action icons
     if ( $id ) {
-    print <<END
+    print <<END;
     <table border='0'>
     <tr>
-       <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
-       <td>&nbsp; <img src='/images/on.gif' alt='$Lang::tr{'click to disable'}' /></td>
-       <td class='base'>$Lang::tr{'click to disable'}</td>
-       <td>&nbsp; &nbsp; <img src='/images/info.gif' alt='$Lang::tr{'show certificate'}' /></td>
-       <td class='base'>$Lang::tr{'show certificate'}</td>
-       <td>&nbsp; &nbsp; <img src='/images/edit.gif' alt='$Lang::tr{'edit'}' /></td>
-       <td class='base'>$Lang::tr{'edit'}</td>
-       <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
-       <td class='base'>$Lang::tr{'remove'}</td>
+               <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
+               <td>&nbsp; <img src='/images/on.gif' alt='$Lang::tr{'click to disable'}' /></td>
+               <td class='base'>$Lang::tr{'click to disable'}</td>
+               <td>&nbsp; &nbsp; <img src='/images/info.gif' alt='$Lang::tr{'show certificate'}' /></td>
+               <td class='base'>$Lang::tr{'show certificate'}</td>
+               <td>&nbsp; &nbsp; <img src='/images/edit.gif' alt='$Lang::tr{'edit'}' /></td>
+               <td class='base'>$Lang::tr{'edit'}</td>
+               <td>&nbsp; &nbsp; <img src='/images/delete.gif' alt='$Lang::tr{'remove'}' /></td>
+               <td class='base'>$Lang::tr{'remove'}</td>
     </tr>
     <tr>
-       <td>&nbsp; </td>
-       <td>&nbsp; <img src='/images/off.gif' alt='?OFF' /></td>
-       <td class='base'>$Lang::tr{'click to enable'}</td>
-       <td> <img src='/images/media-floppy.png' alt='?FLOPPY' /></td>
-       <td class='base'>$Lang::tr{'download certificate'}</td>
-       <td> <img src='/images/openvpn.png' alt='?RELOAD'/></td>
-       <td class='base'>$Lang::tr{'dl client arch'}</td>
-    </tr>
+               <td>&nbsp; </td>
+               <td>&nbsp; <img src='/images/off.gif' alt='?OFF' /></td>
+               <td class='base'>$Lang::tr{'click to enable'}</td>
+               <td>&nbsp; &nbsp; <img src='/images/media-floppy.png' alt='?FLOPPY' /></td>
+               <td class='base'>$Lang::tr{'download certificate'}</td>
+               <td>&nbsp; &nbsp; <img src='/images/openvpn.png' alt='?RELOAD'/></td>
+               <td class='base'>$Lang::tr{'dl client arch'}</td>
+               </tr>
     </table><br>
 END
     ;
     }
 
-    print <<END
+    print <<END;
     <table width='100%'>
     <form method='post'>
-    <tr><td align='right'><input type='submit' name='ACTION' value='$Lang::tr{'add'}' />
-    <input type='submit' name='ACTION' value='$Lang::tr{'ovpn con stat'}' $activeonrun /></td></tr>
+    <tr><td align='right'>
+               <input type='submit' name='ACTION' value='$Lang::tr{'add'}' />
+               <input type='submit' name='ACTION' value='$Lang::tr{'ovpn con stat'}' $activeonrun /></td>
+       </tr>
     </form>
     </table>
 END
-    ;    
-    &Header::closebox();
-}
-&Header::closepage();
+    ;
+       &Header::closebox();
+       }
+    &Header::openbox('100%', 'LEFT', "$Lang::tr{'certificate authorities'}");
+    print <<END;
+    <table width='100%' cellspacing='1' cellpadding='0' class='tbl'>
+    <tr>
+               <th width='25%' class='boldbase' align='center'><b>$Lang::tr{'name'}</b></th>
+               <th width='65%' class='boldbase' align='center'><b>$Lang::tr{'subject'}</b></th>
+               <th width='10%' class='boldbase' colspan='3' align='center'><b>$Lang::tr{'action'}</b></th>
+    </tr>
+END
+    ;
+    my $col1="bgcolor='$color{'color22'}'";
+    my $col2="bgcolor='$color{'color20'}'";
+    my $col3="bgcolor='$color{'color22'}'";
 
+    if (-f "${General::swroot}/ovpn/ca/cacert.pem") {
+               my $casubject = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/ca/cacert.pem`;
+               $casubject    =~ /Subject: (.*)[\n]/;
+               $casubject    = $1;
+               $casubject    =~ s+/Email+, E+;
+               $casubject    =~ s/ ST=/ S=/;
+               print <<END;
+               <tr>
+                       <td class='base' $col1>$Lang::tr{'root certificate'}</td>
+                       <td class='base' $col1>$casubject</td>
+               <form method='post' name='frmrootcrta'><td width='3%' align='center' $col1>
+                       <input type='hidden' name='ACTION' value='$Lang::tr{'show root certificate'}' />
+                       <input type='image' name='$Lang::tr{'edit'}' src='/images/info.gif' alt='$Lang::tr{'show root certificate'}' title='$Lang::tr{'show root certificate'}' width='20' height='20' border='0' />
+               </td></form>
+               <form method='post' name='frmrootcrtb'><td width='3%' align='center' $col1>
+                       <input type='image' name='$Lang::tr{'download root certificate'}' src='/images/media-floppy.png' alt='$Lang::tr{'download root certificate'}' title='$Lang::tr{'download root certificate'}' border='0' />
+                       <input type='hidden' name='ACTION' value='$Lang::tr{'download root certificate'}' />
+               </td></form>
+               <td width='4%' $col1>&nbsp;</td></tr>
+END
+               ;
+    } else {
+               # display rootcert generation buttons
+               print <<END;
+               <tr>
+                       <td class='base' $col1>$Lang::tr{'root certificate'}:</td>
+                       <td class='base' $col1>$Lang::tr{'not present'}</td>
+                       <td colspan='3' $col1>&nbsp;</td></tr>
+END
+               ;
+    }
+
+    if (-f "${General::swroot}/ovpn/certs/servercert.pem") {
+               my $hostsubject = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/certs/servercert.pem`;
+               $hostsubject    =~ /Subject: (.*)[\n]/;
+               $hostsubject    = $1;
+               $hostsubject    =~ s+/Email+, E+;
+               $hostsubject    =~ s/ ST=/ S=/;
 
+               print <<END;
+               <tr>
+                       <td class='base' $col2>$Lang::tr{'host certificate'}</td>
+                       <td class='base' $col2>$hostsubject</td>
+               <form method='post' name='frmhostcrta'><td width='3%' align='center' $col2>
+                       <input type='hidden' name='ACTION' value='$Lang::tr{'show host certificate'}' />
+                       <input type='image' name='$Lang::tr{'show host certificate'}' src='/images/info.gif' alt='$Lang::tr{'show host certificate'}' title='$Lang::tr{'show host certificate'}' width='20' height='20' border='0' />
+               </td></form>
+               <form method='post' name='frmhostcrtb'><td width='3%' align='center' $col2>
+                       <input type='image' name="$Lang::tr{'download host certificate'}" src='/images/media-floppy.png' alt="$Lang::tr{'download host certificate'}" title="$Lang::tr{'download host certificate'}" border='0' />
+                       <input type='hidden' name='ACTION' value="$Lang::tr{'download host certificate'}" />
+               </td></form>
+               <td width='4%' $col2>&nbsp;</td></tr>
+END
+               ;
+    } else {
+               # Nothing
+               print <<END;
+               <tr>
+                       <td width='25%' class='base' $col2>$Lang::tr{'host certificate'}:</td>
+                       <td class='base' $col2>$Lang::tr{'not present'}</td>
+               </td><td colspan='3' $col2>&nbsp;</td></tr>
+END
+               ;
+    }
+
+    # Adding DH parameter to chart
+    if (-f "${General::swroot}/ovpn/ca/dh1024.pem") {
+               my $dhsubject = `/usr/bin/openssl dhparam -text -in ${General::swroot}/ovpn/ca/dh1024.pem`;
+               $dhsubject    =~ /PKCS#3 (.*)[\n]/;
+               $dhsubject    = $1;
+
+
+       print <<END;
+               <tr>
+                       <td class='base' $col3>$Lang::tr{'dh parameter'}</td>
+                       <td class='base' $col3>$dhsubject</td>
+               <form method='post' name='frmdhparam'><td width='3%' align='center' $col3>
+                       <input type='hidden' name='ACTION' value='$Lang::tr{'show dh'}' />
+                       <input type='image' name='$Lang::tr{'show dh'}' src='/images/info.gif' alt='$Lang::tr{'show dh'}' title='$Lang::tr{'show dh'}' width='20' height='20' border='0' />
+               </td></form>
+               <form method='post' name='frmdhparam'><td width='3%' align='center' $col3>
+                       <input type='image' name="$Lang::tr{'download dh parameter'}" src='/images/media-floppy.png' alt="$Lang::tr{'download dh parameter'}" title="$Lang::tr{'download dh parameter'}" border='0' />
+                       <input type='hidden' name='ACTION' value="$Lang::tr{'download dh parameter'}" />
+               </td></form>
+               <td width='4%' $col3>&nbsp;</td></tr>
+END
+               ;
+    } else {
+               # Nothing
+               print <<END;
+               <tr>
+                       <td width='25%' class='base' $col3>$Lang::tr{'dh parameter'}:</td>
+                       <td class='base' $col3>$Lang::tr{'not present'}</td>
+               </td><td colspan='3' $col3>&nbsp;</td></tr>
+END
+               ;
+    }
+
+    if (! -f "${General::swroot}/ovpn/ca/cacert.pem") {
+        print "<tr><td colspan='5' align='center'><form method='post'>";
+               print "<input type='submit' name='ACTION' value='$Lang::tr{'generate root/host certificates'}' />";
+        print "</form></td></tr>\n";
+    }
+
+    if (keys %cahash > 0) {
+               foreach my $key (keys %cahash) {
+                       if (($key + 1) % 2) {
+                               print "<tr bgcolor='$color{'color20'}'>\n";
+                       } else {
+                               print "<tr bgcolor='$color{'color22'}'>\n";
+                       }
+                       print "<td class='base'>$cahash{$key}[0]</td>\n";
+                       print "<td class='base'>$cahash{$key}[1]</td>\n";
+                       print <<END;
+                       <form method='post' name='cafrm${key}a'><td align='center'>
+                               <input type='image' name='$Lang::tr{'show ca certificate'}' src='/images/info.gif' alt='$Lang::tr{'show ca certificate'}' title='$Lang::tr{'show ca certificate'}' border='0' />
+                               <input type='hidden' name='ACTION' value='$Lang::tr{'show ca certificate'}' />
+                               <input type='hidden' name='KEY' value='$key' />
+                       </td></form>
+                       <form method='post' name='cafrm${key}b'><td align='center'>
+                               <input type='image' name='$Lang::tr{'download ca certificate'}' src='/images/media-floppy.png' alt='$Lang::tr{'download ca certificate'}' title='$Lang::tr{'download ca certificate'}' border='0' />
+                               <input type='hidden' name='ACTION' value='$Lang::tr{'download ca certificate'}' />
+                               <input type='hidden' name='KEY' value='$key' />
+                       </td></form>
+                       <form method='post' name='cafrm${key}c'><td align='center'>
+                               <input type='hidden' name='ACTION' value='$Lang::tr{'remove ca certificate'}' />
+                               <input type='image'  name='$Lang::tr{'remove ca certificate'}' src='/images/delete.gif' alt='$Lang::tr{'remove ca certificate'}' title='$Lang::tr{'remove ca certificate'}' width='20' height='20' border='0' />
+                               <input type='hidden' name='KEY' value='$key' />
+                       </td></form></tr>
+END
+                       ;
+               }
+    }
+
+    print "</table>";
+
+    # If the file contains entries, print Key to action icons
+    if ( -f "${General::swroot}/ovpn/ca/cacert.pem") {
+               print <<END;
+               <table>
+               <tr>
+                       <td class='boldbase'>&nbsp; <b>$Lang::tr{'legend'}:</b></td>
+                       <td>&nbsp; &nbsp; <img src='/images/info.gif' alt='$Lang::tr{'show certificate'}' /></td>
+                       <td class='base'>$Lang::tr{'show certificate'}</td>
+                       <td>&nbsp; &nbsp; <img src='/images/media-floppy.png' alt='$Lang::tr{'download certificate'}' /></td>
+                       <td class='base'>$Lang::tr{'download certificate'}</td>
+               </tr>
+               </table>
+END
+               ;
+    }
+
+       print <<END
+       <hr size='1'>
+       <form method='post' enctype='multipart/form-data'>
+       <table width='100%' border='0'cellspacing='1' cellpadding='0'>
+       <tr>
+               <td class='base' nowrap='nowrap'>$Lang::tr{'ca name'}:</td>
+               <td nowrap='nowrap'><input type='text' name='CA_NAME' value='$cgiparams{'CA_NAME'}' size='15' align='left'/></td>
+               <td nowrap='nowrap'><input type='file' name='FH' size='25' />
+               <td nowrap='nowrap' align='right'><input type='submit' name='ACTION' value='$Lang::tr{'upload ca certificate'}' /></td>
+       </tr>
+
+       <tr align='right'>
+               <td colspan='4' align='right' width='80%'><input type='submit' name='ACTION' value='$Lang::tr{'show crl'}' /></td>
+       </tr>
+
+       <tr><td colspan=4><hr /></td></tr><tr>
+       <tr>
+               <td class'base'><b>$Lang::tr{'ovpn dh parameters'}</b></td>
+       </tr>
+
+       <tr>
+               <td class='base' nowrap='nowrap'>$Lang::tr{'ovpn dh upload'}:</td>
+               <td nowrap='nowrap'><size='15' align='left'/></td>
+               <td nowrap='nowrap'><input type='file' name='FH' size='25' />
+               <td colspan='4' align='right'><input type='submit' name='ACTION' value='$Lang::tr{'upload dh key'}' /></td>
+       </tr>
+       <tr>
+               <td class='base' nowrap='nowrap'>$Lang::tr{'ovpn dh new key'}:</td>
+               <td nowrap='nowrap'><size='15' align='left'/></td>
+               <td nowrap='nowrap'><input type='submit' name='ACTION' value='$Lang::tr{'generate dh key'}' /></td>
+       </tr>
+       </table>
+       
+       <tr><td colspan=4><hr /></td></tr><tr>
+END
+       ;
+
+    if ( $srunning eq "yes" ) {
+               print "<div align='center'><form method='post'><input type='submit' name='ACTION' value='$Lang::tr{'remove x509'}' disabled='disabled' /></div></form>\n";
+    } else {
+               print "<div align='center'><form method='post'><input type='submit' name='ACTION' value='$Lang::tr{'remove x509'}' /></div></form>\n";
+    }
+       &Header::closebox();
+END
+       ;
+
+&Header::closepage();
 
index f0100a81673c5f3ab2f379b8509c1aed745093ee..7bceb80ee74230fbbbea1cb9440147cf7e6e5b4d 100644 (file)
@@ -73,6 +73,9 @@ elsif ($pppsettings{'ACTION'} eq $Lang::tr{'save'})
         if ($pppsettings{'TYPE'} =~ /^(modem|serial|isdn)$/ && $pppsettings{'COMPORT'} !~ /^(ttyS0|ttyS1|ttyS2|ttyS3|ttyS4|ttyACM0|ttyACM1|ttyACM2|ttyACM3|ttyUSB0|ttyUSB1|ttyUSB2|ttyUSB3|rfcomm0|rfcomm1|isdn1|isdn2)$/) {
                 $errormessage = $Lang::tr{'invalid input'};
                 goto ERROR; }
+        if ($pppsettings{'TYPE'} =~ /^(modem|serial|isdn)$/ && $pppsettings{'MONPORT'} !~ /^(ttyUSB0|ttyUSB1|ttyUSB2|ttyUSB3)$/) {
+                $errormessage = $Lang::tr{'invalid input'};
+                goto ERROR; }
         if ($pppsettings{'TYPE'} =~ /^(modem|serial)$/ && $pppsettings{'DTERATE'} !~ /^(9600|19200|38400|57600|115200|230400|460800|921600)$/) {
                 $errormessage = $Lang::tr{'invalid input'};
                 goto ERROR; }
@@ -338,6 +341,13 @@ $selected{'COMPORT'}{'rfcomm0'} = '';
 $selected{'COMPORT'}{'rfcomm1'} = '';
 $selected{'COMPORT'}{$pppsettings{'COMPORT'}} = "selected='selected'";
 
+$selected{'MONPORT'}{''} = '';
+$selected{'MONPORT'}{'ttyUSB0'} = '';
+$selected{'MONPORT'}{'ttyUSB1'} = '';
+$selected{'MONPORT'}{'ttyUSB2'} = '';
+$selected{'MONPORT'}{'ttyUSB3'} = '';
+$selected{'MONPORT'}{$pppsettings{'MONPORT'}} = "selected='selected'";
+
 $selected{'DTERATE'}{'9600'} = '';
 $selected{'DTERATE'}{'19200'} = '';
 $selected{'DTERATE'}{'38400'} = '';
@@ -586,6 +596,24 @@ END
 ;
                 }
     print "</select></td>       "}
+
+       if ($pppsettings{'TYPE'} =~ /^(modem|serial)$/) {
+               print <<END;
+                       <tr>
+                               <td colspan='3' width='75%'>$Lang::tr{'monitor interface'}:</td>
+                               <td width='25%'>
+                                       <select name="MONPORT" style="width: 165px;">
+                                               <option value="" $selected{'MONPORT'}{''}>---</option>
+                                               <option value="ttyUSB0" $selected{'MONPORT'}{'ttyUSB0'}>ttyUSB0</option>
+                                               <option value="ttyUSB1" $selected{'MONPORT'}{'ttyUSB1'}>ttyUSB1</option>
+                                               <option value="ttyUSB2" $selected{'MONPORT'}{'ttyUSB2'}>ttyUSB2</option>
+                                               <option value="ttyUSB3" $selected{'MONPORT'}{'ttyUSB3'}>ttyUSB3</option>
+                                       </select>
+                               </td>
+                       </tr>
+END
+       }
+
                 if ($pppsettings{'TYPE'} =~ /^(modem|serial)$/ ) {
                         print <<END
   <tr>
@@ -929,6 +957,7 @@ sub initprofile
 {
         $pppsettings{'PROFILENAME'} = $Lang::tr{'unnamed'};
         $pppsettings{'COMPORT'} = 'ttyS0';
+        $pppsettings{'MONPORT'} = '';
         $pppsettings{'DTERATE'} = 115200;
         $pppsettings{'SPEAKER'} = 'off';
         $pppsettings{'RECONNECTION'} = 'persistent';
index c4cff478928133814504953c403274c7801f46ec..2a9d49394276a83233b4928b5737b1facb5141e9 100644 (file)
@@ -2972,11 +2972,23 @@ sub writepacfile
                print FILE <<END
 if (
      (isPlainHostName(host)) ||
-     (dnsDomainIs(host, ".$mainsettings{'DOMAINNAME'}")) ||
      (isInNet(host, "127.0.0.1", "255.0.0.0")) ||
-     (isInNet(host, "10.0.0.0", "255.0.0.0")) ||
-     (isInNet(host, "172.16.0.0", "255.240.0.0")) ||
-     (isInNet(host, "192.168.0.0", "255.255.0.0")) ||
+END
+;
+
+       if ($netsettings{'GREEN_DEV'}) {
+               print FILE "     (isInNet(host, \"$netsettings{'GREEN_NETADDRESS'}\", \"$netsettings{'GREEN_NETMASK'}\")) ||\n";
+       }
+
+       if (&Header::blue_used() && $netsettings{'BLUE_DEV'}) {
+               print FILE "     (isInNet(host, \"$netsettings{'BLUE_NETADDRESS'}\", \"$netsettings{'BLUE_NETMASK'}\")) ||\n";
+       }
+
+       if (&Header::orange_used() && $netsettings{'ORANGE_DEV'}) {
+               print FILE "     (isInNet(host, \"$netsettings{'ORANGE_NETADDRESS'}\", \"$netsettings{'ORANGE_NETMASK'}\")) ||\n";
+       }
+
+       print FILE <<END
      (isInNet(host, "169.254.0.0", "255.255.0.0"))
    )
      return "DIRECT";
index 0c47cd456bbee33e732d848e2601304e22f133a8..63740d42d8385cf008b86d30d6fd2d376bca5329 100644 (file)
@@ -194,7 +194,7 @@ sub openpagewithoutmenu {
 sub closepage () {
        open(FILE, "</etc/system-release");
        my $system_release = <FILE>;
-       $system_release =~ s/core/Core Update/;
+       $system_release =~ s/core/Core Update /;
        close(FILE);
 
 print <<END;
index 090510fe398552a1c6721b742ae676785e12b723..5df9ba8399760b797519665b2ef518fd0ecd4e49 100644 (file)
@@ -1,7 +1,7 @@
 %tr = ( 
 %tr,
 
-'Act as' => 'Konfiguriert als',
+'Act as' => 'Konfiguriert als:',
 'Add Level7 rule' => 'Level7-Regel hinzufügen',
 'Add Port Rule' => 'Port-Regel hinzufügen',
 'Add Rule' => 'Regel hinzufügen',
@@ -10,7 +10,6 @@
 'Choose Rule' => 'Wählen Sie <u>eine</u> der untenstehenden Regeln aus.',
 'Class' => 'Klasse',
 'Class was deleted' => 'wurde mit eventuell vorhandenen Unterklassen gelöscht',
-'Client status and controlc' => 'Client-Status und -Kontrolle',
 'ConnSched action' => 'Aktion:',
 'ConnSched add action' => 'Aktion hinzufügen',
 'ConnSched change profile title' => 'Wechsle zu Profil:',
@@ -39,7 +38,9 @@
 'Local VPN IP' => 'Internes Netzwerk (GREEN)',
 'MB read' => 'MB gelesen',
 'MB written' => 'MB geschrieben',
-'MTU' => 'MTU Size',
+'MTU' => 'MTU-Größe:',
+'MTU settings' => 'MTU-Einstellungen:',
+'Number of Countries for the pie chart' => 'Anzahl der angezeigten Länder im Diagramm',
 'Number of IPs for the pie chart' => 'Anzahl der angezeigten IPs im Diagramm',
 'Number of Ports for the pie chart' => 'Anzahl der angezeigten Ports im Diagramm',
 'OVPN' => 'OpenVPN',
 'cant change certificates' => 'Kann Zertifikate nicht ändern.',
 'cant enable xtaccess' => 'Die zugehörige Port-Weiterleitungsregel ist deaktiviert, daher können Sie den externen Zugang für diese Regel nicht aktivieren.',
 'cant start openssl' => 'Kann OpenSSL nicht starten',
+'capabilities' => 'Unterstützte Features',
 'caps all' => 'ALLE',
 'capsclosed' => 'GETRENNT',
 'capsinactive' => 'INAKTIV',
 'check for net traffic update' => 'Prüfe auf Net-Traffic-Updates',
 'check vpn lr' => 'Überprüfen',
 'choose config' => 'Konfiguration auswählen',
-'cipher' => 'Verschlüsselung',
+'cipher' => 'Verschlüsselung:',
 'city' => 'Stadt',
 'class in use' => 'Die aktuelle Klasse wird bereits verwendet.',
 'clear cache' => 'Zwischenspeicher löschen',
 'december' => 'Dezember',
 'deep scan directories' => 'rekursiv scannen',
 'def lease time' => 'Standardzeit für Zuordnung',
+'default' => 'Voreinstellung',
 'default ip' => 'Standard IP-Adresse',
 'default lease time' => 'Haltezeit-Voreinstellung in min:',
 'default networks' => 'Standard Netzwerke',
 'details' => 'Mehr',
 'device' => 'Gerät',
 'devices on blue' => 'Geräte auf Blau',
+'dh' => 'Diffie-Hellman-Parameter',
+'dh key move failed' => 'Verschieben der Diffie-Hellman-Parameter fehlgeschlagen.',
+'dh key warn' => 'Das Generieren der Diffie-Hellman-Parameter mit 1024 oder 2048 Bit dauert üblicherweise mehrere Minuten. Schlüssellängen von 3072 oder 4096 Bit beanspruchen mehrere Stunden. Bitte haben Sie etwas Geduld.',
+'dh key warn1' => 'Bei schwachen Systemen oder Systeme mit wenig Entropie wird empfohlen lange Diffie-Hellman-Parameter über die Upload-Funktion hochzuladen.',
+'dh parameter' => 'Diffie-Hellman-Parameter',
 'dhcp advopt add' => 'DHCP Option hinzufügen',
 'dhcp advopt added' => 'DHCP Option hinzugefügt',
 'dhcp advopt blank value' => 'Wert für DHCP Option darf nicht leer sein',
 'dns proxy server' => 'DNS-Proxyserver',
 'dns saved' => 'Erfolgreich gespeichert!',
 'dns saved txt' => 'Die beiden eingegebenen DNS-Server-Adressen wurde erfolgreich gespeichert.<br/>Um die Änderung wirksam zu machen, müssen Sie neustarten oder wiederverbinden!',
-'dns server' => 'DNS-Server',
+'dns server' => 'DNS Server',
 'dns servers' => 'DNS-Server',
 'dns title' => 'Domain Name System',
 'dnsforward' => 'DNS-Weiterleitung',
 'donation-text' => '<strong>IPFire</strong> wird von Freiwilligen in ihrer Freizeit betrieben und auch betreut. Um dieses Projekt am Laufen zu halten, entstehen uns natürlich auch Kosten. Wenn Sie uns unterstützen wollen, würden wir uns über eine kleine Spende sehr freuen.',
 'dos charset' => 'DOS Charset',
 'down and up speed' => 'Geben Sie bitte hier ihre Download- bzw. Upload-Geschwindigkeit ein <br /> und klicken Sie danach auf <i>Speichern</i>.',
-'downlink' => 'Downlink',
 'downlink speed' => 'Downlink-Geschwindigkeit (kBit/sek)',
 'downlink std class' => 'Downloadstandardklasse',
 'download' => 'herunterladen',
 'download ca certificate' => 'CA-Zertifikat herunterladen',
 'download certificate' => 'Zertifikate herunterladen',
+'download dh parameter' => 'Diffie-Hellman-Parameter herunterladen',
 'download host certificate' => 'Host-Zertifikat herunterladen',
 'download new ruleset' => 'Neuen Regelsatz herunterladen',
 'download pkcs12 file' => 'PKCS12-Datei herunterladen',
 'firewall log' => 'Firewall-Protokoll',
 'firewall log viewer' => 'Betrachter der Firewall-Logdateien',
 'firewall logs' => 'Firewall-Logdateien',
+'firewall logs country' => 'Fw-Logdiagramme (Land)',
 'firewall logs ip' => 'Fw-Logdiagramme (IP)',
 'firewall logs port' => 'Fw-Logdiagramme (Port)',
 'firewall rules' => 'Firewallregeln',
 'firewallhits' => 'Firewalltreffer',
 'firmware' => 'Firmware',
 'firmware upload' => 'Hochladen der Firmware/Treiber',
-'first' => 'Erste',
 'fixed ip lease added' => 'Feste IP-Zuordnung hinzugefügt',
 'fixed ip lease modified' => 'Feste IP-Zuordnung geändert',
 'fixed ip lease removed' => 'Feste IP-Zuordnung gelöscht',
 'fwhost wo subnet' => '(Ohne Subnetz)',
 'gateway' => 'Gateway',
 'gateway ip' => 'Gateway-IP',
+'gen dh' => 'Neuen Diffie-Hellman-Parameter erzeugen',
 'gen static key' => 'Statischen Schlüssel erzeugen',
 'generate' => 'Root/Host-Zertifikate generieren',
 'generate a certificate' => 'Erzeuge ein Zertifikat:',
+'generate dh key' => 'Diffie-Hellman Key generieren',
 'generate iso' => 'ISO erstellen',
 'generate root/host certificates' => 'Erzeuge Root/Host-Zertifikate',
 'generate tripwire keys and init' => 'Tripwire Initalisierung',
 'ike integrity' => 'IKE Integrität:',
 'ike lifetime' => 'IKE Lebensdauer:',
 'ike lifetime should be between 1 and 8 hours' => 'IKE Lebensdauer sollte zwischen 1 und 8 Stunden betragen.',
+'imei' => 'IMEI',
 'import' => 'Import',
 'importkey' => 'PSK importieren',
+'imsi' => 'IMSI',
 'in' => 'Ein',
 'inactive' => 'inaktiv',
 'include logfiles' => 'mit Logdateien',
 'lan' => 'LAN',
 'lang' => 'de',
 'languagepurpose' => 'Wählen Sie eine Sprache, in der IPFire angezeigt werden soll:',
-'last' => 'Letzte',
 'last activity' => 'Letzte Aktivität',
 'lateprompting' => 'Late prompting',
 'lease expires' => 'Zuordnung verfällt',
 'log view' => 'Log Anzeige',
 'log viewer' => 'Protokollansicht',
 'log viewing options' => 'Log Ansichts-Optionen',
-'log-options' => 'Logfile options',
+'log-options' => 'Logfile Optionen',
 'loged in at' => 'Angemeldet seit',
 'logging' => 'Logging',
 'logging server' => 'Protokollierungs-Server',
 'missing dat' => 'Verschlüsseltes Archiv wurde nicht gefunden',
 'missing gz' => 'Nichtverschlüsseltes Archiv wurde nicht gefunden',
 'mode' => 'Modus',
+'model' => 'Modell',
 'modem' => 'Modem',
 'modem configuration' => 'Modem-Konfiguration',
+'modem hardware details' => 'Modem-Hardware',
+'modem information' => 'Modem-Informationen',
+'modem network bit error rate' => 'Bit-Fehlerrate',
+'modem network information' => 'Netzwerkinformationen',
+'modem network mode' => 'Netzwerkmodus',
+'modem network operator' => 'Netzbetreiber',
+'modem network registration' => 'Netzregistrierung',
+'modem network signal quality' => 'Signalqualität',
+'modem no connection' => 'Keine Verbindung',
+'modem no connection message' => 'Es konnte keine Verbindung zum Modem aufgebaut werden.',
 'modem on com1' => 'Modem an COM1',
 'modem on com2' => 'Modem an COM2',
 'modem on com3' => 'Modem an COM3',
 'modem on com4' => 'Modem an COM4',
 'modem on com5' => 'Modem an COM5',
 'modem settings have errors' => 'Modemeinstellungen fehlerhaft',
+'modem sim information' => 'SIM-Informationen',
 'modem speaker on' => 'Modemlautsprecher an:',
+'modem status' => 'Modem-Status',
 'modify' => 'Ändern',
 'modulation' => 'Modulation',
 'monday' => 'Montag',
 'network traffic graphs others' => 'Netzwerk (sonstige)',
 'network updated' => 'Benutzerdefiniertes Netzwerk aktualisiert',
 'networks settings' => 'Firewall - Netzwerkeinstellungen',
+'never' => 'Nie',
 'new optionsfw later' => 'Einige Einstellungen werden erst nach einem Neustart aktiv',
 'new optionsfw must boot' => 'Sie müssen Ihren IPFire neu starten',
 'newer' => 'Neuer',
 'nonetworkname' => 'Kein Netzwerkname wurde eingegeben',
 'noservicename' => 'Kein Dienstname wurde eingegeben',
 'not a valid ca certificate' => 'Kein gültiges CA Zertifikat.',
+'not a valid dh key' => 'Kein gültiger Diffie-Hellman-Parameter. Es sind nur Parameter mit einer Länge von 1024, 2048, 3072 oder 4096 Bit im PKCS#3-Format erlaubt.',
 'not enough disk space' => 'Nicht genügend Plattenplatz vorhanden',
 'not present' => '<B>Nicht</B> vorhanden',
 'not running' => 'nicht gestartet',
 'ovpn' => 'OpenVPN',
 'ovpn con stat' => 'OpenVPN Verbindungs-Statistik',
 'ovpn config' => 'OVPN-Konfiguration',
+'ovpn crypt options' => 'Kryptografieoptionen',
 'ovpn device' => 'OpenVPN-Gerät',
+'ovpn dh' => 'Diffie-Hellman-Parameter-Länge',
+'ovpn dh new key' => 'Neuen Diffie-Hellman Parameter erstellen',
+'ovpn dh parameters' => 'Diffie-Hellman-Parameter-Optionen',
+'ovpn dh upload' => 'Neuen Diffie-Hellman-Parameter hochladen',
 'ovpn dl' => 'OVPN-Konfiguration downloaden',
+'ovpn engines' => 'Krypto Engine',
 'ovpn errmsg green already pushed' => 'Route für grünes Netzwerk wird immer gesetzt',
 'ovpn errmsg invalid ip or mask' => 'Ungültige Netzwerk-Adresse oder Subnetzmaske',
+'ovpn generating the root and host certificates' => 'Die Erzeugung der Root- und Host-Zertifikate kann lange Zeit dauern.',
+'ovpn ha' => 'Hash-Algorithmus',
+'ovpn hmac' => 'HMAC-Optionen',
 'ovpn log' => 'OVPN-Log',
 'ovpn mgmt in root range' => 'Ein Port von 1024 oder höher ist erforderlich.',
 'ovpn mtu-disc' => 'Path MTU Discovery',
 'ovpn mtu-disc with mssfix or fragment' => 'Path MTU Discovery kann nicht gemeinsam mit mssfix oder fragment verwendet werden.',
 'ovpn mtu-disc yes' => 'Forciert',
 'ovpn no connections' => 'Keine aktiven OpenVPN Verbindungen',
-'ovpn on blue' => 'OpenVPN auf BLAU',
-'ovpn on orange' => 'OpenVPN auf ORANGE',
-'ovpn on red' => 'OpenVPN auf ROT',
+'ovpn on blue' => 'OpenVPN auf BLAU:',
+'ovpn on orange' => 'OpenVPN auf ORANGE:',
+'ovpn on red' => 'OpenVPN auf ROT:',
 'ovpn port in root range' => 'Ein Port von 1024 oder höher ist erforderlich.',
+'ovpn reneg sec' => 'Session Key Lifetime',
 'ovpn routes push' => 'Routen (eine pro Zeile) z.b. 192.168.10.0/255.255.255.0 192.168.20.0/24',
 'ovpn routes push options' => 'Route push Optionen',
 'ovpn server status' => 'OpenVPN-Server-Status',
-'ovpn subnet' => 'OpenVPN-Subnetz (z.B. 10.0.10.0/255.255.255.0)',
+'ovpn subnet' => 'OpenVPN-Subnetz:',
 'ovpn subnet is invalid' => 'Das OpenVPN-Subnetz ist ungültig.',
 'ovpn subnet overlap' => 'OpenVPNSubnetz überschneidet sich mit  ',
 'ovpn_fastio' => 'Fast-IO',
 'profile saved' => 'Profil gespeichert: ',
 'profiles' => 'Profile:',
 'proto' => 'Proto',
-'protocol' => 'Protokoll',
+'protocol' => 'Protokoll:',
 'proxy' => 'Proxy',
 'proxy access graphs' => 'Diagramme zur Proxyauslastung',
 'proxy admin password' => 'Cache Administrator Passwort',
 'resetglobals' => 'Globale Einstellungen zurücksetzen',
 'resetpolicy' => 'Policy zurücksetzen',
 'resetshares' => 'Shares zurücksetzen?',
-'resetting the vpn configuration will remove the root ca, the host certificate and all certificate based connections' => 'Das Zurücksetzen der VPN-Konfiguration wird die Root-CA, die Host-Zertifikate und alle weiteren Zertifikate und alle zertifikatsbasierten Verbindungen entfernen',
+'resetting the vpn configuration will remove the root ca, the host certificate and all certificate based connections' => 'Das Löschen des X509 wird die Root-CA, die Host-Zertifikate und alle zertifikatsbasierten Verbindungen entfernen.',
 'restart' => 'Neustart',
 'restart ovpn server' => 'OpenVPN-Server neu starten',
 'restore' => 'Wiederherstellen',
 'show ca certificate' => 'CA Zertifikat anzeigen',
 'show certificate' => 'Zertifikat anzeigen',
 'show crl' => 'Certificate Revocation List anzeigen',
+'show dh' => 'Diffie-Hellman-Parameter anzeigen',
 'show host certificate' => 'Host-Zertifikat anzeigen',
 'show last x lines' => 'die letzten x Zeilen anzeigen',
 'show root certificate' => 'Root-Zertifikat anzeigen',
 'snort hits' => 'Gesamtanzahl der aktivierten Intrusion-Regeln für',
 'snort working' => 'Snort führt gerade eine Aufgabe aus... Bitte warten Sie, bis diese erfolgreich beendet wurde.',
 'socket options' => 'Socket Options',
+'software version' => 'Software-Version',
 'sort ascending' => 'Sortiere aufsteigend',
 'sort descending' => 'Sortiere absteigend',
 'sound' => 'Klang',
 'source ip' => 'Quell-IP-Adresse',
 'source ip and port' => 'Quell-IP:Port',
 'source ip bad' => 'Ungültige Quell-IP-Adresse.',
+'source ip country' => 'Quell-IP-Adresse Land',
 'source ip in use' => 'Benutzte Quell-IP:',
 'source ip or net' => 'Quellen-IP oder Netz',
 'source net' => 'Quell-Netz',
 'updxlrtr weekly' => 'wöchentlich',
 'updxlrtr year' => 'einem Jahr',
 'upgrade' => 'upgrade',
-'uplink' => 'Uplink',
 'uplink speed' => 'Uplink-Geschwindigkeit (kBit/sek)',
 'uplink std class' => 'Uploadstandardklasse',
 'upload' => 'Hochladen',
 'upload a certificate' => 'Ein Zertifikat hochladen:',
 'upload a certificate request' => 'Eine Zertifikatsanfrage hochladen:',
 'upload ca certificate' => 'CA-Zertifikat hochladen',
+'upload dh key' => 'Diffie-Hellman-Parameter hochladen',
 'upload file' => 'Datei zum hochladen',
 'upload new ruleset' => 'Neuen Regelsatz hochladen',
 'upload p12 file' => 'PKCS12-Datei hochladen',
 'valid root certificate already exists' => 'Ein gültiges Root-Zertifikat existiert bereits.',
 'valid till' => 'Gültig bis',
 'vci number' => 'VCI-Nummer:',
+'vendor' => 'Hersteller',
 'view log' => 'Log anzeigen',
 'virtual address' => 'Virtuelle Addresse',
 'virtual private networking' => 'Virtuelles Privates Netzwerk',
 'vpn aggrmode' => 'IKE Aggressive Mode zugelassen. Wenn möglich, vermeiden (preshared Schlüssel wird im Klartext übertragen)!',
 'vpn altname syntax' => 'Der Subjekt Alternativ Name ist eine durch Komma getrennte Liste von Email, DNS, URI, RID und IP Objekten. <br />Email: eine Email Adresse. Syntax Email: \'copy\' benutzt die Email Adresse aus dem Zertifikatfeld. <br />DNS: ein gültiger Domain Name.<br />URI: eine gültige URI.<br />RID: Registriertes Objekt Identifikation.<br />IP: eine IP Adresse.<br />Bitte beachten: der Zeichensatz ist eingeschränkt und die Groß-/Kleinschreibung ist entscheidend.<br />Beispiel:<br /><b>email:</b>info@ipfire.org<b>,email:</b>copy<b>,DNS:</b>www.ipfire.org<b>,IP:</b>127.0.0.1<b>,URI:</b>http://url/nach/irgendwo',
 'vpn auth-dn' => 'Peer wird identifiziert durch entweder ein IPV4_ADDR, FQDN, USER_FQDN oder DER_ASN1_DN string in Remote ID Feld',
-'vpn configuration main' => 'VPN-Konfiguration',
 'vpn delayed start' => 'Verzögerung bevor VPN gestartet wird (Sekunden)',
 'vpn delayed start help' => 'Falls notwendig, kann diese Verzögerung dazu verwendet werden, um Dynamic-DNS-Updates ordnungsgemäß anzuwenden. 60 ist ein gängiger Wert, wenn ROT (RED) eine dynamische IP Adresse ist.',
 'vpn incompatible use of defaultroute' => 'Hostname=%defaultroute nicht zulässig',
index de29f34ec48c4a6c6ce1f5c2a303f97ddb291827..e0686f3aa1654a98f9b810267a88c81ab0cbcfa4 100644 (file)
@@ -10,7 +10,6 @@
 'Choose Rule' => 'Choose <u>one</u> of the following rules.',
 'Class' => 'Class',
 'Class was deleted' => 'with potential subclasses was deleted',
-'Client status and controlc' => 'Client status and control:',
 'ConnSched action' => 'Action:',
 'ConnSched add action' => 'Add action',
 'ConnSched change profile title' => 'Change to profile:',
@@ -40,6 +39,8 @@
 'MB read' => 'MB read',
 'MB written' => 'MB written',
 'MTU' => 'MTU size:',
+'MTU settings' => 'MTU settings:',
+'Number of Countries for the pie chart' => 'Number of Countries for the pie chart',
 'Number of IPs for the pie chart' => 'Number of IPs for the pie chart',
 'Number of Ports for the pie chart' => 'Number of ports for the pie chart',
 'OVPN' => 'OpenVPN',
 'behind a proxy' => 'Behind a proxy:',
 'bewan adsl pci st' => 'TO BE REMOVED',
 'bewan adsl usb' => 'TO BE REMOVED',
-'bit' => 'Bit',
+'bit' => 'bit',
 'bitrate' => 'Bitrate',
 'bleeding rules' => 'Bleeding Edge Snort Rules',
 'blue' => 'BLUE',
 'cant change certificates' => 'Can\'t change certificates.',
 'cant enable xtaccess' => 'The associated port forwarding rule is disabled, therefore you cannot enable external access for this rule.',
 'cant start openssl' => 'Can\'t start OpenSSL',
+'capabilities' => 'Capabilities',
 'caps all' => 'ALL',
 'capsclosed' => 'DISCONNECTED',
 'capsinactive' => 'INACTIVE',
 'december' => 'December',
 'deep scan directories' => 'Scan recursive',
 'def lease time' => 'Default Lease Time',
+'default' => 'Default',
 'default ip' => 'Default IP address',
 'default lease time' => 'Default lease time (mins):',
 'default networks' => 'Default networks',
 'details' => 'Details',
 'device' => 'Device',
 'devices on blue' => 'Devices on BLUE',
+'dh' => 'Diffie-Hellman parameters',
+'dh key move failed' => 'Diffie-Hellman parameters move failed.',
+'dh key warn' => 'Creating Diffie-Hellman parameters with lengths of 1024 or 2048 bits takes up to several minutes. Lengths of 3072 or 4096 bits might needs several hours. Please be patient.',
+'dh key warn1' => 'For weak systems or systems with little entropy, it is recommended to upload long Diffie-Hellman parameters by usage of the upload function.',
+'dh name is invalid' => 'Name is invalid, please use "dh1024.pem".',
+'dh parameter' => 'Diffie-Hellman parameters',
 'dhcp advopt add' => 'Add a DHCP option',
 'dhcp advopt added' => 'DHCP option added',
 'dhcp advopt blank value' => 'DHCP Option value cannot be empty.',
 'done' => 'Do it',
 'dos charset' => 'DOS Charset',
 'down and up speed' => 'Enter your Down- and Uplink-Speed <br /> and then press <i>Save</i>.',
-'downlink' => 'Downlink',
 'downlink speed' => 'Downlink speed (kbit/sec)',
 'downlink std class' => 'downlink standard class',
 'download' => 'download',
 'download ca certificate' => 'Download CA certificate',
 'download certificate' => 'Download certificate',
+'download dh parameter' => 'Download Diffie-Hellman parameters',
 'download host certificate' => 'Download host certificate',
 'download new ruleset' => 'Download new ruleset',
 'download pkcs12 file' => 'Download PKCS12 file',
 'firewall log' => 'Firewall log',
 'firewall log viewer' => 'Firewall Log Viewer',
 'firewall logs' => 'Firewall Logs',
+'firewall logs country' => 'Fw-Loggraphs (Country)',
 'firewall logs ip' => 'Fw-Loggraphs (IP)',
 'firewall logs port' => 'Fw-Loggraphs (Port)',
 'firewall rules' => 'Firewall Rules',
 'firewallhits' => 'firewallhits',
 'firmware' => 'Firmware',
 'firmware upload' => 'Upload Firmware/Drivers',
-'first' => 'First',
 'fixed ip lease added' => 'Fixed IP lease added',
 'fixed ip lease modified' => 'Fixed IP lease modified',
 'fixed ip lease removed' => 'Fixed IP lease removed',
 'g.lite' => 'TO BE REMOVED',
 'gateway' => 'Gateway',
 'gateway ip' => 'Gateway IP',
+'gen dh' => 'Generate new Diffie-Hellman parameters',
 'gen static key' => 'Generate a static key',
 'generate' => 'Generate root/host zertifikate',
 'generate a certificate' => 'Generate a certificate:',
+'generate dh key' => 'Generate Diffie-Hellman parameters',
 'generate iso' => 'Generate ISO',
 'generate root/host certificates' => 'Generate root/host certificates',
 'generate tripwire keys and init' => 'generate tripwire keys and init',
 'ike integrity' => 'IKE Integrity:',
 'ike lifetime' => 'IKE Lifetime:',
 'ike lifetime should be between 1 and 8 hours' => 'IKE lifetime should be between 1 and 8 hours.',
+'imei' => 'IMEI',
 'import' => 'Import',
 'importkey' => 'Import PSK',
+'imsi' => 'IMSI',
 'in' => 'In',
 'inactive' => 'inactive',
 'include logfiles' => 'Include logfiles',
 'lan' => 'LAN',
 'lang' => 'en',
 'languagepurpose' => 'Select the language you wish IPFire to display in:',
-'last' => 'Last',
 'last activity' => 'Last Activity',
 'lateprompting' => 'Lateprompting',
 'lease expires' => 'Lease expires',
 'local hard disk' => 'Hard disk',
 'local master' => 'Local Master',
 'local ntp server specified but not enabled' => 'Local NTP server specified but not enabled',
-'local subnet' => 'Local Subnet:',
+'local subnet' => 'Local subnet:',
 'local subnet is invalid' => 'Local subnet is invalid.',
 'local vpn hostname/ip' => 'Local VPN Hostname/IP',
 'localkey' => 'Localkey',
 'missing dat' => 'Encrypted archive not found',
 'missing gz' => 'Unencrypted archive not found',
 'mode' => 'Mode',
+'model' => 'Model',
 'modem' => 'Modem',
 'modem configuration' => 'Modem configuration',
+'modem hardware details' => 'Modem Hardware',
+'modem information' => 'Modem Information',
+'modem network bit error rate' => 'Bit Error Rate',
+'modem network information' => 'Network Information',
+'modem network mode' => 'Network Mode',
+'modem network operator' => 'Network Operator',
+'modem network registration' => 'Network Registration',
+'modem network signal quality' => 'Signal Quality',
+'modem no connection' => 'No Connection',
+'modem no connection message' => 'No connection to the modem could be established.',
 'modem on com1' => 'Modem on COM1',
 'modem on com2' => 'Modem on COM2',
 'modem on com3' => 'Modem on COM3',
 'modem on com4' => 'Modem on COM4',
 'modem on com5' => 'Modem on COM5',
 'modem settings have errors' => 'Modem settings have errors',
+'modem sim information' => 'SIM Information',
 'modem speaker on' => 'Modem speaker on:',
+'modem status' => 'Modem Status',
 'modify' => 'Modify',
 'modulation' => 'Modulation',
 'monday' => 'Monday',
 'network traffic graphs others' => 'Network (others)',
 'network updated' => 'Custom Network updated',
 'networks settings' => 'Firewall - Network settings',
+'never' => 'Never',
 'new optionsfw later' => 'Some options need a reboot to take effect',
 'new optionsfw must boot' => 'You must reboot your IPFire',
 'newer' => 'Newer',
 'nonetworkname' => 'No Network Name entered',
 'noservicename' => 'No Service Name entered',
 'not a valid ca certificate' => 'Not a valid CA certificate.',
+'not a valid dh key' => 'Not a valid Diffie-Hellman parameters file. Please use a length of 1024, 2048, 3072 or 4096 bits and the PKCS#3 format.',
 'not enough disk space' => 'Not enough disk space',
 'not present' => '<b>Not</b> present',
 'not running' => 'not running',
 'ovpn' => 'OpenVPN',
 'ovpn con stat' => 'OpenVPN Connection Statistics',
 'ovpn config' => 'OVPN-Config',
+'ovpn crypt options' => 'Cryptographic options',
 'ovpn device' => 'OpenVPN device:',
+'ovpn dh' => 'Diffie-Hellman parameters length',
+'ovpn dh new key' => 'Generate new Diffie-Hellman parameters',
+'ovpn dh parameters' => 'Diffie-Hellman parameters options',
+'ovpn dh upload' => 'Upload new Diffie-Hellman parameters',
 'ovpn dl' => 'OVPN-Config Download',
+'ovpn engines' => 'Crypto engine',
 'ovpn errmsg green already pushed' => 'Route for green network is always set',
 'ovpn errmsg invalid ip or mask' => 'Invalid network-address or subnetmask',
+'ovpn generating the root and host certificates' => 'Generating the root and host certifictae can take a long time.',
+'ovpn ha' => 'Hash algorithm',
+'ovpn hmac' => 'HMAC options',
 'ovpn log' => 'OVPN-Log',
 'ovpn mgmt in root range' => 'A port number of 1024 or higher is required.',
 'ovpn mtu-disc' => 'Path MTU Discovery',
 'ovpn mtu-disc with mssfix or fragment' => 'Path MTU Discovery cannot be used with mssfix or fragment.',
 'ovpn mtu-disc yes' => 'Forced',
 'ovpn no connections' => 'No active OpenVPN connections',
-'ovpn on blue' => 'OpenVPN on BLUE',
-'ovpn on orange' => 'OpenVPN on ORANGE',
-'ovpn on red' => 'OpenVPN on RED',
+'ovpn on blue' => 'OpenVPN on BLUE:',
+'ovpn on orange' => 'OpenVPN on ORANGE:',
+'ovpn on red' => 'OpenVPN on RED:',
 'ovpn port in root range' => 'A port number of 1024 or higher is required.',
+'ovpn reneg sec' => 'Session key lifetime:',
 'ovpn routes push' => 'Routes (one per line) e.g. 192.168.10.0/255.255.255.0 192.168.20.0/24',
 'ovpn routes push options' => 'Route push options',
 'ovpn server status' => 'Current OpenVPN server status:',
-'ovpn subnet' => 'OpenVPN subnet (e.g. 10.0.10.0/255.255.255.0)',
+'ovpn subnet' => 'OpenVPN subnet:',
 'ovpn subnet is invalid' => 'OpenVPN subnet is invalid.',
 'ovpn subnet overlap' => 'OpenVPN Subnet overlaps with : ',
 'ovpn_fastio' => 'Fast-IO',
-'ovpn_fragment' => 'Fragmentsize',
 'ovpn_mssfix' => 'MSSFIX Size',
 'ovpn_mtudisc' => 'MTU-Discovery',
 'ovpn_processprio' => 'Process priority',
 'profile saved' => 'Profile saved: ',
 'profiles' => 'Profiles:',
 'proto' => 'Proto',
-'protocol' => 'Protocol',
+'protocol' => 'Protocol:',
 'proxy' => 'Proxy',
 'proxy access graphs' => 'Proxy access graphs',
 'proxy admin password' => 'Cache administrator password',
 'resetglobals' => 'Reset global settings',
 'resetpolicy' => 'Reset policy to default',
 'resetshares' => 'Reset shares?',
-'resetting the vpn configuration will remove the root ca, the host certificate and all certificate based connections' => 'Resetting the VPN configuration will remove the root CA, the host certificate and all certificate based connections',
+'resetting the vpn configuration will remove the root ca, the host certificate and all certificate based connections' => 'Resetting the X509 remove the root CA, the host certificate and all certificate based connections.',
 'restart' => 'Restart',
 'restart ovpn server' => 'Restart OpenVPN server',
 'restore' => 'Restore',
 'show ca certificate' => 'Show CA certificate',
 'show certificate' => 'Show certificate',
 'show crl' => 'Show certificate revocation list',
+'show dh' => 'Show Diffie-Hellman parameters',
 'show host certificate' => 'Show host certificate',
 'show last x lines' => 'Show last x lines',
 'show lines' => 'Show lines',
 'snort hits' => 'Total of number of Intrusion rules activated for',
 'snort working' => 'Snort is working ... Please wait until all operations have completed successfully.',
 'socket options' => 'Socket options',
+'software version' => 'Software Version',
 'sort ascending' => 'Sort ascending',
 'sort descending' => 'Sort descending',
 'sound' => 'Sound',
 'source ip' => 'Source IP',
 'source ip and port' => 'Source IP: Port',
 'source ip bad' => 'Not a valid IP address or a network address.',
+'source ip country' => 'Source IP Country',
 'source ip in use' => 'Source IP in use:',
 'source ip or net' => 'Source IP or Net',
 'source net' => 'Source Net',
 'telephone not set' => 'Telephone not set.',
 'template' => 'Preset',
 'template warning' => 'You have two options to set up Qos. The First, you press the save button and generate the classes and rules on your own. The second, you press the preset button and classes and rules will be set up by a template.',
+'teovpn_fragment' => 'Fragmentsize',
 'test' => 'test',
 'test email could not be sent' => 'Could not sent Testemail',
 'test email was sent' => 'Testemail was send successfully',
 'updxlrtr weekly' => 'weekly',
 'updxlrtr year' => 'one year',
 'upgrade' => 'upgrade',
-'uplink' => 'Uplink',
 'uplink speed' => 'Uplink speed (kbit/sec)',
 'uplink std class' => 'uplink standard class',
 'upload' => 'Upload',
 'upload a certificate' => 'Upload a certificate:',
 'upload a certificate request' => 'Upload a certificate request:',
 'upload ca certificate' => 'Upload CA certificate',
+'upload dh key' => 'Upload Diffie-Hellman parameters',
 'upload fcdsl.o' => 'TO BE REMOVED',
 'upload file' => 'Upload file',
 'upload new ruleset' => 'Upload new ruleset',
 'valid root certificate already exists' => 'A valid root certificate already exists.',
 'valid till' => 'Valid till',
 'vci number' => 'VCI number:',
+'vendor' => 'Vendor',
 'view log' => 'view log',
 'virtual address' => 'Virtual Address',
 'virtual private networking' => 'Virtual Private Networking',
 'vpn aggrmode' => 'IKE aggressive mode allowed. Avoid if possible (preshared key is transmitted in clear text)!',
 'vpn altname syntax' => 'SubjectAltName is a comma separated list of e-mail, dns, uri, rid and ip objects.<br />email:an email address. Syntax email:copy takes the email field from the cert to be used.<br />DNS:a valid domain name.<br />URI:any valid uri.<br />RID:registered object identifier.<br />IP:an IP address.<br />Note:charset is limited and case is significant.<br />Example:<br /><b>e-mail:</b>ipfire@foo.org<b>,email:</b>copy<b>,DNS:</b>www.ipfire.org<b>,IP:</b>127.0.0.1<b>,URI:</b>http://url/to/something',
 'vpn auth-dn' => 'Peer is identified by either IPV4_ADDR, FQDN, USER_FQDN or DER_ASN1_DN string in remote ID field',
-'vpn configuration main' => 'VPN Configuration',
 'vpn delayed start' => 'Delay before launching VPN (seconds)',
 'vpn delayed start help' => 'If required, this delay can be used to allow dynamic DNS updates to propagate properly. 60 is a common value when RED is a dynamic IP.',
 'vpn incompatible use of defaultroute' => 'hostname=%defaultroute not allowed',
index fb0f2e9a2f92c2f2238e14e8b0e9b10164db1396..415766d123da4b2bbd5ab7c87fa8ffda8b4b906b 100644 (file)
@@ -57,8 +57,6 @@ DIR_CONF    = $(LFS_BASEDIR)/config
 DIR_INFO    = $(LFS_BASEDIR)/log
 DIR_TMP     = /tmp
 
-KGCC = gcc
-
 ###############################################################################
 # Common Macro Definitions
 ###############################################################################
index 8d7885975110d1ce35f424b252f0fe494f6d575d..f44e7b40ebb0301f5d83429f47e7454db5ecf947 100644 (file)
--- a/lfs/cacti
+++ b/lfs/cacti
@@ -24,7 +24,7 @@
 
 include Config
 
-VER        = 0.8.7h
+VER        = 0.8.8b
 
 THISAPP    = cacti-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
@@ -32,7 +32,7 @@ DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 TARGET     = $(DIR_INFO)/$(THISAPP)
 PROG       = cacti
-PAK_VER    = 4
+PAK_VER    = 5
 
 DEPS       = "netsnmpd mysql"
 
@@ -44,7 +44,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = 58c9371341f49a190ae11a85118e598d
+$(DL_FILE)_MD5 = acb40deae073ca22e5c01a8e3ba389fb
 
 install : $(TARGET)
 
@@ -54,7 +54,6 @@ download :$(patsubst %,$(DIR_DL)/%,$(objects))
 
 md5 : $(subst %,%_MD5,$(objects))
 
-
 dist: 
        @$(PAK)
 
@@ -78,6 +77,21 @@ $(subst %,%_MD5,$(objects)) :
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
        @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
+
+       cd $(DIR_APP) && patch -p1 -i $(DIR_SRC)/src/patches/cacti/cacti-0.8.8a-legal.patch
+       cd $(DIR_APP) && patch -p1 -i $(DIR_SRC)/src/patches/cacti/cacti-0.8.8a-replace_treeview_by_jquery.jstree.patch
+       cd $(DIR_APP) && patch -p2 -i $(DIR_SRC)/src/patches/cacti/cacti-0.8.8b-html-injection.patch
+       cd $(DIR_APP) && patch -p2 -i $(DIR_SRC)/src/patches/cacti/cacti-0.8.8b-remote-command-execution.patch
+       cd $(DIR_APP) && patch -p2 -i $(DIR_SRC)/src/patches/cacti/cacti-0.8.8b-rra-comments.patch
+       cd $(DIR_APP) && patch -p2 -i $(DIR_SRC)/src/patches/cacti/cacti-0.8.8b-sanitize-variables.patch
+       cd $(DIR_APP) && patch -p2 -i $(DIR_SRC)/src/patches/cacti/cacti-0.8.8b-sql-injection-shell-escaping.patch
+       cp -vf \
+               $(DIR_SRC)/config/cacti/d.gif \
+               $(DIR_SRC)/config/cacti/d.png \
+               $(DIR_SRC)/config/cacti/throbber.gif \
+               $(DIR_APP)/include/js/jquery/themes/default/
+       cd $(DIR_APP) && rm -rf include/treeview
+
        @rm -rf /var/cacti /usr/share/cacti
        mkdir -pv /var/cacti /usr/share/cacti
 
@@ -92,6 +106,9 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        ln -s /var/cacti/log /usr/share/cacti/log
        ln -s /var/cacti/rra /usr/share/cacti/rra
 
+       -mkdir -pv /etc/logrotate.d
+       install -v -m 644 $(DIR_SRC)/config/cacti/cacti.logrotate /etc/logrotate.d/cacti
+
        chown -R nobody:nobody /var/cacti/rra /var/cacti/log
        @rm -rf $(DIR_APP)
        @$(POSTBUILD)
index 3232d38ecbd7452974dd33838080fed23ad47ef9..fcb08b0d495713ac886d2019a12b7d1a503c0e74 100644 (file)
@@ -80,6 +80,7 @@ $(TARGET) :
        cp $(DIR_SRC)/config/cfgroot/lang.pl                    $(CONFIG_ROOT)/
        cp $(DIR_SRC)/config/cfgroot/countries.pl               $(CONFIG_ROOT)/
        cp $(DIR_SRC)/config/cfgroot/graphs.pl                  $(CONFIG_ROOT)/
+       cp $(DIR_SRC)/config/cfgroot/modem-lib.pl               $(CONFIG_ROOT)/
        cp $(DIR_SRC)/config/cfgroot/advoptions-list            $(CONFIG_ROOT)/dhcp/advoptions-list
        cp $(DIR_SRC)/config/cfgroot/connscheduler-lib.pl       $(CONFIG_ROOT)/connscheduler/lib.pl
        cp $(DIR_SRC)/config/cfgroot/connscheduler.conf         $(CONFIG_ROOT)/connscheduler
diff --git a/lfs/daq b/lfs/daq
index e6fd8fbdf462885cddb7a8ce0d119880ca84f873..fa8f2a89c5e7dbd228b5fb3089dd9f1ff81123fc 100644 (file)
--- a/lfs/daq
+++ b/lfs/daq
@@ -24,7 +24,7 @@
 
 include Config
 
-VER        = 2.0.1
+VER        = 2.0.2
 
 THISAPP    = daq-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
@@ -40,7 +40,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = 044aa3663d44580d005293eeb8ccf175
+$(DL_FILE)_MD5 = 865bf9b750a2a2ca632591a3c70b0ea0
 
 install : $(TARGET)
 
index 58c99c43c8bcff1e736c7537d12c4b97cdd48475..10a42ee766c09fa764e571fc9a68bbb5effbcc34 100644 (file)
@@ -27,7 +27,7 @@ include Config
 VERSUFIX = ipfire$(KCFG)
 MODPATH = /lib/modules/$(KVER)-$(VERSUFIX)/kernel/drivers/net/e1000e
 
-VER        = 2.5.4
+VER        = 3.0.4
 
 THISAPP    = e1000e-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
@@ -43,7 +43,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = 8a57fc73335bf1ab0e16a02ecccdae76
+$(DL_FILE)_MD5 = 2d8364cd2043ef5c71291a4ca8b8084e
 
 install : $(TARGET)
 
diff --git a/lfs/icinga b/lfs/icinga
new file mode 100644 (file)
index 0000000..691d83d
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#                                                                             #
+# IPFire.org - A linux based firewall                                         #
+# Copyright (C) 2007-2012  IPFire Team  <info@ipfire.org>                     #
+#                                                                             #
+# This 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 3 of the License, or           #
+# (at your option) any later version.                                         #
+#                                                                             #
+# This program is distributed in the hope that it will be useful,             #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of              #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
+# GNU General Public License for more details.                                #
+#                                                                             #
+# You should have received a copy of the GNU General Public License           #
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
+#                                                                             #
+###############################################################################
+
+###############################################################################
+# Definitions
+###############################################################################
+
+include Config
+
+VER        = 1.11.4
+PLUGIN_VER = 2.0.2
+
+THISAPP    = icinga-$(VER)
+DL_FILE    = $(THISAPP).tar.gz
+DL_FROM    = $(URL_IPFIRE)
+DIR_APP    = $(DIR_SRC)/$(THISAPP)
+TARGET     = $(DIR_INFO)/$(THISAPP)
+PROG       = icinga
+PAK_VER    = 1
+
+DEPS       = ""
+
+CFLAGS    += -fno-strict-aliasing
+
+###############################################################################
+# Top-level Rules
+###############################################################################
+
+objects = $(DL_FILE) nagios-plugins-$(PLUGIN_VER).tar.gz
+
+$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
+nagios-plugins-$(PLUGIN_VER).tar.gz = \
+       $(DL_FROM)/nagios-plugins-$(PLUGIN_VER).tar.gz
+
+$(DL_FILE)_MD5 = cfe64b91ec84f5431e53959e31ff07b5
+nagios-plugins-$(PLUGIN_VER).tar.gz_MD5 = 2f6d9c43adcf9f024175e48a44d099d4
+
+install : $(TARGET)
+
+check : $(patsubst %,$(DIR_CHK)/%,$(objects))
+
+download :$(patsubst %,$(DIR_DL)/%,$(objects))
+
+md5 : $(subst %,%_MD5,$(objects))
+
+dist: 
+       @$(PAK)
+
+###############################################################################
+# Downloading, checking, md5sum
+###############################################################################
+
+$(patsubst %,$(DIR_CHK)/%,$(objects)) :
+       @$(CHECK)
+
+$(patsubst %,$(DIR_DL)/%,$(objects)) :
+       @$(LOAD)
+
+$(subst %,%_MD5,$(objects)) :
+       @$(MD5)
+
+###############################################################################
+# Installation Details
+###############################################################################
+
+$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
+       @$(PREBUILD)
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
+       @rm -rf $(DIR_SRC)/nagios-plugins-$(PLUGIN_VER) && cd $(DIR_SRC) && \
+               tar axf $(DIR_DL)/nagios-plugins-$(PLUGIN_VER).tar.gz
+
+       # Compile core
+       cd $(DIR_APP) && \
+               ./configure \
+                       --prefix=/usr \
+                       --sysconfdir=/etc/icinga \
+                       --datadir=/usr/share/icinga \
+                       --datarootdir=/usr/share/icinga \
+                       --sbindir=/usr/share/icinga/cgi-bin \
+                       --localstatedir=/var/icinga \
+                       --libdir=/usr/lib/icinga \
+                       --libexecdir=/usr/lib/icinga/plugins \
+                       --with-lockfile=/var/run/icinga.pid \
+                       --with-httpd-conf=/etc/httpd/conf/conf.d \
+                       --with-icinga-user=nobody \
+                       --with-icinga-group=nobody \
+                       --enable-event-broker \
+                       --enable-embedded-perl \
+                       --disable-idoutils
+       cd $(DIR_APP) && make all $(MAKETUNING)
+
+       # Compile plugins
+       cd $(DIR_SRC)/nagios-plugins-$(PLUGIN_VER) && \
+               ./configure \
+                       --prefix=/usr \
+                       --libexecdir=/usr/lib/icinga/plugins \
+                       --with-nagios-user=nobody \
+                       --with-nagios-group=nobody
+       cd $(DIR_SRC)/nagios-plugins-$(PLUGIN_VER) && make $(MAKETUNING)
+
+       # Install core
+       cd $(DIR_APP) && make \
+               install install-init install-commandmode install-config \
+               install-webconf install-eventhandlers
+       rm -vf /etc/httpd/conf/conf.d/icinga.conf
+       install -v -m 644 $(DIR_SRC)/config/icinga/icinga.conf \
+               /etc/httpd/conf/vhosts.d/icinga.conf
+
+       # Install plugins
+       cd $(DIR_SRC)/nagios-plugins-$(PLUGIN_VER) && make install
+
+       ln -svf /etc/rc.d/init.d/icinga /etc/rc.d/rc3.d/S67icinga
+       ln -svf /etc/rc.d/init.d/icinga /etc/rc.d/rc0.d/K33icinga
+       ln -svf /etc/rc.d/init.d/icinga /etc/rc.d/rc6.d/K33icinga
+
+       install -v -m 644 $(DIR_SRC)/config/backup/includes/icinga \
+                        /var/ipfire/backup/addons/includes/icinga
+
+       @rm -rf $(DIR_APP) $(DIR_SRC)/nagios-plugins-$(PLUGIN_VER)
+       @$(POSTBUILD)
diff --git a/lfs/igb b/lfs/igb
index 9303ffb86df071f9c5764c392994834680dac3af..b8aadc48b66f414024bd35d06fcacc34effda492 100644 (file)
--- a/lfs/igb
+++ b/lfs/igb
@@ -27,7 +27,7 @@ include Config
 VERSUFIX   = ipfire$(KCFG)
 MODPATH = /lib/modules/$(KVER)-$(VERSUFIX)/kernel/drivers/net/ethernet/intel/igb/
 
-VER        = 5.0.6
+VER        = 5.1.2
 
 THISAPP    = igb-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
@@ -43,7 +43,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = 701717fbbba6065af4ff5138bd3a3a9c
+$(DL_FILE)_MD5 = c222b04f7e43afffc105d0d0db60c6c0
 
 install : $(TARGET)
 
index deb92357a7dd580b90b3728b6d8c0da450f2286a..9310c1f285e5a606b4253816e884f6e25578d6e0 100644 (file)
@@ -74,6 +74,10 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/iputils-20020927-rh.patch
        cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/iputils-glibckernheaders.patch
        cd $(DIR_APP) && make ping
-       cd $(DIR_APP) && install -m 0755 ping /usr/bin
+       cd $(DIR_APP) && install -m 4755 ping /usr/bin
+
+       # Some scripts expect ping in /bin/ping.
+       ln -svf ../usr/bin/ping /bin/ping
+
        @rm -rf $(DIR_APP)
        @$(POSTBUILD)
index 2bf32d39b8cf9f521cf0955c4495d108ebfaaf3c..9146ad935f2ab2c79cde397a17fa523b0d13d612 100644 (file)
--- a/lfs/linux
+++ b/lfs/linux
 
 include Config
 
-VER        = 3.10.39
+VER        = 3.10.40
 
 RPI_PATCHES = linux-3.10.38-grsec-1b49b45
-GRS_PATCHES = grsecurity-2.9.1-3.10.39-ipfire1.patch.xz
+GRS_PATCHES = grsecurity-2.9.1-3.10.40-ipfire1.patch.xz
 
 THISAPP    = linux-$(VER)
 DL_FILE    = linux-$(VER).tar.xz
@@ -36,7 +36,7 @@ DIR_APP    = $(DIR_SRC)/$(THISAPP)
 CFLAGS     =
 CXXFLAGS   =
 
-PAK_VER    = 44
+PAK_VER    = 45
 DEPS      = ""
 
 VERSUFIX=ipfire$(KCFG)
@@ -74,9 +74,9 @@ $(DL_FILE)                            = $(URL_IPFIRE)/$(DL_FILE)
 rpi-patches-$(RPI_PATCHES).patch.xz    = $(URL_IPFIRE)/rpi-patches-$(RPI_PATCHES).patch.xz
 $(GRS_PATCHES)                         = $(URL_IPFIRE)/$(GRS_PATCHES)
 
-$(DL_FILE)_MD5                         = 74db7cc558a1a72ebf5044d286e2bc47
+$(DL_FILE)_MD5                         = c1dca08f0f1a60f29b7caa9ff45582a8
 rpi-patches-$(RPI_PATCHES).patch.xz_MD5        = a7408e8bad57b4b2cb677dd5a0bfb7ff
-$(GRS_PATCHES)_MD5                     = 6296b7ec4146544249075249e338ceb3
+$(GRS_PATCHES)_MD5                     = f46506dd67e459fc41d60d0641323668
 
 install : $(TARGET)
 
@@ -120,6 +120,9 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        # Layer7-patch
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.10-layer7-filter.patch
 
+       # pie packet scheduler
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.10.39-pie_packet_sch.patch
+
        # Grsecurity-patches
 ifneq "$(KCFG)" "-headers"
        cd $(DIR_APP) && xz -c -d $(DIR_DL)/$(GRS_PATCHES) | patch -Np1
@@ -250,26 +253,26 @@ else
 
        # Cleanup kernel source
        cp $(DIR_SRC)/config/kernel/kernel.config.$(MACHINE)-$(VERSUFIX) $(DIR_APP)/.config
-       cd $(DIR_APP) && make CC="$(KGCC)" oldconfig
-       cd $(DIR_APP) && make CC="$(KGCC)" clean
+       cd $(DIR_APP) && make oldconfig
+       cd $(DIR_APP) && make clean
        cd $(DIR_APP) && sed -i -e 's/EXTRAVERSION\ =.*/EXTRAVERSION\ =\ -$(VERSUFIX)/' Makefile
 
 ifeq "$(KCFG)" "-kirkwood"
-       cd $(DIR_APP) && make $(MAKETUNING) CC="$(KGCC)" uImage modules
+       cd $(DIR_APP) && make $(MAKETUNING) uImage modules
        cd $(DIR_APP) && cp -v arch/arm/boot/uImage /boot/vmlinuz-$(VER)-$(VERSUFIX)
        cd $(DIR_APP) && cp -v arch/arm/boot/uImage /boot/uImage-$(VERSUFIX)
 else
 ifeq "$(KCFG)" "-multi"
-       cd $(DIR_APP) && make $(MAKETUNING) CC="$(KGCC)" zImage modules
+       cd $(DIR_APP) && make $(MAKETUNING) zImage modules
        cd $(DIR_APP) && cp -v arch/arm/boot/zImage /boot/vmlinuz-$(VER)-$(VERSUFIX)
        cd $(DIR_APP) && cp -v arch/arm/boot/zImage /boot/zImage-$(VERSUFIX)
 else
 ifeq "$(KCFG)" "-rpi"
-       cd $(DIR_APP) && make $(MAKETUNING) CC="$(KGCC)" zImage modules
+       cd $(DIR_APP) && make $(MAKETUNING) zImage modules
        cd $(DIR_APP) && cp -v arch/arm/boot/zImage /boot/vmlinuz-$(VER)-$(VERSUFIX)
        cd $(DIR_APP) && cp -v arch/arm/boot/zImage /boot/kernel.img
 else
-       cd $(DIR_APP) && make $(MAKETUNING) CC="$(KGCC)" bzImage modules
+       cd $(DIR_APP) && make $(MAKETUNING) bzImage modules
        cd $(DIR_APP) && cp -v arch/i386/boot/bzImage /boot/vmlinuz-$(VER)-$(VERSUFIX)
        ln -sf vmlinuz-$(VER)-$(VERSUFIX) /boot/vmlinuz-$(VERSUFIX)
 endif
@@ -278,11 +281,11 @@ endif
        cd $(DIR_APP) && cp -v System.map /boot/System.map-$(VER)-$(VERSUFIX)
        cd $(DIR_APP) && cp -v .config /boot/config-$(VER)-$(VERSUFIX)
        ln -sf System.map-$(VER)-$(VERSUFIX) /boot/System.map-$(VERSUFIX)
-       cd $(DIR_APP) && make CC="$(KGCC)" $(MAKETUNING) modules_install
-       cd $(DIR_APP) && make CC="$(KGCC)" $(MAKETUNING) firmware_install
+       cd $(DIR_APP) && make $(MAKETUNING) modules_install
+       cd $(DIR_APP) && make $(MAKETUNING) firmware_install
 
 ifeq "$(MACHINE_TYPE)" "arm"
-       cd $(DIR_APP) && make CC="$(KGCC)" $(MAKETUNING) dtbs
+       cd $(DIR_APP) && make $(MAKETUNING) dtbs
        cd $(DIR_APP) && for f in $$(find arch/arm/boot/dts/ -name *.dtb); do \
                                mkdir -p /boot/dtb-$(VER)-$(VERSUFIX) ; \
                                install -m 644 $$f /boot/dtb-$(VER)-$(VERSUFIX)/ ; \
diff --git a/lfs/nut b/lfs/nut
index 0a5f84779ea70446263dbb1e8ef0a465677c2a02..c64c5a26b53087f5a06038447c68e519d4b40ff1 100644 (file)
--- a/lfs/nut
+++ b/lfs/nut
@@ -24,7 +24,7 @@
 
 include Config
 
-VER        = 2.6.3
+VER        = 2.7.2
 
 THISAPP    = nut-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
@@ -32,7 +32,7 @@ DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 TARGET     = $(DIR_INFO)/$(THISAPP)
 PROG       = nut
-PAK_VER    = 4
+PAK_VER    = 5
 
 DEPS       = ""
 
@@ -44,7 +44,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = 8db00c21f8bc03add6e14d15f634ec6a
+$(DL_FILE)_MD5 = c3568b42e058cfc385b46d25140dced4
 
 install : $(TARGET)
 
index 053d5819861e21180507d8d793ba2615aeb9b026..8c7c81a4916843702b71031ae9e222fc795db05d 100644 (file)
@@ -1,7 +1,7 @@
 ###############################################################################
 #                                                                             #
 # IPFire.org - A linux based firewall                                         #
-# Copyright (C) 2007-2013  IPFire Team  <info@ipfire.org>                     #
+# Copyright (C) 2007-2014  IPFire Team  <info@ipfire.org>                     #
 #                                                                             #
 # This program is free software: you can redistribute it and/or modify        #
 # it under the terms of the GNU General Public License as published by        #
 
 include Config
 
-VER        = 2.3.2
+VER        = 2.3.4
 
 THISAPP    = openvpn-$(VER)
-DL_FILE    = $(THISAPP).tar.gz
+DL_FILE    = $(THISAPP).tar.xz
 DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 TARGET     = $(DIR_INFO)/$(THISAPP)
@@ -40,7 +40,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = 06e5f93dbf13f2c19647ca15ffc23ac1
+$(DL_FILE)_MD5 = 9b70be9fb45e407117c3c9b118e4ba22
 
 install : $(TARGET)
 
@@ -69,7 +69,7 @@ $(subst %,%_MD5,$(objects)) :
 
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
-       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar Jxf $(DIR_DL)/$(DL_FILE)
        cd $(DIR_APP) && ./configure \
                --prefix=/usr \
                --sysconfdir=/var/ipfire/ovpn \
similarity index 91%
rename from lfs/vnstati
rename to lfs/perl-Device-Modem
index c7cd6edafbba72f00e2ef61faf38b82d6aa410da..f0609b9285b33e5e67b2f10a459071ee4e991ff8 100644 (file)
@@ -1,7 +1,7 @@
 ###############################################################################
 #                                                                             #
 # IPFire.org - A linux based firewall                                         #
-# Copyright (C) 2007  Michael Tremer & Christian Schmidt                      #
+# Copyright (C) 2014 IPFire Team  <info@ipfire.org>                           #
 #                                                                             #
 # This program is free software: you can redistribute it and/or modify        #
 # it under the terms of the GNU General Public License as published by        #
@@ -24,9 +24,9 @@
 
 include Config
 
-VER        = beta3
+VER        = 1.56
 
-THISAPP    = vnstati-$(VER)
+THISAPP    = Device-Modem-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
 DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
@@ -40,7 +40,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = 5652b955e16716cec48da464b083c76f
+$(DL_FILE)_MD5 = a0ec45c3e313bea27ccb476d3b725955
 
 install : $(TARGET)
 
@@ -50,9 +50,6 @@ download :$(patsubst %,$(DIR_DL)/%,$(objects))
 
 md5 : $(subst %,%_MD5,$(objects))
 
-dist: 
-       @$(PAK)
-
 ###############################################################################
 # Downloading, checking, md5sum
 ###############################################################################
@@ -73,7 +70,8 @@ $(subst %,%_MD5,$(objects)) :
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
        @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
-       cd $(DIR_APP) && make $(MAKETUNING)                                                                             LOCAL_CONFIGURE_OPTIONS="--enable-readline=yes"
+       cd $(DIR_APP) && perl Makefile.PL
+       cd $(DIR_APP) && make $(MAKETUNING)
        cd $(DIR_APP) && make install
        @rm -rf $(DIR_APP)
        @$(POSTBUILD)
similarity index 79%
rename from lfs/inetutils
rename to lfs/perl-Device-SerialPort
index ba87c9c994cbd093a983dc5cbe849397ada9d5de..3eebc07d7d4db52c607e95257188502834c00e15 100644 (file)
@@ -1,7 +1,7 @@
 ###############################################################################
 #                                                                             #
 # IPFire.org - A linux based firewall                                         #
-# Copyright (C) 2007  Michael Tremer & Christian Schmidt                      #
+# Copyright (C) 2014 IPFire Team  <info@ipfire.org>                           #
 #                                                                             #
 # This program is free software: you can redistribute it and/or modify        #
 # it under the terms of the GNU General Public License as published by        #
@@ -24,9 +24,9 @@
 
 include Config
 
-VER        = 1.4.2
+VER        = 1.000002
 
-THISAPP    = inetutils-$(VER)
+THISAPP    = Device-SerialPort-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
 DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
@@ -40,7 +40,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = df0909a586ddac2b7a0d62795eea4206
+$(DL_FILE)_MD5 = f53db3733679adc5d05d06fa530444b6
 
 install : $(TARGET)
 
@@ -70,19 +70,8 @@ $(subst %,%_MD5,$(objects)) :
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
        @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/$(THISAPP)-gcc4_fixes-3.patch
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/$(THISAPP)-daemon_fixes-1.patch
-       cd $(DIR_APP) && sed -i '/#include/a #include <stdlib.h>' libicmp/icmp_timestamp.c
-       cd $(DIR_APP) && ./configure --prefix=/usr --libexecdir=/usr/sbin \
-                               --sysconfdir=/etc --localstatedir=/var \
-                               --mandir=/usr/share/man --infodir=/usr/share/info \
-                               --disable-logger --disable-syslogd --disable-telnet --disable-telnetd
+       cd $(DIR_APP) && perl Makefile.PL
        cd $(DIR_APP) && make $(MAKETUNING)
        cd $(DIR_APP) && make install
-       mv -v /usr/bin/ping /bin
-
-       # Don't use whois command from here.
-       rm -vf /usr/bin/whois
-
        @rm -rf $(DIR_APP)
        @$(POSTBUILD)
diff --git a/lfs/ppp b/lfs/ppp
index 5d772fc04321517f232abc75327fbe09d61e6162..3c60938dcdcd65d6a208cb667af70c71ebf5579f 100644 (file)
--- a/lfs/ppp
+++ b/lfs/ppp
@@ -24,7 +24,7 @@
 
 include Config
 
-VER        = 2.4.5
+VER        = 2.4.6
 
 THISAPP    = ppp-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
@@ -42,7 +42,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = 4621bc56167b6953ec4071043fe0ec57
+$(DL_FILE)_MD5 = 3434d2cc9327167a0723aaaa8670083b
 
 install : $(TARGET)
 
@@ -73,16 +73,14 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
        @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
        cd $(DIR_APP) && rm -f include/pcap-int.h include/linux/if_pppol2tp.h
-#      cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/ppp-2.4.2-pppoatm.patch
-#      cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/ppp-2.4.2-pppoatm-persist.patch
-#      cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/ppp-2.4.1-oedod.patch
-#      cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/ppp-2.4.2-pppoatm-modprobe.patch
-#      cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/ppp-2.4.2-signal.patch
-#      cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/ppp-2.4.2-printstats.patch
-#      cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/ppp-2.4.2-close.patch
+       cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/ppp/0003-build-sys-utilize-compiler-flags-handed-to-us-by-rpm.patch
+       cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/ppp/0012-pppd-we-don-t-want-to-accidentally-leak-fds.patch
+       cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/ppp/0013-everywhere-O_CLOEXEC-harder.patch
+       cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/ppp/0014-everywhere-use-SOCK_CLOEXEC-when-creating-socket.patch
+       cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/ppp/ppp-2.4.6-increase-max-padi-attempts.patch
        cd $(DIR_APP) && sed -i -e "s+/etc/ppp/connect-errors+/var/log/connect-errors+" pppd/pathnames.h
        cd $(DIR_APP) && ./configure --prefix=/usr --disable-nls
-       cd $(DIR_APP) && make $(MAKETUNING) CC="gcc $(CFLAGS)"
+       cd $(DIR_APP) && make $(MAKETUNING) CC="gcc" RPM_OPT_FLAGS="$(CFLAGS)"
        cd $(DIR_APP) && make install
        cd $(DIR_APP) && make install-etcppp
        touch /var/log/connect-errors
index d68b97d1e5667a66320706b962c576f742886222..2fc0476b0a8e5c93bc0264074a3edca341f6641e 100644 (file)
--- a/lfs/qemu
+++ b/lfs/qemu
@@ -33,7 +33,7 @@ DIR_APP    = $(DIR_SRC)/$(THISAPP)
 TARGET     = $(DIR_INFO)/$(THISAPP)
 SUP_ARCH   = i586
 PROG       = qemu
-PAK_VER    = 13
+PAK_VER    = 14
 
 DEPS       = "sdl"
 
index 2d5d04a121b596fc8f1853a2a63a56a2d0eef742..45c17a8ad691b70bbe63a62428068c04044009e6 100644 (file)
--- a/lfs/snort
+++ b/lfs/snort
@@ -24,7 +24,7 @@
 
 include Config
 
-VER        = 2.9.5.3
+VER        = 2.9.6.1
 
 THISAPP    = snort-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
@@ -40,7 +40,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = f99465c0734a6173bfca899dcb72266b
+$(DL_FILE)_MD5 = d7c0f1ddb2e70b70acdaa4664abb5fb0
 
 install : $(TARGET)
 
@@ -70,14 +70,26 @@ $(subst %,%_MD5,$(objects)) :
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
        @rm -rf $(DIR_APP) $(DIR_SRC)/snort* && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
-       cd $(DIR_APP) && ./configure --prefix=/usr --disable-nls \
-               --sysconfdir=/etc/snort --target=i586 \
-               --enable-linux-smp-stats --enable-smb-alerts \
-               --enable-gre --enable-mpls --enable-targetbased \
-               --enable-decoder-preprocessor-rules --enable-ppm \
+       cd $(DIR_APP) && ./configure \
+               --prefix=/usr \
+               --disable-nls \
+               --sysconfdir=/etc/snort \
+               --target=i586 \
+               --enable-linux-smp-stats \
+               --enable-smb-alerts \
+               --enable-gre --enable-mpls \
+               --enable-targetbased \
+               --enable-decoder-preprocessor-rules \
+               --enable-ppm \
                --enable-non-ether-decoders \
-               --enable-perfprofiling --enable-zlib --enable-active-response \
-               --enable-normalizer --enable-reload --enable-react --enable-flexresp3
+               --enable-perfprofiling \
+               --enable-zlib \
+               --enable-active-response \
+               --enable-normalizer \
+               --enable-reload \
+               --enable-react \
+               --enable-flexresp3
+
        cd $(DIR_APP) && make
        cd $(DIR_APP) && make install
        mv /usr/bin/snort /usr/sbin/
index 3c5f6c54aebdf6ba5b2b757d3dd9ffc3cdde7527..e050b17c5c4edaa8f5d8c725479ecf95e0792a87 100644 (file)
--- a/lfs/squid
+++ b/lfs/squid
@@ -24,7 +24,7 @@
 
 include Config
 
-VER        = 3.3.11
+VER        = 3.4.5
 
 THISAPP    = squid-$(VER)
 DL_FILE    = $(THISAPP).tar.xz
@@ -40,7 +40,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = dd016ff5f14b2548083b3882207914f6
+$(DL_FILE)_MD5 = a831efb36cfbaa419f8dc7a43cba72c9
 
 install : $(TARGET)
 
@@ -53,6 +53,7 @@ md5 : $(subst %,%_MD5,$(objects))
 ###############################################################################
 # Downloading, checking, md5sum
 ###############################################################################
+
 $(patsubst %,$(DIR_CHK)/%,$(objects)) :
        @$(CHECK)
 
@@ -116,7 +117,9 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
                --enable-kill-parent-hack \
                --disable-wccpv2 \
                --enable-icap-client \
-               --disable-esi
+               --disable-esi \
+               --enable-zph-qos \
+               --disable-arch-native
 
        cd $(DIR_APP) && make $(MAKETUNING)
        cd $(DIR_APP) && make install
diff --git a/lfs/sslscan b/lfs/sslscan
new file mode 100644 (file)
index 0000000..a384db1
--- /dev/null
@@ -0,0 +1,83 @@
+###############################################################################
+#                                                                             #
+# IPFire.org - A linux based firewall                                         #
+# Copyright (C) 2014  Michael Tremer & Christian Schmidt                      #
+#                                                                             #
+# This 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 3 of the License, or           #
+# (at your option) any later version.                                         #
+#                                                                             #
+# This program is distributed in the hope that it will be useful,             #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of              #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
+# GNU General Public License for more details.                                #
+#                                                                             #
+# You should have received a copy of the GNU General Public License           #
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
+#                                                                             #
+###############################################################################
+
+###############################################################################
+# Definitions
+###############################################################################
+
+include Config
+
+VER        = 1.10.2
+
+THISAPP    = sslscan-$(VER)
+DL_FILE    = $(THISAPP).tar.gz
+DL_FROM    = $(URL_IPFIRE)
+DIR_APP    = $(DIR_SRC)/$(THISAPP)
+TARGET     = $(DIR_INFO)/$(THISAPP)
+PROG       = sslscan
+PAK_VER    = 1
+
+DEPS       = ""
+
+###############################################################################
+# Top-level Rules
+###############################################################################
+
+objects = $(DL_FILE)
+
+$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
+
+$(DL_FILE)_MD5 = 41ecff92303cecfd00bf3c7de509af14
+
+install : $(TARGET)
+
+check : $(patsubst %,$(DIR_CHK)/%,$(objects))
+
+download :$(patsubst %,$(DIR_DL)/%,$(objects))
+
+md5 : $(subst %,%_MD5,$(objects))
+
+dist: 
+       @$(PAK)
+
+###############################################################################
+# Downloading, checking, md5sum
+###############################################################################
+
+$(patsubst %,$(DIR_CHK)/%,$(objects)) :
+       @$(CHECK)
+
+$(patsubst %,$(DIR_DL)/%,$(objects)) :
+       @$(LOAD)
+
+$(subst %,%_MD5,$(objects)) :
+       @$(MD5)
+
+###############################################################################
+# Installation Details
+###############################################################################
+
+$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
+       @$(PREBUILD)
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
+       cd $(DIR_APP) && make $(MAKETUNING) CFLAGS="$(CFLAGS)"
+       cd $(DIR_APP) && make install PREFIX=/usr
+       @rm -rf $(DIR_APP)
+       @$(POSTBUILD)
index 7c3feabb7de6f734f398c7447c2259d5bc834c33..9dd72fef5331974d44892afecf8eb1d34247c50e 100644 (file)
--- a/lfs/sudo
+++ b/lfs/sudo
@@ -24,7 +24,7 @@
 
 include Config
 
-VER        = 1.8.10p1
+VER        = 1.8.10p3
 
 THISAPP    = sudo-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
@@ -40,7 +40,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = 1d9c2bc5aaf02608343d17b9a666e8e1
+$(DL_FILE)_MD5 = fcd8d0d9f9f0397d076ee901e242ed39
 
 install : $(TARGET)
 
@@ -79,7 +79,8 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
                        --with-env-editor \
                        --with-ignore-dot \
                        --with-tty-tickets \
-                       --with-passpromt="[sudo] password for %p: "
+                       --with-passpromt="[sudo] password for %p: " \
+                       --without-pam
        cd $(DIR_APP) && make $(MAKETUNING)
        cd $(DIR_APP) && make install
        @rm -rf $(DIR_APP)
index 2e7b46c65f310b87ec31b12cb514ef6604042b87..b8c8b2759fa30433100304611ec58f6512a2a0dd 100644 (file)
@@ -24,7 +24,7 @@
 
 include Config
 
-VER        = 1.6
+VER        = 1.11
 
 THISAPP    = vnstat-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
@@ -40,7 +40,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5 = ccaffe8e70d47e0cf2f25e52daa25712
+$(DL_FILE)_MD5 = a5a113f9176cd61fb954f2ba297f5fdb
 
 install : $(TARGET)
 
@@ -73,7 +73,7 @@ $(subst %,%_MD5,$(objects)) :
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
        @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
-       cd $(DIR_APP) && make $(MAKETUNING)                                                                             LOCAL_CONFIGURE_OPTIONS="--enable-readline=yes"
+       cd $(DIR_APP) && make all $(MAKETUNING)                                                                         LOCAL_CONFIGURE_OPTIONS="--enable-readline=yes"
        cd $(DIR_APP) && make install
        sed -i 's|eth0|green0|g' /etc/vnstat.conf
        sed -i 's|/var/lib/vnstat|/var/log/rrd/vnstat|g' /etc/vnstat.conf
diff --git a/make.sh b/make.sh
index 4f40b4603d9c864fc46b437bcbdef7486214464e..83d73957f18676963659a49356c57a921f9e5d16 100755 (executable)
--- a/make.sh
+++ b/make.sh
@@ -25,8 +25,8 @@
 NAME="IPFire"                                                  # Software name
 SNAME="ipfire"                                                 # Short name
 VERSION="2.15"                                                 # Version number
-CORE="77"                                                      # Core Level (Filename)
-PAKFIRE_CORE="77"                                              # Core Level (PAKFIRE)
+CORE="78"                                                      # Core Level (Filename)
+PAKFIRE_CORE="78"                                              # Core Level (PAKFIRE)
 GIT_BRANCH=`git rev-parse --abbrev-ref HEAD`                   # Git Branch
 SLOGAN="www.ipfire.org"                                                # Software slogan
 CONFIG_ROOT=/var/ipfire                                                # Configuration rootdir
@@ -34,16 +34,13 @@ NICE=10                                                             # Nice level
 MAX_RETRIES=1                                                  # prefetch/check loop
 BUILD_IMAGES=1                                                 # Flash and Xen Downloader
 KVER=`grep --max-count=1 VER lfs/linux | awk '{ print $3 }'`
-MACHINE=`uname -m`
 GIT_TAG=$(git tag | tail -1)                                   # Git Tag
 GIT_LASTCOMMIT=$(git log | head -n1 | cut -d" " -f2 |head -c8) # Last commit
 TOOLCHAINVER=7
 
-BUILDMACHINE=$MACHINE
-    if [ "$MACHINE" = "x86_64" ]; then
-        BUILDMACHINE="i686";
-    fi
-
+# New architecture variables
+BUILD_ARCH="$(uname -m)"
+BUILDMACHINE="${BUILD_ARCH}"
 
 # Debian specific settings
 if [ ! -e /etc/debian_version ]; then
@@ -72,6 +69,12 @@ if [ -f .config ]; then
        . .config
 fi
 
+if [ -n "${TARGET_ARCH}" ]; then
+       configure_target "${TARGET_ARCH}"
+else
+       configure_target "default"
+fi
+
 if [ -z $EDITOR ]; then
        for i in nano emacs vi; do
                EDITOR=$(which $i 2>/dev/null)
@@ -241,7 +244,7 @@ prepareenv() {
 
 buildtoolchain() {
     local error=false
-    case "${MACHINE}:$(uname -m)" in
+    case "${TARGET_ARCH}:${BUILD_ARCH}" in
         # x86
         i586:i586|i586:i686|i586:x86_64)
             # These are working.
@@ -352,7 +355,6 @@ buildbase() {
     lfsmake2 groff
     lfsmake2 gperf
     lfsmake2 gzip
-    lfsmake2 inetutils
     lfsmake2 iproute2
     lfsmake2 jwhois
     lfsmake2 kbd
@@ -399,61 +401,62 @@ buildipfire() {
   ipfiremake bc
   ipfiremake u-boot
 
-  if [ "${MACHINE_TYPE}" != "arm" ]; then
-
-    # x86-pae (Native and new XEN) kernel build
-    ipfiremake linux                   KCFG="-pae"
-#    ipfiremake kvm-kmod                       KCFG="-pae"
-#    ipfiremake v4l-dvb                        KCFG="-pae"
-#    ipfiremake mISDN                  KCFG="-pae"
-    ipfiremake cryptodev               KCFG="-pae"
-#    ipfiremake compat-drivers         KCFG="-pae"
-#    ipfiremake r8169                  KCFG="-pae"
-#    ipfiremake r8168                  KCFG="-pae"
-#    ipfiremake r8101                  KCFG="-pae"
-    ipfiremake e1000e                  KCFG="-pae"
-    ipfiremake igb                     KCFG="-pae"
-
-    # x86 kernel build
-    ipfiremake linux                   KCFG=""
-#    ipfiremake kvm-kmod                       KCFG=""
-#    ipfiremake v4l-dvb                        KCFG=""
-#    ipfiremake mISDN                  KCFG=""
-    ipfiremake cryptodev               KCFG=""
-#    ipfiremake compat-drivers         KCFG=""
-#    ipfiremake r8169                  KCFG=""
-#    ipfiremake r8168                  KCFG=""
-#    ipfiremake r8101                  KCFG=""
-    ipfiremake e1000e                  KCFG=""
-    ipfiremake igb                     KCFG=""
-
-  else
-    # arm-rpi (Raspberry Pi) kernel build
-    ipfiremake linux                   KCFG="-rpi"
-#    ipfiremake v4l-dvb                        KCFG="-rpi"
-#    ipfiremake mISDN                  KCFG="-rpi" NOPCI=1
-    ipfiremake cryptodev               KCFG="-rpi"
-#    ipfiremake compat-drivers         KCFG="-rpi"
-
-    # arm multi platform (Panda, Wandboard ...) kernel build
-    ipfiremake linux                   KCFG="-multi"
-    ipfiremake cryptodev               KCFG="-multi"
-    ipfiremake e1000e                  KCFG="-multi"
-    ipfiremake igb                     KCFG="-multi"
-
-    # arm-kirkwood (Dreamplug, ICY-Box ...) kernel build
-    ipfiremake linux                   KCFG="-kirkwood"
-#    ipfiremake v4l-dvb                        KCFG="-kirkwood"
-#    ipfiremake mISDN                  KCFG="-kirkwood"
-    ipfiremake cryptodev               KCFG="-kirkwood"
-#    ipfiremake compat-drivers         KCFG="-kirkwood"
-#    ipfiremake r8169                  KCFG="-kirkwood"
-#    ipfiremake r8168                  KCFG="-kirkwood"
-#    ipfiremake r8101                  KCFG="-kirkwood"
-#    ipfiremake e1000e                 KCFG="-kirkwood"
-    ipfiremake igb                     KCFG="-kirkwood"
+  case "${TARGET_ARCH}" in
+       i586)
+               # x86-pae (Native and new XEN) kernel build
+               ipfiremake linux                        KCFG="-pae"
+#              ipfiremake kvm-kmod                     KCFG="-pae"
+#              ipfiremake v4l-dvb                      KCFG="-pae"
+#              ipfiremake mISDN                        KCFG="-pae"
+               ipfiremake cryptodev                    KCFG="-pae"
+#              ipfiremake compat-drivers               KCFG="-pae"
+#              ipfiremake r8169                        KCFG="-pae"
+#              ipfiremake r8168                        KCFG="-pae"
+#              ipfiremake r8101                        KCFG="-pae"
+               ipfiremake e1000e                       KCFG="-pae"
+               ipfiremake igb                          KCFG="-pae"
+
+               # x86 kernel build
+               ipfiremake linux                        KCFG=""
+#              ipfiremake kvm-kmod                     KCFG=""
+#              ipfiremake v4l-dvb                      KCFG=""
+#              ipfiremake mISDN                        KCFG=""
+               ipfiremake cryptodev                    KCFG=""
+#              ipfiremake compat-drivers               KCFG=""
+#              ipfiremake r8169                        KCFG=""
+#              ipfiremake r8168                        KCFG=""
+#              ipfiremake r8101                        KCFG=""
+               ipfiremake e1000e                       KCFG=""
+               ipfiremake igb                          KCFG=""
+               ;;
 
-  fi
+       armv5tel)
+               # arm-rpi (Raspberry Pi) kernel build
+               ipfiremake linux                        KCFG="-rpi"
+#              ipfiremake v4l-dvb                      KCFG="-rpi"
+#              ipfiremake mISDN                        KCFG="-rpi" NOPCI=1
+               ipfiremake cryptodev                    KCFG="-rpi"
+#              ipfiremake compat-drivers               KCFG="-rpi"
+
+               # arm multi platform (Panda, Wandboard ...) kernel build
+               ipfiremake linux                        KCFG="-multi"
+               ipfiremake cryptodev                    KCFG="-multi"
+               ipfiremake e1000e                       KCFG="-multi"
+               ipfiremake igb                          KCFG="-multi"
+
+               # arm-kirkwood (Dreamplug, ICY-Box ...) kernel build
+               ipfiremake linux                        KCFG="-kirkwood"
+#              ipfiremake v4l-dvb                      KCFG="-kirkwood"
+#              ipfiremake mISDN                        KCFG="-kirkwood"
+               ipfiremake cryptodev                    KCFG="-kirkwood"
+#              ipfiremake compat-drivers               KCFG="-kirkwood"
+#              ipfiremake r8169                        KCFG="-kirkwood"
+#              ipfiremake r8168                        KCFG="-kirkwood"
+#              ipfiremake r8101                        KCFG="-kirkwood"
+#              ipfiremake e1000e                       KCFG="-kirkwood"
+               ipfiremake igb                          KCFG="-kirkwood"
+               ;;
+  esac
   ipfiremake pkg-config
   ipfiremake linux-atm
   ipfiremake cpio
@@ -514,6 +517,8 @@ buildipfire() {
   ipfiremake perl-GD
   ipfiremake GD-Graph
   ipfiremake GD-TextUtil
+  ipfiremake perl-Device-SerialPort
+  ipfiremake perl-Device-Modem
   ipfiremake gnupg
   ipfiremake hdparm
   ipfiremake sdparm
@@ -667,8 +672,10 @@ buildipfire() {
   ipfiremake netpbm
   ipfiremake phpSANE
   ipfiremake tunctl
+  ipfiremake netsnmpd
   ipfiremake nagios
   ipfiremake nagios_nrpe
+  ipfiremake icinga
   ipfiremake ebtables
   ipfiremake directfb
   ipfiremake dfb++
@@ -676,6 +683,7 @@ buildipfire() {
   ipfiremake ffmpeg
   ipfiremake vdr
   ipfiremake vdr_streamdev
+  ipfiremake vdr_vnsiserver5
   ipfiremake vdr_vnsiserver3
   ipfiremake vdr_epgsearch
   ipfiremake vdr_dvbapi
@@ -689,7 +697,6 @@ buildipfire() {
   ipfiremake git
   ipfiremake squidclamav
   ipfiremake vnstat
-  ipfiremake vnstati
   ipfiremake iw
   ipfiremake wpa_supplicant
   ipfiremake hostapd
@@ -714,7 +721,6 @@ buildipfire() {
   ipfiremake perl-Sort-Naturally
   ipfiremake vdradmin
   ipfiremake miau
-  ipfiremake netsnmpd
   ipfiremake perl-DBI
   ipfiremake perl-DBD-mysql
   ipfiremake perl-DBD-SQLite
@@ -796,7 +802,7 @@ buildipfire() {
   ipfiremake iptraf-ng
   ipfiremake iotop
   ipfiremake stunnel
-  ipfiremake vdr_vnsiserver5
+  ipfiremake sslscan
 }
 
 buildinstaller() {
@@ -896,6 +902,22 @@ ipfirepackages() {
   rm -rf  $BASEDIR/build/install/packages/*
 }
 
+while [ $# -gt 0 ]; do
+       case "${1}" in
+               --target=*)
+                       configure_target "${1#--target=}"
+                       ;;
+               -*)
+                       exiterror "Unknown configuration option: ${1}"
+                       ;;
+               *)
+                       # Found a command, so exit options parsing.
+                       break
+                       ;;
+       esac
+       shift
+done
+
 # See what we're supposed to do
 case "$1" in 
 build)
index 83717811010da5f1f89c16aa8b7b6ed020ee1b89..7a18502bfa728743bc951fef3ccbce84389a57f4 100644 (file)
@@ -120,10 +120,10 @@ iptables_init() {
        iptables -N IPTVFORWARD
        iptables -A FORWARD -j IPTVFORWARD
 
-       # filtering from GUI
-       iptables -N GUIINPUT
-       iptables -A INPUT -j GUIINPUT
-       iptables -A GUIINPUT -p icmp --icmp-type 8 -j ACCEPT
+       # Allow to ping the firewall.
+       iptables -N ICMPINPUT
+       iptables -A INPUT -j ICMPINPUT
+       iptables -A ICMPINPUT -p icmp --icmp-type 8 -j ACCEPT
 
        # Accept everything on loopback
        iptables -N LOOPBACK
@@ -179,7 +179,10 @@ iptables_init() {
        iptables -t nat -A POSTROUTING -j IPSECNAT
 
        # localhost and ethernet.
-       iptables -A INPUT   -i $GREEN_DEV  -m conntrack --ctstate NEW -j ACCEPT ! -p icmp
+       # Always allow accessing the web GUI from GREEN.
+       iptables -N GUIINPUT
+       iptables -A INPUT -j GUIINPUT
+       iptables -A GUIINPUT -i "${GREEN_DEV}" -p tcp --dport 444 -j ACCEPT
 
        # WIRELESS chains
        iptables -N WIRELESSINPUT
index 8aba4ff1b4f3c60734b9834d00a415c7f3801208..9b4623eceb818dfee1277cc4dc759f80b7aad598 100644 (file)
@@ -35,7 +35,7 @@ if [ "x$MODE" = "xnone" ] ; then
 fi
 
 upsd=/usr/sbin/upsd
-upsdrvctl=/usr/bin/upsdrvctl
+upsdrvctl=/usr/sbin/upsdrvctl
 upsmon=/usr/sbin/upsmon
 log=">/dev/null 2>/dev/null"
 
index 1d61a63990a492cfe3fcff112cc78d538b20a980..0ed86616534c23d4bffcf1bae1e4c3b9b7986533 100644 (file)
@@ -43,10 +43,7 @@ case "$1" in
        (
                sleep 3
                pid=$(cat /var/run/sshd.pid 2>/dev/null)
-               [ -n "${pid}" ] && [ -e "/proc/${pid}/oom_score_adj" ] && \
-                                       echo "-16" > "/proc/${pid}/oom_score_adj" || \
-                               [ -e "/proc/${pid}/oom_adj" ] && \
-                                       echo "-16" > "/proc/${pid}/oom_adj"
+               [ -n "${pid}" ] && echo "-16" > "/proc/${pid}/oom_score_adj"
        ) &
         ;;
 
index e61f94dab54c59f0622ef09d144f25d6c8999562..db7a6cc72af6f2687fc7553637381299ffed7f46 100644 (file)
@@ -321,10 +321,10 @@ int main(int argc, char *argv[])
                swap_file = memory / 4;
        
   /* Calculating Root-Size dependend of Max Disk Space */
-  if ( disk < 756 )
-               root_partition = 200;
-       else if ( disk >= 756 && disk <= 3072 )
-               root_partition = 512;
+  if ( disk < 2048 )
+               root_partition = 1024;
+       else if ( disk >= 2048 && disk <= 3072 )
+               root_partition = 1536;
        else 
                root_partition = 2048;
                
index c6b354c864175bc2955212addfb795d4c45331cd..8268992b9b51cedc6035f67127cb85910bcddb7d 100644 (file)
@@ -23,7 +23,4 @@
 #
 . /opt/pakfire/lib/functions.sh
 extract_files
-mysqladmin --user=root -pmysqlfire create cacti
-mysql --user=root -pmysqlfire cacti < /usr/share/cacti/cacti.sql
-mysql --user=root -pmysqlfire -e "GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY 'cactiuser';" mysql
 /etc/init.d/apache restart
diff --git a/src/patches/cacti/cacti-0.8.8a-legal.patch b/src/patches/cacti/cacti-0.8.8a-legal.patch
new file mode 100644 (file)
index 0000000..af09209
--- /dev/null
@@ -0,0 +1,8166 @@
+diff -up cacti-0.8.8a/include/js/jquery/colorpicker.js.legal cacti-0.8.8a/include/js/jquery/colorpicker.js
+--- cacti-0.8.8a/include/js/jquery/colorpicker.js.legal        2013-01-04 15:44:38.025416061 -0500
++++ cacti-0.8.8a/include/js/jquery/colorpicker.js      2013-01-04 15:43:12.644377988 -0500
+@@ -0,0 +1,484 @@
++/**
++ *
++ * Color picker
++ * Author: Stefan Petre www.eyecon.ro
++ * 
++ * Dual licensed under the MIT and GPL licenses
++ * 
++ */
++(function ($) {
++      var ColorPicker = function () {
++              var
++                      ids = {},
++                      inAction,
++                      charMin = 65,
++                      visible,
++                      tpl = '<div class="colorpicker"><div class="colorpicker_color"><div><div></div></div></div><div class="colorpicker_hue"><div></div></div><div class="colorpicker_new_color"></div><div class="colorpicker_current_color"></div><div class="colorpicker_hex"><input type="text" maxlength="6" size="6" /></div><div class="colorpicker_rgb_r colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_g colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_h colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_s colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_submit"></div></div>',
++                      defaults = {
++                              eventName: 'click',
++                              onShow: function () {},
++                              onBeforeShow: function(){},
++                              onHide: function () {},
++                              onChange: function () {},
++                              onSubmit: function () {},
++                              color: 'ff0000',
++                              livePreview: true,
++                              flat: false
++                      },
++                      fillRGBFields = function  (hsb, cal) {
++                              var rgb = HSBToRGB(hsb);
++                              $(cal).data('colorpicker').fields
++                                      .eq(1).val(rgb.r).end()
++                                      .eq(2).val(rgb.g).end()
++                                      .eq(3).val(rgb.b).end();
++                      },
++                      fillHSBFields = function  (hsb, cal) {
++                              $(cal).data('colorpicker').fields
++                                      .eq(4).val(hsb.h).end()
++                                      .eq(5).val(hsb.s).end()
++                                      .eq(6).val(hsb.b).end();
++                      },
++                      fillHexFields = function (hsb, cal) {
++                              $(cal).data('colorpicker').fields
++                                      .eq(0).val(HSBToHex(hsb)).end();
++                      },
++                      setSelector = function (hsb, cal) {
++                              $(cal).data('colorpicker').selector.css('backgroundColor', '#' + HSBToHex({h: hsb.h, s: 100, b: 100}));
++                              $(cal).data('colorpicker').selectorIndic.css({
++                                      left: parseInt(150 * hsb.s/100, 10),
++                                      top: parseInt(150 * (100-hsb.b)/100, 10)
++                              });
++                      },
++                      setHue = function (hsb, cal) {
++                              $(cal).data('colorpicker').hue.css('top', parseInt(150 - 150 * hsb.h/360, 10));
++                      },
++                      setCurrentColor = function (hsb, cal) {
++                              $(cal).data('colorpicker').currentColor.css('backgroundColor', '#' + HSBToHex(hsb));
++                      },
++                      setNewColor = function (hsb, cal) {
++                              $(cal).data('colorpicker').newColor.css('backgroundColor', '#' + HSBToHex(hsb));
++                      },
++                      keyDown = function (ev) {
++                              var pressedKey = ev.charCode || ev.keyCode || -1;
++                              if ((pressedKey > charMin && pressedKey <= 90) || pressedKey == 32) {
++                                      return false;
++                              }
++                              var cal = $(this).parent().parent();
++                              if (cal.data('colorpicker').livePreview === true) {
++                                      change.apply(this);
++                              }
++                      },
++                      change = function (ev) {
++                              var cal = $(this).parent().parent(), col;
++                              if (this.parentNode.className.indexOf('_hex') > 0) {
++                                      cal.data('colorpicker').color = col = HexToHSB(fixHex(this.value));
++                              } else if (this.parentNode.className.indexOf('_hsb') > 0) {
++                                      cal.data('colorpicker').color = col = fixHSB({
++                                              h: parseInt(cal.data('colorpicker').fields.eq(4).val(), 10),
++                                              s: parseInt(cal.data('colorpicker').fields.eq(5).val(), 10),
++                                              b: parseInt(cal.data('colorpicker').fields.eq(6).val(), 10)
++                                      });
++                              } else {
++                                      cal.data('colorpicker').color = col = RGBToHSB(fixRGB({
++                                              r: parseInt(cal.data('colorpicker').fields.eq(1).val(), 10),
++                                              g: parseInt(cal.data('colorpicker').fields.eq(2).val(), 10),
++                                              b: parseInt(cal.data('colorpicker').fields.eq(3).val(), 10)
++                                      }));
++                              }
++                              if (ev) {
++                                      fillRGBFields(col, cal.get(0));
++                                      fillHexFields(col, cal.get(0));
++                                      fillHSBFields(col, cal.get(0));
++                              }
++                              setSelector(col, cal.get(0));
++                              setHue(col, cal.get(0));
++                              setNewColor(col, cal.get(0));
++                              cal.data('colorpicker').onChange.apply(cal, [col, HSBToHex(col), HSBToRGB(col)]);
++                      },
++                      blur = function (ev) {
++                              var cal = $(this).parent().parent();
++                              cal.data('colorpicker').fields.parent().removeClass('colorpicker_focus');
++                      },
++                      focus = function () {
++                              charMin = this.parentNode.className.indexOf('_hex') > 0 ? 70 : 65;
++                              $(this).parent().parent().data('colorpicker').fields.parent().removeClass('colorpicker_focus');
++                              $(this).parent().addClass('colorpicker_focus');
++                      },
++                      downIncrement = function (ev) {
++                              var field = $(this).parent().find('input').focus();
++                              var current = {
++                                      el: $(this).parent().addClass('colorpicker_slider'),
++                                      max: this.parentNode.className.indexOf('_hsb_h') > 0 ? 360 : (this.parentNode.className.indexOf('_hsb') > 0 ? 100 : 255),
++                                      y: ev.pageY,
++                                      field: field,
++                                      val: parseInt(field.val(), 10),
++                                      preview: $(this).parent().parent().data('colorpicker').livePreview                                      
++                              };
++                              $(document).bind('mouseup', current, upIncrement);
++                              $(document).bind('mousemove', current, moveIncrement);
++                      },
++                      moveIncrement = function (ev) {
++                              ev.data.field.val(Math.max(0, Math.min(ev.data.max, parseInt(ev.data.val + ev.pageY - ev.data.y, 10))));
++                              if (ev.data.preview) {
++                                      change.apply(ev.data.field.get(0), [true]);
++                              }
++                              return false;
++                      },
++                      upIncrement = function (ev) {
++                              change.apply(ev.data.field.get(0), [true]);
++                              ev.data.el.removeClass('colorpicker_slider').find('input').focus();
++                              $(document).unbind('mouseup', upIncrement);
++                              $(document).unbind('mousemove', moveIncrement);
++                              return false;
++                      },
++                      downHue = function (ev) {
++                              var current = {
++                                      cal: $(this).parent(),
++                                      y: $(this).offset().top
++                              };
++                              current.preview = current.cal.data('colorpicker').livePreview;
++                              $(document).bind('mouseup', current, upHue);
++                              $(document).bind('mousemove', current, moveHue);
++                      },
++                      moveHue = function (ev) {
++                              change.apply(
++                                      ev.data.cal.data('colorpicker')
++                                              .fields
++                                              .eq(4)
++                                              .val(parseInt(360*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.y))))/150, 10))
++                                              .get(0),
++                                      [ev.data.preview]
++                              );
++                              return false;
++                      },
++                      upHue = function (ev) {
++                              fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
++                              fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
++                              $(document).unbind('mouseup', upHue);
++                              $(document).unbind('mousemove', moveHue);
++                              return false;
++                      },
++                      downSelector = function (ev) {
++                              var current = {
++                                      cal: $(this).parent(),
++                                      pos: $(this).offset()
++                              };
++                              current.preview = current.cal.data('colorpicker').livePreview;
++                              $(document).bind('mouseup', current, upSelector);
++                              $(document).bind('mousemove', current, moveSelector);
++                      },
++                      moveSelector = function (ev) {
++                              change.apply(
++                                      ev.data.cal.data('colorpicker')
++                                              .fields
++                                              .eq(6)
++                                              .val(parseInt(100*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.pos.top))))/150, 10))
++                                              .end()
++                                              .eq(5)
++                                              .val(parseInt(100*(Math.max(0,Math.min(150,(ev.pageX - ev.data.pos.left))))/150, 10))
++                                              .get(0),
++                                      [ev.data.preview]
++                              );
++                              return false;
++                      },
++                      upSelector = function (ev) {
++                              fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
++                              fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
++                              $(document).unbind('mouseup', upSelector);
++                              $(document).unbind('mousemove', moveSelector);
++                              return false;
++                      },
++                      enterSubmit = function (ev) {
++                              $(this).addClass('colorpicker_focus');
++                      },
++                      leaveSubmit = function (ev) {
++                              $(this).removeClass('colorpicker_focus');
++                      },
++                      clickSubmit = function (ev) {
++                              var cal = $(this).parent();
++                              var col = cal.data('colorpicker').color;
++                              cal.data('colorpicker').origColor = col;
++                              setCurrentColor(col, cal.get(0));
++                              cal.data('colorpicker').onSubmit(col, HSBToHex(col), HSBToRGB(col), cal.data('colorpicker').el);
++                      },
++                      show = function (ev) {
++                              var cal = $('#' + $(this).data('colorpickerId'));
++                              cal.data('colorpicker').onBeforeShow.apply(this, [cal.get(0)]);
++                              var pos = $(this).offset();
++                              var viewPort = getViewport();
++                              var top = pos.top + this.offsetHeight;
++                              var left = pos.left;
++                              if (top + 176 > viewPort.t + viewPort.h) {
++                                      top -= this.offsetHeight + 176;
++                              }
++                              if (left + 356 > viewPort.l + viewPort.w) {
++                                      left -= 356;
++                              }
++                              cal.css({left: left + 'px', top: top + 'px'});
++                              if (cal.data('colorpicker').onShow.apply(this, [cal.get(0)]) != false) {
++                                      cal.show();
++                              }
++                              $(document).bind('mousedown', {cal: cal}, hide);
++                              return false;
++                      },
++                      hide = function (ev) {
++                              if (!isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) {
++                                      if (ev.data.cal.data('colorpicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) {
++                                              ev.data.cal.hide();
++                                      }
++                                      $(document).unbind('mousedown', hide);
++                              }
++                      },
++                      isChildOf = function(parentEl, el, container) {
++                              if (parentEl == el) {
++                                      return true;
++                              }
++                              if (parentEl.contains) {
++                                      return parentEl.contains(el);
++                              }
++                              if ( parentEl.compareDocumentPosition ) {
++                                      return !!(parentEl.compareDocumentPosition(el) & 16);
++                              }
++                              var prEl = el.parentNode;
++                              while(prEl && prEl != container) {
++                                      if (prEl == parentEl)
++                                              return true;
++                                      prEl = prEl.parentNode;
++                              }
++                              return false;
++                      },
++                      getViewport = function () {
++                              var m = document.compatMode == 'CSS1Compat';
++                              return {
++                                      l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft),
++                                      t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop),
++                                      w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth),
++                                      h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight)
++                              };
++                      },
++                      fixHSB = function (hsb) {
++                              return {
++                                      h: Math.min(360, Math.max(0, hsb.h)),
++                                      s: Math.min(100, Math.max(0, hsb.s)),
++                                      b: Math.min(100, Math.max(0, hsb.b))
++                              };
++                      }, 
++                      fixRGB = function (rgb) {
++                              return {
++                                      r: Math.min(255, Math.max(0, rgb.r)),
++                                      g: Math.min(255, Math.max(0, rgb.g)),
++                                      b: Math.min(255, Math.max(0, rgb.b))
++                              };
++                      },
++                      fixHex = function (hex) {
++                              var len = 6 - hex.length;
++                              if (len > 0) {
++                                      var o = [];
++                                      for (var i=0; i<len; i++) {
++                                              o.push('0');
++                                      }
++                                      o.push(hex);
++                                      hex = o.join('');
++                              }
++                              return hex;
++                      }, 
++                      HexToRGB = function (hex) {
++                              var hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16);
++                              return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)};
++                      },
++                      HexToHSB = function (hex) {
++                              return RGBToHSB(HexToRGB(hex));
++                      },
++                      RGBToHSB = function (rgb) {
++                              var hsb = {
++                                      h: 0,
++                                      s: 0,
++                                      b: 0
++                              };
++                              var min = Math.min(rgb.r, rgb.g, rgb.b);
++                              var max = Math.max(rgb.r, rgb.g, rgb.b);
++                              var delta = max - min;
++                              hsb.b = max;
++                              if (max != 0) {
++                                      
++                              }
++                              hsb.s = max != 0 ? 255 * delta / max : 0;
++                              if (hsb.s != 0) {
++                                      if (rgb.r == max) {
++                                              hsb.h = (rgb.g - rgb.b) / delta;
++                                      } else if (rgb.g == max) {
++                                              hsb.h = 2 + (rgb.b - rgb.r) / delta;
++                                      } else {
++                                              hsb.h = 4 + (rgb.r - rgb.g) / delta;
++                                      }
++                              } else {
++                                      hsb.h = -1;
++                              }
++                              hsb.h *= 60;
++                              if (hsb.h < 0) {
++                                      hsb.h += 360;
++                              }
++                              hsb.s *= 100/255;
++                              hsb.b *= 100/255;
++                              return hsb;
++                      },
++                      HSBToRGB = function (hsb) {
++                              var rgb = {};
++                              var h = Math.round(hsb.h);
++                              var s = Math.round(hsb.s*255/100);
++                              var v = Math.round(hsb.b*255/100);
++                              if(s == 0) {
++                                      rgb.r = rgb.g = rgb.b = v;
++                              } else {
++                                      var t1 = v;
++                                      var t2 = (255-s)*v/255;
++                                      var t3 = (t1-t2)*(h%60)/60;
++                                      if(h==360) h = 0;
++                                      if(h<60) {rgb.r=t1;     rgb.b=t2; rgb.g=t2+t3}
++                                      else if(h<120) {rgb.g=t1; rgb.b=t2;     rgb.r=t1-t3}
++                                      else if(h<180) {rgb.g=t1; rgb.r=t2;     rgb.b=t2+t3}
++                                      else if(h<240) {rgb.b=t1; rgb.r=t2;     rgb.g=t1-t3}
++                                      else if(h<300) {rgb.b=t1; rgb.g=t2;     rgb.r=t2+t3}
++                                      else if(h<360) {rgb.r=t1; rgb.g=t2;     rgb.b=t1-t3}
++                                      else {rgb.r=0; rgb.g=0; rgb.b=0}
++                              }
++                              return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)};
++                      },
++                      RGBToHex = function (rgb) {
++                              var hex = [
++                                      rgb.r.toString(16),
++                                      rgb.g.toString(16),
++                                      rgb.b.toString(16)
++                              ];
++                              $.each(hex, function (nr, val) {
++                                      if (val.length == 1) {
++                                              hex[nr] = '0' + val;
++                                      }
++                              });
++                              return hex.join('');
++                      },
++                      HSBToHex = function (hsb) {
++                              return RGBToHex(HSBToRGB(hsb));
++                      },
++                      restoreOriginal = function () {
++                              var cal = $(this).parent();
++                              var col = cal.data('colorpicker').origColor;
++                              cal.data('colorpicker').color = col;
++                              fillRGBFields(col, cal.get(0));
++                              fillHexFields(col, cal.get(0));
++                              fillHSBFields(col, cal.get(0));
++                              setSelector(col, cal.get(0));
++                              setHue(col, cal.get(0));
++                              setNewColor(col, cal.get(0));
++                      };
++              return {
++                      init: function (opt) {
++                              opt = $.extend({}, defaults, opt||{});
++                              if (typeof opt.color == 'string') {
++                                      opt.color = HexToHSB(opt.color);
++                              } else if (opt.color.r != undefined && opt.color.g != undefined && opt.color.b != undefined) {
++                                      opt.color = RGBToHSB(opt.color);
++                              } else if (opt.color.h != undefined && opt.color.s != undefined && opt.color.b != undefined) {
++                                      opt.color = fixHSB(opt.color);
++                              } else {
++                                      return this;
++                              }
++                              return this.each(function () {
++                                      if (!$(this).data('colorpickerId')) {
++                                              var options = $.extend({}, opt);
++                                              options.origColor = opt.color;
++                                              var id = 'collorpicker_' + parseInt(Math.random() * 1000);
++                                              $(this).data('colorpickerId', id);
++                                              var cal = $(tpl).attr('id', id);
++                                              if (options.flat) {
++                                                      cal.appendTo(this).show();
++                                              } else {
++                                                      cal.appendTo(document.body);
++                                              }
++                                              options.fields = cal
++                                                                                      .find('input')
++                                                                                              .bind('keyup', keyDown)
++                                                                                              .bind('change', change)
++                                                                                              .bind('blur', blur)
++                                                                                              .bind('focus', focus);
++                                              cal
++                                                      .find('span').bind('mousedown', downIncrement).end()
++                                                      .find('>div.colorpicker_current_color').bind('click', restoreOriginal);
++                                              options.selector = cal.find('div.colorpicker_color').bind('mousedown', downSelector);
++                                              options.selectorIndic = options.selector.find('div div');
++                                              options.el = this;
++                                              options.hue = cal.find('div.colorpicker_hue div');
++                                              cal.find('div.colorpicker_hue').bind('mousedown', downHue);
++                                              options.newColor = cal.find('div.colorpicker_new_color');
++                                              options.currentColor = cal.find('div.colorpicker_current_color');
++                                              cal.data('colorpicker', options);
++                                              cal.find('div.colorpicker_submit')
++                                                      .bind('mouseenter', enterSubmit)
++                                                      .bind('mouseleave', leaveSubmit)
++                                                      .bind('click', clickSubmit);
++                                              fillRGBFields(options.color, cal.get(0));
++                                              fillHSBFields(options.color, cal.get(0));
++                                              fillHexFields(options.color, cal.get(0));
++                                              setHue(options.color, cal.get(0));
++                                              setSelector(options.color, cal.get(0));
++                                              setCurrentColor(options.color, cal.get(0));
++                                              setNewColor(options.color, cal.get(0));
++                                              if (options.flat) {
++                                                      cal.css({
++                                                              position: 'relative',
++                                                              display: 'block'
++                                                      });
++                                              } else {
++                                                      $(this).bind(options.eventName, show);
++                                              }
++                                      }
++                              });
++                      },
++                      showPicker: function() {
++                              return this.each( function () {
++                                      if ($(this).data('colorpickerId')) {
++                                              show.apply(this);
++                                      }
++                              });
++                      },
++                      hidePicker: function() {
++                              return this.each( function () {
++                                      if ($(this).data('colorpickerId')) {
++                                              $('#' + $(this).data('colorpickerId')).hide();
++                                      }
++                              });
++                      },
++                      setColor: function(col) {
++                              if (typeof col == 'string') {
++                                      col = HexToHSB(col);
++                              } else if (col.r != undefined && col.g != undefined && col.b != undefined) {
++                                      col = RGBToHSB(col);
++                              } else if (col.h != undefined && col.s != undefined && col.b != undefined) {
++                                      col = fixHSB(col);
++                              } else {
++                                      return this;
++                              }
++                              return this.each(function(){
++                                      if ($(this).data('colorpickerId')) {
++                                              var cal = $('#' + $(this).data('colorpickerId'));
++                                              cal.data('colorpicker').color = col;
++                                              cal.data('colorpicker').origColor = col;
++                                              fillRGBFields(col, cal.get(0));
++                                              fillHSBFields(col, cal.get(0));
++                                              fillHexFields(col, cal.get(0));
++                                              setHue(col, cal.get(0));
++                                              setSelector(col, cal.get(0));
++                                              setCurrentColor(col, cal.get(0));
++                                              setNewColor(col, cal.get(0));
++                                      }
++                              });
++                      }
++              };
++      }();
++      $.fn.extend({
++              ColorPicker: ColorPicker.init,
++              ColorPickerHide: ColorPicker.hidePicker,
++              ColorPickerShow: ColorPicker.showPicker,
++              ColorPickerSetColor: ColorPicker.setColor
++      });
++})(jQuery)
+\ No newline at end of file
+diff -up cacti-0.8.8a/include/js/jquery/jquery.cookie.js.legal cacti-0.8.8a/include/js/jquery/jquery.cookie.js
+--- cacti-0.8.8a/include/js/jquery/jquery.cookie.js.legal      2013-01-04 15:44:38.027416060 -0500
++++ cacti-0.8.8a/include/js/jquery/jquery.cookie.js    2013-01-04 15:43:12.644377988 -0500
+@@ -0,0 +1,91 @@
++/*jslint browser: true */ /*global jQuery: true */
++
++/**
++ * jQuery Cookie plugin
++ *
++ * Copyright (c) 2010 Klaus Hartl (stilbuero.de)
++ * Dual licensed under the MIT and GPL licenses:
++ * http://www.opensource.org/licenses/mit-license.php
++ * http://www.gnu.org/licenses/gpl.html
++ *
++ */
++
++// TODO JsDoc
++
++/**
++ * Create a cookie with the given key and value and other optional parameters.
++ *
++ * @example $.cookie('the_cookie', 'the_value');
++ * @desc Set the value of a cookie.
++ * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
++ * @desc Create a cookie with all available options.
++ * @example $.cookie('the_cookie', 'the_value');
++ * @desc Create a session cookie.
++ * @example $.cookie('the_cookie', null);
++ * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
++ *       used when the cookie was set.
++ *
++ * @param String key The key of the cookie.
++ * @param String value The value of the cookie.
++ * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
++ * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
++ *                             If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
++ *                             If set to null or omitted, the cookie will be a session cookie and will not be retained
++ *                             when the the browser exits.
++ * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
++ * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
++ * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
++ *                        require a secure protocol (like HTTPS).
++ * @type undefined
++ *
++ * @name $.cookie
++ * @cat Plugins/Cookie
++ * @author Klaus Hartl/klaus.hartl@stilbuero.de
++ */
++
++/**
++ * Get the value of a cookie with the given key.
++ *
++ * @example $.cookie('the_cookie');
++ * @desc Get the value of a cookie.
++ *
++ * @param String key The key of the cookie.
++ * @return The value of the cookie.
++ * @type String
++ *
++ * @name $.cookie
++ * @cat Plugins/Cookie
++ * @author Klaus Hartl/klaus.hartl@stilbuero.de
++ */
++jQuery.cookie = function (key, value, options) {
++
++    // key and at least value given, set cookie...
++    if (arguments.length > 1 && String(value) !== "[object Object]") {
++        options = jQuery.extend({}, options);
++
++        if (value === null || value === undefined) {
++            options.expires = -1;
++        }
++
++        if (typeof options.expires === 'number') {
++            var days = options.expires, t = options.expires = new Date();
++            t.setDate(t.getDate() + days);
++        }
++
++        value = String(value);
++
++        return (document.cookie = [
++            encodeURIComponent(key), '=',
++            options.raw ? value : encodeURIComponent(value),
++            options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
++            options.path ? '; path=' + options.path : '',
++            options.domain ? '; domain=' + options.domain : '',
++            options.secure ? '; secure' : ''
++        ].join(''));
++    }
++
++    // key and possibly options given, get cookie...
++    options = value || {};
++    var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
++    return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
++};
+diff -up cacti-0.8.8a/include/js/jquery/jquery.dd.js.legal cacti-0.8.8a/include/js/jquery/jquery.dd.js
+--- cacti-0.8.8a/include/js/jquery/jquery.dd.js.legal  2013-01-04 15:44:38.030416069 -0500
++++ cacti-0.8.8a/include/js/jquery/jquery.dd.js        2013-01-04 15:43:12.644377988 -0500
+@@ -0,0 +1,11 @@
++// MSDropDown - jquery.dd.js
++// author: Marghoob Suleman - Search me on google
++// Date: 12th Aug, 2009, {18 Dec, 2010 (2.36)}
++// Version: 2.37.5 {date: 17 June, 2011}
++// Revision: 34
++// web: www.giftlelo.com | www.marghoobsuleman.com
++/*
++// msDropDown is free jQuery Plugin: you can redistribute it and/or modify
++// it under the terms of the either the MIT License or the Gnu General Public License (GPL) Version 2
++*/
++;eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';(5($){3 1L="";3 3m=5(p,q){3 r=p;3 s=1a;3 q=$.3n({1d:4c,2q:7,3o:23,1U:6,1M:4d,3p:\'28\',1N:15,3q:\'4e\',2I:\'\',1j:\'\'},q);1a.1V=2r 3r();3 u="";3 v={};v.2J=6;v.2s=15;v.2t=1o;3 x=15;3 y={2K:\'4f\',1O:\'4g\',1H:\'4h\',29:\'4i\',1h:\'4j\',2L:\'4k\',2M:\'4l\',4m:\'4n\',2u:\'4o\',3s:\'4p\'};3 z={28:q.3p,2N:\'2N\',2O:\'2O\',2P:\'2P\',1t:\'1t\',1k:.30,2a:\'2a\',2v:\'2v\',2w:\'2w\',11:\'11\'};3 A={3t:"2x,2Q,2R,1P,2y,2z,1u,1B,2A,1Q,4q,1W,2S",18:"1C,1v,1k,4r"};1a.1R=2r 3r();3 B=$(r).18("1b");4(1w(B)=="14"||B.1c<=0){B="4s"+$.1S.3u++;$(r).2B("1b",B)};3 C=$(r).18("1j");q.1j+=(C==14)?"":C;3 D=$(r).3v();x=($(r).18("1C")>1||$(r).18("1v")==6)?6:15;4(x){q.2q=$(r).18("1C")};3 E={};3 F=0;3 G=15;3 H;3 I={};3 J=5(a){4(1w(I[a])=="14"){I[a]=1p.4t(a)}12 I[a]};3 K=5(a){12 B+y[a]};3 L=5(a){3 b=a;3 c=$(b).18("1j");12 c};3 M=5(a){3 b=$("#"+B+" 2T:11");4(b.1c>1){1D(3 i=0;i<b.1c;i++){4(a==b[i].1i){12 6}}}19 4(b.1c==1){4(b[0].1i==a){12 6}};12 15};3 N=5(a,b,c,d){3 e="";3 f=(d=="2U")?K("2M"):K("2L");3 g=(d=="2U")?f+"2V"+(b)+"2V"+(c):f+"2V"+(b);3 h="";3 i="";4(q.1N!=15){i=\' \'+q.1N+\' \'+a.3w}19{h=$(a).18("1X");h=(h.1c==0)?"":\'<3x 3y="\'+h+\'" 3z="3A" /> \'};3 j=$(a).1q();3 k=$(a).4u();3 l=($(a).18("1k")==6)?"1k":"2W";E[g]={1I:h+j,2b:k,1q:j,1i:a.1i,1b:g};3 m=L(a);4(M(a.1i)==6){e+=\'<a 3B="3C:3D(0);" 1r="\'+z.11+\' \'+l+i+\'"\'}19{e+=\'<a  3B="3C:3D(0);" 1r="\'+l+i+\'"\'};4(m!==15&&m!==14){e+=" 1j=\'"+m+"\'"};e+=\' 1b="\'+g+\'">\';e+=h+\'<1x 1r="\'+z.1t+\'">\'+j+\'</1x></a>\';12 e};3 O=5(t){3 b=t.3E();4(b.1c==0)12-1;3 a="";1D(3 i 2c E){3 c=E[i].1q.3E();4(c.3F(0,b.1c)==b){a+="#"+E[i].1b+", "}};12(a=="")?-1:a};3 P=5(){3 f=D;4(f.1c==0)12"";3 g="";3 h=K("2L");3 i=K("2M");f.2X(5(c){3 d=f[c];4(d.4v=="4w"){g+="<1y 1r=\'4x\'>";g+="<1x 1j=\'3G-4y:4z;3G-1j:4A; 4B:4C;\'>"+$(d).18("4D")+"</1x>";3 e=$(d).3v();e.2X(5(a){3 b=e[a];g+=N(b,c,a,"2U")});g+="</1y>"}19{g+=N(d,c,"","")}});12 g};3 Q=5(){3 a=K("1O");3 b=K("1h");3 c=q.1j;1Y="";1Y+=\'<1y 1b="\'+b+\'" 1r="\'+z.2P+\'"\';4(!x){1Y+=(c!="")?\' 1j="\'+c+\'"\':\'\'}19{1Y+=(c!="")?\' 1j="2C-1m:4E 4F #4G;1s:2d;1n:2Y;\'+c+\'"\':\'\'};1Y+=\'>\';12 1Y};3 R=5(){3 a=K("1H");3 b=K("2u");3 c=K("29");3 d=K("3s");3 e="";3 f="";4(J(B).1E.1c>0){e=$("#"+B+" 2T:11").1q();f=$("#"+B+" 2T:11").18("1X")};f=(f.1c==0||f==14||q.1U==15||q.1N!=15)?"":\'<3x 3y="\'+f+\'" 3z="3A" /> \';3 g=\'<1y 1b="\'+a+\'" 1r="\'+z.2N+\'"\';g+=\'>\';g+=\'<1x 1b="\'+b+\'" 1r="\'+z.2O+\'"></1x><1x 1r="\'+z.1t+\'" 1b="\'+c+\'">\'+f+\'<1x 1r="\'+z.1t+\'">\'+e+\'</1x></1x></1y>\';12 g};3 S=5(){3 c=K("1h");$("#"+c+" a.2W").1J("1P");$("#"+c+" a.2W").1e("1P",5(a){a.1Z();V(1a);21();4(!x){$("#"+c).1J("1B");X(15);3 b=(q.1U==15)?$(1a).1q():$(1a).1I();1T(b);s.2e()}})};3 T=5(){3 d=15;3 e=K("1O");3 f=K("1H");3 g=K("29");3 h=K("1h");3 i=K("2u");3 j=$("#"+B).2Z();j=j+2;3 k=q.1j;4($("#"+e).1c>0){$("#"+e).2D();d=6};3 l=\'<1y 1b="\'+e+\'" 1r="\'+z.28+\'"\';l+=(k!="")?\' 1j="\'+k+\'"\':\'\';l+=\'>\';l+=R();l+=Q();l+=P();l+="</1y>";l+="</1y>";4(d==6){3 m=K("2K");$("#"+m).31(l)}19{$("#"+B).31(l)};4(x){3 f=K("1H");$("#"+f).2f()};$("#"+e).9("2Z",j+"1z");$("#"+h).9("2Z",(j-2)+"1z");4(D.1c>q.2q){3 n=2g($("#"+h+" a:3H").9("2h-3I"))+2g($("#"+h+" a:3H").9("2h-1m"));3 o=((q.3o)*q.2q)-n;$("#"+h).9("1d",o+"1z")}19 4(x){3 o=$("#"+B).1d();$("#"+h).9("1d",o+"1z")};4(d==15){3J();W(B)};4($("#"+B).18("1k")==6){$("#"+e).9("2E",z.1k)};Z();$("#"+f).1e("1B",5(a){32(1)});$("#"+f).1e("1Q",5(a){32(0)});S();$("#"+h+" a.1k").9("2E",z.1k);4(x){$("#"+h).1e("1B",5(c){4(!v.2s){v.2s=6;$(1p).1e("1W",5(a){3 b=a.3K;v.2t=b;4(b==39||b==40){a.1Z();a.2i();33();21()};4(b==37||b==38){a.1Z();a.2i();34();21()}})}})};$("#"+h).1e("1Q",5(a){X(15);$(1p).1J("1W");v.2s=15;v.2t=1o});$("#"+f).1e("1P",5(b){X(15);4($("#"+h+":2j").1c==1){$("#"+h).1J("1B")}19{$("#"+h).1e("1B",5(a){X(6)});s.3L()}});$("#"+f).1e("1Q",5(a){X(15)});4(q.1U&&q.1N!=15){2k()}};3 U=5(a){1D(3 i 2c E){4(E[i].1i==a){12 E[i]}};12-1};3 V=5(a){3 b=K("1h");4($("#"+b+" a."+z.11).1c==1){u=$("#"+b+" a."+z.11).1q()};4(!x){$("#"+b+" a."+z.11).1K(z.11)};3 c=$("#"+b+" a."+z.11).18("1b");4(c!=14){3 d=(v.22==14||v.22==1o)?E[c].1i:v.22};4(a&&!x){$(a).1F(z.11)};4(x){3 e=v.2t;4($("#"+B).18("1v")==6){4(e==17){v.22=E[$(a).18("1b")].1i;$(a).4H(z.11)}19 4(e==16){$("#"+b+" a."+z.11).1K(z.11);$(a).1F(z.11);3 f=$(a).18("1b");3 g=E[f].1i;1D(3 i=35.4I(d,g);i<=35.4J(d,g);i++){$("#"+U(i).1b).1F(z.11)}}19{$("#"+b+" a."+z.11).1K(z.11);$(a).1F(z.11);v.22=E[$(a).18("1b")].1i}}19{$("#"+b+" a."+z.11).1K(z.11);$(a).1F(z.11);v.22=E[$(a).18("1b")].1i}}};3 W=5(a){3 b=a;J(b).4K=5(e){$("#"+b).1S(q)}};3 X=5(a){v.2J=a};3 Y=5(){12 v.2J};3 Z=5(){3 b=K("1O");3 c=A.3t.4L(",");1D(3 d=0;d<c.1c;d++){3 e=c[d];3 f=24(e);4(f==6){2F(e){1f"2x":$("#"+b).1e("4M",5(a){J(B).2x()});1g;1f"1P":$("#"+b).1e("1P",5(a){$("#"+B).1G("1P")});1g;1f"2y":$("#"+b).1e("2y",5(a){$("#"+B).1G("2y")});1g;1f"2z":$("#"+b).1e("2z",5(a){$("#"+B).1G("2z")});1g;1f"1u":$("#"+b).1e("1u",5(a){$("#"+B).1G("1u")});1g;1f"1B":$("#"+b).1e("1B",5(a){$("#"+B).1G("1B")});1g;1f"2A":$("#"+b).1e("2A",5(a){$("#"+B).1G("2A")});1g;1f"1Q":$("#"+b).1e("1Q",5(a){$("#"+B).1G("1Q")});1g}}}};3 3J=5(){3 a=K("2K");$("#"+B).31("<1y 1r=\'"+z.2a+"\' 1j=\'1d:3M;3N:3O;1n:36;\' 1b=\'"+a+"\'></1y>");$("#"+B).4N($("#"+a))};3 1T=5(a){3 b=K("29");$("#"+b).1I(a)};3 3a=5(w){3 a=w;3 b=K("1h");3 c=$("#"+b+" a:2j");3 d=c.1c;3 e=$("#"+b+" a:2j").1i($("#"+b+" a.11:2j"));3 f;2F(a){1f"3b":4(e<d-1){e++;f=c[e]};1g;1f"3P":4(e<d&&e>0){e--;f=c[e]};1g};4(1w(f)=="14"){12 15};$("#"+b+" a."+z.11).1K(z.11);$(f).1F(z.11);3 g=f.1b;4(!x){3 h=(q.1U==15)?E[g].1q:$("#"+g).1I();1T(h);2k(E[g].1i)};4(a=="3b"){4(2g(($("#"+g).1n().1m+$("#"+g).1d()))>=2g($("#"+b).1d())){$("#"+b).2l(($("#"+b).2l())+$("#"+g).1d()+$("#"+g).1d())}}19{4(2g(($("#"+g).1n().1m+$("#"+g).1d()))<=0){$("#"+b).2l(($("#"+b).2l()-$("#"+b).1d())-$("#"+g).1d())}}};3 33=5(){3a("3b")};3 34=5(){3a("3P")};3 2k=5(i){4(q.1N!=15){3 a=K("29");3 b=(1w(i)=="14")?J(B).1l:i;3 c=J(B).1E[b].3w;4(c.1c>0){3 d=K("1h");3 e=$("#"+d+" a."+c).18("1b");3 f=$("#"+e).9("2m-4O");3 g=$("#"+e).9("2m-1n");3 h=$("#"+e).9("2h-3Q");4(f!=14){$("#"+a).2n("."+z.1t).2B(\'1j\',"2m:"+f)};4(g!=14){$("#"+a).2n("."+z.1t).9(\'2m-1n\',g)};4(h!=14){$("#"+a).2n("."+z.1t).9(\'2h-3Q\',h)};$("#"+a).2n("."+z.1t).9(\'2m-3R\',\'4P-3R\');$("#"+a).2n("."+z.1t).9(\'2h-3I\',\'4Q\')}}};3 21=5(){3 a=K("1h");3 b=$("#"+a+" a."+z.11);4(b.1c==1){3 c=$("#"+a+" a."+z.11).1q();3 d=$("#"+a+" a."+z.11).18("1b");4(d!=14){3 e=E[d].2b;J(B).1l=E[d].1i};4(q.1U&&q.1N!=15)2k()}19 4(b.1c>1){1D(3 i=0;i<b.1c;i++){3 d=$(b[i]).18("1b");3 f=E[d].1i;J(B).1E[f].11="11"}};3 g=J(B).1l;s.1V["1l"]=g};3 24=5(a){4($("#"+B).18("4R"+a)!=14){12 6};3 b=$("#"+B).3c("4S");4(b&&b[a]){12 6};12 15};3 3S=5(){3 b=K("1h");4(24(\'2R\')==6){3 c=E[$("#"+b+" a.11").18("1b")].1q;4($.3T(u)!==$.3T(c)&&u!==""){$("#"+B).1G("2R")}};4(24(\'1u\')==6){$("#"+B).1G("1u")};4(24(\'2Q\')==6){$(1p).1e("1u",5(a){$("#"+B).2x();$("#"+B)[0].2Q();21();$(1p).1J("1u")})}};3 32=5(a){3 b=K("2u");4(a==1)$("#"+b).9({3U:\'0 4T%\'});19 $("#"+b).9({3U:\'0 0\'})};3 3V=5(){1D(3 i 2c J(B)){4(1w(J(B)[i])!=\'5\'&&J(B)[i]!==14&&J(B)[i]!==1o){s.1A(i,J(B)[i],6)}}};3 3W=5(a,b){4(U(b)!=-1){J(B)[a]=b;3 c=K("1h");$("#"+c+" a."+z.11).1K(z.11);$("#"+U(b).1b).1F(z.11);3 d=U(J(B).1l).1I;1T(d)}};3 3X=5(i,a){4(a==\'d\'){1D(3 b 2c E){4(E[b].1i==i){4U E[b];1g}}};3 c=0;1D(3 b 2c E){E[b].1i=c;c++}};3 2G=5(){3 a=K("1h");3 b=K("1O");3 c=$("#"+b).1n();3 d=$("#"+b).1d();3 e=$(3Y).1d();3 f=$(3Y).2l();3 g=$("#"+a).1d();3 h={1M:q.1M,1m:(c.1m+d)+"1z",1s:"2o"};3 i=q.3q;3 j=15;3 k=z.2w;$("#"+a).1K(z.2w);$("#"+a).1K(z.2v);4((e+f)<35.4V(g+d+c.1m)){3 l=c.1m-g;4((c.1m-g)<0){l=10};h={1M:q.1M,1m:l+"1z",1s:"2o"};i="25";j=6;k=z.2v};12{3d:j,3Z:i,9:h,2C:k}};3 3e=5(){4(s.1R["41"]!=1o){2H(s.1R["41"])(s)}};3 3f=5(){3S();4(s.1R["42"]!=1o){2H(s.1R["42"])(s)}};1a.3L=5(){4((s.26("1k",6)==6)||(s.26("1E",6).1c==0))12;3 e=K("1h");4(1L!=""&&e!=1L){$("#"+1L).43("3g");$("#"+1L).9({1M:\'0\'})};4($("#"+e).9("1s")=="2o"){u=E[$("#"+e+" a.11").18("1b")].1q;3 f="";H=$("#"+e).1d();$("#"+e+" a").25();$(1p).1e("1W",5(a){3 b=a.3K;4(b==8){a.1Z();a.2i();f=(f.1c==0)?"":f.3F(0,f.1c-1)};2F(b){1f 39:1f 40:a.1Z();a.2i();33();1g;1f 37:1f 38:a.1Z();a.2i();34();1g;1f 27:1f 13:s.2e();21();1g;44:4(b>46){f+=4W.4X(b)};3 c=O(f);4(c!=-1){$("#"+e).9({1d:\'4Y\'});$("#"+e+" a").2f();$(c).25();3 d=2G();$("#"+e).9(d.9);$("#"+e).9({1s:\'2d\'})}19{$("#"+e+" a").25();$("#"+e).9({1d:H+\'1z\'})};1g};4(24("1W")==6){J(B).4Z()}});$(1p).1e("2S",5(a){4($("#"+B).18("45")!=14){J(B).45()}});$(1p).1e("1u",5(a){4(Y()==15){s.2e()}});3 g=2G();$("#"+e).9(g.9);4(g.3d==6){$("#"+e).9({1s:\'2d\'});$("#"+e).1F(g.2C);3e()}19{$("#"+e)[g.3Z]("3g",5(){$("#"+e).1F(g.2C);3e()})};4(e!=1L){1L=e}}};1a.2e=5(){3 b=K("1h");3 c=$("#"+K("1H")).1n().1m;3 d=2G();G=15;4(d.3d==6){$("#"+b).50({1d:0,1m:c},5(){$("#"+b).9({1d:H+\'1z\',1s:\'2o\'});3f()})}19{$("#"+b).43("3g",5(a){3f();$("#"+b).9({1M:\'0\'});$("#"+b).9({1d:H+\'1z\'})})};2k();$(1p).1J("1W");$(1p).1J("2S");$(1p).1J("1u")};1a.1l=5(i){4(1w(i)=="14"){12 s.26("1l")}19{s.1A("1l",i)}};1a.51=5(a){4(1w(a)=="14"||a==6){$("."+z.2a).52("1j")}19{$("."+z.2a).2B("1j","1d:3M;3N:3O;1n:36")}};1a.1A=5(a,b,c){4(a==14||b==14)47{48:"1A 53 54?"};s.1V[a]=b;4(c!=6){2F(a){1f"1l":3W(a,b);1g;1f"1k":s.1k(b,6);1g;1f"1v":J(B)[a]=b;x=($(r).18("1C")>0||$(r).18("1v")==6)?6:15;4(x){3 d=$("#"+B).1d();3 f=K("1h");$("#"+f).9("1d",d+"1z");3 g=K("1H");$("#"+g).2f();3 f=K("1h");$("#"+f).9({1s:\'2d\',1n:\'2Y\'});S()};1g;1f"1C":J(B)[a]=b;4(b==0){J(B).1v=15};x=($(r).18("1C")>0||$(r).18("1v")==6)?6:15;4(b==0){3 g=K("1H");$("#"+g).25();3 f=K("1h");$("#"+f).9({1s:\'2o\',1n:\'36\'});3 h="";4(J(B).1l>=0){3 i=U(J(B).1l);h=i.1I;V($("#"+i.1b))};1T(h)}19{3 g=K("1H");$("#"+g).2f();3 f=K("1h");$("#"+f).9({1s:\'2d\',1n:\'2Y\'})};1g;44:55{J(B)[a]=b}56(e){};1g}}};1a.26=5(a,b){4(a==14&&b==14){12 s.1V};4(a!=14&&b==14){12(s.1V[a]!=14)?s.1V[a]:1o};4(a!=14&&b!=14){12 J(B)[a]}};1a.2j=5(a){3 b=K("1O");4(a==6){$("#"+b).25()}19 4(a==15){$("#"+b).2f()}19{12 $("#"+b).9("1s")}};1a.57=5(a,b){3 c=a;3 d=c.1q;3 e=(c.2b==14||c.2b==1o)?d:c.2b;3 f=(c["1X"]==14||c["1X"]==1o)?\'\':c["1X"];3 i=(b==14||b==1o)?J(B).1E.1c:b;J(B).1E[i]=2r 58(d,e);4(f!=\'\')J(B).1E[i]["1X"]=f;3 g=U(i);4(g!=-1){3 h=N(J(B).1E[i],i,"","");$("#"+g.1b).1I(h)}19{3 h=N(J(B).1E[i],i,"","");3 j=K("1h");$("#"+j).59(h);S()}};1a.2D=5(i){J(B).2D(i);4((U(i))!=-1){$("#"+U(i).1b).2D();3X(i,\'d\')};4(J(B).1c==0){1T("")}19{3 a=U(J(B).1l).1I;1T(a)};s.1A("1l",J(B).1l)};1a.1k=5(a,b){J(B).1k=a;3 c=K("1O");4(a==6){$("#"+c).9("2E",z.1k);s.2e()}19 4(a==15){$("#"+c).9("2E",1)};4(b!=6){s.1A("1k",a)}};1a.3h=5(){12(J(B).3h==14)?1o:J(B).3h};1a.3i=5(){4(2p.1c==1){12 J(B).3i(2p[0])}19 4(2p.1c==2){12 J(B).3i(2p[0],2p[1])}19{47{48:"5a 1i 5b 5c!"}}};1a.49=5(a){12 J(B).49(a)};1a.1v=5(a){4(1w(a)=="14"){12 s.26("1v")}19{s.1A("1v",a)}};1a.1C=5(a){4(1w(a)=="14"){12 s.26("1C")}19{s.1A("1C",a)}};1a.5d=5(a,b){s.1R[a]=b};1a.5e=5(a){2H(s.1R[a])(s)};3 4a=5(){s.1A("3j",$.1S.3j);s.1A("3k",$.1S.3k)};3 4b=5(){T();3V();4a();4(q.2I!=\'\'){2H(q.2I)(s)}};4b()};$.1S={3j:2.37,3k:"5f 5g",3u:20,5h:5(a,b){12 $(a).1S(b).3c("28")}};$.3l.3n({1S:5(b){12 1a.2X(5(){3 a=2r 3m(1a,b);$(1a).3c(\'28\',a)})}});4(1w($.3l.18)==\'14\'){$.3l.18=5(w){12 $(1a).2B(w)}}})(5i);',62,329,'|||var|if|function|true|||css||||||||||||||||||||||||||||||||||||||||||||||||||||||selected|return||undefined|false|||prop|else|this|id|length|height|bind|case|break|postChildID|index|style|disabled|selectedIndex|top|position|null|document|text|class|display|ddTitleText|mouseup|multiple|typeof|span|div|px|set|mouseover|size|for|options|addClass|trigger|postTitleID|html|unbind|removeClass|bs|zIndex|useSprite|postID|click|mouseout|onActions|msDropDown|bv|showIcon|ddProp|keydown|title|sDiv|preventDefault||bA|oldIndex||bB|show|get||dd|postTitleTextID|ddOutOfVision|value|in|block|close|hide|parseInt|padding|stopPropagation|visible|bz|scrollTop|background|find|none|arguments|visibleRows|new|keyboardAction|currentKey|postArrowID|borderTop|noBorderTop|focus|dblclick|mousedown|mousemove|attr|border|remove|opacity|switch|bH|eval|onInit|insideWindow|postElementHolder|postAID|postOPTAID|ddTitle|arrow|ddChild|blur|change|keyup|option|opt|_|enabled|each|relative|width||after|bD|bx|by|Math|absolute||||bw|next|data|opp|bI|bJ|fast|form|item|version|author|fn|bt|extend|rowHeight|mainCSS|animStyle|Object|postInputhidden|actions|counter|children|className|img|src|align|absmiddle|href|javascript|void|toLowerCase|substr|font|first|bottom|bu|keyCode|open|0px|overflow|hidden|previous|left|repeat|bC|trim|backgroundPosition|bE|bF|bG|window|ani||onOpen|onClose|slideUp|default|onkeyup||throw|message|namedItem|bK|bL|120|9999|slideDown|_msddHolder|_msdd|_title|_titletext|_child|_msa|_msopta|postInputID|_msinput|_arrow|_inp|keypress|tabindex|msdrpdd|getElementById|val|nodeName|OPTGROUP|opta|weight|bold|italic|clear|both|label|1px|solid|c3c3c3|toggleClass|min|max|refresh|split|mouseenter|appendTo|image|no|2px|on|events|100|delete|floor|String|fromCharCode|auto|onkeydown|animate|debug|removeAttr|to|what|try|catch|add|Option|append|An|is|required|addMyEvent|fireEvent|Marghoob|Suleman|create|jQuery'.split('|'),0,{}))
+\ No newline at end of file
+diff -up cacti-0.8.8a/include/js/jquery/jquery.dropdown.js.legal cacti-0.8.8a/include/js/jquery/jquery.dropdown.js
+--- cacti-0.8.8a/include/js/jquery/jquery.dropdown.js.legal    2013-01-04 15:44:38.032416068 -0500
++++ cacti-0.8.8a/include/js/jquery/jquery.dropdown.js  2013-01-04 15:43:12.644377988 -0500
+@@ -0,0 +1,227 @@
++/*
++ +-------------------------------------------------------------------------+
++ | Copyright (C) 2004-2013 The Cacti Group                                 |
++ |                                                                         |
++ | This 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.                  |
++ |                                                                         |
++ | This program is distributed in the hope that it will be useful,         |
++ | but WITHOUT ANY WARRANTY; without even the implied warranty of          |
++ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           |
++ | GNU General Public License for more details.                            |
++ +-------------------------------------------------------------------------+
++ | Cacti: The Complete RRDTool-based Graphing Solution                     |
++ +-------------------------------------------------------------------------+
++ | This code is designed, written, and maintained by the Cacti Group. See  |
++ | about.php and/or the AUTHORS file for specific developer information.   |
++ +-------------------------------------------------------------------------+
++ | http://www.cacti.net/                                                   |
++ +-------------------------------------------------------------------------+
++*/
++
++(function($){
++ $.fn.DropDownMenu = function(options) {
++
++      var defaults = {
++              title:                  false,
++              subtitle:               false,
++              name:                   'myName',
++              maxHeight:              300,
++              width:                  'auto',
++              timeout:                500,
++              auto_close:     10000,
++              html:                   '<h6>empty</h6>',
++              offsetX:                0,
++              offsetY:                0,
++              simultaneous:   false,
++              textAlign:              'left'
++      };
++
++      var timerref            = null;
++      var menu                        = null;
++      var menuHeight          = 0;
++      var options             = $.extend(defaults, options);
++      var contentHeight       = 0;
++
++      /* do nothing if requested menu is still loaded */
++      if($('#' + options.name).is(":visible")) { return; }
++
++      /* remove all open menus from DOM if they should not stay in front at the same time */
++      var oldMenus = $(".cacti_dd_menu");
++      if(options.simultaneous == false) {
++              oldMenus.css({'overflow-y':'hidden'}).slideUp('200');
++              oldMenus.queue(function () {
++                      oldMenus.remove();
++                      oldMenus.dequeue();
++              });
++      }
++
++      return this.each(function() {
++              obj = $(this);
++              newMenu = _init_menu(obj);
++              _open_menu(newMenu);
++      });
++
++      function _init_menu(initiator){
++              /* create the main menu structure */
++              $("<div id='" + options.name + "' style='display: none;' class='cacti_dd_menu ui-widget ui-corner-all'>"
++                      + "<div id='" + options.name + "_title' class='title ui-state-default ui-corner-top'><h6>" + options.title + "</h6></div>"
++                      + "<div id='" + options.name + "_back' class='back ui-state-active'></div>"
++                      + "<div id='" + options.name + "_content' class='content ui-widget-content ui-state-highlight " + ((options.subtitle !== false) ? "" : "ui-corner-bottom" ) + "'></div>"
++                      + "<div id='" + options.name + "_subtitle' class='subtitle ui-state-default ui-corner-bottom'><h6>" + options.subtitle + "</h6></div>"
++                      + "<div id='" + options.name + "_html' class='html'></div>"
++              + "</div>").appendTo("body");
++
++              /* define references to the menu and its different sections */
++              menu                    = $('#' + options.name);
++              menu_head               = $('#' + options.name + '_title');
++              menu_content    = $('#' + options.name + '_content');
++              menu_back               = $('#' + options.name + '_back');
++              menu_subhead    = $('#' + options.name + '_subtitle');
++              menu_html               = $('#' + options.name + '_html');
++
++              /* while div container "myName_html" holds the raw data ... */
++              menu_html.append(options.html);
++              i=1;
++              menu_html.find("h6:has(div)").each(function() {
++                      var subMenu = $(this);
++                      var subMenuClass = options.name + '_' + i;
++                      var subMenuTitle = subMenu.find('a:first').html();
++                      subMenu.addClass(subMenuClass);
++                      $('.'+subMenuClass).die().live("click", function(){ _switch_layer( subMenuClass); } );
++                      subMenu.children("div").hide();
++                      subMenu.find('a:first').html('<span style="float:left; min-width:80%;">' + subMenuTitle + '</span><span class="ui-icon ui-icon-triangle-1-e" style="float:right;"></span>');
++                      i++;
++              });
++
++              /* ... "myName_content" will have the visible menu data */
++              menu_content.append(menu_html.html());
++
++              /* if necessary show title, subtitle ... */
++              if(options.title        !== false) { menu_head.show(); }
++              if(options.subtitle !== false) { menu_subhead.show(); }
++
++              /* make content visible */
++              menu_content.show();
++
++              /* reduce height to a minimum for best fit */
++              menuHeight = (menu.outerHeight() > options.maxHeight) ? options.maxHeight : menu.outerHeight();
++
++              /* set the width to a fixed value */
++              if(!isNaN(parseInt(options.width))) {
++                      menu.css({
++                              'min-width' : options.width + 'px',
++                              'max-width' : options.width + 'px'
++                      });
++                      menu.width(options.width);
++              }else {
++                      // use real width plus 15 percent
++                      var width = menu.outerWidth(true)*1.15;
++                      menu.css({
++                              'min-width' : width + 'px',
++                              'max-width' : width + 'px'
++                      });
++                      menu.width(width);
++              }
++
++              /* default position of the menu container */
++              menu.css({
++                      // x-position in relation to the initiator
++                      'left'  : initiator.offset().left + options.offsetX + 'px',
++                      // y-position in relation to the initiator
++                      'top'   : initiator.offset().top + initiator.height() + options.offsetY + 'px'
++              });
++
++              /* change the orientation from right to left if width exceeds the windows size */
++              if((initiator.offset().left + initiator.width() + options.offsetX + menu.outerWidth(true)) > $(window).width()) {
++                      menu.css({'left' : (initiator.offset().left + initiator.width() - menu.outerWidth(true)) + 'px'});
++              }
++
++              menu.css({'height':0, 'text-align':options.textAlign});
++              menu.bind('mouseover', _cancel_timer);
++              menu.bind('mouseout', _set_timer);
++              return menu;
++      }
++
++
++      function _switch_layer(subMenuClass){
++              if(subMenuClass == null) {
++                      var content = menu_html;
++                      menu_back.empty().hide();
++                      menu_content.height(contentHeight);
++              }else {
++                      var content = menu_html.find('.' + subMenuClass + ' div:first');
++                      menu_back.show();
++              }
++
++              parentClass = menu_html.find('.' + subMenuClass).parents('h6').attr('class');
++
++              menu_back.empty().append( menu_html.find('.' + subMenuClass + ' a:first').html() );
++              menu_back.find('span:last').removeClass('ui-icon-triangle-1-e').addClass('ui-icon-triangle-1-s');
++              menu_back.unbind('click').click( function() { _switch_layer( parentClass); });
++
++              menu_content.empty().append(content.html());
++
++              /* re-calculate content height */
++              if(subMenuClass != null) {
++                              menu_head_height        = menu_head.is(":visible")              ? menu_head.outerHeight()               : 0;
++                              menu_back_height        = menu_back.is(":visible")              ? menu_back.outerHeight()               : 0;
++                              menu_subhead_height     = menu_subhead.is(":visible")   ? menu_subhead.outerHeight()    : 0;
++
++                              menu_content.height(menuHeight - menu_head_height - menu_back_height - menu_subhead_height);
++              }
++
++              /* return false to suppress unwanted click events*/
++              return false;
++      }
++
++      function _set_timer(timer){
++                      timer = ( typeof(timer) != 'number' ) ? options.timeout : timer;
++                      timerref = window.setTimeout( _close_menu, timer);
++      }
++
++      function _cancel_timer() {
++              if(timerref) {
++                      window.clearTimeout(timerref);
++                      timerref = null;
++              }
++      }
++
++      function _close_menu(){
++              menu = $('#' + options.name);
++              menu.slideUp(menuHeight*3);
++              menu.queue(function () {
++                      menu.remove();
++                      menu.dequeue();
++              });
++      }
++
++      function _open_menu(obj){
++              //wait until oldMenu is completey closed before opening a new one
++              var wait = setInterval(function() {
++                      if( !oldMenus.is(":animated") ) {
++                              clearInterval(wait);
++                              obj.show().animate({height: menuHeight}, menuHeight*3);
++
++                              //setup contentHeight;
++                              menu_head_height        = menu_head.is(":visible")              ? menu_head.outerHeight()               : 0;
++                              menu_back_height        = menu_back.is(":visible")              ? menu_back.outerHeight()               : 0;
++                              menu_subhead_height     = menu_subhead.is(":visible")   ? menu_subhead.outerHeight()    : 0;
++
++                              menu_content.height(menuHeight - menu_head_height - menu_back_height - menu_subhead_height);
++
++                              contentHeight = $('#' + options.name + '_content').height();
++                              $('#' + options.name + '_content').css({'overflow-y':'auto'});
++
++                              obj.find('h6').eq(0).focus();
++                              if(options.auto_close !== false) {
++                                      _set_timer(options.auto_close);
++                              }
++                      }
++              }, 200);
++      }
++
++ };
++})(jQuery);
+\ No newline at end of file
+diff -up cacti-0.8.8a/include/js/jquery/jquery.js.legal cacti-0.8.8a/include/js/jquery/jquery.js
+--- cacti-0.8.8a/include/js/jquery/jquery.js.legal     2013-01-04 15:44:38.035416071 -0500
++++ cacti-0.8.8a/include/js/jquery/jquery.js   2013-01-04 15:43:12.644377988 -0500
+@@ -0,0 +1,4 @@
++/*! jQuery v1.7.1 jquery.com | jquery.org/license */
++(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
++f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
++{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
+\ No newline at end of file
+diff -up cacti-0.8.8a/include/js/jquery/jquery.jstree.js.legal cacti-0.8.8a/include/js/jquery/jquery.jstree.js
+--- cacti-0.8.8a/include/js/jquery/jquery.jstree.js.legal      2013-01-04 15:44:38.036416073 -0500
++++ cacti-0.8.8a/include/js/jquery/jquery.jstree.js    2013-01-04 15:43:12.645377988 -0500
+@@ -0,0 +1,4551 @@
++/*\r
++ * jsTree 1.0-rc3\r
++ * http://jstree.com/\r
++ *\r
++ * Copyright (c) 2010 Ivan Bozhanov (vakata.com)\r
++ *\r
++ * Licensed same as jquery - under the terms of either the MIT License or the GPL Version 2 License\r
++ *   http://www.opensource.org/licenses/mit-license.php\r
++ *   http://www.gnu.org/licenses/gpl.html\r
++ *\r
++ * $Date: 2011-02-09 01:17:14 +0200 (ср, 09 февр 2011) $\r
++ * $Revision: 236 $\r
++ */\r
++\r
++/*jslint browser: true, onevar: true, undef: true, bitwise: true, strict: true */\r
++/*global window : false, clearInterval: false, clearTimeout: false, document: false, setInterval: false, setTimeout: false, jQuery: false, navigator: false, XSLTProcessor: false, DOMParser: false, XMLSerializer: false*/\r
++\r
++"use strict";\r
++\r
++// top wrapper to prevent multiple inclusion (is this OK?)\r
++(function () { if(jQuery && jQuery.jstree) { return; }\r
++      var is_ie6 = false, is_ie7 = false, is_ff2 = false;\r
++\r
++/* \r
++ * jsTree core\r
++ */\r
++(function ($) {\r
++      // Common functions not related to jsTree \r
++      // decided to move them to a `vakata` "namespace"\r
++      $.vakata = {};\r
++      // CSS related functions\r
++      $.vakata.css = {\r
++              get_css : function(rule_name, delete_flag, sheet) {\r
++                      rule_name = rule_name.toLowerCase();\r
++                      var css_rules = sheet.cssRules || sheet.rules,\r
++                              j = 0;\r
++                      do {\r
++                              if(css_rules.length && j > css_rules.length + 5) { return false; }\r
++                              if(css_rules[j].selectorText && css_rules[j].selectorText.toLowerCase() == rule_name) {\r
++                                      if(delete_flag === true) {\r
++                                              if(sheet.removeRule) { sheet.removeRule(j); }\r
++                                              if(sheet.deleteRule) { sheet.deleteRule(j); }\r
++                                              return true;\r
++                                      }\r
++                                      else { return css_rules[j]; }\r
++                              }\r
++                      }\r
++                      while (css_rules[++j]);\r
++                      return false;\r
++              },\r
++              add_css : function(rule_name, sheet) {\r
++                      if($.jstree.css.get_css(rule_name, false, sheet)) { return false; }\r
++                      if(sheet.insertRule) { sheet.insertRule(rule_name + ' { }', 0); } else { sheet.addRule(rule_name, null, 0); }\r
++                      return $.vakata.css.get_css(rule_name);\r
++              },\r
++              remove_css : function(rule_name, sheet) { \r
++                      return $.vakata.css.get_css(rule_name, true, sheet); \r
++              },\r
++              add_sheet : function(opts) {\r
++                      var tmp = false, is_new = true;\r
++                      if(opts.str) {\r
++                              if(opts.title) { tmp = $("style[id='" + opts.title + "-stylesheet']")[0]; }\r
++                              if(tmp) { is_new = false; }\r
++                              else {\r
++                                      tmp = document.createElement("style");\r
++                                      tmp.setAttribute('type',"text/css");\r
++                                      if(opts.title) { tmp.setAttribute("id", opts.title + "-stylesheet"); }\r
++                              }\r
++                              if(tmp.styleSheet) {\r
++                                      if(is_new) { \r
++                                              document.getElementsByTagName("head")[0].appendChild(tmp); \r
++                                              tmp.styleSheet.cssText = opts.str; \r
++                                      }\r
++                                      else {\r
++                                              tmp.styleSheet.cssText = tmp.styleSheet.cssText + " " + opts.str; \r
++                                      }\r
++                              }\r
++                              else {\r
++                                      tmp.appendChild(document.createTextNode(opts.str));\r
++                                      document.getElementsByTagName("head")[0].appendChild(tmp);\r
++                              }\r
++                              return tmp.sheet || tmp.styleSheet;\r
++                      }\r
++                      if(opts.url) {\r
++                              if(document.createStyleSheet) {\r
++                                      try { tmp = document.createStyleSheet(opts.url); } catch (e) { }\r
++                              }\r
++                              else {\r
++                                      tmp                     = document.createElement('link');\r
++                                      tmp.rel         = 'stylesheet';\r
++                                      tmp.type        = 'text/css';\r
++                                      tmp.media       = "all";\r
++                                      tmp.href        = opts.url;\r
++                                      document.getElementsByTagName("head")[0].appendChild(tmp);\r
++                                      return tmp.styleSheet;\r
++                              }\r
++                      }\r
++              }\r
++      };\r
++\r
++      // private variables \r
++      var instances = [],                     // instance array (used by $.jstree.reference/create/focused)\r
++              focused_instance = -1,  // the index in the instance array of the currently focused instance\r
++              plugins = {},                   // list of included plugins\r
++              prepared_move = {};             // for the move_node function\r
++\r
++      // jQuery plugin wrapper (thanks to jquery UI widget function)\r
++      $.fn.jstree = function (settings) {\r
++              var isMethodCall = (typeof settings == 'string'), // is this a method call like $().jstree("open_node")\r
++                      args = Array.prototype.slice.call(arguments, 1), \r
++                      returnValue = this;\r
++\r
++              // if a method call execute the method on all selected instances\r
++              if(isMethodCall) {\r
++                      if(settings.substring(0, 1) == '_') { return returnValue; }\r
++                      this.each(function() {\r
++                              var instance = instances[$.data(this, "jstree_instance_id")],\r
++                                      methodValue = (instance && $.isFunction(instance[settings])) ? instance[settings].apply(instance, args) : instance;\r
++                                      if(typeof methodValue !== "undefined" && (settings.indexOf("is_") === 0 || (methodValue !== true && methodValue !== false))) { returnValue = methodValue; return false; }\r
++                      });\r
++              }\r
++              else {\r
++                      this.each(function() {\r
++                              // extend settings and allow for multiple hashes and $.data\r
++                              var instance_id = $.data(this, "jstree_instance_id"),\r
++                                      a = [],\r
++                                      b = settings ? $.extend({}, true, settings) : {},\r
++                                      c = $(this), \r
++                                      s = false, \r
++                                      t = [];\r
++                              a = a.concat(args);\r
++                              if(c.data("jstree")) { a.push(c.data("jstree")); }\r
++                              b = a.length ? $.extend.apply(null, [true, b].concat(a)) : b;\r
++\r
++                              // if an instance already exists, destroy it first\r
++                              if(typeof instance_id !== "undefined" && instances[instance_id]) { instances[instance_id].destroy(); }\r
++                              // push a new empty object to the instances array\r
++                              instance_id = parseInt(instances.push({}),10) - 1;\r
++                              // store the jstree instance id to the container element\r
++                              $.data(this, "jstree_instance_id", instance_id);\r
++                              // clean up all plugins\r
++                              b.plugins = $.isArray(b.plugins) ? b.plugins : $.jstree.defaults.plugins.slice();\r
++                              b.plugins.unshift("core");\r
++                              // only unique plugins\r
++                              b.plugins = b.plugins.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",");\r
++\r
++                              // extend defaults with passed data\r
++                              s = $.extend(true, {}, $.jstree.defaults, b);\r
++                              s.plugins = b.plugins;\r
++                              $.each(plugins, function (i, val) { \r
++                                      if($.inArray(i, s.plugins) === -1) { s[i] = null; delete s[i]; } \r
++                                      else { t.push(i); }\r
++                              });\r
++                              s.plugins = t;\r
++\r
++                              // push the new object to the instances array (at the same time set the default classes to the container) and init\r
++                              instances[instance_id] = new $.jstree._instance(instance_id, $(this).addClass("jstree jstree-" + instance_id), s); \r
++                              // init all activated plugins for this instance\r
++                              $.each(instances[instance_id]._get_settings().plugins, function (i, val) { instances[instance_id].data[val] = {}; });\r
++                              $.each(instances[instance_id]._get_settings().plugins, function (i, val) { if(plugins[val]) { plugins[val].__init.apply(instances[instance_id]); } });\r
++                              // initialize the instance\r
++                              setTimeout(function() { if(instances[instance_id]) { instances[instance_id].init(); } }, 0);\r
++                      });\r
++              }\r
++              // return the jquery selection (or if it was a method call that returned a value - the returned value)\r
++              return returnValue;\r
++      };\r
++      // object to store exposed functions and objects\r
++      $.jstree = {\r
++              defaults : {\r
++                      plugins : []\r
++              },\r
++              _focused : function () { return instances[focused_instance] || null; },\r
++              _reference : function (needle) { \r
++                      // get by instance id\r
++                      if(instances[needle]) { return instances[needle]; }\r
++                      // get by DOM (if still no luck - return null\r
++                      var o = $(needle); \r
++                      if(!o.length && typeof needle === "string") { o = $("#" + needle); }\r
++                      if(!o.length) { return null; }\r
++                      return instances[o.closest(".jstree").data("jstree_instance_id")] || null; \r
++              },\r
++              _instance : function (index, container, settings) { \r
++                      // for plugins to store data in\r
++                      this.data = { core : {} };\r
++                      this.get_settings       = function () { return $.extend(true, {}, settings); };\r
++                      this._get_settings      = function () { return settings; };\r
++                      this.get_index          = function () { return index; };\r
++                      this.get_container      = function () { return container; };\r
++                      this.get_container_ul = function () { return container.children("ul:eq(0)"); };\r
++                      this._set_settings      = function (s) { \r
++                              settings = $.extend(true, {}, settings, s);\r
++                      };\r
++              },\r
++              _fn : { },\r
++              plugin : function (pname, pdata) {\r
++                      pdata = $.extend({}, {\r
++                              __init          : $.noop, \r
++                              __destroy       : $.noop,\r
++                              _fn                     : {},\r
++                              defaults        : false\r
++                      }, pdata);\r
++                      plugins[pname] = pdata;\r
++\r
++                      $.jstree.defaults[pname] = pdata.defaults;\r
++                      $.each(pdata._fn, function (i, val) {\r
++                              val.plugin              = pname;\r
++                              val.old                 = $.jstree._fn[i];\r
++                              $.jstree._fn[i] = function () {\r
++                                      var rslt,\r
++                                              func = val,\r
++                                              args = Array.prototype.slice.call(arguments),\r
++                                              evnt = new $.Event("before.jstree"),\r
++                                              rlbk = false;\r
++\r
++                                      if(this.data.core.locked === true && i !== "unlock" && i !== "is_locked") { return; }\r
++\r
++                                      // Check if function belongs to the included plugins of this instance\r
++                                      do {\r
++                                              if(func && func.plugin && $.inArray(func.plugin, this._get_settings().plugins) !== -1) { break; }\r
++                                              func = func.old;\r
++                                      } while(func);\r
++                                      if(!func) { return; }\r
++\r
++                                      // context and function to trigger events, then finally call the function\r
++                                      if(i.indexOf("_") === 0) {\r
++                                              rslt = func.apply(this, args);\r
++                                      }\r
++                                      else {\r
++                                              rslt = this.get_container().triggerHandler(evnt, { "func" : i, "inst" : this, "args" : args, "plugin" : func.plugin });\r
++                                              if(rslt === false) { return; }\r
++                                              if(typeof rslt !== "undefined") { args = rslt; }\r
++\r
++                                              rslt = func.apply(\r
++                                                      $.extend({}, this, { \r
++                                                              __callback : function (data) { \r
++                                                                      this.get_container().triggerHandler( i + '.jstree', { "inst" : this, "args" : args, "rslt" : data, "rlbk" : rlbk });\r
++                                                              },\r
++                                                              __rollback : function () { \r
++                                                                      rlbk = this.get_rollback();\r
++                                                                      return rlbk;\r
++                                                              },\r
++                                                              __call_old : function (replace_arguments) {\r
++                                                                      return func.old.apply(this, (replace_arguments ? Array.prototype.slice.call(arguments, 1) : args ) );\r
++                                                              }\r
++                                                      }), args);\r
++                                      }\r
++\r
++                                      // return the result\r
++                                      return rslt;\r
++                              };\r
++                              $.jstree._fn[i].old = val.old;\r
++                              $.jstree._fn[i].plugin = pname;\r
++                      });\r
++              },\r
++              rollback : function (rb) {\r
++                      if(rb) {\r
++                              if(!$.isArray(rb)) { rb = [ rb ]; }\r
++                              $.each(rb, function (i, val) {\r
++                                      instances[val.i].set_rollback(val.h, val.d);\r
++                              });\r
++                      }\r
++              }\r
++      };\r
++      // set the prototype for all instances\r
++      $.jstree._fn = $.jstree._instance.prototype = {};\r
++\r
++      // load the css when DOM is ready\r
++      $(function() {\r
++              // code is copied from jQuery ($.browser is deprecated + there is a bug in IE)\r
++              var u = navigator.userAgent.toLowerCase(),\r
++                      v = (u.match( /.+?(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],\r
++                      css_string = '' + \r
++                              '.jstree ul, .jstree li { display:block; margin:0 0 0 0; padding:0 0 0 0; list-style-type:none; } ' + \r
++                              '.jstree li { display:block; min-height:18px; line-height:18px; white-space:nowrap; margin-left:18px; min-width:18px; } ' + \r
++                              '.jstree-rtl li { margin-left:0; margin-right:18px; } ' + \r
++                              '.jstree > ul > li { margin-left:0px; } ' + \r
++                              '.jstree-rtl > ul > li { margin-right:0px; } ' + \r
++                              '.jstree ins { display:inline-block; text-decoration:none; width:18px; height:18px; margin:0 0 0 0; padding:0; } ' + \r
++                              '.jstree a { display:inline-block; line-height:16px; height:16px; color:black; white-space:nowrap; text-decoration:none; padding:1px 2px; margin:0; } ' + \r
++                              '.jstree a:focus { outline: none; } ' + \r
++                              '.jstree a > ins { height:16px; width:16px; } ' + \r
++                              '.jstree a > .jstree-icon { margin-right:3px; } ' + \r
++                              '.jstree-rtl a > .jstree-icon { margin-left:3px; margin-right:0; } ' + \r
++                              'li.jstree-open > ul { display:block; } ' + \r
++                              'li.jstree-closed > ul { display:none; } ';\r
++              // Correct IE 6 (does not support the > CSS selector)\r
++              if(/msie/.test(u) && parseInt(v, 10) == 6) { \r
++                      is_ie6 = true;\r
++\r
++                      // fix image flicker and lack of caching\r
++                      try {\r
++                              document.execCommand("BackgroundImageCache", false, true);\r
++                      } catch (err) { }\r
++\r
++                      css_string += '' + \r
++                              '.jstree li { height:18px; margin-left:0; margin-right:0; } ' + \r
++                              '.jstree li li { margin-left:18px; } ' + \r
++                              '.jstree-rtl li li { margin-left:0px; margin-right:18px; } ' + \r
++                              'li.jstree-open ul { display:block; } ' + \r
++                              'li.jstree-closed ul { display:none !important; } ' + \r
++                              '.jstree li a { display:inline; border-width:0 !important; padding:0px 2px !important; } ' + \r
++                              '.jstree li a ins { height:16px; width:16px; margin-right:3px; } ' + \r
++                              '.jstree-rtl li a ins { margin-right:0px; margin-left:3px; } ';\r
++              }\r
++              // Correct IE 7 (shifts anchor nodes onhover)\r
++              if(/msie/.test(u) && parseInt(v, 10) == 7) { \r
++                      is_ie7 = true;\r
++                      css_string += '.jstree li a { border-width:0 !important; padding:0px 2px !important; } ';\r
++              }\r
++              // correct ff2 lack of display:inline-block\r
++              if(!/compatible/.test(u) && /mozilla/.test(u) && parseFloat(v, 10) < 1.9) {\r
++                      is_ff2 = true;\r
++                      css_string += '' + \r
++                              '.jstree ins { display:-moz-inline-box; } ' + \r
++                              '.jstree li { line-height:12px; } ' + // WHY??\r
++                              '.jstree a { display:-moz-inline-box; } ' + \r
++                              '.jstree .jstree-no-icons .jstree-checkbox { display:-moz-inline-stack !important; } ';\r
++                              /* this shouldn't be here as it is theme specific */\r
++              }\r
++              // the default stylesheet\r
++              $.vakata.css.add_sheet({ str : css_string, title : "jstree" });\r
++      });\r
++\r
++      // core functions (open, close, create, update, delete)\r
++      $.jstree.plugin("core", {\r
++              __init : function () {\r
++                      this.data.core.locked = false;\r
++                      this.data.core.to_open = this.get_settings().core.initially_open;\r
++                      this.data.core.to_load = this.get_settings().core.initially_load;\r
++              },\r
++              defaults : { \r
++                      html_titles     : false,\r
++                      animation       : 500,\r
++                      initially_open : [],\r
++                      initially_load : [],\r
++                      open_parents : true,\r
++                      notify_plugins : true,\r
++                      rtl                     : false,\r
++                      load_open       : false,\r
++                      strings         : {\r
++                              loading         : "Loading ...",\r
++                              new_node        : "New node",\r
++                              multiple_selection : "Multiple selection"\r
++                      }\r
++              },\r
++              _fn : { \r
++                      init    : function () { \r
++                              this.set_focus(); \r
++                              if(this._get_settings().core.rtl) {\r
++                                      this.get_container().addClass("jstree-rtl").css("direction", "rtl");\r
++                              }\r
++                              this.get_container().html("<ul><li class='jstree-last jstree-leaf'><ins>&#160;</ins><a class='jstree-loading' href='#'><ins class='jstree-icon'>&#160;</ins>" + this._get_string("loading") + "</a></li></ul>");\r
++                              this.data.core.li_height = this.get_container_ul().find("li.jstree-closed, li.jstree-leaf").eq(0).height() || 18;\r
++\r
++                              this.get_container()\r
++                                      .delegate("li > ins", "click.jstree", $.proxy(function (event) {\r
++                                                      var trgt = $(event.target);\r
++                                                      // if(trgt.is("ins") && event.pageY - trgt.offset().top < this.data.core.li_height) { this.toggle_node(trgt); }\r
++                                                      this.toggle_node(trgt);\r
++                                              }, this))\r
++                                      .bind("mousedown.jstree", $.proxy(function () { \r
++                                                      this.set_focus(); // This used to be setTimeout(set_focus,0) - why?\r
++                                              }, this))\r
++                                      .bind("dblclick.jstree", function (event) { \r
++                                              var sel;\r
++                                              if(document.selection && document.selection.empty) { document.selection.empty(); }\r
++                                              else {\r
++                                                      if(window.getSelection) {\r
++                                                              sel = window.getSelection();\r
++                                                              try { \r
++                                                                      sel.removeAllRanges();\r
++                                                                      sel.collapse();\r
++                                                              } catch (err) { }\r
++                                                      }\r
++                                              }\r
++                                      });\r
++                              if(this._get_settings().core.notify_plugins) {\r
++                                      this.get_container()\r
++                                              .bind("load_node.jstree", $.proxy(function (e, data) { \r
++                                                              var o = this._get_node(data.rslt.obj),\r
++                                                                      t = this;\r
++                                                              if(o === -1) { o = this.get_container_ul(); }\r
++                                                              if(!o.length) { return; }\r
++                                                              o.find("li").each(function () {\r
++                                                                      var th = $(this);\r
++                                                                      if(th.data("jstree")) {\r
++                                                                              $.each(th.data("jstree"), function (plugin, values) {\r
++                                                                                      if(t.data[plugin] && $.isFunction(t["_" + plugin + "_notify"])) {\r
++                                                                                              t["_" + plugin + "_notify"].call(t, th, values);\r
++                                                                                      }\r
++                                                                              });\r
++                                                                      }\r
++                                                              });\r
++                                                      }, this));\r
++                              }\r
++                              if(this._get_settings().core.load_open) {\r
++                                      this.get_container()\r
++                                              .bind("load_node.jstree", $.proxy(function (e, data) { \r
++                                                              var o = this._get_node(data.rslt.obj),\r
++                                                                      t = this;\r
++                                                              if(o === -1) { o = this.get_container_ul(); }\r
++                                                              if(!o.length) { return; }\r
++                                                              o.find("li.jstree-open:not(:has(ul))").each(function () {\r
++                                                                      t.load_node(this, $.noop, $.noop);\r
++                                                              });\r
++                                                      }, this));\r
++                              }\r
++                              this.__callback();\r
++                              this.load_node(-1, function () { this.loaded(); this.reload_nodes(); });\r
++                      },\r
++                      destroy : function () { \r
++                              var i,\r
++                                      n = this.get_index(),\r
++                                      s = this._get_settings(),\r
++                                      _this = this;\r
++\r
++                              $.each(s.plugins, function (i, val) {\r
++                                      try { plugins[val].__destroy.apply(_this); } catch(err) { }\r
++                              });\r
++                              this.__callback();\r
++                              // set focus to another instance if this one is focused\r
++                              if(this.is_focused()) { \r
++                                      for(i in instances) { \r
++                                              if(instances.hasOwnProperty(i) && i != n) { \r
++                                                      instances[i].set_focus(); \r
++                                                      break; \r
++                                              } \r
++                                      }\r
++                              }\r
++                              // if no other instance found\r
++                              if(n === focused_instance) { focused_instance = -1; }\r
++                              // remove all traces of jstree in the DOM (only the ones set using jstree*) and cleans all events\r
++                              this.get_container()\r
++                                      .unbind(".jstree")\r
++                                      .undelegate(".jstree")\r
++                                      .removeData("jstree_instance_id")\r
++                                      .find("[class^='jstree']")\r
++                                              .andSelf()\r
++                                              .attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); });\r
++                              $(document)\r
++                                      .unbind(".jstree-" + n)\r
++                                      .undelegate(".jstree-" + n);\r
++                              // remove the actual data\r
++                              instances[n] = null;\r
++                              delete instances[n];\r
++                      },\r
++\r
++                      _core_notify : function (n, data) {\r
++                              if(data.opened) {\r
++                                      this.open_node(n, false, true);\r
++                              }\r
++                      },\r
++\r
++                      lock : function () {\r
++                              this.data.core.locked = true;\r
++                              this.get_container().children("ul").addClass("jstree-locked").css("opacity","0.7");\r
++                              this.__callback({});\r
++                      },\r
++                      unlock : function () {\r
++                              this.data.core.locked = false;\r
++                              this.get_container().children("ul").removeClass("jstree-locked").css("opacity","1");\r
++                              this.__callback({});\r
++                      },\r
++                      is_locked : function () { return this.data.core.locked; },\r
++                      save_opened : function () {\r
++                              var _this = this;\r
++                              this.data.core.to_open = [];\r
++                              this.get_container_ul().find("li.jstree-open").each(function () { \r
++                                      if(this.id) { _this.data.core.to_open.push("#" + this.id.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:")); }\r
++                              });\r
++                              this.__callback(_this.data.core.to_open);\r
++                      },\r
++                      save_loaded : function () { },\r
++                      reload_nodes : function (is_callback) {\r
++                              var _this = this,\r
++                                      done = true,\r
++                                      current = [],\r
++                                      remaining = [];\r
++                              if(!is_callback) { \r
++                                      this.data.core.reopen = false; \r
++                                      this.data.core.refreshing = true; \r
++                                      this.data.core.to_open = $.map($.makeArray(this.data.core.to_open), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });\r
++                                      this.data.core.to_load = $.map($.makeArray(this.data.core.to_load), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });\r
++                                      if(this.data.core.to_open.length) {\r
++                                              this.data.core.to_load = this.data.core.to_load.concat(this.data.core.to_open);\r
++                                      }\r
++                              }\r
++                              if(this.data.core.to_load.length) {\r
++                                      $.each(this.data.core.to_load, function (i, val) {\r
++                                              if(val == "#") { return true; }\r
++                                              if($(val).length) { current.push(val); }\r
++                                              else { remaining.push(val); }\r
++                                      });\r
++                                      if(current.length) {\r
++                                              this.data.core.to_load = remaining;\r
++                                              $.each(current, function (i, val) { \r
++                                                      if(!_this._is_loaded(val)) {\r
++                                                              _this.load_node(val, function () { _this.reload_nodes(true); }, function () { _this.reload_nodes(true); });\r
++                                                              done = false;\r
++                                                      }\r
++                                              });\r
++                                      }\r
++                              }\r
++                              if(this.data.core.to_open.length) {\r
++                                      $.each(this.data.core.to_open, function (i, val) {\r
++                                              _this.open_node(val, false, true); \r
++                                      });\r
++                              }\r
++                              if(done) { \r
++                                      // TODO: find a more elegant approach to syncronizing returning requests\r
++                                      if(this.data.core.reopen) { clearTimeout(this.data.core.reopen); }\r
++                                      this.data.core.reopen = setTimeout(function () { _this.__callback({}, _this); }, 50);\r
++                                      this.data.core.refreshing = false;\r
++                                      this.reopen();\r
++                              }\r
++                      },\r
++                      reopen : function () {\r
++                              var _this = this;\r
++                              if(this.data.core.to_open.length) {\r
++                                      $.each(this.data.core.to_open, function (i, val) {\r
++                                              _this.open_node(val, false, true); \r
++                                      });\r
++                              }\r
++                              this.__callback({});\r
++                      },\r
++                      refresh : function (obj) {\r
++                              var _this = this;\r
++                              this.save_opened();\r
++                              if(!obj) { obj = -1; }\r
++                              obj = this._get_node(obj);\r
++                              if(!obj) { obj = -1; }\r
++                              if(obj !== -1) { obj.children("UL").remove(); }\r
++                              else { this.get_container_ul().empty(); }\r
++                              this.load_node(obj, function () { _this.__callback({ "obj" : obj}); _this.reload_nodes(); });\r
++                      },\r
++                      // Dummy function to fire after the first load (so that there is a jstree.loaded event)\r
++                      loaded  : function () { \r
++                              this.__callback(); \r
++                      },\r
++                      // deal with focus\r
++                      set_focus       : function () { \r
++                              if(this.is_focused()) { return; }\r
++                              var f = $.jstree._focused();\r
++                              if(f) { f.unset_focus(); }\r
++\r
++                              this.get_container().addClass("jstree-focused"); \r
++                              focused_instance = this.get_index(); \r
++                              this.__callback();\r
++                      },\r
++                      is_focused      : function () { \r
++                              return focused_instance == this.get_index(); \r
++                      },\r
++                      unset_focus     : function () {\r
++                              if(this.is_focused()) {\r
++                                      this.get_container().removeClass("jstree-focused"); \r
++                                      focused_instance = -1; \r
++                              }\r
++                              this.__callback();\r
++                      },\r
++\r
++                      // traverse\r
++                      _get_node               : function (obj) { \r
++                              var $obj = $(obj, this.get_container()); \r
++                              if($obj.is(".jstree") || obj == -1) { return -1; } \r
++                              $obj = $obj.closest("li", this.get_container()); \r
++                              return $obj.length ? $obj : false; \r
++                      },\r
++                      _get_next               : function (obj, strict) {\r
++                              obj = this._get_node(obj);\r
++                              if(obj === -1) { return this.get_container().find("> ul > li:first-child"); }\r
++                              if(!obj.length) { return false; }\r
++                              if(strict) { return (obj.nextAll("li").size() > 0) ? obj.nextAll("li:eq(0)") : false; }\r
++\r
++                              if(obj.hasClass("jstree-open")) { return obj.find("li:eq(0)"); }\r
++                              else if(obj.nextAll("li").size() > 0) { return obj.nextAll("li:eq(0)"); }\r
++                              else { return obj.parentsUntil(".jstree","li").next("li").eq(0); }\r
++                      },\r
++                      _get_prev               : function (obj, strict) {\r
++                              obj = this._get_node(obj);\r
++                              if(obj === -1) { return this.get_container().find("> ul > li:last-child"); }\r
++                              if(!obj.length) { return false; }\r
++                              if(strict) { return (obj.prevAll("li").length > 0) ? obj.prevAll("li:eq(0)") : false; }\r
++\r
++                              if(obj.prev("li").length) {\r
++                                      obj = obj.prev("li").eq(0);\r
++                                      while(obj.hasClass("jstree-open")) { obj = obj.children("ul:eq(0)").children("li:last"); }\r
++                                      return obj;\r
++                              }\r
++                              else { var o = obj.parentsUntil(".jstree","li:eq(0)"); return o.length ? o : false; }\r
++                      },\r
++                      _get_parent             : function (obj) {\r
++                              obj = this._get_node(obj);\r
++                              if(obj == -1 || !obj.length) { return false; }\r
++                              var o = obj.parentsUntil(".jstree", "li:eq(0)");\r
++                              return o.length ? o : -1;\r
++                      },\r
++                      _get_children   : function (obj) {\r
++                              obj = this._get_node(obj);\r
++                              if(obj === -1) { return this.get_container().children("ul:eq(0)").children("li"); }\r
++                              if(!obj.length) { return false; }\r
++                              return obj.children("ul:eq(0)").children("li");\r
++                      },\r
++                      get_path                : function (obj, id_mode) {\r
++                              var p = [],\r
++                                      _this = this;\r
++                              obj = this._get_node(obj);\r
++                              if(obj === -1 || !obj || !obj.length) { return false; }\r
++                              obj.parentsUntil(".jstree", "li").each(function () {\r
++                                      p.push( id_mode ? this.id : _this.get_text(this) );\r
++                              });\r
++                              p.reverse();\r
++                              p.push( id_mode ? obj.attr("id") : this.get_text(obj) );\r
++                              return p;\r
++                      },\r
++\r
++                      // string functions\r
++                      _get_string : function (key) {\r
++                              return this._get_settings().core.strings[key] || key;\r
++                      },\r
++\r
++                      is_open         : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-open"); },\r
++                      is_closed       : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-closed"); },\r
++                      is_leaf         : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-leaf"); },\r
++                      correct_state   : function (obj) {\r
++                              obj = this._get_node(obj);\r
++                              if(!obj || obj === -1) { return false; }\r
++                              obj.removeClass("jstree-closed jstree-open").addClass("jstree-leaf").children("ul").remove();\r
++                              this.__callback({ "obj" : obj });\r
++                      },\r
++                      // open/close\r
++                      open_node       : function (obj, callback, skip_animation) {\r
++                              obj = this._get_node(obj);\r
++                              if(!obj.length) { return false; }\r
++                              if(!obj.hasClass("jstree-closed")) { if(callback) { callback.call(); } return false; }\r
++                              var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation,\r
++                                      t = this;\r
++                              if(!this._is_loaded(obj)) {\r
++                                      obj.children("a").addClass("jstree-loading");\r
++                                      this.load_node(obj, function () { t.open_node(obj, callback, skip_animation); }, callback);\r
++                              }\r
++                              else {\r
++                                      if(this._get_settings().core.open_parents) {\r
++                                              obj.parentsUntil(".jstree",".jstree-closed").each(function () {\r
++                                                      t.open_node(this, false, true);\r
++                                              });\r
++                                      }\r
++                                      if(s) { obj.children("ul").css("display","none"); }\r
++                                      obj.removeClass("jstree-closed").addClass("jstree-open").children("a").removeClass("jstree-loading");\r
++                                      if(s) { obj.children("ul").stop(true, true).slideDown(s, function () { this.style.display = ""; t.after_open(obj); }); }\r
++                                      else { t.after_open(obj); }\r
++                                      this.__callback({ "obj" : obj });\r
++                                      if(callback) { callback.call(); }\r
++                              }\r
++                      },\r
++                      after_open      : function (obj) { this.__callback({ "obj" : obj }); },\r
++                      close_node      : function (obj, skip_animation) {\r
++                              obj = this._get_node(obj);\r
++                              var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation,\r
++                                      t = this;\r
++                              if(!obj.length || !obj.hasClass("jstree-open")) { return false; }\r
++                              if(s) { obj.children("ul").attr("style","display:block !important"); }\r
++                              obj.removeClass("jstree-open").addClass("jstree-closed");\r
++                              if(s) { obj.children("ul").stop(true, true).slideUp(s, function () { this.style.display = ""; t.after_close(obj); }); }\r
++                              else { t.after_close(obj); }\r
++                              this.__callback({ "obj" : obj });\r
++                      },\r
++                      after_close     : function (obj) { this.__callback({ "obj" : obj }); },\r
++                      toggle_node     : function (obj) {\r
++                              obj = this._get_node(obj);\r
++                              if(obj.hasClass("jstree-closed")) { return this.open_node(obj); }\r
++                              if(obj.hasClass("jstree-open")) { return this.close_node(obj); }\r
++                      },\r
++                      open_all        : function (obj, do_animation, original_obj) {\r
++                              obj = obj ? this._get_node(obj) : -1;\r
++                              if(!obj || obj === -1) { obj = this.get_container_ul(); }\r
++                              if(original_obj) { \r
++                                      obj = obj.find("li.jstree-closed");\r
++                              }\r
++                              else {\r
++                                      original_obj = obj;\r
++                                      if(obj.is(".jstree-closed")) { obj = obj.find("li.jstree-closed").andSelf(); }\r
++                                      else { obj = obj.find("li.jstree-closed"); }\r
++                              }\r
++                              var _this = this;\r
++                              obj.each(function () { \r
++                                      var __this = this; \r
++                                      if(!_this._is_loaded(this)) { _this.open_node(this, function() { _this.open_all(__this, do_animation, original_obj); }, !do_animation); }\r
++                                      else { _this.open_node(this, false, !do_animation); }\r
++                              });\r
++                              // so that callback is fired AFTER all nodes are open\r
++                              if(original_obj.find('li.jstree-closed').length === 0) { this.__callback({ "obj" : original_obj }); }\r
++                      },\r
++                      close_all       : function (obj, do_animation) {\r
++                              var _this = this;\r
++                              obj = obj ? this._get_node(obj) : this.get_container();\r
++                              if(!obj || obj === -1) { obj = this.get_container_ul(); }\r
++                              obj.find("li.jstree-open").andSelf().each(function () { _this.close_node(this, !do_animation); });\r
++                              this.__callback({ "obj" : obj });\r
++                      },\r
++                      clean_node      : function (obj) {\r
++                              obj = obj && obj != -1 ? $(obj) : this.get_container_ul();\r
++                              obj = obj.is("li") ? obj.find("li").andSelf() : obj.find("li");\r
++                              obj.removeClass("jstree-last")\r
++                                      .filter("li:last-child").addClass("jstree-last").end()\r
++                                      .filter(":has(li)")\r
++                                              .not(".jstree-open").removeClass("jstree-leaf").addClass("jstree-closed");\r
++                              obj.not(".jstree-open, .jstree-closed").addClass("jstree-leaf").children("ul").remove();\r
++                              this.__callback({ "obj" : obj });\r
++                      },\r
++                      // rollback\r
++                      get_rollback : function () { \r
++                              this.__callback();\r
++                              return { i : this.get_index(), h : this.get_container().children("ul").clone(true), d : this.data }; \r
++                      },\r
++                      set_rollback : function (html, data) {\r
++                              this.get_container().empty().append(html);\r
++                              this.data = data;\r
++                              this.__callback();\r
++                      },\r
++                      // Dummy functions to be overwritten by any datastore plugin included\r
++                      load_node       : function (obj, s_call, e_call) { this.__callback({ "obj" : obj }); },\r
++                      _is_loaded      : function (obj) { return true; },\r
++\r
++                      // Basic operations: create\r
++                      create_node     : function (obj, position, js, callback, is_loaded) {\r
++                              obj = this._get_node(obj);\r
++                              position = typeof position === "undefined" ? "last" : position;\r
++                              var d = $("<li />"),\r
++                                      s = this._get_settings().core,\r
++                                      tmp;\r
++\r
++                              if(obj !== -1 && !obj.length) { return false; }\r
++                              if(!is_loaded && !this._is_loaded(obj)) { this.load_node(obj, function () { this.create_node(obj, position, js, callback, true); }); return false; }\r
++\r
++                              this.__rollback();\r
++\r
++                              if(typeof js === "string") { js = { "data" : js }; }\r
++                              if(!js) { js = {}; }\r
++                              if(js.attr) { d.attr(js.attr); }\r
++                              if(js.metadata) { d.data(js.metadata); }\r
++                              if(js.state) { d.addClass("jstree-" + js.state); }\r
++                              if(!js.data) { js.data = this._get_string("new_node"); }\r
++                              if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); }\r
++                              $.each(js.data, function (i, m) {\r
++                                      tmp = $("<a />");\r
++                                      if($.isFunction(m)) { m = m.call(this, js); }\r
++                                      if(typeof m == "string") { tmp.attr('href','#')[ s.html_titles ? "html" : "text" ](m); }\r
++                                      else {\r
++                                              if(!m.attr) { m.attr = {}; }\r
++                                              if(!m.attr.href) { m.attr.href = '#'; }\r
++                                              tmp.attr(m.attr)[ s.html_titles ? "html" : "text" ](m.title);\r
++                                              if(m.language) { tmp.addClass(m.language); }\r
++                                      }\r
++                                      tmp.prepend("<ins class='jstree-icon'>&#160;</ins>");\r
++                                      if(!m.icon && js.icon) { m.icon = js.icon; }\r
++                                      if(m.icon) { \r
++                                              if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); }\r
++                                              else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); }\r
++                                      }\r
++                                      d.append(tmp);\r
++                              });\r
++                              d.prepend("<ins class='jstree-icon'>&#160;</ins>");\r
++                              if(obj === -1) {\r
++                                      obj = this.get_container();\r
++                                      if(position === "before") { position = "first"; }\r
++                                      if(position === "after") { position = "last"; }\r
++                              }\r
++                              switch(position) {\r
++                                      case "before": obj.before(d); tmp = this._get_parent(obj); break;\r
++                                      case "after" : obj.after(d);  tmp = this._get_parent(obj); break;\r
++                                      case "inside":\r
++                                      case "first" :\r
++                                              if(!obj.children("ul").length) { obj.append("<ul />"); }\r
++                                              obj.children("ul").prepend(d);\r
++                                              tmp = obj;\r
++                                              break;\r
++                                      case "last":\r
++                                              if(!obj.children("ul").length) { obj.append("<ul />"); }\r
++                                              obj.children("ul").append(d);\r
++                                              tmp = obj;\r
++                                              break;\r
++                                      default:\r
++                                              if(!obj.children("ul").length) { obj.append("<ul />"); }\r
++                                              if(!position) { position = 0; }\r
++                                              tmp = obj.children("ul").children("li").eq(position);\r
++                                              if(tmp.length) { tmp.before(d); }\r
++                                              else { obj.children("ul").append(d); }\r
++                                              tmp = obj;\r
++                                              break;\r
++                              }\r
++                              if(tmp === -1 || tmp.get(0) === this.get_container().get(0)) { tmp = -1; }\r
++                              this.clean_node(tmp);\r
++                              this.__callback({ "obj" : d, "parent" : tmp });\r
++                              if(callback) { callback.call(this, d); }\r
++                              return d;\r
++                      },\r
++                      // Basic operations: rename (deal with text)\r
++                      get_text        : function (obj) {\r
++                              obj = this._get_node(obj);\r
++                              if(!obj.length) { return false; }\r
++                              var s = this._get_settings().core.html_titles;\r
++                              obj = obj.children("a:eq(0)");\r
++                              if(s) {\r
++                                      obj = obj.clone();\r
++                                      obj.children("INS").remove();\r
++                                      return obj.html();\r
++                              }\r
++                              else {\r
++                                      obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];\r
++                                      return obj.nodeValue;\r
++                              }\r
++                      },\r
++                      set_text        : function (obj, val) {\r
++                              obj = this._get_node(obj);\r
++                              if(!obj.length) { return false; }\r
++                              obj = obj.children("a:eq(0)");\r
++                              if(this._get_settings().core.html_titles) {\r
++                                      var tmp = obj.children("INS").clone();\r
++                                      obj.html(val).prepend(tmp);\r
++                                      this.__callback({ "obj" : obj, "name" : val });\r
++                                      return true;\r
++                              }\r
++                              else {\r
++                                      obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];\r
++                                      this.__callback({ "obj" : obj, "name" : val });\r
++                                      return (obj.nodeValue = val);\r
++                              }\r
++                      },\r
++                      rename_node : function (obj, val) {\r
++                              obj = this._get_node(obj);\r
++                              this.__rollback();\r
++                              if(obj && obj.length && this.set_text.apply(this, Array.prototype.slice.call(arguments))) { this.__callback({ "obj" : obj, "name" : val }); }\r
++                      },\r
++                      // Basic operations: deleting nodes\r
++                      delete_node : function (obj) {\r
++                              obj = this._get_node(obj);\r
++                              if(!obj.length) { return false; }\r
++                              this.__rollback();\r
++                              var p = this._get_parent(obj), prev = $([]), t = this;\r
++                              obj.each(function () {\r
++                                      prev = prev.add(t._get_prev(this));\r
++                              });\r
++                              obj = obj.detach();\r
++                              if(p !== -1 && p.find("> ul > li").length === 0) {\r
++                                      p.removeClass("jstree-open jstree-closed").addClass("jstree-leaf");\r
++                              }\r
++                              this.clean_node(p);\r
++                              this.__callback({ "obj" : obj, "prev" : prev, "parent" : p });\r
++                              return obj;\r
++                      },\r
++                      prepare_move : function (o, r, pos, cb, is_cb) {\r
++                              var p = {};\r
++\r
++                              p.ot = $.jstree._reference(o) || this;\r
++                              p.o = p.ot._get_node(o);\r
++                              p.r = r === - 1 ? -1 : this._get_node(r);\r
++                              p.p = (typeof pos === "undefined" || pos === false) ? "last" : pos; // TODO: move to a setting\r
++                              if(!is_cb && prepared_move.o && prepared_move.o[0] === p.o[0] && prepared_move.r[0] === p.r[0] && prepared_move.p === p.p) {\r
++                                      this.__callback(prepared_move);\r
++                                      if(cb) { cb.call(this, prepared_move); }\r
++                                      return;\r
++                              }\r
++                              p.ot = $.jstree._reference(p.o) || this;\r
++                              p.rt = $.jstree._reference(p.r) || this; // r === -1 ? p.ot : $.jstree._reference(p.r) || this\r
++                              if(p.r === -1 || !p.r) {\r
++                                      p.cr = -1;\r
++                                      switch(p.p) {\r
++                                              case "first":\r
++                                              case "before":\r
++                                              case "inside":\r
++                                                      p.cp = 0; \r
++                                                      break;\r
++                                              case "after":\r
++                                              case "last":\r
++                                                      p.cp = p.rt.get_container().find(" > ul > li").length; \r
++                                                      break;\r
++                                              default:\r
++                                                      p.cp = p.p;\r
++                                                      break;\r
++                                      }\r
++                              }\r
++                              else {\r
++                                      if(!/^(before|after)$/.test(p.p) && !this._is_loaded(p.r)) {\r
++                                              return this.load_node(p.r, function () { this.prepare_move(o, r, pos, cb, true); });\r
++                                      }\r
++                                      switch(p.p) {\r
++                                              case "before":\r
++                                                      p.cp = p.r.index();\r
++                                                      p.cr = p.rt._get_parent(p.r);\r
++                                                      break;\r
++                                              case "after":\r
++                                                      p.cp = p.r.index() + 1;\r
++                                                      p.cr = p.rt._get_parent(p.r);\r
++                                                      break;\r
++                                              case "inside":\r
++                                              case "first":\r
++                                                      p.cp = 0;\r
++                                                      p.cr = p.r;\r
++                                                      break;\r
++                                              case "last":\r
++                                                      p.cp = p.r.find(" > ul > li").length; \r
++                                                      p.cr = p.r;\r
++                                                      break;\r
++                                              default: \r
++                                                      p.cp = p.p;\r
++                                                      p.cr = p.r;\r
++                                                      break;\r
++                                      }\r
++                              }\r
++                              p.np = p.cr == -1 ? p.rt.get_container() : p.cr;\r
++                              p.op = p.ot._get_parent(p.o);\r
++                              p.cop = p.o.index();\r
++                              if(p.op === -1) { p.op = p.ot ? p.ot.get_container() : this.get_container(); }\r
++                              if(!/^(before|after)$/.test(p.p) && p.op && p.np && p.op[0] === p.np[0] && p.o.index() < p.cp) { p.cp++; }\r
++                              //if(p.p === "before" && p.op && p.np && p.op[0] === p.np[0] && p.o.index() < p.cp) { p.cp--; }\r
++                              p.or = p.np.find(" > ul > li:nth-child(" + (p.cp + 1) + ")");\r
++                              prepared_move = p;\r
++                              this.__callback(prepared_move);\r
++                              if(cb) { cb.call(this, prepared_move); }\r
++                      },\r
++                      check_move : function () {\r
++                              var obj = prepared_move, ret = true, r = obj.r === -1 ? this.get_container() : obj.r;\r
++                              if(!obj || !obj.o || obj.or[0] === obj.o[0]) { return false; }\r
++                              if(obj.op && obj.np && obj.op[0] === obj.np[0] && obj.cp - 1 === obj.o.index()) { return false; }\r
++                              obj.o.each(function () { \r
++                                      if(r.parentsUntil(".jstree", "li").andSelf().index(this) !== -1) { ret = false; return false; }\r
++                              });\r
++                              return ret;\r
++                      },\r
++                      move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) {\r
++                              if(!is_prepared) { \r
++                                      return this.prepare_move(obj, ref, position, function (p) {\r
++                                              this.move_node(p, false, false, is_copy, true, skip_check);\r
++                                      });\r
++                              }\r
++                              if(is_copy) { \r
++                                      prepared_move.cy = true;\r
++                              }\r
++                              if(!skip_check && !this.check_move()) { return false; }\r
++\r
++                              this.__rollback();\r
++                              var o = false;\r
++                              if(is_copy) {\r
++                                      o = obj.o.clone(true);\r
++                                      o.find("*[id]").andSelf().each(function () {\r
++                                              if(this.id) { this.id = "copy_" + this.id; }\r
++                                      });\r
++                              }\r
++                              else { o = obj.o; }\r
++\r
++                              if(obj.or.length) { obj.or.before(o); }\r
++                              else { \r
++                                      if(!obj.np.children("ul").length) { $("<ul />").appendTo(obj.np); }\r
++                                      obj.np.children("ul:eq(0)").append(o); \r
++                              }\r
++\r
++                              try { \r
++                                      obj.ot.clean_node(obj.op);\r
++                                      obj.rt.clean_node(obj.np);\r
++                                      if(!obj.op.find("> ul > li").length) {\r
++                                              obj.op.removeClass("jstree-open jstree-closed").addClass("jstree-leaf").children("ul").remove();\r
++                                      }\r
++                              } catch (e) { }\r
++\r
++                              if(is_copy) { \r
++                                      prepared_move.cy = true;\r
++                                      prepared_move.oc = o; \r
++                              }\r
++                              this.__callback(prepared_move);\r
++                              return prepared_move;\r
++                      },\r
++                      _get_move : function () { return prepared_move; }\r
++              }\r
++      });\r
++})(jQuery);\r
++//*/\r
++\r
++/* \r
++ * jsTree ui plugin\r
++ * This plugins handles selecting/deselecting/hovering/dehovering nodes\r
++ */\r
++(function ($) {\r
++      var scrollbar_width, e1, e2;\r
++      $(function() {\r
++              if (/msie/.test(navigator.userAgent.toLowerCase())) {\r
++                      e1 = $('<textarea cols="10" rows="2"></textarea>').css({ position: 'absolute', top: -1000, left: 0 }).appendTo('body');\r
++                      e2 = $('<textarea cols="10" rows="2" style="overflow: hidden;"></textarea>').css({ position: 'absolute', top: -1000, left: 0 }).appendTo('body');\r
++                      scrollbar_width = e1.width() - e2.width();\r
++                      e1.add(e2).remove();\r
++              } \r
++              else {\r
++                      e1 = $('<div />').css({ width: 100, height: 100, overflow: 'auto', position: 'absolute', top: -1000, left: 0 })\r
++                                      .prependTo('body').append('<div />').find('div').css({ width: '100%', height: 200 });\r
++                      scrollbar_width = 100 - e1.width();\r
++                      e1.parent().remove();\r
++              }\r
++      });\r
++      $.jstree.plugin("ui", {\r
++              __init : function () { \r
++                      this.data.ui.selected = $(); \r
++                      this.data.ui.last_selected = false; \r
++                      this.data.ui.hovered = null;\r
++                      this.data.ui.to_select = this.get_settings().ui.initially_select;\r
++\r
++                      this.get_container()\r
++                              .delegate("a", "click.jstree", $.proxy(function (event) {\r
++                                              event.preventDefault();\r
++                                              event.currentTarget.blur();\r
++                                              if(!$(event.currentTarget).hasClass("jstree-loading")) {\r
++                                                      this.select_node(event.currentTarget, true, event);\r
++                                              }\r
++                                      }, this))\r
++                              .delegate("a", "mouseenter.jstree", $.proxy(function (event) {\r
++                                              if(!$(event.currentTarget).hasClass("jstree-loading")) {\r
++                                                      this.hover_node(event.target);\r
++                                              }\r
++                                      }, this))\r
++                              .delegate("a", "mouseleave.jstree", $.proxy(function (event) {\r
++                                              if(!$(event.currentTarget).hasClass("jstree-loading")) {\r
++                                                      this.dehover_node(event.target);\r
++                                              }\r
++                                      }, this))\r
++                              .bind("reopen.jstree", $.proxy(function () { \r
++                                              this.reselect();\r
++                                      }, this))\r
++                              .bind("get_rollback.jstree", $.proxy(function () { \r
++                                              this.dehover_node();\r
++                                              this.save_selected();\r
++                                      }, this))\r
++                              .bind("set_rollback.jstree", $.proxy(function () { \r
++                                              this.reselect();\r
++                                      }, this))\r
++                              .bind("close_node.jstree", $.proxy(function (event, data) { \r
++                                              var s = this._get_settings().ui,\r
++                                                      obj = this._get_node(data.rslt.obj),\r
++                                                      clk = (obj && obj.length) ? obj.children("ul").find("a.jstree-clicked") : $(),\r
++                                                      _this = this;\r
++                                              if(s.selected_parent_close === false || !clk.length) { return; }\r
++                                              clk.each(function () { \r
++                                                      _this.deselect_node(this);\r
++                                                      if(s.selected_parent_close === "select_parent") { _this.select_node(obj); }\r
++                                              });\r
++                                      }, this))\r
++                              .bind("delete_node.jstree", $.proxy(function (event, data) { \r
++                                              var s = this._get_settings().ui.select_prev_on_delete,\r
++                                                      obj = this._get_node(data.rslt.obj),\r
++                                                      clk = (obj && obj.length) ? obj.find("a.jstree-clicked") : [],\r
++                                                      _this = this;\r
++                                              clk.each(function () { _this.deselect_node(this); });\r
++                                              if(s && clk.length) { \r
++                                                      data.rslt.prev.each(function () { \r
++                                                              if(this.parentNode) { _this.select_node(this); return false; /* if return false is removed all prev nodes will be selected */}\r
++                                                      });\r
++                                              }\r
++                                      }, this))\r
++                              .bind("move_node.jstree", $.proxy(function (event, data) { \r
++                                              if(data.rslt.cy) { \r
++                                                      data.rslt.oc.find("a.jstree-clicked").removeClass("jstree-clicked");\r
++                                              }\r
++                                      }, this));\r
++              },\r
++              defaults : {\r
++                      select_limit : -1, // 0, 1, 2 ... or -1 for unlimited\r
++                      select_multiple_modifier : "ctrl", // on, or ctrl, shift, alt\r
++                      select_range_modifier : "shift",\r
++                      selected_parent_close : "select_parent", // false, "deselect", "select_parent"\r
++                      selected_parent_open : true,\r
++                      select_prev_on_delete : true,\r
++                      disable_selecting_children : false,\r
++                      initially_select : []\r
++              },\r
++              _fn : { \r
++                      _get_node : function (obj, allow_multiple) {\r
++                              if(typeof obj === "undefined" || obj === null) { return allow_multiple ? this.data.ui.selected : this.data.ui.last_selected; }\r
++                              var $obj = $(obj, this.get_container()); \r
++                              if($obj.is(".jstree") || obj == -1) { return -1; } \r
++                              $obj = $obj.closest("li", this.get_container()); \r
++                              return $obj.length ? $obj : false; \r
++                      },\r
++                      _ui_notify : function (n, data) {\r
++                              if(data.selected) {\r
++                                      this.select_node(n, false);\r
++                              }\r
++                      },\r
++                      save_selected : function () {\r
++                              var _this = this;\r
++                              this.data.ui.to_select = [];\r
++                              this.data.ui.selected.each(function () { if(this.id) { _this.data.ui.to_select.push("#" + this.id.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:")); } });\r
++                              this.__callback(this.data.ui.to_select);\r
++                      },\r
++                      reselect : function () {\r
++                              var _this = this,\r
++                                      s = this.data.ui.to_select;\r
++                              s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });\r
++                              // this.deselect_all(); WHY deselect, breaks plugin state notifier?\r
++                              $.each(s, function (i, val) { if(val && val !== "#") { _this.select_node(val); } });\r
++                              this.data.ui.selected = this.data.ui.selected.filter(function () { return this.parentNode; });\r
++                              this.__callback();\r
++                      },\r
++                      refresh : function (obj) {\r
++                              this.save_selected();\r
++                              return this.__call_old();\r
++                      },\r
++                      hover_node : function (obj) {\r
++                              obj = this._get_node(obj);\r
++                              if(!obj.length) { return false; }\r
++                              //if(this.data.ui.hovered && obj.get(0) === this.data.ui.hovered.get(0)) { return; }\r
++                              if(!obj.hasClass("jstree-hovered")) { this.dehover_node(); }\r
++                              this.data.ui.hovered = obj.children("a").addClass("jstree-hovered").parent();\r
++                              this._fix_scroll(obj);\r
++                              this.__callback({ "obj" : obj });\r
++                      },\r
++                      dehover_node : function () {\r
++                              var obj = this.data.ui.hovered, p;\r
++                              if(!obj || !obj.length) { return false; }\r
++                              p = obj.children("a").removeClass("jstree-hovered").parent();\r
++                              if(this.data.ui.hovered[0] === p[0]) { this.data.ui.hovered = null; }\r
++                              this.__callback({ "obj" : obj });\r
++                      },\r
++                      select_node : function (obj, check, e) {\r
++                              obj = this._get_node(obj);\r
++                              if(obj == -1 || !obj || !obj.length) { return false; }\r
++                              var s = this._get_settings().ui,\r
++                                      is_multiple = (s.select_multiple_modifier == "on" || (s.select_multiple_modifier !== false && e && e[s.select_multiple_modifier + "Key"])),\r
++                                      is_range = (s.select_range_modifier !== false && e && e[s.select_range_modifier + "Key"] && this.data.ui.last_selected && this.data.ui.last_selected[0] !== obj[0] && this.data.ui.last_selected.parent()[0] === obj.parent()[0]),\r
++                                      is_selected = this.is_selected(obj),\r
++                                      proceed = true,\r
++                                      t = this;\r
++                              if(check) {\r
++                                      if(s.disable_selecting_children && is_multiple && \r
++                                              (\r
++                                                      (obj.parentsUntil(".jstree","li").children("a.jstree-clicked").length) ||\r
++                                                      (obj.children("ul").find("a.jstree-clicked:eq(0)").length)\r
++                                              )\r
++                                      ) {\r
++                                              return false;\r
++                                      }\r
++                                      proceed = false;\r
++                                      switch(!0) {\r
++                                              case (is_range):\r
++                                                      this.data.ui.last_selected.addClass("jstree-last-selected");\r
++                                                      obj = obj[ obj.index() < this.data.ui.last_selected.index() ? "nextUntil" : "prevUntil" ](".jstree-last-selected").andSelf();\r
++                                                      if(s.select_limit == -1 || obj.length < s.select_limit) {\r
++                                                              this.data.ui.last_selected.removeClass("jstree-last-selected");\r
++                                                              this.data.ui.selected.each(function () {\r
++                                                                      if(this !== t.data.ui.last_selected[0]) { t.deselect_node(this); }\r
++                                                              });\r
++                                                              is_selected = false;\r
++                                                              proceed = true;\r
++                                                      }\r
++                                                      else {\r
++                                                              proceed = false;\r
++                                                      }\r
++                                                      break;\r
++                                              case (is_selected && !is_multiple): \r
++                                                      this.deselect_all();\r
++                                                      is_selected = false;\r
++                                                      proceed = true;\r
++                                                      break;\r
++                                              case (!is_selected && !is_multiple): \r
++                                                      if(s.select_limit == -1 || s.select_limit > 0) {\r
++                                                              this.deselect_all();\r
++                                                              proceed = true;\r
++                                                      }\r
++                                                      break;\r
++                                              case (is_selected && is_multiple): \r
++                                                      this.deselect_node(obj);\r
++                                                      break;\r
++                                              case (!is_selected && is_multiple): \r
++                                                      if(s.select_limit == -1 || this.data.ui.selected.length + 1 <= s.select_limit) { \r
++                                                              proceed = true;\r
++                                                      }\r
++                                                      break;\r
++                                      }\r
++                              }\r
++                              if(proceed && !is_selected) {\r
++                                      if(!is_range) { this.data.ui.last_selected = obj; }\r
++                                      obj.children("a").addClass("jstree-clicked");\r
++                                      if(s.selected_parent_open) {\r
++                                              obj.parents(".jstree-closed").each(function () { t.open_node(this, false, true); });\r
++                                      }\r
++                                      this.data.ui.selected = this.data.ui.selected.add(obj);\r
++                                      this._fix_scroll(obj.eq(0));\r
++                                      this.__callback({ "obj" : obj, "e" : e });\r
++                              }\r
++                      },\r
++                      _fix_scroll : function (obj) {\r
++                              var c = this.get_container()[0], t;\r
++                              if(c.scrollHeight > c.offsetHeight) {\r
++                                      obj = this._get_node(obj);\r
++                                      if(!obj || obj === -1 || !obj.length || !obj.is(":visible")) { return; }\r
++                                      t = obj.offset().top - this.get_container().offset().top;\r
++                                      if(t < 0) { \r
++                                              c.scrollTop = c.scrollTop + t - 1; \r
++                                      }\r
++                                      if(t + this.data.core.li_height + (c.scrollWidth > c.offsetWidth ? scrollbar_width : 0) > c.offsetHeight) { \r
++                                              c.scrollTop = c.scrollTop + (t - c.offsetHeight + this.data.core.li_height + 1 + (c.scrollWidth > c.offsetWidth ? scrollbar_width : 0)); \r
++                                      }\r
++                              }\r
++                      },\r
++                      deselect_node : function (obj) {\r
++                              obj = this._get_node(obj);\r
++                              if(!obj.length) { return false; }\r
++                              if(this.is_selected(obj)) {\r
++                                      obj.children("a").removeClass("jstree-clicked");\r
++                                      this.data.ui.selected = this.data.ui.selected.not(obj);\r
++                                      if(this.data.ui.last_selected.get(0) === obj.get(0)) { this.data.ui.last_selected = this.data.ui.selected.eq(0); }\r
++                                      this.__callback({ "obj" : obj });\r
++                              }\r
++                      },\r
++                      toggle_select : function (obj) {\r
++                              obj = this._get_node(obj);\r
++                              if(!obj.length) { return false; }\r
++                              if(this.is_selected(obj)) { this.deselect_node(obj); }\r
++                              else { this.select_node(obj); }\r
++                      },\r
++                      is_selected : function (obj) { return this.data.ui.selected.index(this._get_node(obj)) >= 0; },\r
++                      get_selected : function (context) { \r
++                              return context ? $(context).find("a.jstree-clicked").parent() : this.data.ui.selected; \r
++                      },\r
++                      deselect_all : function (context) {\r
++                              var ret = context ? $(context).find("a.jstree-clicked").parent() : this.get_container().find("a.jstree-clicked").parent();\r
++                              ret.children("a.jstree-clicked").removeClass("jstree-clicked");\r
++                              this.data.ui.selected = $([]);\r
++                              this.data.ui.last_selected = false;\r
++                              this.__callback({ "obj" : ret });\r
++                      }\r
++              }\r
++      });\r
++      // include the selection plugin by default\r
++      $.jstree.defaults.plugins.push("ui");\r
++})(jQuery);\r
++//*/\r
++\r
++/* \r
++ * jsTree CRRM plugin\r
++ * Handles creating/renaming/removing/moving nodes by user interaction.\r
++ */\r
++(function ($) {\r
++      $.jstree.plugin("crrm", { \r
++              __init : function () {\r
++                      this.get_container()\r
++                              .bind("move_node.jstree", $.proxy(function (e, data) {\r
++                                      if(this._get_settings().crrm.move.open_onmove) {\r
++                                              var t = this;\r
++                                              data.rslt.np.parentsUntil(".jstree").andSelf().filter(".jstree-closed").each(function () {\r
++                                                      t.open_node(this, false, true);\r
++                                              });\r
++                                      }\r
++                              }, this));\r
++              },\r
++              defaults : {\r
++                      input_width_limit : 200,\r
++                      move : {\r
++                              always_copy                     : false, // false, true or "multitree"\r
++                              open_onmove                     : true,\r
++                              default_position        : "last",\r
++                              check_move                      : function (m) { return true; }\r
++                      }\r
++              },\r
++              _fn : {\r
++                      _show_input : function (obj, callback) {\r
++                              obj = this._get_node(obj);\r
++                              var rtl = this._get_settings().core.rtl,\r
++                                      w = this._get_settings().crrm.input_width_limit,\r
++                                      w1 = obj.children("ins").width(),\r
++                                      w2 = obj.find("> a:visible > ins").width() * obj.find("> a:visible > ins").length,\r
++                                      t = this.get_text(obj),\r
++                                      h1 = $("<div />", { css : { "position" : "absolute", "top" : "-200px", "left" : (rtl ? "0px" : "-1000px"), "visibility" : "hidden" } }).appendTo("body"),\r
++                                      h2 = obj.css("position","relative").append(\r
++                                      $("<input />", { \r
++                                              "value" : t,\r
++                                              "class" : "jstree-rename-input",\r
++                                              // "size" : t.length,\r
++                                              "css" : {\r
++                                                      "padding" : "0",\r
++                                                      "border" : "1px solid silver",\r
++                                                      "position" : "absolute",\r
++                                                      "left"  : (rtl ? "auto" : (w1 + w2 + 4) + "px"),\r
++                                                      "right" : (rtl ? (w1 + w2 + 4) + "px" : "auto"),\r
++                                                      "top" : "0px",\r
++                                                      "height" : (this.data.core.li_height - 2) + "px",\r
++                                                      "lineHeight" : (this.data.core.li_height - 2) + "px",\r
++                                                      "width" : "150px" // will be set a bit further down\r
++                                              },\r
++                                              "blur" : $.proxy(function () {\r
++                                                      var i = obj.children(".jstree-rename-input"),\r
++                                                              v = i.val();\r
++                                                      if(v === "") { v = t; }\r
++                                                      h1.remove();\r
++                                                      i.remove(); // rollback purposes\r
++                                                      this.set_text(obj,t); // rollback purposes\r
++                                                      this.rename_node(obj, v);\r
++                                                      callback.call(this, obj, v, t);\r
++                                                      obj.css("position","");\r
++                                              }, this),\r
++                                              "keyup" : function (event) {\r
++                                                      var key = event.keyCode || event.which;\r
++                                                      if(key == 27) { this.value = t; this.blur(); return; }\r
++                                                      else if(key == 13) { this.blur(); return; }\r
++                                                      else {\r
++                                                              h2.width(Math.min(h1.text("pW" + this.value).width(),w));\r
++                                                      }\r
++                                              },\r
++                                              "keypress" : function(event) {\r
++                                                      var key = event.keyCode || event.which;\r
++                                                      if(key == 13) { return false; }\r
++                                              }\r
++                                      })\r
++                              ).children(".jstree-rename-input"); \r
++                              this.set_text(obj, "");\r
++                              h1.css({\r
++                                              fontFamily              : h2.css('fontFamily')          || '',\r
++                                              fontSize                : h2.css('fontSize')            || '',\r
++                                              fontWeight              : h2.css('fontWeight')          || '',\r
++                                              fontStyle               : h2.css('fontStyle')           || '',\r
++                                              fontStretch             : h2.css('fontStretch')         || '',\r
++                                              fontVariant             : h2.css('fontVariant')         || '',\r
++                                              letterSpacing   : h2.css('letterSpacing')       || '',\r
++                                              wordSpacing             : h2.css('wordSpacing')         || ''\r
++                              });\r
++                              h2.width(Math.min(h1.text("pW" + h2[0].value).width(),w))[0].select();\r
++                      },\r
++                      rename : function (obj) {\r
++                              obj = this._get_node(obj);\r
++                              this.__rollback();\r
++                              var f = this.__callback;\r
++                              this._show_input(obj, function (obj, new_name, old_name) { \r
++                                      f.call(this, { "obj" : obj, "new_name" : new_name, "old_name" : old_name });\r
++                              });\r
++                      },\r
++                      create : function (obj, position, js, callback, skip_rename) {\r
++                              var t, _this = this;\r
++                              obj = this._get_node(obj);\r
++                              if(!obj) { obj = -1; }\r
++                              this.__rollback();\r
++                              t = this.create_node(obj, position, js, function (t) {\r
++                                      var p = this._get_parent(t),\r
++                                              pos = $(t).index();\r
++                                      if(callback) { callback.call(this, t); }\r
++                                      if(p.length && p.hasClass("jstree-closed")) { this.open_node(p, false, true); }\r
++                                      if(!skip_rename) { \r
++                                              this._show_input(t, function (obj, new_name, old_name) { \r
++                                                      _this.__callback({ "obj" : obj, "name" : new_name, "parent" : p, "position" : pos });\r
++                                              });\r
++                                      }\r
++                                      else { _this.__callback({ "obj" : t, "name" : this.get_text(t), "parent" : p, "position" : pos }); }\r
++                              });\r
++                              return t;\r
++                      },\r
++                      remove : function (obj) {\r
++                              obj = this._get_node(obj, true);\r
++                              var p = this._get_parent(obj), prev = this._get_prev(obj);\r
++                              this.__rollback();\r
++                              obj = this.delete_node(obj);\r
++                              if(obj !== false) { this.__callback({ "obj" : obj, "prev" : prev, "parent" : p }); }\r
++                      },\r
++                      check_move : function () {\r
++                              if(!this.__call_old()) { return false; }\r
++                              var s = this._get_settings().crrm.move;\r
++                              if(!s.check_move.call(this, this._get_move())) { return false; }\r
++                              return true;\r
++                      },\r
++                      move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) {\r
++                              var s = this._get_settings().crrm.move;\r
++                              if(!is_prepared) { \r
++                                      if(typeof position === "undefined") { position = s.default_position; }\r
++                                      if(position === "inside" && !s.default_position.match(/^(before|after)$/)) { position = s.default_position; }\r
++                                      return this.__call_old(true, obj, ref, position, is_copy, false, skip_check);\r
++                              }\r
++                              // if the move is already prepared\r
++                              if(s.always_copy === true || (s.always_copy === "multitree" && obj.rt.get_index() !== obj.ot.get_index() )) {\r
++                                      is_copy = true;\r
++                              }\r
++                              this.__call_old(true, obj, ref, position, is_copy, true, skip_check);\r
++                      },\r
++\r
++                      cut : function (obj) {\r
++                              obj = this._get_node(obj, true);\r
++                              if(!obj || !obj.length) { return false; }\r
++                              this.data.crrm.cp_nodes = false;\r
++                              this.data.crrm.ct_nodes = obj;\r
++                              this.__callback({ "obj" : obj });\r
++                      },\r
++                      copy : function (obj) {\r
++                              obj = this._get_node(obj, true);\r
++                              if(!obj || !obj.length) { return false; }\r
++                              this.data.crrm.ct_nodes = false;\r
++                              this.data.crrm.cp_nodes = obj;\r
++                              this.__callback({ "obj" : obj });\r
++                      },\r
++                      paste : function (obj) { \r
++                              obj = this._get_node(obj);\r
++                              if(!obj || !obj.length) { return false; }\r
++                              var nodes = this.data.crrm.ct_nodes ? this.data.crrm.ct_nodes : this.data.crrm.cp_nodes;\r
++                              if(!this.data.crrm.ct_nodes && !this.data.crrm.cp_nodes) { return false; }\r
++                              if(this.data.crrm.ct_nodes) { this.move_node(this.data.crrm.ct_nodes, obj); this.data.crrm.ct_nodes = false; }\r
++                              if(this.data.crrm.cp_nodes) { this.move_node(this.data.crrm.cp_nodes, obj, false, true); }\r
++                              this.__callback({ "obj" : obj, "nodes" : nodes });\r
++                      }\r
++              }\r
++      });\r
++      // include the crr plugin by default\r
++      // $.jstree.defaults.plugins.push("crrm");\r
++})(jQuery);\r
++//*/\r
++\r
++/* \r
++ * jsTree themes plugin\r
++ * Handles loading and setting themes, as well as detecting path to themes, etc.\r
++ */\r
++(function ($) {\r
++      var themes_loaded = [];\r
++      // this variable stores the path to the themes folder - if left as false - it will be autodetected\r
++      $.jstree._themes = false;\r
++      $.jstree.plugin("themes", {\r
++              __init : function () { \r
++                      this.get_container()\r
++                              .bind("init.jstree", $.proxy(function () {\r
++                                              var s = this._get_settings().themes;\r
++                                              this.data.themes.dots = s.dots; \r
++                                              this.data.themes.icons = s.icons; \r
++                                              this.set_theme(s.theme, s.url);\r
++                                      }, this))\r
++                              .bind("loaded.jstree", $.proxy(function () {\r
++                                              // bound here too, as simple HTML tree's won't honor dots & icons otherwise\r
++                                              if(!this.data.themes.dots) { this.hide_dots(); }\r
++                                              else { this.show_dots(); }\r
++                                              if(!this.data.themes.icons) { this.hide_icons(); }\r
++                                              else { this.show_icons(); }\r
++                                      }, this));\r
++              },\r
++              defaults : { \r
++                      theme : "default", \r
++                      url : false,\r
++                      dots : true,\r
++                      icons : true\r
++              },\r
++              _fn : {\r
++                      set_theme : function (theme_name, theme_url) {\r
++                              if(!theme_name) { return false; }\r
++                              if(!theme_url) { theme_url = $.jstree._themes + theme_name + '/style.css'; }\r
++                              if($.inArray(theme_url, themes_loaded) == -1) {\r
++                                      $.vakata.css.add_sheet({ "url" : theme_url });\r
++                                      themes_loaded.push(theme_url);\r
++                              }\r
++                              if(this.data.themes.theme != theme_name) {\r
++                                      this.get_container().removeClass('jstree-' + this.data.themes.theme);\r
++                                      this.data.themes.theme = theme_name;\r
++                              }\r
++                              this.get_container().addClass('jstree-' + theme_name);\r
++                              if(!this.data.themes.dots) { this.hide_dots(); }\r
++                              else { this.show_dots(); }\r
++                              if(!this.data.themes.icons) { this.hide_icons(); }\r
++                              else { this.show_icons(); }\r
++                              this.__callback();\r
++                      },\r
++                      get_theme       : function () { return this.data.themes.theme; },\r
++\r
++                      show_dots       : function () { this.data.themes.dots = true; this.get_container().children("ul").removeClass("jstree-no-dots"); },\r
++                      hide_dots       : function () { this.data.themes.dots = false; this.get_container().children("ul").addClass("jstree-no-dots"); },\r
++                      toggle_dots     : function () { if(this.data.themes.dots) { this.hide_dots(); } else { this.show_dots(); } },\r
++\r
++                      show_icons      : function () { this.data.themes.icons = true; this.get_container().children("ul").removeClass("jstree-no-icons"); },\r
++                      hide_icons      : function () { this.data.themes.icons = false; this.get_container().children("ul").addClass("jstree-no-icons"); },\r
++                      toggle_icons: function () { if(this.data.themes.icons) { this.hide_icons(); } else { this.show_icons(); } }\r
++              }\r
++      });\r
++      // autodetect themes path\r
++      $(function () {\r
++              if($.jstree._themes === false) {\r
++                      $("script").each(function () { \r
++                              if(this.src.toString().match(/jquery\.jstree[^\/]*?\.js(\?.*)?$/)) { \r
++                                      $.jstree._themes = this.src.toString().replace(/jquery\.jstree[^\/]*?\.js(\?.*)?$/, "") + 'themes/'; \r
++                                      return false; \r
++                              }\r
++                      });\r
++              }\r
++              if($.jstree._themes === false) { $.jstree._themes = "themes/"; }\r
++      });\r
++      // include the themes plugin by default\r
++      $.jstree.defaults.plugins.push("themes");\r
++})(jQuery);\r
++//*/\r
++\r
++/*\r
++ * jsTree hotkeys plugin\r
++ * Enables keyboard navigation for all tree instances\r
++ * Depends on the jstree ui & jquery hotkeys plugins\r
++ */\r
++(function ($) {\r
++      var bound = [];\r
++      function exec(i, event) {\r
++              var f = $.jstree._focused(), tmp;\r
++              if(f && f.data && f.data.hotkeys && f.data.hotkeys.enabled) { \r
++                      tmp = f._get_settings().hotkeys[i];\r
++                      if(tmp) { return tmp.call(f, event); }\r
++              }\r
++      }\r
++      $.jstree.plugin("hotkeys", {\r
++              __init : function () {\r
++                      if(typeof $.hotkeys === "undefined") { throw "jsTree hotkeys: jQuery hotkeys plugin not included."; }\r
++                      if(!this.data.ui) { throw "jsTree hotkeys: jsTree UI plugin not included."; }\r
++                      $.each(this._get_settings().hotkeys, function (i, v) {\r
++                              if(v !== false && $.inArray(i, bound) == -1) {\r
++                                      $(document).bind("keydown", i, function (event) { return exec(i, event); });\r
++                                      bound.push(i);\r
++                              }\r
++                      });\r
++                      this.get_container()\r
++                              .bind("lock.jstree", $.proxy(function () {\r
++                                              if(this.data.hotkeys.enabled) { this.data.hotkeys.enabled = false; this.data.hotkeys.revert = true; }\r
++                                      }, this))\r
++                              .bind("unlock.jstree", $.proxy(function () {\r
++                                              if(this.data.hotkeys.revert) { this.data.hotkeys.enabled = true; }\r
++                                      }, this));\r
++                      this.enable_hotkeys();\r
++              },\r
++              defaults : {\r
++                      "up" : function () { \r
++                              var o = this.data.ui.hovered || this.data.ui.last_selected || -1;\r
++                              this.hover_node(this._get_prev(o));\r
++                              return false; \r
++                      },\r
++                      "ctrl+up" : function () { \r
++                              var o = this.data.ui.hovered || this.data.ui.last_selected || -1;\r
++                              this.hover_node(this._get_prev(o));\r
++                              return false; \r
++                      },\r
++                      "shift+up" : function () { \r
++                              var o = this.data.ui.hovered || this.data.ui.last_selected || -1;\r
++                              this.hover_node(this._get_prev(o));\r
++                              return false; \r
++                      },\r
++                      "down" : function () { \r
++                              var o = this.data.ui.hovered || this.data.ui.last_selected || -1;\r
++                              this.hover_node(this._get_next(o));\r
++                              return false;\r
++                      },\r
++                      "ctrl+down" : function () { \r
++                              var o = this.data.ui.hovered || this.data.ui.last_selected || -1;\r
++                              this.hover_node(this._get_next(o));\r
++                              return false;\r
++                      },\r
++                      "shift+down" : function () { \r
++                              var o = this.data.ui.hovered || this.data.ui.last_selected || -1;\r
++                              this.hover_node(this._get_next(o));\r
++                              return false;\r
++                      },\r
++                      "left" : function () { \r
++                              var o = this.data.ui.hovered || this.data.ui.last_selected;\r
++                              if(o) {\r
++                                      if(o.hasClass("jstree-open")) { this.close_node(o); }\r
++                                      else { this.hover_node(this._get_prev(o)); }\r
++                              }\r
++                              return false;\r
++                      },\r
++                      "ctrl+left" : function () { \r
++                              var o = this.data.ui.hovered || this.data.ui.last_selected;\r
++                              if(o) {\r
++                                      if(o.hasClass("jstree-open")) { this.close_node(o); }\r
++                                      else { this.hover_node(this._get_prev(o)); }\r
++                              }\r
++                              return false;\r
++                      },\r
++                      "shift+left" : function () { \r
++                              var o = this.data.ui.hovered || this.data.ui.last_selected;\r
++                              if(o) {\r
++                                      if(o.hasClass("jstree-open")) { this.close_node(o); }\r
++                                      else { this.hover_node(this._get_prev(o)); }\r
++                              }\r
++                              return false;\r
++                      },\r
++                      "right" : function () { \r
++                              var o = this.data.ui.hovered || this.data.ui.last_selected;\r
++                              if(o && o.length) {\r
++                                      if(o.hasClass("jstree-closed")) { this.open_node(o); }\r
++                                      else { this.hover_node(this._get_next(o)); }\r
++                              }\r
++                              return false;\r
++                      },\r
++                      "ctrl+right" : function () { \r
++                              var o = this.data.ui.hovered || this.data.ui.last_selected;\r
++                              if(o && o.length) {\r
++                                      if(o.hasClass("jstree-closed")) { this.open_node(o); }\r
++                                      else { this.hover_node(this._get_next(o)); }\r
++                              }\r
++                              return false;\r
++                      },\r
++                      "shift+right" : function () { \r
++                              var o = this.data.ui.hovered || this.data.ui.last_selected;\r
++                              if(o && o.length) {\r
++                                      if(o.hasClass("jstree-closed")) { this.open_node(o); }\r
++                                      else { this.hover_node(this._get_next(o)); }\r
++                              }\r
++                              return false;\r
++                      },\r
++                      "space" : function () { \r
++                              if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").click(); } \r
++                              return false; \r
++                      },\r
++                      "ctrl+space" : function (event) { \r
++                              event.type = "click";\r
++                              if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").trigger(event); } \r
++                              return false; \r
++                      },\r
++                      "shift+space" : function (event) { \r
++                              event.type = "click";\r
++                              if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").trigger(event); } \r
++                              return false; \r
++                      },\r
++                      "f2" : function () { this.rename(this.data.ui.hovered || this.data.ui.last_selected); },\r
++                      "del" : function () { this.remove(this.data.ui.hovered || this._get_node(null)); }\r
++              },\r
++              _fn : {\r
++                      enable_hotkeys : function () {\r
++                              this.data.hotkeys.enabled = true;\r
++                      },\r
++                      disable_hotkeys : function () {\r
++                              this.data.hotkeys.enabled = false;\r
++                      }\r
++              }\r
++      });\r
++})(jQuery);\r
++//*/\r
++\r
++/* \r
++ * jsTree JSON plugin\r
++ * The JSON data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions.\r
++ */\r
++(function ($) {\r
++      $.jstree.plugin("json_data", {\r
++              __init : function() {\r
++                      var s = this._get_settings().json_data;\r
++                      if(s.progressive_unload) {\r
++                              this.get_container().bind("after_close.jstree", function (e, data) {\r
++                                      data.rslt.obj.children("ul").remove();\r
++                              });\r
++                      }\r
++              },\r
++              defaults : { \r
++                      // `data` can be a function:\r
++                      //  * accepts two arguments - node being loaded and a callback to pass the result to\r
++                      //  * will be executed in the current tree's scope & ajax won't be supported\r
++                      data : false, \r
++                      ajax : false,\r
++                      correct_state : true,\r
++                      progressive_render : false,\r
++                      progressive_unload : false\r
++              },\r
++              _fn : {\r
++                      load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_json(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); },\r
++                      _is_loaded : function (obj) { \r
++                              var s = this._get_settings().json_data;\r
++                              obj = this._get_node(obj); \r
++                              return obj == -1 || !obj || (!s.ajax && !s.progressive_render && !$.isFunction(s.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").length > 0;\r
++                      },\r
++                      refresh : function (obj) {\r
++                              obj = this._get_node(obj);\r
++                              var s = this._get_settings().json_data;\r
++                              if(obj && obj !== -1 && s.progressive_unload && ($.isFunction(s.data) || !!s.ajax)) {\r
++                                      obj.removeData("jstree_children");\r
++                              }\r
++                              return this.__call_old();\r
++                      },\r
++                      load_node_json : function (obj, s_call, e_call) {\r
++                              var s = this.get_settings().json_data, d,\r
++                                      error_func = function () {},\r
++                                      success_func = function () {};\r
++                              obj = this._get_node(obj);\r
++\r
++                              if(obj && obj !== -1 && (s.progressive_render || s.progressive_unload) && !obj.is(".jstree-open, .jstree-leaf") && obj.children("ul").children("li").length === 0 && obj.data("jstree_children")) {\r
++                                      d = this._parse_json(obj.data("jstree_children"), obj);\r
++                                      if(d) {\r
++                                              obj.append(d);\r
++                                              if(!s.progressive_unload) { obj.removeData("jstree_children"); }\r
++                                      }\r
++                                      this.clean_node(obj);\r
++                                      if(s_call) { s_call.call(this); }\r
++                                      return;\r
++                              }\r
++\r
++                              if(obj && obj !== -1) {\r
++                                      if(obj.data("jstree_is_loading")) { return; }\r
++                                      else { obj.data("jstree_is_loading",true); }\r
++                              }\r
++                              switch(!0) {\r
++                                      case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied.";\r
++                                      // function option added here for easier model integration (also supporting async - see callback)\r
++                                      case ($.isFunction(s.data)):\r
++                                              s.data.call(this, obj, $.proxy(function (d) {\r
++                                                      d = this._parse_json(d, obj);\r
++                                                      if(!d) { \r
++                                                              if(obj === -1 || !obj) {\r
++                                                                      if(s.correct_state) { this.get_container().children("ul").empty(); }\r
++                                                              }\r
++                                                              else {\r
++                                                                      obj.children("a.jstree-loading").removeClass("jstree-loading");\r
++                                                                      obj.removeData("jstree_is_loading");\r
++                                                                      if(s.correct_state) { this.correct_state(obj); }\r
++                                                              }\r
++                                                              if(e_call) { e_call.call(this); }\r
++                                                      }\r
++                                                      else {\r
++                                                              if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }\r
++                                                              else { obj.append(d).children("a.jstree-loading").removeClass("jstree-loading"); obj.removeData("jstree_is_loading"); }\r
++                                                              this.clean_node(obj);\r
++                                                              if(s_call) { s_call.call(this); }\r
++                                                      }\r
++                                              }, this));\r
++                                              break;\r
++                                      case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):\r
++                                              if(!obj || obj == -1) {\r
++                                                      d = this._parse_json(s.data, obj);\r
++                                                      if(d) {\r
++                                                              this.get_container().children("ul").empty().append(d.children());\r
++                                                              this.clean_node();\r
++                                                      }\r
++                                                      else { \r
++                                                              if(s.correct_state) { this.get_container().children("ul").empty(); }\r
++                                                      }\r
++                                              }\r
++                                              if(s_call) { s_call.call(this); }\r
++                                              break;\r
++                                      case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):\r
++                                              error_func = function (x, t, e) {\r
++                                                      var ef = this.get_settings().json_data.ajax.error; \r
++                                                      if(ef) { ef.call(this, x, t, e); }\r
++                                                      if(obj != -1 && obj.length) {\r
++                                                              obj.children("a.jstree-loading").removeClass("jstree-loading");\r
++                                                              obj.removeData("jstree_is_loading");\r
++                                                              if(t === "success" && s.correct_state) { this.correct_state(obj); }\r
++                                                      }\r
++                                                      else {\r
++                                                              if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }\r
++                                                      }\r
++                                                      if(e_call) { e_call.call(this); }\r
++                                              };\r
++                                              success_func = function (d, t, x) {\r
++                                                      var sf = this.get_settings().json_data.ajax.success; \r
++                                                      if(sf) { d = sf.call(this,d,t,x) || d; }\r
++                                                      if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "") || (!$.isArray(d) && !$.isPlainObject(d))) {\r
++                                                              return error_func.call(this, x, t, "");\r
++                                                      }\r
++                                                      d = this._parse_json(d, obj);\r
++                                                      if(d) {\r
++                                                              if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }\r
++                                                              else { obj.append(d).children("a.jstree-loading").removeClass("jstree-loading"); obj.removeData("jstree_is_loading"); }\r
++                                                              this.clean_node(obj);\r
++                                                              if(s_call) { s_call.call(this); }\r
++                                                      }\r
++                                                      else {\r
++                                                              if(obj === -1 || !obj) {\r
++                                                                      if(s.correct_state) { \r
++                                                                              this.get_container().children("ul").empty(); \r
++                                                                              if(s_call) { s_call.call(this); }\r
++                                                                      }\r
++                                                              }\r
++                                                              else {\r
++                                                                      obj.children("a.jstree-loading").removeClass("jstree-loading");\r
++                                                                      obj.removeData("jstree_is_loading");\r
++                                                                      if(s.correct_state) { \r
++                                                                              this.correct_state(obj);\r
++                                                                              if(s_call) { s_call.call(this); } \r
++                                                                      }\r
++                                                              }\r
++                                                      }\r
++                                              };\r
++                                              s.ajax.context = this;\r
++                                              s.ajax.error = error_func;\r
++                                              s.ajax.success = success_func;\r
++                                              if(!s.ajax.dataType) { s.ajax.dataType = "json"; }\r
++                                              if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }\r
++                                              if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }\r
++                                              $.ajax(s.ajax);\r
++                                              break;\r
++                              }\r
++                      },\r
++                      _parse_json : function (js, obj, is_callback) {\r
++                              var d = false, \r
++                                      p = this._get_settings(),\r
++                                      s = p.json_data,\r
++                                      t = p.core.html_titles,\r
++                                      tmp, i, j, ul1, ul2;\r
++\r
++                              if(!js) { return d; }\r
++                              if(s.progressive_unload && obj && obj !== -1) { \r
++                                      obj.data("jstree_children", d);\r
++                              }\r
++                              if($.isArray(js)) {\r
++                                      d = $();\r
++                                      if(!js.length) { return false; }\r
++                                      for(i = 0, j = js.length; i < j; i++) {\r
++                                              tmp = this._parse_json(js[i], obj, true);\r
++                                              if(tmp.length) { d = d.add(tmp); }\r
++                                      }\r
++                              }\r
++                              else {\r
++                                      if(typeof js == "string") { js = { data : js }; }\r
++                                      if(!js.data && js.data !== "") { return d; }\r
++                                      d = $("<li />");\r
++                                      if(js.attr) { d.attr(js.attr); }\r
++                                      if(js.metadata) { d.data(js.metadata); }\r
++                                      if(js.state) { d.addClass("jstree-" + js.state); }\r
++                                      if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); }\r
++                                      $.each(js.data, function (i, m) {\r
++                                              tmp = $("<a />");\r
++                                              if($.isFunction(m)) { m = m.call(this, js); }\r
++                                              if(typeof m == "string") { tmp.attr('href','#')[ t ? "html" : "text" ](m); }\r
++                                              else {\r
++                                                      if(!m.attr) { m.attr = {}; }\r
++                                                      if(!m.attr.href) { m.attr.href = '#'; }\r
++                                                      tmp.attr(m.attr)[ t ? "html" : "text" ](m.title);\r
++                                                      if(m.language) { tmp.addClass(m.language); }\r
++                                              }\r
++                                              tmp.prepend("<ins class='jstree-icon'>&#160;</ins>");\r
++                                              if(!m.icon && js.icon) { m.icon = js.icon; }\r
++                                              if(m.icon) { \r
++                                                      if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); }\r
++                                                      else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); }\r
++                                              }\r
++                                              d.append(tmp);\r
++                                      });\r
++                                      d.prepend("<ins class='jstree-icon'>&#160;</ins>");\r
++                                      if(js.children) { \r
++                                              if(s.progressive_render && js.state !== "open") {\r
++                                                      d.addClass("jstree-closed").data("jstree_children", js.children);\r
++                                              }\r
++                                              else {\r
++                                                      if(s.progressive_unload) { d.data("jstree_children", js.children); }\r
++                                                      if($.isArray(js.children) && js.children.length) {\r
++                                                              tmp = this._parse_json(js.children, obj, true);\r
++                                                              if(tmp.length) {\r
++                                                                      ul2 = $("<ul />");\r
++                                                                      ul2.append(tmp);\r
++                                                                      d.append(ul2);\r
++                                                              }\r
++                                                      }\r
++                                              }\r
++                                      }\r
++                              }\r
++                              if(!is_callback) {\r
++                                      ul1 = $("<ul />");\r
++                                      ul1.append(d);\r
++                                      d = ul1;\r
++                              }\r
++                              return d;\r
++                      },\r
++                      get_json : function (obj, li_attr, a_attr, is_callback) {\r
++                              var result = [], \r
++                                      s = this._get_settings(), \r
++                                      _this = this,\r
++                                      tmp1, tmp2, li, a, t, lang;\r
++                              obj = this._get_node(obj);\r
++                              if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); }\r
++                              li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ];\r
++                              if(!is_callback && this.data.types) { li_attr.push(s.types.type_attr); }\r
++                              a_attr = $.isArray(a_attr) ? a_attr : [ ];\r
++\r
++                              obj.each(function () {\r
++                                      li = $(this);\r
++                                      tmp1 = { data : [] };\r
++                                      if(li_attr.length) { tmp1.attr = { }; }\r
++                                      $.each(li_attr, function (i, v) { \r
++                                              tmp2 = li.attr(v); \r
++                                              if(tmp2 && tmp2.length && tmp2.replace(/jstree[^ ]*/ig,'').length) {\r
++                                                      tmp1.attr[v] = (" " + tmp2).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,""); \r
++                                              }\r
++                                      });\r
++                                      if(li.hasClass("jstree-open")) { tmp1.state = "open"; }\r
++                                      if(li.hasClass("jstree-closed")) { tmp1.state = "closed"; }\r
++                                      if(li.data()) { tmp1.metadata = li.data(); }\r
++                                      a = li.children("a");\r
++                                      a.each(function () {\r
++                                              t = $(this);\r
++                                              if(\r
++                                                      a_attr.length || \r
++                                                      $.inArray("languages", s.plugins) !== -1 || \r
++                                                      t.children("ins").get(0).style.backgroundImage.length || \r
++                                                      (t.children("ins").get(0).className && t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').length)\r
++                                              ) { \r
++                                                      lang = false;\r
++                                                      if($.inArray("languages", s.plugins) !== -1 && $.isArray(s.languages) && s.languages.length) {\r
++                                                              $.each(s.languages, function (l, lv) {\r
++                                                                      if(t.hasClass(lv)) {\r
++                                                                              lang = lv;\r
++                                                                              return false;\r
++                                                                      }\r
++                                                              });\r
++                                                      }\r
++                                                      tmp2 = { attr : { }, title : _this.get_text(t, lang) }; \r
++                                                      $.each(a_attr, function (k, z) {\r
++                                                              tmp2.attr[z] = (" " + (t.attr(z) || "")).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"");\r
++                                                      });\r
++                                                      if($.inArray("languages", s.plugins) !== -1 && $.isArray(s.languages) && s.languages.length) {\r
++                                                              $.each(s.languages, function (k, z) {\r
++                                                                      if(t.hasClass(z)) { tmp2.language = z; return true; }\r
++                                                              });\r
++                                                      }\r
++                                                      if(t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"").length) {\r
++                                                              tmp2.icon = t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"");\r
++                                                      }\r
++                                                      if(t.children("ins").get(0).style.backgroundImage.length) {\r
++                                                              tmp2.icon = t.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","");\r
++                                                      }\r
++                                              }\r
++                                              else {\r
++                                                      tmp2 = _this.get_text(t);\r
++                                              }\r
++                                              if(a.length > 1) { tmp1.data.push(tmp2); }\r
++                                              else { tmp1.data = tmp2; }\r
++                                      });\r
++                                      li = li.find("> ul > li");\r
++                                      if(li.length) { tmp1.children = _this.get_json(li, li_attr, a_attr, true); }\r
++                                      result.push(tmp1);\r
++                              });\r
++                              return result;\r
++                      }\r
++              }\r
++      });\r
++})(jQuery);\r
++//*/\r
++\r
++/* \r
++ * jsTree languages plugin\r
++ * Adds support for multiple language versions in one tree\r
++ * This basically allows for many titles coexisting in one node, but only one of them being visible at any given time\r
++ * This is useful for maintaining the same structure in many languages (hence the name of the plugin)\r
++ */\r
++(function ($) {\r
++      $.jstree.plugin("languages", {\r
++              __init : function () { this._load_css();  },\r
++              defaults : [],\r
++              _fn : {\r
++                      set_lang : function (i) { \r
++                              var langs = this._get_settings().languages,\r
++                                      st = false,\r
++                                      selector = ".jstree-" + this.get_index() + ' a';\r
++                              if(!$.isArray(langs) || langs.length === 0) { return false; }\r
++                              if($.inArray(i,langs) == -1) {\r
++                                      if(!!langs[i]) { i = langs[i]; }\r
++                                      else { return false; }\r
++                              }\r
++                              if(i == this.data.languages.current_language) { return true; }\r
++                              st = $.vakata.css.get_css(selector + "." + this.data.languages.current_language, false, this.data.languages.language_css);\r
++                              if(st !== false) { st.style.display = "none"; }\r
++                              st = $.vakata.css.get_css(selector + "." + i, false, this.data.languages.language_css);\r
++                              if(st !== false) { st.style.display = ""; }\r
++                              this.data.languages.current_language = i;\r
++                              this.__callback(i);\r
++                              return true;\r
++                      },\r
++                      get_lang : function () {\r
++                              return this.data.languages.current_language;\r
++                      },\r
++                      _get_string : function (key, lang) {\r
++                              var langs = this._get_settings().languages,\r
++                                      s = this._get_settings().core.strings;\r
++                              if($.isArray(langs) && langs.length) {\r
++                                      lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;\r
++                              }\r
++                              if(s[lang] && s[lang][key]) { return s[lang][key]; }\r
++                              if(s[key]) { return s[key]; }\r
++                              return key;\r
++                      },\r
++                      get_text : function (obj, lang) {\r
++                              obj = this._get_node(obj) || this.data.ui.last_selected;\r
++                              if(!obj.size()) { return false; }\r
++                              var langs = this._get_settings().languages,\r
++                                      s = this._get_settings().core.html_titles;\r
++                              if($.isArray(langs) && langs.length) {\r
++                                      lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;\r
++                                      obj = obj.children("a." + lang);\r
++                              }\r
++                              else { obj = obj.children("a:eq(0)"); }\r
++                              if(s) {\r
++                                      obj = obj.clone();\r
++                                      obj.children("INS").remove();\r
++                                      return obj.html();\r
++                              }\r
++                              else {\r
++                                      obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];\r
++                                      return obj.nodeValue;\r
++                              }\r
++                      },\r
++                      set_text : function (obj, val, lang) {\r
++                              obj = this._get_node(obj) || this.data.ui.last_selected;\r
++                              if(!obj.size()) { return false; }\r
++                              var langs = this._get_settings().languages,\r
++                                      s = this._get_settings().core.html_titles,\r
++                                      tmp;\r
++                              if($.isArray(langs) && langs.length) {\r
++                                      lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;\r
++                                      obj = obj.children("a." + lang);\r
++                              }\r
++                              else { obj = obj.children("a:eq(0)"); }\r
++                              if(s) {\r
++                                      tmp = obj.children("INS").clone();\r
++                                      obj.html(val).prepend(tmp);\r
++                                      this.__callback({ "obj" : obj, "name" : val, "lang" : lang });\r
++                                      return true;\r
++                              }\r
++                              else {\r
++                                      obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];\r
++                                      this.__callback({ "obj" : obj, "name" : val, "lang" : lang });\r
++                                      return (obj.nodeValue = val);\r
++                              }\r
++                      },\r
++                      _load_css : function () {\r
++                              var langs = this._get_settings().languages,\r
++                                      str = "/* languages css */",\r
++                                      selector = ".jstree-" + this.get_index() + ' a',\r
++                                      ln;\r
++                              if($.isArray(langs) && langs.length) {\r
++                                      this.data.languages.current_language = langs[0];\r
++                                      for(ln = 0; ln < langs.length; ln++) {\r
++                                              str += selector + "." + langs[ln] + " {";\r
++                                              if(langs[ln] != this.data.languages.current_language) { str += " display:none; "; }\r
++                                              str += " } ";\r
++                                      }\r
++                                      this.data.languages.language_css = $.vakata.css.add_sheet({ 'str' : str, 'title' : "jstree-languages" });\r
++                              }\r
++                      },\r
++                      create_node : function (obj, position, js, callback) {\r
++                              var t = this.__call_old(true, obj, position, js, function (t) {\r
++                                      var langs = this._get_settings().languages,\r
++                                              a = t.children("a"),\r
++                                              ln;\r
++                                      if($.isArray(langs) && langs.length) {\r
++                                              for(ln = 0; ln < langs.length; ln++) {\r
++                                                      if(!a.is("." + langs[ln])) {\r
++                                                              t.append(a.eq(0).clone().removeClass(langs.join(" ")).addClass(langs[ln]));\r
++                                                      }\r
++                                              }\r
++                                              a.not("." + langs.join(", .")).remove();\r
++                                      }\r
++                                      if(callback) { callback.call(this, t); }\r
++                              });\r
++                              return t;\r
++                      }\r
++              }\r
++      });\r
++})(jQuery);\r
++//*/\r
++\r
++/*\r
++ * jsTree cookies plugin\r
++ * Stores the currently opened/selected nodes in a cookie and then restores them\r
++ * Depends on the jquery.cookie plugin\r
++ */\r
++(function ($) {\r
++      $.jstree.plugin("cookies", {\r
++              __init : function () {\r
++                      if(typeof $.cookie === "undefined") { throw "jsTree cookie: jQuery cookie plugin not included."; }\r
++\r
++                      var s = this._get_settings().cookies,\r
++                              tmp;\r
++                      if(!!s.save_loaded) {\r
++                              tmp = $.cookie(s.save_loaded);\r
++                              if(tmp && tmp.length) { this.data.core.to_load = tmp.split(","); }\r
++                      }\r
++                      if(!!s.save_opened) {\r
++                              tmp = $.cookie(s.save_opened);\r
++                              if(tmp && tmp.length) { this.data.core.to_open = tmp.split(","); }\r
++                      }\r
++                      if(!!s.save_selected) {\r
++                              tmp = $.cookie(s.save_selected);\r
++                              if(tmp && tmp.length && this.data.ui) { this.data.ui.to_select = tmp.split(","); }\r
++                      }\r
++                      this.get_container()\r
++                              .one( ( this.data.ui ? "reselect" : "reopen" ) + ".jstree", $.proxy(function () {\r
++                                      this.get_container()\r
++                                              .bind("open_node.jstree close_node.jstree select_node.jstree deselect_node.jstree", $.proxy(function (e) { \r
++                                                              if(this._get_settings().cookies.auto_save) { this.save_cookie((e.handleObj.namespace + e.handleObj.type).replace("jstree","")); }\r
++                                                      }, this));\r
++                              }, this));\r
++              },\r
++              defaults : {\r
++                      save_loaded             : "jstree_load",\r
++                      save_opened             : "jstree_open",\r
++                      save_selected   : "jstree_select",\r
++                      auto_save               : true,\r
++                      cookie_options  : {}\r
++              },\r
++              _fn : {\r
++                      save_cookie : function (c) {\r
++                              if(this.data.core.refreshing) { return; }\r
++                              var s = this._get_settings().cookies;\r
++                              if(!c) { // if called manually and not by event\r
++                                      if(s.save_loaded) {\r
++                                              this.save_loaded();\r
++                                              $.cookie(s.save_loaded, this.data.core.to_load.join(","), s.cookie_options);\r
++                                      }\r
++                                      if(s.save_opened) {\r
++                                              this.save_opened();\r
++                                              $.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options);\r
++                                      }\r
++                                      if(s.save_selected && this.data.ui) {\r
++                                              this.save_selected();\r
++                                              $.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options);\r
++                                      }\r
++                                      return;\r
++                              }\r
++                              switch(c) {\r
++                                      case "open_node":\r
++                                      case "close_node":\r
++                                              if(!!s.save_opened) { \r
++                                                      this.save_opened(); \r
++                                                      $.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options); \r
++                                              }\r
++                                              if(!!s.save_loaded) { \r
++                                                      this.save_loaded(); \r
++                                                      $.cookie(s.save_loaded, this.data.core.to_load.join(","), s.cookie_options); \r
++                                              }\r
++                                              break;\r
++                                      case "select_node":\r
++                                      case "deselect_node":\r
++                                              if(!!s.save_selected && this.data.ui) { \r
++                                                      this.save_selected(); \r
++                                                      $.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options); \r
++                                              }\r
++                                              break;\r
++                              }\r
++                      }\r
++              }\r
++      });\r
++      // include cookies by default\r
++      // $.jstree.defaults.plugins.push("cookies");\r
++})(jQuery);\r
++//*/\r
++\r
++/*\r
++ * jsTree sort plugin\r
++ * Sorts items alphabetically (or using any other function)\r
++ */\r
++(function ($) {\r
++      $.jstree.plugin("sort", {\r
++              __init : function () {\r
++                      this.get_container()\r
++                              .bind("load_node.jstree", $.proxy(function (e, data) {\r
++                                              var obj = this._get_node(data.rslt.obj);\r
++                                              obj = obj === -1 ? this.get_container().children("ul") : obj.children("ul");\r
++                                              this.sort(obj);\r
++                                      }, this))\r
++                              .bind("rename_node.jstree create_node.jstree create.jstree", $.proxy(function (e, data) {\r
++                                              this.sort(data.rslt.obj.parent());\r
++                                      }, this))\r
++                              .bind("move_node.jstree", $.proxy(function (e, data) {\r
++                                              var m = data.rslt.np == -1 ? this.get_container() : data.rslt.np;\r
++                                              this.sort(m.children("ul"));\r
++                                      }, this));\r
++              },\r
++              defaults : function (a, b) { return this.get_text(a) > this.get_text(b) ? 1 : -1; },\r
++              _fn : {\r
++                      sort : function (obj) {\r
++                              var s = this._get_settings().sort,\r
++                                      t = this;\r
++                              obj.append($.makeArray(obj.children("li")).sort($.proxy(s, t)));\r
++                              obj.find("> li > ul").each(function() { t.sort($(this)); });\r
++                              this.clean_node(obj);\r
++                      }\r
++              }\r
++      });\r
++})(jQuery);\r
++//*/\r
++\r
++/*\r
++ * jsTree DND plugin\r
++ * Drag and drop plugin for moving/copying nodes\r
++ */\r
++(function ($) {\r
++      var o = false,\r
++              r = false,\r
++              m = false,\r
++              ml = false,\r
++              sli = false,\r
++              sti = false,\r
++              dir1 = false,\r
++              dir2 = false,\r
++              last_pos = false;\r
++      $.vakata.dnd = {\r
++              is_down : false,\r
++              is_drag : false,\r
++              helper : false,\r
++              scroll_spd : 10,\r
++              init_x : 0,\r
++              init_y : 0,\r
++              threshold : 5,\r
++              helper_left : 5,\r
++              helper_top : 10,\r
++              user_data : {},\r
++\r
++              drag_start : function (e, data, html) { \r
++                      if($.vakata.dnd.is_drag) { $.vakata.drag_stop({}); }\r
++                      try {\r
++                              e.currentTarget.unselectable = "on";\r
++                              e.currentTarget.onselectstart = function() { return false; };\r
++                              if(e.currentTarget.style) { e.currentTarget.style.MozUserSelect = "none"; }\r
++                      } catch(err) { }\r
++                      $.vakata.dnd.init_x = e.pageX;\r
++                      $.vakata.dnd.init_y = e.pageY;\r
++                      $.vakata.dnd.user_data = data;\r
++                      $.vakata.dnd.is_down = true;\r
++                      $.vakata.dnd.helper = $("<div id='vakata-dragged' />").html(html); //.fadeTo(10,0.25);\r
++                      $(document).bind("mousemove", $.vakata.dnd.drag);\r
++                      $(document).bind("mouseup", $.vakata.dnd.drag_stop);\r
++                      return false;\r
++              },\r
++              drag : function (e) { \r
++                      if(!$.vakata.dnd.is_down) { return; }\r
++                      if(!$.vakata.dnd.is_drag) {\r
++                              if(Math.abs(e.pageX - $.vakata.dnd.init_x) > 5 || Math.abs(e.pageY - $.vakata.dnd.init_y) > 5) { \r
++                                      $.vakata.dnd.helper.appendTo("body");\r
++                                      $.vakata.dnd.is_drag = true;\r
++                                      $(document).triggerHandler("drag_start.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });\r
++                              }\r
++                              else { return; }\r
++                      }\r
++\r
++                      // maybe use a scrolling parent element instead of document?\r
++                      if(e.type === "mousemove") { // thought of adding scroll in order to move the helper, but mouse poisition is n/a\r
++                              var d = $(document), t = d.scrollTop(), l = d.scrollLeft();\r
++                              if(e.pageY - t < 20) { \r
++                                      if(sti && dir1 === "down") { clearInterval(sti); sti = false; }\r
++                                      if(!sti) { dir1 = "up"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() - $.vakata.dnd.scroll_spd); }, 150); }\r
++                              }\r
++                              else { \r
++                                      if(sti && dir1 === "up") { clearInterval(sti); sti = false; }\r
++                              }\r
++                              if($(window).height() - (e.pageY - t) < 20) {\r
++                                      if(sti && dir1 === "up") { clearInterval(sti); sti = false; }\r
++                                      if(!sti) { dir1 = "down"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() + $.vakata.dnd.scroll_spd); }, 150); }\r
++                              }\r
++                              else { \r
++                                      if(sti && dir1 === "down") { clearInterval(sti); sti = false; }\r
++                              }\r
++\r
++                              if(e.pageX - l < 20) {\r
++                                      if(sli && dir2 === "right") { clearInterval(sli); sli = false; }\r
++                                      if(!sli) { dir2 = "left"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() - $.vakata.dnd.scroll_spd); }, 150); }\r
++                              }\r
++                              else { \r
++                                      if(sli && dir2 === "left") { clearInterval(sli); sli = false; }\r
++                              }\r
++                              if($(window).width() - (e.pageX - l) < 20) {\r
++                                      if(sli && dir2 === "left") { clearInterval(sli); sli = false; }\r
++                                      if(!sli) { dir2 = "right"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() + $.vakata.dnd.scroll_spd); }, 150); }\r
++                              }\r
++                              else { \r
++                                      if(sli && dir2 === "right") { clearInterval(sli); sli = false; }\r
++                              }\r
++                      }\r
++\r
++                      $.vakata.dnd.helper.css({ left : (e.pageX + $.vakata.dnd.helper_left) + "px", top : (e.pageY + $.vakata.dnd.helper_top) + "px" });\r
++                      $(document).triggerHandler("drag.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });\r
++              },\r
++              drag_stop : function (e) {\r
++                      if(sli) { clearInterval(sli); }\r
++                      if(sti) { clearInterval(sti); }\r
++                      $(document).unbind("mousemove", $.vakata.dnd.drag);\r
++                      $(document).unbind("mouseup", $.vakata.dnd.drag_stop);\r
++                      $(document).triggerHandler("drag_stop.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });\r
++                      $.vakata.dnd.helper.remove();\r
++                      $.vakata.dnd.init_x = 0;\r
++                      $.vakata.dnd.init_y = 0;\r
++                      $.vakata.dnd.user_data = {};\r
++                      $.vakata.dnd.is_down = false;\r
++                      $.vakata.dnd.is_drag = false;\r
++              }\r
++      };\r
++      $(function() {\r
++              var css_string = '#vakata-dragged { display:block; margin:0 0 0 0; padding:4px 4px 4px 24px; position:absolute; top:-2000px; line-height:16px; z-index:10000; } ';\r
++              $.vakata.css.add_sheet({ str : css_string, title : "vakata" });\r
++      });\r
++\r
++      $.jstree.plugin("dnd", {\r
++              __init : function () {\r
++                      this.data.dnd = {\r
++                              active : false,\r
++                              after : false,\r
++                              inside : false,\r
++                              before : false,\r
++                              off : false,\r
++                              prepared : false,\r
++                              w : 0,\r
++                              to1 : false,\r
++                              to2 : false,\r
++                              cof : false,\r
++                              cw : false,\r
++                              ch : false,\r
++                              i1 : false,\r
++                              i2 : false,\r
++                              mto : false\r
++                      };\r
++                      this.get_container()\r
++                              .bind("mouseenter.jstree", $.proxy(function (e) {\r
++                                              if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {\r
++                                                      if(this.data.themes) {\r
++                                                              m.attr("class", "jstree-" + this.data.themes.theme); \r
++                                                              if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); }\r
++                                                              $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme);\r
++                                                      }\r
++                                                      //if($(e.currentTarget).find("> ul > li").length === 0) {\r
++                                                      if(e.currentTarget === e.target && $.vakata.dnd.user_data.obj && $($.vakata.dnd.user_data.obj).length && $($.vakata.dnd.user_data.obj).parents(".jstree:eq(0)")[0] !== e.target) { // node should not be from the same tree\r
++                                                              var tr = $.jstree._reference(e.target), dc;\r
++                                                              if(tr.data.dnd.foreign) {\r
++                                                                      dc = tr._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : tr.get_container(), is_root : true });\r
++                                                                      if(dc === true || dc.inside === true || dc.before === true || dc.after === true) {\r
++                                                                              $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");\r
++                                                                      }\r
++                                                              }\r
++                                                              else {\r
++                                                                      tr.prepare_move(o, tr.get_container(), "last");\r
++                                                                      if(tr.check_move()) {\r
++                                                                              $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");\r
++                                                                      }\r
++                                                              }\r
++                                                      }\r
++                                              }\r
++                                      }, this))\r
++                              .bind("mouseup.jstree", $.proxy(function (e) {\r
++                                              //if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && $(e.currentTarget).find("> ul > li").length === 0) {\r
++                                              if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && e.currentTarget === e.target && $.vakata.dnd.user_data.obj && $($.vakata.dnd.user_data.obj).length && $($.vakata.dnd.user_data.obj).parents(".jstree:eq(0)")[0] !== e.target) { // node should not be from the same tree\r
++                                                      var tr = $.jstree._reference(e.currentTarget), dc;\r
++                                                      if(tr.data.dnd.foreign) {\r
++                                                              dc = tr._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : tr.get_container(), is_root : true });\r
++                                                              if(dc === true || dc.inside === true || dc.before === true || dc.after === true) {\r
++                                                                      tr._get_settings().dnd.drag_finish.call(this, { "o" : o, "r" : tr.get_container(), is_root : true });\r
++                                                              }\r
++                                                      }\r
++                                                      else {\r
++                                                              tr.move_node(o, tr.get_container(), "last", e[tr._get_settings().dnd.copy_modifier + "Key"]);\r
++                                                      }\r
++                                              }\r
++                                      }, this))\r
++                              .bind("mouseleave.jstree", $.proxy(function (e) {\r
++                                              if(e.relatedTarget && e.relatedTarget.id && e.relatedTarget.id === "jstree-marker-line") {\r
++                                                      return false; \r
++                                              }\r
++                                              if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {\r
++                                                      if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }\r
++                                                      if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }\r
++                                                      if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }\r
++                                                      if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }\r
++                                                      if($.vakata.dnd.helper.children("ins").hasClass("jstree-ok")) {\r
++                                                              $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");\r
++                                                      }\r
++                                              }\r
++                                      }, this))\r
++                              .bind("mousemove.jstree", $.proxy(function (e) {\r
++                                              if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {\r
++                                                      var cnt = this.get_container()[0];\r
++\r
++                                                      // Horizontal scroll\r
++                                                      if(e.pageX + 24 > this.data.dnd.cof.left + this.data.dnd.cw) {\r
++                                                              if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }\r
++                                                              this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft += $.vakata.dnd.scroll_spd; }, cnt), 100);\r
++                                                      }\r
++                                                      else if(e.pageX - 24 < this.data.dnd.cof.left) {\r
++                                                              if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }\r
++                                                              this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft -= $.vakata.dnd.scroll_spd; }, cnt), 100);\r
++                                                      }\r
++                                                      else {\r
++                                                              if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }\r
++                                                      }\r
++\r
++                                                      // Vertical scroll\r
++                                                      if(e.pageY + 24 > this.data.dnd.cof.top + this.data.dnd.ch) {\r
++                                                              if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }\r
++                                                              this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop += $.vakata.dnd.scroll_spd; }, cnt), 100);\r
++                                                      }\r
++                                                      else if(e.pageY - 24 < this.data.dnd.cof.top) {\r
++                                                              if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }\r
++                                                              this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop -= $.vakata.dnd.scroll_spd; }, cnt), 100);\r
++                                                      }\r
++                                                      else {\r
++                                                              if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }\r
++                                                      }\r
++\r
++                                              }\r
++                                      }, this))\r
++                              .bind("scroll.jstree", $.proxy(function (e) { \r
++                                              if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && m && ml) {\r
++                                                      m.hide();\r
++                                                      ml.hide();\r
++                                              }\r
++                                      }, this))\r
++                              .delegate("a", "mousedown.jstree", $.proxy(function (e) { \r
++                                              if(e.which === 1) {\r
++                                                      this.start_drag(e.currentTarget, e);\r
++                                                      return false;\r
++                                              }\r
++                                      }, this))\r
++                              .delegate("a", "mouseenter.jstree", $.proxy(function (e) { \r
++                                              if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {\r
++                                                      this.dnd_enter(e.currentTarget);\r
++                                              }\r
++                                      }, this))\r
++                              .delegate("a", "mousemove.jstree", $.proxy(function (e) { \r
++                                              if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {\r
++                                                      if(!r || !r.length || r.children("a")[0] !== e.currentTarget) {\r
++                                                              this.dnd_enter(e.currentTarget);\r
++                                                      }\r
++                                                      if(typeof this.data.dnd.off.top === "undefined") { this.data.dnd.off = $(e.target).offset(); }\r
++                                                      this.data.dnd.w = (e.pageY - (this.data.dnd.off.top || 0)) % this.data.core.li_height;\r
++                                                      if(this.data.dnd.w < 0) { this.data.dnd.w += this.data.core.li_height; }\r
++                                                      this.dnd_show();\r
++                                              }\r
++                                      }, this))\r
++                              .delegate("a", "mouseleave.jstree", $.proxy(function (e) { \r
++                                              if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {\r
++                                                      if(e.relatedTarget && e.relatedTarget.id && e.relatedTarget.id === "jstree-marker-line") {\r
++                                                              return false; \r
++                                                      }\r
++                                                              if(m) { m.hide(); }\r
++                                                              if(ml) { ml.hide(); }\r
++                                                      /*\r
++                                                      var ec = $(e.currentTarget).closest("li"), \r
++                                                              er = $(e.relatedTarget).closest("li");\r
++                                                      if(er[0] !== ec.prev()[0] && er[0] !== ec.next()[0]) {\r
++                                                              if(m) { m.hide(); }\r
++                                                              if(ml) { ml.hide(); }\r
++                                                      }\r
++                                                      */\r
++                                                      this.data.dnd.mto = setTimeout( \r
++                                                              (function (t) { return function () { t.dnd_leave(e); }; })(this),\r
++                                                      0);\r
++                                              }\r
++                                      }, this))\r
++                              .delegate("a", "mouseup.jstree", $.proxy(function (e) { \r
++                                              if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {\r
++                                                      this.dnd_finish(e);\r
++                                              }\r
++                                      }, this));\r
++\r
++                      $(document)\r
++                              .bind("drag_stop.vakata", $.proxy(function () {\r
++                                              if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }\r
++                                              if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }\r
++                                              if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }\r
++                                              if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }\r
++                                              this.data.dnd.after             = false;\r
++                                              this.data.dnd.before    = false;\r
++                                              this.data.dnd.inside    = false;\r
++                                              this.data.dnd.off               = false;\r
++                                              this.data.dnd.prepared  = false;\r
++                                              this.data.dnd.w                 = false;\r
++                                              this.data.dnd.to1               = false;\r
++                                              this.data.dnd.to2               = false;\r
++                                              this.data.dnd.i1                = false;\r
++                                              this.data.dnd.i2                = false;\r
++                                              this.data.dnd.active    = false;\r
++                                              this.data.dnd.foreign   = false;\r
++                                              if(m) { m.css({ "top" : "-2000px" }); }\r
++                                              if(ml) { ml.css({ "top" : "-2000px" }); }\r
++                                      }, this))\r
++                              .bind("drag_start.vakata", $.proxy(function (e, data) {\r
++                                              if(data.data.jstree) { \r
++                                                      var et = $(data.event.target);\r
++                                                      if(et.closest(".jstree").hasClass("jstree-" + this.get_index())) {\r
++                                                              this.dnd_enter(et);\r
++                                                      }\r
++                                              }\r
++                                      }, this));\r
++                              /*\r
++                              .bind("keydown.jstree-" + this.get_index() + " keyup.jstree-" + this.get_index(), $.proxy(function(e) {\r
++                                              if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && !this.data.dnd.foreign) {\r
++                                                      var h = $.vakata.dnd.helper.children("ins");\r
++                                                      if(e[this._get_settings().dnd.copy_modifier + "Key"] && h.hasClass("jstree-ok")) {\r
++                                                              h.parent().html(h.parent().html().replace(/ \(Copy\)$/, "") + " (Copy)");\r
++                                                      } \r
++                                                      else {\r
++                                                              h.parent().html(h.parent().html().replace(/ \(Copy\)$/, ""));\r
++                                                      }\r
++                                              }\r
++                                      }, this)); */\r
++\r
++\r
++\r
++                      var s = this._get_settings().dnd;\r
++                      if(s.drag_target) {\r
++                              $(document)\r
++                                      .delegate(s.drag_target, "mousedown.jstree-" + this.get_index(), $.proxy(function (e) {\r
++                                              o = e.target;\r
++                                              $.vakata.dnd.drag_start(e, { jstree : true, obj : e.target }, "<ins class='jstree-icon'></ins>" + $(e.target).text() );\r
++                                              if(this.data.themes) { \r
++                                                      if(m) { m.attr("class", "jstree-" + this.data.themes.theme); }\r
++                                                      if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); }\r
++                                                      $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme); \r
++                                              }\r
++                                              $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");\r
++                                              var cnt = this.get_container();\r
++                                              this.data.dnd.cof = cnt.offset();\r
++                                              this.data.dnd.cw = parseInt(cnt.width(),10);\r
++                                              this.data.dnd.ch = parseInt(cnt.height(),10);\r
++                                              this.data.dnd.foreign = true;\r
++                                              e.preventDefault();\r
++                                      }, this));\r
++                      }\r
++                      if(s.drop_target) {\r
++                              $(document)\r
++                                      .delegate(s.drop_target, "mouseenter.jstree-" + this.get_index(), $.proxy(function (e) {\r
++                                                      if(this.data.dnd.active && this._get_settings().dnd.drop_check.call(this, { "o" : o, "r" : $(e.target), "e" : e })) {\r
++                                                              $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");\r
++                                                      }\r
++                                              }, this))\r
++                                      .delegate(s.drop_target, "mouseleave.jstree-" + this.get_index(), $.proxy(function (e) {\r
++                                                      if(this.data.dnd.active) {\r
++                                                              $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");\r
++                                                      }\r
++                                              }, this))\r
++                                      .delegate(s.drop_target, "mouseup.jstree-" + this.get_index(), $.proxy(function (e) {\r
++                                                      if(this.data.dnd.active && $.vakata.dnd.helper.children("ins").hasClass("jstree-ok")) {\r
++                                                              this._get_settings().dnd.drop_finish.call(this, { "o" : o, "r" : $(e.target), "e" : e });\r
++                                                      }\r
++                                              }, this));\r
++                      }\r
++              },\r
++              defaults : {\r
++                      copy_modifier   : "ctrl",\r
++                      check_timeout   : 100,\r
++                      open_timeout    : 500,\r
++                      drop_target             : ".jstree-drop",\r
++                      drop_check              : function (data) { return true; },\r
++                      drop_finish             : $.noop,\r
++                      drag_target             : ".jstree-draggable",\r
++                      drag_finish             : $.noop,\r
++                      drag_check              : function (data) { return { after : false, before : false, inside : true }; }\r
++              },\r
++              _fn : {\r
++                      dnd_prepare : function () {\r
++                              if(!r || !r.length) { return; }\r
++                              this.data.dnd.off = r.offset();\r
++                              if(this._get_settings().core.rtl) {\r
++                                      this.data.dnd.off.right = this.data.dnd.off.left + r.width();\r
++                              }\r
++                              if(this.data.dnd.foreign) {\r
++                                      var a = this._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : r });\r
++                                      this.data.dnd.after = a.after;\r
++                                      this.data.dnd.before = a.before;\r
++                                      this.data.dnd.inside = a.inside;\r
++                                      this.data.dnd.prepared = true;\r
++                                      return this.dnd_show();\r
++                              }\r
++                              this.prepare_move(o, r, "before");\r
++                              this.data.dnd.before = this.check_move();\r
++                              this.prepare_move(o, r, "after");\r
++                              this.data.dnd.after = this.check_move();\r
++                              if(this._is_loaded(r)) {\r
++                                      this.prepare_move(o, r, "inside");\r
++                                      this.data.dnd.inside = this.check_move();\r
++                              }\r
++                              else {\r
++                                      this.data.dnd.inside = false;\r
++                              }\r
++                              this.data.dnd.prepared = true;\r
++                              return this.dnd_show();\r
++                      },\r
++                      dnd_show : function () {\r
++                              if(!this.data.dnd.prepared) { return; }\r
++                              var o = ["before","inside","after"],\r
++                                      r = false,\r
++                                      rtl = this._get_settings().core.rtl,\r
++                                      pos;\r
++                              if(this.data.dnd.w < this.data.core.li_height/3) { o = ["before","inside","after"]; }\r
++                              else if(this.data.dnd.w <= this.data.core.li_height*2/3) {\r
++                                      o = this.data.dnd.w < this.data.core.li_height/2 ? ["inside","before","after"] : ["inside","after","before"];\r
++                              }\r
++                              else { o = ["after","inside","before"]; }\r
++                              $.each(o, $.proxy(function (i, val) { \r
++                                      if(this.data.dnd[val]) {\r
++                                              $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");\r
++                                              r = val;\r
++                                              return false;\r
++                                      }\r
++                              }, this));\r
++                              if(r === false) { $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid"); }\r
++                              \r
++                              pos = rtl ? (this.data.dnd.off.right - 18) : (this.data.dnd.off.left + 10);\r
++                              switch(r) {\r
++                                      case "before":\r
++                                              m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top - 6) + "px" }).show();\r
++                                              if(ml) { ml.css({ "left" : (pos + 8) + "px", "top" : (this.data.dnd.off.top - 1) + "px" }).show(); }\r
++                                              break;\r
++                                      case "after":\r
++                                              m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height - 6) + "px" }).show();\r
++                                              if(ml) { ml.css({ "left" : (pos + 8) + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height - 1) + "px" }).show(); }\r
++                                              break;\r
++                                      case "inside":\r
++                                              m.css({ "left" : pos + ( rtl ? -4 : 4) + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height/2 - 5) + "px" }).show();\r
++                                              if(ml) { ml.hide(); }\r
++                                              break;\r
++                                      default:\r
++                                              m.hide();\r
++                                              if(ml) { ml.hide(); }\r
++                                              break;\r
++                              }\r
++                              last_pos = r;\r
++                              return r;\r
++                      },\r
++                      dnd_open : function () {\r
++                              this.data.dnd.to2 = false;\r
++                              this.open_node(r, $.proxy(this.dnd_prepare,this), true);\r
++                      },\r
++                      dnd_finish : function (e) {\r
++                              if(this.data.dnd.foreign) {\r
++                                      if(this.data.dnd.after || this.data.dnd.before || this.data.dnd.inside) {\r
++                                              this._get_settings().dnd.drag_finish.call(this, { "o" : o, "r" : r, "p" : last_pos });\r
++                                      }\r
++                              }\r
++                              else {\r
++                                      this.dnd_prepare();\r
++                                      this.move_node(o, r, last_pos, e[this._get_settings().dnd.copy_modifier + "Key"]);\r
++                              }\r
++                              o = false;\r
++                              r = false;\r
++                              m.hide();\r
++                              if(ml) { ml.hide(); }\r
++                      },\r
++                      dnd_enter : function (obj) {\r
++                              if(this.data.dnd.mto) { \r
++                                      clearTimeout(this.data.dnd.mto);\r
++                                      this.data.dnd.mto = false;\r
++                              }\r
++                              var s = this._get_settings().dnd;\r
++                              this.data.dnd.prepared = false;\r
++                              r = this._get_node(obj);\r
++                              if(s.check_timeout) { \r
++                                      // do the calculations after a minimal timeout (users tend to drag quickly to the desired location)\r
++                                      if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }\r
++                                      this.data.dnd.to1 = setTimeout($.proxy(this.dnd_prepare, this), s.check_timeout); \r
++                              }\r
++                              else { \r
++                                      this.dnd_prepare(); \r
++                              }\r
++                              if(s.open_timeout) { \r
++                                      if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }\r
++                                      if(r && r.length && r.hasClass("jstree-closed")) { \r
++                                              // if the node is closed - open it, then recalculate\r
++                                              this.data.dnd.to2 = setTimeout($.proxy(this.dnd_open, this), s.open_timeout);\r
++                                      }\r
++                              }\r
++                              else {\r
++                                      if(r && r.length && r.hasClass("jstree-closed")) { \r
++                                              this.dnd_open();\r
++                                      }\r
++                              }\r
++                      },\r
++                      dnd_leave : function (e) {\r
++                              this.data.dnd.after             = false;\r
++                              this.data.dnd.before    = false;\r
++                              this.data.dnd.inside    = false;\r
++                              $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");\r
++                              m.hide();\r
++                              if(ml) { ml.hide(); }\r
++                              if(r && r[0] === e.target.parentNode) {\r
++                                      if(this.data.dnd.to1) {\r
++                                              clearTimeout(this.data.dnd.to1);\r
++                                              this.data.dnd.to1 = false;\r
++                                      }\r
++                                      if(this.data.dnd.to2) {\r
++                                              clearTimeout(this.data.dnd.to2);\r
++                                              this.data.dnd.to2 = false;\r
++                                      }\r
++                              }\r
++                      },\r
++                      start_drag : function (obj, e) {\r
++                              o = this._get_node(obj);\r
++                              if(this.data.ui && this.is_selected(o)) { o = this._get_node(null, true); }\r
++                              var dt = o.length > 1 ? this._get_string("multiple_selection") : this.get_text(o),\r
++                                      cnt = this.get_container();\r
++                              if(!this._get_settings().core.html_titles) { dt = dt.replace(/</ig,"&lt;").replace(/>/ig,"&gt;"); }\r
++                              $.vakata.dnd.drag_start(e, { jstree : true, obj : o }, "<ins class='jstree-icon'></ins>" + dt );\r
++                              if(this.data.themes) { \r
++                                      if(m) { m.attr("class", "jstree-" + this.data.themes.theme); }\r
++                                      if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); }\r
++                                      $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme); \r
++                              }\r
++                              this.data.dnd.cof = cnt.offset();\r
++                              this.data.dnd.cw = parseInt(cnt.width(),10);\r
++                              this.data.dnd.ch = parseInt(cnt.height(),10);\r
++                              this.data.dnd.active = true;\r
++                      }\r
++              }\r
++      });\r
++      $(function() {\r
++              var css_string = '' + \r
++                      '#vakata-dragged ins { display:block; text-decoration:none; width:16px; height:16px; margin:0 0 0 0; padding:0; position:absolute; top:4px; left:4px; ' + \r
++                      ' -moz-border-radius:4px; border-radius:4px; -webkit-border-radius:4px; ' +\r
++                      '} ' + \r
++                      '#vakata-dragged .jstree-ok { background:green; } ' + \r
++                      '#vakata-dragged .jstree-invalid { background:red; } ' + \r
++                      '#jstree-marker { padding:0; margin:0; font-size:12px; overflow:hidden; height:12px; width:8px; position:absolute; top:-30px; z-index:10001; background-repeat:no-repeat; display:none; background-color:transparent; text-shadow:1px 1px 1px white; color:black; line-height:10px; } ' + \r
++                      '#jstree-marker-line { padding:0; margin:0; line-height:0%; font-size:1px; overflow:hidden; height:1px; width:100px; position:absolute; top:-30px; z-index:10000; background-repeat:no-repeat; display:none; background-color:#456c43; ' + \r
++                      ' cursor:pointer; border:1px solid #eeeeee; border-left:0; -moz-box-shadow: 0px 0px 2px #666; -webkit-box-shadow: 0px 0px 2px #666; box-shadow: 0px 0px 2px #666; ' + \r
++                      ' -moz-border-radius:1px; border-radius:1px; -webkit-border-radius:1px; ' +\r
++                      '}' + \r
++                      '';\r
++              $.vakata.css.add_sheet({ str : css_string, title : "jstree" });\r
++              m = $("<div />").attr({ id : "jstree-marker" }).hide().html("&raquo;")\r
++                      .bind("mouseleave mouseenter", function (e) { \r
++                              m.hide();\r
++                              ml.hide();\r
++                              e.preventDefault(); \r
++                              e.stopImmediatePropagation(); \r
++                              return false; \r
++                      })\r
++                      .appendTo("body");\r
++              ml = $("<div />").attr({ id : "jstree-marker-line" }).hide()\r
++                      .bind("mouseup", function (e) { \r
++                              if(r && r.length) { \r
++                                      r.children("a").trigger(e); \r
++                                      e.preventDefault(); \r
++                                      e.stopImmediatePropagation(); \r
++                                      return false; \r
++                              } \r
++                      })\r
++                      .bind("mouseleave", function (e) { \r
++                              var rt = $(e.relatedTarget);\r
++                              if(rt.is(".jstree") || rt.closest(".jstree").length === 0) {\r
++                                      if(r && r.length) { \r
++                                              r.children("a").trigger(e); \r
++                                              m.hide();\r
++                                              ml.hide();\r
++                                              e.preventDefault(); \r
++                                              e.stopImmediatePropagation(); \r
++                                              return false; \r
++                                      }\r
++                              }\r
++                      })\r
++                      .appendTo("body");\r
++              $(document).bind("drag_start.vakata", function (e, data) {\r
++                      if(data.data.jstree) { m.show(); if(ml) { ml.show(); } }\r
++              });\r
++              $(document).bind("drag_stop.vakata", function (e, data) {\r
++                      if(data.data.jstree) { m.hide(); if(ml) { ml.hide(); } }\r
++              });\r
++      });\r
++})(jQuery);\r
++//*/\r
++\r
++/*\r
++ * jsTree checkbox plugin\r
++ * Inserts checkboxes in front of every node\r
++ * Depends on the ui plugin\r
++ * DOES NOT WORK NICELY WITH MULTITREE DRAG'N'DROP\r
++ */\r
++(function ($) {\r
++      $.jstree.plugin("checkbox", {\r
++              __init : function () {\r
++                      this.data.checkbox.noui = this._get_settings().checkbox.override_ui;\r
++                      if(this.data.ui && this.data.checkbox.noui) {\r
++                              this.select_node = this.deselect_node = this.deselect_all = $.noop;\r
++                              this.get_selected = this.get_checked;\r
++                      }\r
++\r
++                      this.get_container()\r
++                              .bind("open_node.jstree create_node.jstree clean_node.jstree refresh.jstree", $.proxy(function (e, data) { \r
++                                              this._prepare_checkboxes(data.rslt.obj);\r
++                                      }, this))\r
++                              .bind("loaded.jstree", $.proxy(function (e) {\r
++                                              this._prepare_checkboxes();\r
++                                      }, this))\r
++                              .delegate( (this.data.ui && this.data.checkbox.noui ? "a" : "ins.jstree-checkbox") , "click.jstree", $.proxy(function (e) {\r
++                                              e.preventDefault();\r
++                                              if(this._get_node(e.target).hasClass("jstree-checked")) { this.uncheck_node(e.target); }\r
++                                              else { this.check_node(e.target); }\r
++                                              if(this.data.ui && this.data.checkbox.noui) {\r
++                                                      this.save_selected();\r
++                                                      if(this.data.cookies) { this.save_cookie("select_node"); }\r
++                                              }\r
++                                              else {\r
++                                                      e.stopImmediatePropagation();\r
++                                                      return false;\r
++                                              }\r
++                                      }, this));\r
++              },\r
++              defaults : {\r
++                      override_ui : false,\r
++                      two_state : false,\r
++                      real_checkboxes : false,\r
++                      checked_parent_open : true,\r
++                      real_checkboxes_names : function (n) { return [ ("check_" + (n[0].id || Math.ceil(Math.random() * 10000))) , 1]; }\r
++              },\r
++              __destroy : function () {\r
++                      this.get_container()\r
++                              .find("input.jstree-real-checkbox").removeClass("jstree-real-checkbox").end()\r
++                              .find("ins.jstree-checkbox").remove();\r
++              },\r
++              _fn : {\r
++                      _checkbox_notify : function (n, data) {\r
++                              if(data.checked) {\r
++                                      this.check_node(n, false);\r
++                              }\r
++                      },\r
++                      _prepare_checkboxes : function (obj) {\r
++                              obj = !obj || obj == -1 ? this.get_container().find("> ul > li") : this._get_node(obj);\r
++                              if(obj === false) { return; } // added for removing root nodes\r
++                              var c, _this = this, t, ts = this._get_settings().checkbox.two_state, rc = this._get_settings().checkbox.real_checkboxes, rcn = this._get_settings().checkbox.real_checkboxes_names;\r
++                              obj.each(function () {\r
++                                      t = $(this);\r
++                                      c = t.is("li") && (t.hasClass("jstree-checked") || (rc && t.children(":checked").length)) ? "jstree-checked" : "jstree-unchecked";\r
++                                      t.find("li").andSelf().each(function () {\r
++                                              var $t = $(this), nm;\r
++                                              $t.children("a" + (_this.data.languages ? "" : ":eq(0)") ).not(":has(.jstree-checkbox)").prepend("<ins class='jstree-checkbox'>&#160;</ins>").parent().not(".jstree-checked, .jstree-unchecked").addClass( ts ? "jstree-unchecked" : c );\r
++                                              if(rc) {\r
++                                                      if(!$t.children(":checkbox").length) {\r
++                                                              nm = rcn.call(_this, $t);\r
++                                                              $t.prepend("<input type='checkbox' class='jstree-real-checkbox' id='" + nm[0] + "' name='" + nm[0] + "' value='" + nm[1] + "' />");\r
++                                                      }\r
++                                                      else {\r
++                                                              $t.children(":checkbox").addClass("jstree-real-checkbox");\r
++                                                      }\r
++                                              }\r
++                                              if(!ts) {\r
++                                                      if(c === "jstree-checked" || $t.hasClass("jstree-checked") || $t.children(':checked').length) {\r
++                                                              $t.find("li").andSelf().addClass("jstree-checked").children(":checkbox").prop("checked", true);\r
++                                                      }\r
++                                              }\r
++                                              else {\r
++                                                      if($t.hasClass("jstree-checked") || $t.children(':checked').length) {\r
++                                                              $t.addClass("jstree-checked").children(":checkbox").prop("checked", true);\r
++                                                      }\r
++                                              }\r
++                                      });\r
++                              });\r
++                              if(!ts) {\r
++                                      obj.find(".jstree-checked").parent().parent().each(function () { _this._repair_state(this); }); \r
++                              }\r
++                      },\r
++                      change_state : function (obj, state) {\r
++                              obj = this._get_node(obj);\r
++                              var coll = false, rc = this._get_settings().checkbox.real_checkboxes;\r
++                              if(!obj || obj === -1) { return false; }\r
++                              state = (state === false || state === true) ? state : obj.hasClass("jstree-checked");\r
++                              if(this._get_settings().checkbox.two_state) {\r
++                                      if(state) { \r
++                                              obj.removeClass("jstree-checked").addClass("jstree-unchecked"); \r
++                                              if(rc) { obj.children(":checkbox").prop("checked", false); }\r
++                                      }\r
++                                      else { \r
++                                              obj.removeClass("jstree-unchecked").addClass("jstree-checked"); \r
++                                              if(rc) { obj.children(":checkbox").prop("checked", true); }\r
++                                      }\r
++                              }\r
++                              else {\r
++                                      if(state) { \r
++                                              coll = obj.find("li").andSelf();\r
++                                              if(!coll.filter(".jstree-checked, .jstree-undetermined").length) { return false; }\r
++                                              coll.removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked"); \r
++                                              if(rc) { coll.children(":checkbox").prop("checked", false); }\r
++                                      }\r
++                                      else { \r
++                                              coll = obj.find("li").andSelf();\r
++                                              if(!coll.filter(".jstree-unchecked, .jstree-undetermined").length) { return false; }\r
++                                              coll.removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked"); \r
++                                              if(rc) { coll.children(":checkbox").prop("checked", true); }\r
++                                              if(this.data.ui) { this.data.ui.last_selected = obj; }\r
++                                              this.data.checkbox.last_selected = obj;\r
++                                      }\r
++                                      obj.parentsUntil(".jstree", "li").each(function () {\r
++                                              var $this = $(this);\r
++                                              if(state) {\r
++                                                      if($this.children("ul").children("li.jstree-checked, li.jstree-undetermined").length) {\r
++                                                              $this.parentsUntil(".jstree", "li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");\r
++                                                              if(rc) { $this.parentsUntil(".jstree", "li").andSelf().children(":checkbox").prop("checked", false); }\r
++                                                              return false;\r
++                                                      }\r
++                                                      else {\r
++                                                              $this.removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked");\r
++                                                              if(rc) { $this.children(":checkbox").prop("checked", false); }\r
++                                                      }\r
++                                              }\r
++                                              else {\r
++                                                      if($this.children("ul").children("li.jstree-unchecked, li.jstree-undetermined").length) {\r
++                                                              $this.parentsUntil(".jstree", "li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");\r
++                                                              if(rc) { $this.parentsUntil(".jstree", "li").andSelf().children(":checkbox").prop("checked", false); }\r
++                                                              return false;\r
++                                                      }\r
++                                                      else {\r
++                                                              $this.removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked");\r
++                                                              if(rc) { $this.children(":checkbox").prop("checked", true); }\r
++                                                      }\r
++                                              }\r
++                                      });\r
++                              }\r
++                              if(this.data.ui && this.data.checkbox.noui) { this.data.ui.selected = this.get_checked(); }\r
++                              this.__callback(obj);\r
++                              return true;\r
++                      },\r
++                      check_node : function (obj) {\r
++                              if(this.change_state(obj, false)) { \r
++                                      obj = this._get_node(obj);\r
++                                      if(this._get_settings().checkbox.checked_parent_open) {\r
++                                              var t = this;\r
++                                              obj.parents(".jstree-closed").each(function () { t.open_node(this, false, true); });\r
++                                      }\r
++                                      this.__callback({ "obj" : obj }); \r
++                              }\r
++                      },\r
++                      uncheck_node : function (obj) {\r
++                              if(this.change_state(obj, true)) { this.__callback({ "obj" : this._get_node(obj) }); }\r
++                      },\r
++                      check_all : function () {\r
++                              var _this = this, \r
++                                      coll = this._get_settings().checkbox.two_state ? this.get_container_ul().find("li") : this.get_container_ul().children("li");\r
++                              coll.each(function () {\r
++                                      _this.change_state(this, false);\r
++                              });\r
++                              this.__callback();\r
++                      },\r
++                      uncheck_all : function () {\r
++                              var _this = this,\r
++                                      coll = this._get_settings().checkbox.two_state ? this.get_container_ul().find("li") : this.get_container_ul().children("li");\r
++                              coll.each(function () {\r
++                                      _this.change_state(this, true);\r
++                              });\r
++                              this.__callback();\r
++                      },\r
++\r
++                      is_checked : function(obj) {\r
++                              obj = this._get_node(obj);\r
++                              return obj.length ? obj.is(".jstree-checked") : false;\r
++                      },\r
++                      get_checked : function (obj, get_all) {\r
++                              obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);\r
++                              return get_all || this._get_settings().checkbox.two_state ? obj.find(".jstree-checked") : obj.find("> ul > .jstree-checked, .jstree-undetermined > ul > .jstree-checked");\r
++                      },\r
++                      get_unchecked : function (obj, get_all) { \r
++                              obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);\r
++                              return get_all || this._get_settings().checkbox.two_state ? obj.find(".jstree-unchecked") : obj.find("> ul > .jstree-unchecked, .jstree-undetermined > ul > .jstree-unchecked");\r
++                      },\r
++\r
++                      show_checkboxes : function () { this.get_container().children("ul").removeClass("jstree-no-checkboxes"); },\r
++                      hide_checkboxes : function () { this.get_container().children("ul").addClass("jstree-no-checkboxes"); },\r
++\r
++                      _repair_state : function (obj) {\r
++                              obj = this._get_node(obj);\r
++                              if(!obj.length) { return; }\r
++                              if(this._get_settings().checkbox.two_state) {\r
++                                      obj.find('li').andSelf().not('.jstree-checked').removeClass('jstree-undetermined').addClass('jstree-unchecked').children(':checkbox').prop('checked', true);\r
++                                      return;\r
++                              }\r
++                              var rc = this._get_settings().checkbox.real_checkboxes,\r
++                                      a = obj.find("> ul > .jstree-checked").length,\r
++                                      b = obj.find("> ul > .jstree-undetermined").length,\r
++                                      c = obj.find("> ul > li").length;\r
++                              if(c === 0) { if(obj.hasClass("jstree-undetermined")) { this.change_state(obj, false); } }\r
++                              else if(a === 0 && b === 0) { this.change_state(obj, true); }\r
++                              else if(a === c) { this.change_state(obj, false); }\r
++                              else { \r
++                                      obj.parentsUntil(".jstree","li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");\r
++                                      if(rc) { obj.parentsUntil(".jstree", "li").andSelf().children(":checkbox").prop("checked", false); }\r
++                              }\r
++                      },\r
++                      reselect : function () {\r
++                              if(this.data.ui && this.data.checkbox.noui) { \r
++                                      var _this = this,\r
++                                              s = this.data.ui.to_select;\r
++                                      s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });\r
++                                      this.deselect_all();\r
++                                      $.each(s, function (i, val) { _this.check_node(val); });\r
++                                      this.__callback();\r
++                              }\r
++                              else { \r
++                                      this.__call_old(); \r
++                              }\r
++                      },\r
++                      save_loaded : function () {\r
++                              var _this = this;\r
++                              this.data.core.to_load = [];\r
++                              this.get_container_ul().find("li.jstree-closed.jstree-undetermined").each(function () {\r
++                                      if(this.id) { _this.data.core.to_load.push("#" + this.id); }\r
++                              });\r
++                      }\r
++              }\r
++      });\r
++      $(function() {\r
++              var css_string = '.jstree .jstree-real-checkbox { display:none; } ';\r
++              $.vakata.css.add_sheet({ str : css_string, title : "jstree" });\r
++      });\r
++})(jQuery);\r
++//*/\r
++\r
++/* \r
++ * jsTree XML plugin\r
++ * The XML data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions.\r
++ */\r
++(function ($) {\r
++      $.vakata.xslt = function (xml, xsl, callback) {\r
++              var rs = "", xm, xs, processor, support;\r
++              // TODO: IE9 no XSLTProcessor, no document.recalc\r
++              if(document.recalc) {\r
++                      xm = document.createElement('xml');\r
++                      xs = document.createElement('xml');\r
++                      xm.innerHTML = xml;\r
++                      xs.innerHTML = xsl;\r
++                      $("body").append(xm).append(xs);\r
++                      setTimeout( (function (xm, xs, callback) {\r
++                              return function () {\r
++                                      callback.call(null, xm.transformNode(xs.XMLDocument));\r
++                                      setTimeout( (function (xm, xs) { return function () { $(xm).remove(); $(xs).remove(); }; })(xm, xs), 200);\r
++                              };\r
++                      })(xm, xs, callback), 100);\r
++                      return true;\r
++              }\r
++              if(typeof window.DOMParser !== "undefined" && typeof window.XMLHttpRequest !== "undefined" && typeof window.XSLTProcessor === "undefined") {\r
++                      xml = new DOMParser().parseFromString(xml, "text/xml");\r
++                      xsl = new DOMParser().parseFromString(xsl, "text/xml");\r
++                      // alert(xml.transformNode());\r
++                      // callback.call(null, new XMLSerializer().serializeToString(rs));\r
++                      \r
++              }\r
++              if(typeof window.DOMParser !== "undefined" && typeof window.XMLHttpRequest !== "undefined" && typeof window.XSLTProcessor !== "undefined") {\r
++                      processor = new XSLTProcessor();\r
++                      support = $.isFunction(processor.transformDocument) ? (typeof window.XMLSerializer !== "undefined") : true;\r
++                      if(!support) { return false; }\r
++                      xml = new DOMParser().parseFromString(xml, "text/xml");\r
++                      xsl = new DOMParser().parseFromString(xsl, "text/xml");\r
++                      if($.isFunction(processor.transformDocument)) {\r
++                              rs = document.implementation.createDocument("", "", null);\r
++                              processor.transformDocument(xml, xsl, rs, null);\r
++                              callback.call(null, new XMLSerializer().serializeToString(rs));\r
++                              return true;\r
++                      }\r
++                      else {\r
++                              processor.importStylesheet(xsl);\r
++                              rs = processor.transformToFragment(xml, document);\r
++                              callback.call(null, $("<div />").append(rs).html());\r
++                              return true;\r
++                      }\r
++              }\r
++              return false;\r
++      };\r
++      var xsl = {\r
++              'nest' : '<' + '?xml version="1.0" encoding="utf-8" ?>' + \r
++                      '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' + \r
++                      '<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/html" />' + \r
++                      '<xsl:template match="/">' + \r
++                      '       <xsl:call-template name="nodes">' + \r
++                      '               <xsl:with-param name="node" select="/root" />' + \r
++                      '       </xsl:call-template>' + \r
++                      '</xsl:template>' + \r
++                      '<xsl:template name="nodes">' + \r
++                      '       <xsl:param name="node" />' + \r
++                      '       <ul>' + \r
++                      '       <xsl:for-each select="$node/item">' + \r
++                      '               <xsl:variable name="children" select="count(./item) &gt; 0" />' + \r
++                      '               <li>' + \r
++                      '                       <xsl:attribute name="class">' + \r
++                      '                               <xsl:if test="position() = last()">jstree-last </xsl:if>' + \r
++                      '                               <xsl:choose>' + \r
++                      '                                       <xsl:when test="@state = \'open\'">jstree-open </xsl:when>' + \r
++                      '                                       <xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' + \r
++                      '                                       <xsl:otherwise>jstree-leaf </xsl:otherwise>' + \r
++                      '                               </xsl:choose>' + \r
++                      '                               <xsl:value-of select="@class" />' + \r
++                      '                       </xsl:attribute>' + \r
++                      '                       <xsl:for-each select="@*">' + \r
++                      '                               <xsl:if test="name() != \'class\' and name() != \'state\' and name() != \'hasChildren\'">' + \r
++                      '                                       <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' + \r
++                      '                               </xsl:if>' + \r
++                      '                       </xsl:for-each>' + \r
++                      '       <ins class="jstree-icon"><xsl:text>&#xa0;</xsl:text></ins>' + \r
++                      '                       <xsl:for-each select="content/name">' + \r
++                      '                               <a>' + \r
++                      '                               <xsl:attribute name="href">' + \r
++                      '                                       <xsl:choose>' + \r
++                      '                                       <xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' + \r
++                      '                                       <xsl:otherwise>#</xsl:otherwise>' + \r
++                      '                                       </xsl:choose>' + \r
++                      '                               </xsl:attribute>' + \r
++                      '                               <xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' + \r
++                      '                               <xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' + \r
++                      '                               <xsl:for-each select="@*">' + \r
++                      '                                       <xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' + \r
++                      '                                               <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' + \r
++                      '                                       </xsl:if>' + \r
++                      '                               </xsl:for-each>' + \r
++                      '                                       <ins>' + \r
++                      '                                               <xsl:attribute name="class">jstree-icon ' + \r
++                      '                                                       <xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' + \r
++                      '                                               </xsl:attribute>' + \r
++                      '                                               <xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' + \r
++                      '                                               <xsl:text>&#xa0;</xsl:text>' + \r
++                      '                                       </ins>' + \r
++                      '                                       <xsl:copy-of select="./child::node()" />' + \r
++                      '                               </a>' + \r
++                      '                       </xsl:for-each>' + \r
++                      '                       <xsl:if test="$children or @hasChildren"><xsl:call-template name="nodes"><xsl:with-param name="node" select="current()" /></xsl:call-template></xsl:if>' + \r
++                      '               </li>' + \r
++                      '       </xsl:for-each>' + \r
++                      '       </ul>' + \r
++                      '</xsl:template>' + \r
++                      '</xsl:stylesheet>',\r
++\r
++              'flat' : '<' + '?xml version="1.0" encoding="utf-8" ?>' + \r
++                      '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' + \r
++                      '<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/xml" />' + \r
++                      '<xsl:template match="/">' + \r
++                      '       <ul>' + \r
++                      '       <xsl:for-each select="//item[not(@parent_id) or @parent_id=0 or not(@parent_id = //item/@id)]">' + /* the last `or` may be removed */\r
++                      '               <xsl:call-template name="nodes">' + \r
++                      '                       <xsl:with-param name="node" select="." />' + \r
++                      '                       <xsl:with-param name="is_last" select="number(position() = last())" />' + \r
++                      '               </xsl:call-template>' + \r
++                      '       </xsl:for-each>' + \r
++                      '       </ul>' + \r
++                      '</xsl:template>' + \r
++                      '<xsl:template name="nodes">' + \r
++                      '       <xsl:param name="node" />' + \r
++                      '       <xsl:param name="is_last" />' + \r
++                      '       <xsl:variable name="children" select="count(//item[@parent_id=$node/attribute::id]) &gt; 0" />' + \r
++                      '       <li>' + \r
++                      '       <xsl:attribute name="class">' + \r
++                      '               <xsl:if test="$is_last = true()">jstree-last </xsl:if>' + \r
++                      '               <xsl:choose>' + \r
++                      '                       <xsl:when test="@state = \'open\'">jstree-open </xsl:when>' + \r
++                      '                       <xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' + \r
++                      '                       <xsl:otherwise>jstree-leaf </xsl:otherwise>' + \r
++                      '               </xsl:choose>' + \r
++                      '               <xsl:value-of select="@class" />' + \r
++                      '       </xsl:attribute>' + \r
++                      '       <xsl:for-each select="@*">' + \r
++                      '               <xsl:if test="name() != \'parent_id\' and name() != \'hasChildren\' and name() != \'class\' and name() != \'state\'">' + \r
++                      '               <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' + \r
++                      '               </xsl:if>' + \r
++                      '       </xsl:for-each>' + \r
++                      '       <ins class="jstree-icon"><xsl:text>&#xa0;</xsl:text></ins>' + \r
++                      '       <xsl:for-each select="content/name">' + \r
++                      '               <a>' + \r
++                      '               <xsl:attribute name="href">' + \r
++                      '                       <xsl:choose>' + \r
++                      '                       <xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' + \r
++                      '                       <xsl:otherwise>#</xsl:otherwise>' + \r
++                      '                       </xsl:choose>' + \r
++                      '               </xsl:attribute>' + \r
++                      '               <xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' + \r
++                      '               <xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' + \r
++                      '               <xsl:for-each select="@*">' + \r
++                      '                       <xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' + \r
++                      '                               <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' + \r
++                      '                       </xsl:if>' + \r
++                      '               </xsl:for-each>' + \r
++                      '                       <ins>' + \r
++                      '                               <xsl:attribute name="class">jstree-icon ' + \r
++                      '                                       <xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' + \r
++                      '                               </xsl:attribute>' + \r
++                      '                               <xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' + \r
++                      '                               <xsl:text>&#xa0;</xsl:text>' + \r
++                      '                       </ins>' + \r
++                      '                       <xsl:copy-of select="./child::node()" />' + \r
++                      '               </a>' + \r
++                      '       </xsl:for-each>' + \r
++                      '       <xsl:if test="$children">' + \r
++                      '               <ul>' + \r
++                      '               <xsl:for-each select="//item[@parent_id=$node/attribute::id]">' + \r
++                      '                       <xsl:call-template name="nodes">' + \r
++                      '                               <xsl:with-param name="node" select="." />' + \r
++                      '                               <xsl:with-param name="is_last" select="number(position() = last())" />' + \r
++                      '                       </xsl:call-template>' + \r
++                      '               </xsl:for-each>' + \r
++                      '               </ul>' + \r
++                      '       </xsl:if>' + \r
++                      '       </li>' + \r
++                      '</xsl:template>' + \r
++                      '</xsl:stylesheet>'\r
++      },\r
++      escape_xml = function(string) {\r
++              return string\r
++                      .toString()\r
++                      .replace(/&/g, '&amp;')\r
++                      .replace(/</g, '&lt;')\r
++                      .replace(/>/g, '&gt;')\r
++                      .replace(/"/g, '&quot;')\r
++                      .replace(/'/g, '&apos;');\r
++      };\r
++      $.jstree.plugin("xml_data", {\r
++              defaults : { \r
++                      data : false,\r
++                      ajax : false,\r
++                      xsl : "flat",\r
++                      clean_node : false,\r
++                      correct_state : true,\r
++                      get_skip_empty : false,\r
++                      get_include_preamble : true\r
++              },\r
++              _fn : {\r
++                      load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_xml(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); },\r
++                      _is_loaded : function (obj) { \r
++                              var s = this._get_settings().xml_data;\r
++                              obj = this._get_node(obj);\r
++                              return obj == -1 || !obj || (!s.ajax && !$.isFunction(s.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;\r
++                      },\r
++                      load_node_xml : function (obj, s_call, e_call) {\r
++                              var s = this.get_settings().xml_data,\r
++                                      error_func = function () {},\r
++                                      success_func = function () {};\r
++\r
++                              obj = this._get_node(obj);\r
++                              if(obj && obj !== -1) {\r
++                                      if(obj.data("jstree_is_loading")) { return; }\r
++                                      else { obj.data("jstree_is_loading",true); }\r
++                              }\r
++                              switch(!0) {\r
++                                      case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied.";\r
++                                      case ($.isFunction(s.data)):\r
++                                              s.data.call(this, obj, $.proxy(function (d) {\r
++                                                      this.parse_xml(d, $.proxy(function (d) {\r
++                                                              if(d) {\r
++                                                                      d = d.replace(/ ?xmlns="[^"]*"/ig, "");\r
++                                                                      if(d.length > 10) {\r
++                                                                              d = $(d);\r
++                                                                              if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }\r
++                                                                              else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d); obj.removeData("jstree_is_loading"); }\r
++                                                                              if(s.clean_node) { this.clean_node(obj); }\r
++                                                                              if(s_call) { s_call.call(this); }\r
++                                                                      }\r
++                                                                      else {\r
++                                                                              if(obj && obj !== -1) { \r
++                                                                                      obj.children("a.jstree-loading").removeClass("jstree-loading");\r
++                                                                                      obj.removeData("jstree_is_loading");\r
++                                                                                      if(s.correct_state) { \r
++                                                                                              this.correct_state(obj);\r
++                                                                                              if(s_call) { s_call.call(this); } \r
++                                                                                      }\r
++                                                                              }\r
++                                                                              else {\r
++                                                                                      if(s.correct_state) { \r
++                                                                                              this.get_container().children("ul").empty();\r
++                                                                                              if(s_call) { s_call.call(this); } \r
++                                                                                      }\r
++                                                                              }\r
++                                                                      }\r
++                                                              }\r
++                                                      }, this));\r
++                                              }, this));\r
++                                              break;\r
++                                      case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):\r
++                                              if(!obj || obj == -1) {\r
++                                                      this.parse_xml(s.data, $.proxy(function (d) {\r
++                                                              if(d) {\r
++                                                                      d = d.replace(/ ?xmlns="[^"]*"/ig, "");\r
++                                                                      if(d.length > 10) {\r
++                                                                              d = $(d);\r
++                                                                              this.get_container().children("ul").empty().append(d.children());\r
++                                                                              if(s.clean_node) { this.clean_node(obj); }\r
++                                                                              if(s_call) { s_call.call(this); }\r
++                                                                      }\r
++                                                              }\r
++                                                              else { \r
++                                                                      if(s.correct_state) { \r
++                                                                              this.get_container().children("ul").empty(); \r
++                                                                              if(s_call) { s_call.call(this); }\r
++                                                                      }\r
++                                                              }\r
++                                                      }, this));\r
++                                              }\r
++                                              break;\r
++                                      case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):\r
++                                              error_func = function (x, t, e) {\r
++                                                      var ef = this.get_settings().xml_data.ajax.error; \r
++                                                      if(ef) { ef.call(this, x, t, e); }\r
++                                                      if(obj !== -1 && obj.length) {\r
++                                                              obj.children("a.jstree-loading").removeClass("jstree-loading");\r
++                                                              obj.removeData("jstree_is_loading");\r
++                                                              if(t === "success" && s.correct_state) { this.correct_state(obj); }\r
++                                                      }\r
++                                                      else {\r
++                                                              if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }\r
++                                                      }\r
++                                                      if(e_call) { e_call.call(this); }\r
++                                              };\r
++                                              success_func = function (d, t, x) {\r
++                                                      d = x.responseText;\r
++                                                      var sf = this.get_settings().xml_data.ajax.success; \r
++                                                      if(sf) { d = sf.call(this,d,t,x) || d; }\r
++                                                      if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "")) {\r
++                                                              return error_func.call(this, x, t, "");\r
++                                                      }\r
++                                                      this.parse_xml(d, $.proxy(function (d) {\r
++                                                              if(d) {\r
++                                                                      d = d.replace(/ ?xmlns="[^"]*"/ig, "");\r
++                                                                      if(d.length > 10) {\r
++                                                                              d = $(d);\r
++                                                                              if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }\r
++                                                                              else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d); obj.removeData("jstree_is_loading"); }\r
++                                                                              if(s.clean_node) { this.clean_node(obj); }\r
++                                                                              if(s_call) { s_call.call(this); }\r
++                                                                      }\r
++                                                                      else {\r
++                                                                              if(obj && obj !== -1) { \r
++                                                                                      obj.children("a.jstree-loading").removeClass("jstree-loading");\r
++                                                                                      obj.removeData("jstree_is_loading");\r
++                                                                                      if(s.correct_state) { \r
++                                                                                              this.correct_state(obj);\r
++                                                                                              if(s_call) { s_call.call(this); } \r
++                                                                                      }\r
++                                                                              }\r
++                                                                              else {\r
++                                                                                      if(s.correct_state) { \r
++                                                                                              this.get_container().children("ul").empty();\r
++                                                                                              if(s_call) { s_call.call(this); } \r
++                                                                                      }\r
++                                                                              }\r
++                                                                      }\r
++                                                              }\r
++                                                      }, this));\r
++                                              };\r
++                                              s.ajax.context = this;\r
++                                              s.ajax.error = error_func;\r
++                                              s.ajax.success = success_func;\r
++                                              if(!s.ajax.dataType) { s.ajax.dataType = "xml"; }\r
++                                              if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }\r
++                                              if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }\r
++                                              $.ajax(s.ajax);\r
++                                              break;\r
++                              }\r
++                      },\r
++                      parse_xml : function (xml, callback) {\r
++                              var s = this._get_settings().xml_data;\r
++                              $.vakata.xslt(xml, xsl[s.xsl], callback);\r
++                      },\r
++                      get_xml : function (tp, obj, li_attr, a_attr, is_callback) {\r
++                              var result = "", \r
++                                      s = this._get_settings(), \r
++                                      _this = this,\r
++                                      tmp1, tmp2, li, a, lang;\r
++                              if(!tp) { tp = "flat"; }\r
++                              if(!is_callback) { is_callback = 0; }\r
++                              obj = this._get_node(obj);\r
++                              if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); }\r
++                              li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ];\r
++                              if(!is_callback && this.data.types && $.inArray(s.types.type_attr, li_attr) === -1) { li_attr.push(s.types.type_attr); }\r
++\r
++                              a_attr = $.isArray(a_attr) ? a_attr : [ ];\r
++\r
++                              if(!is_callback) { \r
++                                      if(s.xml_data.get_include_preamble) { \r
++                                              result += '<' + '?xml version="1.0" encoding="UTF-8"?' + '>'; \r
++                                      }\r
++                                      result += "<root>"; \r
++                              }\r
++                              obj.each(function () {\r
++                                      result += "<item";\r
++                                      li = $(this);\r
++                                      $.each(li_attr, function (i, v) { \r
++                                              var t = li.attr(v);\r
++                                              if(!s.xml_data.get_skip_empty || typeof t !== "undefined") {\r
++                                                      result += " " + v + "=\"" + escape_xml((" " + (t || "")).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"")) + "\""; \r
++                                              }\r
++                                      });\r
++                                      if(li.hasClass("jstree-open")) { result += " state=\"open\""; }\r
++                                      if(li.hasClass("jstree-closed")) { result += " state=\"closed\""; }\r
++                                      if(tp === "flat") { result += " parent_id=\"" + escape_xml(is_callback) + "\""; }\r
++                                      result += ">";\r
++                                      result += "<content>";\r
++                                      a = li.children("a");\r
++                                      a.each(function () {\r
++                                              tmp1 = $(this);\r
++                                              lang = false;\r
++                                              result += "<name";\r
++                                              if($.inArray("languages", s.plugins) !== -1) {\r
++                                                      $.each(s.languages, function (k, z) {\r
++                                                              if(tmp1.hasClass(z)) { result += " lang=\"" + escape_xml(z) + "\""; lang = z; return false; }\r
++                                                      });\r
++                                              }\r
++                                              if(a_attr.length) { \r
++                                                      $.each(a_attr, function (k, z) {\r
++                                                              var t = tmp1.attr(z);\r
++                                                              if(!s.xml_data.get_skip_empty || typeof t !== "undefined") {\r
++                                                                      result += " " + z + "=\"" + escape_xml((" " + t || "").replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"")) + "\"";\r
++                                                              }\r
++                                                      });\r
++                                              }\r
++                                              if(tmp1.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"").length) {\r
++                                                      result += ' icon="' + escape_xml(tmp1.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"")) + '"';\r
++                                              }\r
++                                              if(tmp1.children("ins").get(0).style.backgroundImage.length) {\r
++                                                      result += ' icon="' + escape_xml(tmp1.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","").replace(/'/ig,"").replace(/"/ig,"")) + '"';\r
++                                              }\r
++                                              result += ">";\r
++                                              result += "<![CDATA[" + _this.get_text(tmp1, lang) + "]]>";\r
++                                              result += "</name>";\r
++                                      });\r
++                                      result += "</content>";\r
++                                      tmp2 = li[0].id || true;\r
++                                      li = li.find("> ul > li");\r
++                                      if(li.length) { tmp2 = _this.get_xml(tp, li, li_attr, a_attr, tmp2); }\r
++                                      else { tmp2 = ""; }\r
++                                      if(tp == "nest") { result += tmp2; }\r
++                                      result += "</item>";\r
++                                      if(tp == "flat") { result += tmp2; }\r
++                              });\r
++                              if(!is_callback) { result += "</root>"; }\r
++                              return result;\r
++                      }\r
++              }\r
++      });\r
++})(jQuery);\r
++//*/\r
++\r
++/*\r
++ * jsTree search plugin\r
++ * Enables both sync and async search on the tree\r
++ * DOES NOT WORK WITH JSON PROGRESSIVE RENDER\r
++ */\r
++(function ($) {\r
++      $.expr[':'].jstree_contains = function(a,i,m){\r
++              return (a.textContent || a.innerText || "").toLowerCase().indexOf(m[3].toLowerCase())>=0;\r
++      };\r
++      $.expr[':'].jstree_title_contains = function(a,i,m) {\r
++              return (a.getAttribute("title") || "").toLowerCase().indexOf(m[3].toLowerCase())>=0;\r
++      };\r
++      $.jstree.plugin("search", {\r
++              __init : function () {\r
++                      this.data.search.str = "";\r
++                      this.data.search.result = $();\r
++                      if(this._get_settings().search.show_only_matches) {\r
++                              this.get_container()\r
++                                      .bind("search.jstree", function (e, data) {\r
++                                              $(this).children("ul").find("li").hide().removeClass("jstree-last");\r
++                                              data.rslt.nodes.parentsUntil(".jstree").andSelf().show()\r
++                                                      .filter("ul").each(function () { $(this).children("li:visible").eq(-1).addClass("jstree-last"); });\r
++                                      })\r
++                                      .bind("clear_search.jstree", function () {\r
++                                              $(this).children("ul").find("li").css("display","").end().end().jstree("clean_node", -1);\r
++                                      });\r
++                      }\r
++              },\r
++              defaults : {\r
++                      ajax : false,\r
++                      search_method : "jstree_contains", // for case insensitive - jstree_contains\r
++                      show_only_matches : false\r
++              },\r
++              _fn : {\r
++                      search : function (str, skip_async) {\r
++                              if($.trim(str) === "") { this.clear_search(); return; }\r
++                              var s = this.get_settings().search, \r
++                                      t = this,\r
++                                      error_func = function () { },\r
++                                      success_func = function () { };\r
++                              this.data.search.str = str;\r
++\r
++                              if(!skip_async && s.ajax !== false && this.get_container_ul().find("li.jstree-closed:not(:has(ul)):eq(0)").length > 0) {\r
++                                      this.search.supress_callback = true;\r
++                                      error_func = function () { };\r
++                                      success_func = function (d, t, x) {\r
++                                              var sf = this.get_settings().search.ajax.success; \r
++                                              if(sf) { d = sf.call(this,d,t,x) || d; }\r
++                                              this.data.search.to_open = d;\r
++                                              this._search_open();\r
++                                      };\r
++                                      s.ajax.context = this;\r
++                                      s.ajax.error = error_func;\r
++                                      s.ajax.success = success_func;\r
++                                      if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, str); }\r
++                                      if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, str); }\r
++                                      if(!s.ajax.data) { s.ajax.data = { "search_string" : str }; }\r
++                                      if(!s.ajax.dataType || /^json/.exec(s.ajax.dataType)) { s.ajax.dataType = "json"; }\r
++                                      $.ajax(s.ajax);\r
++                                      return;\r
++                              }\r
++                              if(this.data.search.result.length) { this.clear_search(); }\r
++                              this.data.search.result = this.get_container().find("a" + (this.data.languages ? "." + this.get_lang() : "" ) + ":" + (s.search_method) + "(" + this.data.search.str + ")");\r
++                              this.data.search.result.addClass("jstree-search").parent().parents(".jstree-closed").each(function () {\r
++                                      t.open_node(this, false, true);\r
++                              });\r
++                              this.__callback({ nodes : this.data.search.result, str : str });\r
++                      },\r
++                      clear_search : function (str) {\r
++                              this.data.search.result.removeClass("jstree-search");\r
++                              this.__callback(this.data.search.result);\r
++                              this.data.search.result = $();\r
++                      },\r
++                      _search_open : function (is_callback) {\r
++                              var _this = this,\r
++                                      done = true,\r
++                                      current = [],\r
++                                      remaining = [];\r
++                              if(this.data.search.to_open.length) {\r
++                                      $.each(this.data.search.to_open, function (i, val) {\r
++                                              if(val == "#") { return true; }\r
++                                              if($(val).length && $(val).is(".jstree-closed")) { current.push(val); }\r
++                                              else { remaining.push(val); }\r
++                                      });\r
++                                      if(current.length) {\r
++                                              this.data.search.to_open = remaining;\r
++                                              $.each(current, function (i, val) { \r
++                                                      _this.open_node(val, function () { _this._search_open(true); }); \r
++                                              });\r
++                                              done = false;\r
++                                      }\r
++                              }\r
++                              if(done) { this.search(this.data.search.str, true); }\r
++                      }\r
++              }\r
++      });\r
++})(jQuery);\r
++//*/\r
++\r
++/* \r
++ * jsTree contextmenu plugin\r
++ */\r
++(function ($) {\r
++      $.vakata.context = {\r
++              hide_on_mouseleave : false,\r
++\r
++              cnt             : $("<div id='vakata-contextmenu' />"),\r
++              vis             : false,\r
++              tgt             : false,\r
++              par             : false,\r
++              func    : false,\r
++              data    : false,\r
++              rtl             : false,\r
++              show    : function (s, t, x, y, d, p, rtl) {\r
++                      $.vakata.context.rtl = !!rtl;\r
++                      var html = $.vakata.context.parse(s), h, w;\r
++                      if(!html) { return; }\r
++                      $.vakata.context.vis = true;\r
++                      $.vakata.context.tgt = t;\r
++                      $.vakata.context.par = p || t || null;\r
++                      $.vakata.context.data = d || null;\r
++                      $.vakata.context.cnt\r
++                              .html(html)\r
++                              .css({ "visibility" : "hidden", "display" : "block", "left" : 0, "top" : 0 });\r
++\r
++                      if($.vakata.context.hide_on_mouseleave) {\r
++                              $.vakata.context.cnt\r
++                                      .one("mouseleave", function(e) { $.vakata.context.hide(); });\r
++                      }\r
++\r
++                      h = $.vakata.context.cnt.height();\r
++                      w = $.vakata.context.cnt.width();\r
++                      if(x + w > $(document).width()) { \r
++                              x = $(document).width() - (w + 5); \r
++                              $.vakata.context.cnt.find("li > ul").addClass("right"); \r
++                      }\r
++                      if(y + h > $(document).height()) { \r
++                              y = y - (h + t[0].offsetHeight); \r
++                              $.vakata.context.cnt.find("li > ul").addClass("bottom"); \r
++                      }\r
++\r
++                      $.vakata.context.cnt\r
++                              .css({ "left" : x, "top" : y })\r
++                              .find("li:has(ul)")\r
++                                      .bind("mouseenter", function (e) { \r
++                                              var w = $(document).width(),\r
++                                                      h = $(document).height(),\r
++                                                      ul = $(this).children("ul").show(); \r
++                                              if(w !== $(document).width()) { ul.toggleClass("right"); }\r
++                                              if(h !== $(document).height()) { ul.toggleClass("bottom"); }\r
++                                      })\r
++                                      .bind("mouseleave", function (e) { \r
++                                              $(this).children("ul").hide(); \r
++                                      })\r
++                                      .end()\r
++                              .css({ "visibility" : "visible" })\r
++                              .show();\r
++                      $(document).triggerHandler("context_show.vakata");\r
++              },\r
++              hide    : function () {\r
++                      $.vakata.context.vis = false;\r
++                      $.vakata.context.cnt.attr("class","").css({ "visibility" : "hidden" });\r
++                      $(document).triggerHandler("context_hide.vakata");\r
++              },\r
++              parse   : function (s, is_callback) {\r
++                      if(!s) { return false; }\r
++                      var str = "",\r
++                              tmp = false,\r
++                              was_sep = true;\r
++                      if(!is_callback) { $.vakata.context.func = {}; }\r
++                      str += "<ul>";\r
++                      $.each(s, function (i, val) {\r
++                              if(!val) { return true; }\r
++                              $.vakata.context.func[i] = val.action;\r
++                              if(!was_sep && val.separator_before) {\r
++                                      str += "<li class='vakata-separator vakata-separator-before'></li>";\r
++                              }\r
++                              was_sep = false;\r
++                              str += "<li class='" + (val._class || "") + (val._disabled ? " jstree-contextmenu-disabled " : "") + "'><ins ";\r
++                              if(val.icon && val.icon.indexOf("/") === -1) { str += " class='" + val.icon + "' "; }\r
++                              if(val.icon && val.icon.indexOf("/") !== -1) { str += " style='background:url(" + val.icon + ") center center no-repeat;' "; }\r
++                              str += ">&#160;</ins><a href='#' rel='" + i + "'>";\r
++                              if(val.submenu) {\r
++                                      str += "<span style='float:" + ($.vakata.context.rtl ? "left" : "right") + ";'>&raquo;</span>";\r
++                              }\r
++                              str += val.label + "</a>";\r
++                              if(val.submenu) {\r
++                                      tmp = $.vakata.context.parse(val.submenu, true);\r
++                                      if(tmp) { str += tmp; }\r
++                              }\r
++                              str += "</li>";\r
++                              if(val.separator_after) {\r
++                                      str += "<li class='vakata-separator vakata-separator-after'></li>";\r
++                                      was_sep = true;\r
++                              }\r
++                      });\r
++                      str = str.replace(/<li class\='vakata-separator vakata-separator-after'\><\/li\>$/,"");\r
++                      str += "</ul>";\r
++                      $(document).triggerHandler("context_parse.vakata");\r
++                      return str.length > 10 ? str : false;\r
++              },\r
++              exec    : function (i) {\r
++                      if($.isFunction($.vakata.context.func[i])) {\r
++                              // if is string - eval and call it!\r
++                              $.vakata.context.func[i].call($.vakata.context.data, $.vakata.context.par);\r
++                              return true;\r
++                      }\r
++                      else { return false; }\r
++              }\r
++      };\r
++      $(function () {\r
++              var css_string = '' + \r
++                      '#vakata-contextmenu { display:block; visibility:hidden; left:0; top:-200px; position:absolute; margin:0; padding:0; min-width:180px; background:#ebebeb; border:1px solid silver; z-index:10000; *width:180px; } ' + \r
++                      '#vakata-contextmenu ul { min-width:180px; *width:180px; } ' + \r
++                      '#vakata-contextmenu ul, #vakata-contextmenu li { margin:0; padding:0; list-style-type:none; display:block; } ' + \r
++                      '#vakata-contextmenu li { line-height:20px; min-height:20px; position:relative; padding:0px; } ' + \r
++                      '#vakata-contextmenu li a { padding:1px 6px; line-height:17px; display:block; text-decoration:none; margin:1px 1px 0 1px; } ' + \r
++                      '#vakata-contextmenu li ins { float:left; width:16px; height:16px; text-decoration:none; margin-right:2px; } ' + \r
++                      '#vakata-contextmenu li a:hover, #vakata-contextmenu li.vakata-hover > a { background:gray; color:white; } ' + \r
++                      '#vakata-contextmenu li ul { display:none; position:absolute; top:-2px; left:100%; background:#ebebeb; border:1px solid gray; } ' + \r
++                      '#vakata-contextmenu .right { right:100%; left:auto; } ' + \r
++                      '#vakata-contextmenu .bottom { bottom:-1px; top:auto; } ' + \r
++                      '#vakata-contextmenu li.vakata-separator { min-height:0; height:1px; line-height:1px; font-size:1px; overflow:hidden; margin:0 2px; background:silver; /* border-top:1px solid #fefefe; */ padding:0; } ';\r
++              $.vakata.css.add_sheet({ str : css_string, title : "vakata" });\r
++              $.vakata.context.cnt\r
++                      .delegate("a","click", function (e) { e.preventDefault(); })\r
++                      .delegate("a","mouseup", function (e) {\r
++                              if(!$(this).parent().hasClass("jstree-contextmenu-disabled") && $.vakata.context.exec($(this).attr("rel"))) {\r
++                                      $.vakata.context.hide();\r
++                              }\r
++                              else { $(this).blur(); }\r
++                      })\r
++                      .delegate("a","mouseover", function () {\r
++                              $.vakata.context.cnt.find(".vakata-hover").removeClass("vakata-hover");\r
++                      })\r
++                      .appendTo("body");\r
++              $(document).bind("mousedown", function (e) { if($.vakata.context.vis && !$.contains($.vakata.context.cnt[0], e.target)) { $.vakata.context.hide(); } });\r
++              if(typeof $.hotkeys !== "undefined") {\r
++                      $(document)\r
++                              .bind("keydown", "up", function (e) { \r
++                                      if($.vakata.context.vis) { \r
++                                              var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").prevAll("li:not(.vakata-separator)").first();\r
++                                              if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").last(); }\r
++                                              o.addClass("vakata-hover");\r
++                                              e.stopImmediatePropagation(); \r
++                                              e.preventDefault();\r
++                                      } \r
++                              })\r
++                              .bind("keydown", "down", function (e) { \r
++                                      if($.vakata.context.vis) { \r
++                                              var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").nextAll("li:not(.vakata-separator)").first();\r
++                                              if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").first(); }\r
++                                              o.addClass("vakata-hover");\r
++                                              e.stopImmediatePropagation(); \r
++                                              e.preventDefault();\r
++                                      } \r
++                              })\r
++                              .bind("keydown", "right", function (e) { \r
++                                      if($.vakata.context.vis) { \r
++                                              $.vakata.context.cnt.find(".vakata-hover").children("ul").show().children("li:not(.vakata-separator)").removeClass("vakata-hover").first().addClass("vakata-hover");\r
++                                              e.stopImmediatePropagation(); \r
++                                              e.preventDefault();\r
++                                      } \r
++                              })\r
++                              .bind("keydown", "left", function (e) { \r
++                                      if($.vakata.context.vis) { \r
++                                              $.vakata.context.cnt.find(".vakata-hover").children("ul").hide().children(".vakata-separator").removeClass("vakata-hover");\r
++                                              e.stopImmediatePropagation(); \r
++                                              e.preventDefault();\r
++                                      } \r
++                              })\r
++                              .bind("keydown", "esc", function (e) { \r
++                                      $.vakata.context.hide(); \r
++                                      e.preventDefault();\r
++                              })\r
++                              .bind("keydown", "space", function (e) { \r
++                                      $.vakata.context.cnt.find(".vakata-hover").last().children("a").click();\r
++                                      e.preventDefault();\r
++                              });\r
++              }\r
++      });\r
++\r
++      $.jstree.plugin("contextmenu", {\r
++              __init : function () {\r
++                      this.get_container()\r
++                              .delegate("a", "contextmenu.jstree", $.proxy(function (e) {\r
++                                              e.preventDefault();\r
++                                              if(!$(e.currentTarget).hasClass("jstree-loading")) {\r
++                                                      this.show_contextmenu(e.currentTarget, e.pageX, e.pageY);\r
++                                              }\r
++                                      }, this))\r
++                              .delegate("a", "click.jstree", $.proxy(function (e) {\r
++                                              if(this.data.contextmenu) {\r
++                                                      $.vakata.context.hide();\r
++                                              }\r
++                                      }, this))\r
++                              .bind("destroy.jstree", $.proxy(function () {\r
++                                              // TODO: move this to descruct method\r
++                                              if(this.data.contextmenu) {\r
++                                                      $.vakata.context.hide();\r
++                                              }\r
++                                      }, this));\r
++                      $(document).bind("context_hide.vakata", $.proxy(function () { this.data.contextmenu = false; }, this));\r
++              },\r
++              defaults : { \r
++                      select_node : false, // requires UI plugin\r
++                      show_at_node : true,\r
++                      items : { // Could be a function that should return an object like this one\r
++                              "create" : {\r
++                                      "separator_before"      : false,\r
++                                      "separator_after"       : true,\r
++                                      "label"                         : "Create",\r
++                                      "action"                        : function (obj) { this.create(obj); }\r
++                              },\r
++                              "rename" : {\r
++                                      "separator_before"      : false,\r
++                                      "separator_after"       : false,\r
++                                      "label"                         : "Rename",\r
++                                      "action"                        : function (obj) { this.rename(obj); }\r
++                              },\r
++                              "remove" : {\r
++                                      "separator_before"      : false,\r
++                                      "icon"                          : false,\r
++                                      "separator_after"       : false,\r
++                                      "label"                         : "Delete",\r
++                                      "action"                        : function (obj) { if(this.is_selected(obj)) { this.remove(); } else { this.remove(obj); } }\r
++                              },\r
++                              "ccp" : {\r
++                                      "separator_before"      : true,\r
++                                      "icon"                          : false,\r
++                                      "separator_after"       : false,\r
++                                      "label"                         : "Edit",\r
++                                      "action"                        : false,\r
++                                      "submenu" : { \r
++                                              "cut" : {\r
++                                                      "separator_before"      : false,\r
++                                                      "separator_after"       : false,\r
++                                                      "label"                         : "Cut",\r
++                                                      "action"                        : function (obj) { this.cut(obj); }\r
++                                              },\r
++                                              "copy" : {\r
++                                                      "separator_before"      : false,\r
++                                                      "icon"                          : false,\r
++                                                      "separator_after"       : false,\r
++                                                      "label"                         : "Copy",\r
++                                                      "action"                        : function (obj) { this.copy(obj); }\r
++                                              },\r
++                                              "paste" : {\r
++                                                      "separator_before"      : false,\r
++                                                      "icon"                          : false,\r
++                                                      "separator_after"       : false,\r
++                                                      "label"                         : "Paste",\r
++                                                      "action"                        : function (obj) { this.paste(obj); }\r
++                                              }\r
++                                      }\r
++                              }\r
++                      }\r
++              },\r
++              _fn : {\r
++                      show_contextmenu : function (obj, x, y) {\r
++                              obj = this._get_node(obj);\r
++                              var s = this.get_settings().contextmenu,\r
++                                      a = obj.children("a:visible:eq(0)"),\r
++                                      o = false,\r
++                                      i = false;\r
++                              if(s.select_node && this.data.ui && !this.is_selected(obj)) {\r
++                                      this.deselect_all();\r
++                                      this.select_node(obj, true);\r
++                              }\r
++                              if(s.show_at_node || typeof x === "undefined" || typeof y === "undefined") {\r
++                                      o = a.offset();\r
++                                      x = o.left;\r
++                                      y = o.top + this.data.core.li_height;\r
++                              }\r
++                              i = obj.data("jstree") && obj.data("jstree").contextmenu ? obj.data("jstree").contextmenu : s.items;\r
++                              if($.isFunction(i)) { i = i.call(this, obj); }\r
++                              this.data.contextmenu = true;\r
++                              $.vakata.context.show(i, a, x, y, this, obj, this._get_settings().core.rtl);\r
++                              if(this.data.themes) { $.vakata.context.cnt.attr("class", "jstree-" + this.data.themes.theme + "-context"); }\r
++                      }\r
++              }\r
++      });\r
++})(jQuery);\r
++//*/\r
++\r
++/* \r
++ * jsTree types plugin\r
++ * Adds support types of nodes\r
++ * You can set an attribute on each li node, that represents its type.\r
++ * According to the type setting the node may get custom icon/validation rules\r
++ */\r
++(function ($) {\r
++      $.jstree.plugin("types", {\r
++              __init : function () {\r
++                      var s = this._get_settings().types;\r
++                      this.data.types.attach_to = [];\r
++                      this.get_container()\r
++                              .bind("init.jstree", $.proxy(function () { \r
++                                              var types = s.types, \r
++                                                      attr  = s.type_attr, \r
++                                                      icons_css = "", \r
++                                                      _this = this;\r
++\r
++                                              $.each(types, function (i, tp) {\r
++                                                      $.each(tp, function (k, v) { \r
++                                                              if(!/^(max_depth|max_children|icon|valid_children)$/.test(k)) { _this.data.types.attach_to.push(k); }\r
++                                                      });\r
++                                                      if(!tp.icon) { return true; }\r
++                                                      if( tp.icon.image || tp.icon.position) {\r
++                                                              if(i == "default")      { icons_css += '.jstree-' + _this.get_index() + ' a > .jstree-icon { '; }\r
++                                                              else                            { icons_css += '.jstree-' + _this.get_index() + ' li[' + attr + '="' + i + '"] > a > .jstree-icon { '; }\r
++                                                              if(tp.icon.image)       { icons_css += ' background-image:url(' + tp.icon.image + '); '; }\r
++                                                              if(tp.icon.position){ icons_css += ' background-position:' + tp.icon.position + '; '; }\r
++                                                              else                            { icons_css += ' background-position:0 0; '; }\r
++                                                              icons_css += '} ';\r
++                                                      }\r
++                                              });\r
++                                              if(icons_css !== "") { $.vakata.css.add_sheet({ 'str' : icons_css, title : "jstree-types" }); }\r
++                                      }, this))\r
++                              .bind("before.jstree", $.proxy(function (e, data) { \r
++                                              var s, t, \r
++                                                      o = this._get_settings().types.use_data ? this._get_node(data.args[0]) : false, \r
++                                                      d = o && o !== -1 && o.length ? o.data("jstree") : false;\r
++                                              if(d && d.types && d.types[data.func] === false) { e.stopImmediatePropagation(); return false; }\r
++                                              if($.inArray(data.func, this.data.types.attach_to) !== -1) {\r
++                                                      if(!data.args[0] || (!data.args[0].tagName && !data.args[0].jquery)) { return; }\r
++                                                      s = this._get_settings().types.types;\r
++                                                      t = this._get_type(data.args[0]);\r
++                                                      if(\r
++                                                              ( \r
++                                                                      (s[t] && typeof s[t][data.func] !== "undefined") || \r
++                                                                      (s["default"] && typeof s["default"][data.func] !== "undefined") \r
++                                                              ) && this._check(data.func, data.args[0]) === false\r
++                                                      ) {\r
++                                                              e.stopImmediatePropagation();\r
++                                                              return false;\r
++                                                      }\r
++                                              }\r
++                                      }, this));\r
++                      if(is_ie6) {\r
++                              this.get_container()\r
++                                      .bind("load_node.jstree set_type.jstree", $.proxy(function (e, data) {\r
++                                                      var r = data && data.rslt && data.rslt.obj && data.rslt.obj !== -1 ? this._get_node(data.rslt.obj).parent() : this.get_container_ul(),\r
++                                                              c = false,\r
++                                                              s = this._get_settings().types;\r
++                                                      $.each(s.types, function (i, tp) {\r
++                                                              if(tp.icon && (tp.icon.image || tp.icon.position)) {\r
++                                                                      c = i === "default" ? r.find("li > a > .jstree-icon") : r.find("li[" + s.type_attr + "='" + i + "'] > a > .jstree-icon");\r
++                                                                      if(tp.icon.image) { c.css("backgroundImage","url(" + tp.icon.image + ")"); }\r
++                                                                      c.css("backgroundPosition", tp.icon.position || "0 0");\r
++                                                              }\r
++                                                      });\r
++                                              }, this));\r
++                      }\r
++              },\r
++              defaults : {\r
++                      // defines maximum number of root nodes (-1 means unlimited, -2 means disable max_children checking)\r
++                      max_children            : -1,\r
++                      // defines the maximum depth of the tree (-1 means unlimited, -2 means disable max_depth checking)\r
++                      max_depth                       : -1,\r
++                      // defines valid node types for the root nodes\r
++                      valid_children          : "all",\r
++\r
++                      // whether to use $.data\r
++                      use_data : false, \r
++                      // where is the type stores (the rel attribute of the LI element)\r
++                      type_attr : "rel",\r
++                      // a list of types\r
++                      types : {\r
++                              // the default type\r
++                              "default" : {\r
++                                      "max_children"  : -1,\r
++                                      "max_depth"             : -1,\r
++                                      "valid_children": "all"\r
++\r
++                                      // Bound functions - you can bind any other function here (using boolean or function)\r
++                                      //"select_node" : true\r
++                              }\r
++                      }\r
++              },\r
++              _fn : {\r
++                      _types_notify : function (n, data) {\r
++                              if(data.type && this._get_settings().types.use_data) {\r
++                                      this.set_type(data.type, n);\r
++                              }\r
++                      },\r
++                      _get_type : function (obj) {\r
++                              obj = this._get_node(obj);\r
++                              return (!obj || !obj.length) ? false : obj.attr(this._get_settings().types.type_attr) || "default";\r
++                      },\r
++                      set_type : function (str, obj) {\r
++                              obj = this._get_node(obj);\r
++                              var ret = (!obj.length || !str) ? false : obj.attr(this._get_settings().types.type_attr, str);\r
++                              if(ret) { this.__callback({ obj : obj, type : str}); }\r
++                              return ret;\r
++                      },\r
++                      _check : function (rule, obj, opts) {\r
++                              obj = this._get_node(obj);\r
++                              var v = false, t = this._get_type(obj), d = 0, _this = this, s = this._get_settings().types, data = false;\r
++                              if(obj === -1) { \r
++                                      if(!!s[rule]) { v = s[rule]; }\r
++                                      else { return; }\r
++                              }\r
++                              else {\r
++                                      if(t === false) { return; }\r
++                                      data = s.use_data ? obj.data("jstree") : false;\r
++                                      if(data && data.types && typeof data.types[rule] !== "undefined") { v = data.types[rule]; }\r
++                                      else if(!!s.types[t] && typeof s.types[t][rule] !== "undefined") { v = s.types[t][rule]; }\r
++                                      else if(!!s.types["default"] && typeof s.types["default"][rule] !== "undefined") { v = s.types["default"][rule]; }\r
++                              }\r
++                              if($.isFunction(v)) { v = v.call(this, obj); }\r
++                              if(rule === "max_depth" && obj !== -1 && opts !== false && s.max_depth !== -2 && v !== 0) {\r
++                                      // also include the node itself - otherwise if root node it is not checked\r
++                                      obj.children("a:eq(0)").parentsUntil(".jstree","li").each(function (i) {\r
++                                              // check if current depth already exceeds global tree depth\r
++                                              if(s.max_depth !== -1 && s.max_depth - (i + 1) <= 0) { v = 0; return false; }\r
++                                              d = (i === 0) ? v : _this._check(rule, this, false);\r
++                                              // check if current node max depth is already matched or exceeded\r
++                                              if(d !== -1 && d - (i + 1) <= 0) { v = 0; return false; }\r
++                                              // otherwise - set the max depth to the current value minus current depth\r
++                                              if(d >= 0 && (d - (i + 1) < v || v < 0) ) { v = d - (i + 1); }\r
++                                              // if the global tree depth exists and it minus the nodes calculated so far is less than `v` or `v` is unlimited\r
++                                              if(s.max_depth >= 0 && (s.max_depth - (i + 1) < v || v < 0) ) { v = s.max_depth - (i + 1); }\r
++                                      });\r
++                              }\r
++                              return v;\r
++                      },\r
++                      check_move : function () {\r
++                              if(!this.__call_old()) { return false; }\r
++                              var m  = this._get_move(),\r
++                                      s  = m.rt._get_settings().types,\r
++                                      mc = m.rt._check("max_children", m.cr),\r
++                                      md = m.rt._check("max_depth", m.cr),\r
++                                      vc = m.rt._check("valid_children", m.cr),\r
++                                      ch = 0, d = 1, t;\r
++\r
++                              if(vc === "none") { return false; } \r
++                              if($.isArray(vc) && m.ot && m.ot._get_type) {\r
++                                      m.o.each(function () {\r
++                                              if($.inArray(m.ot._get_type(this), vc) === -1) { d = false; return false; }\r
++                                      });\r
++                                      if(d === false) { return false; }\r
++                              }\r
++                              if(s.max_children !== -2 && mc !== -1) {\r
++                                      ch = m.cr === -1 ? this.get_container().find("> ul > li").not(m.o).length : m.cr.find("> ul > li").not(m.o).length;\r
++                                      if(ch + m.o.length > mc) { return false; }\r
++                              }\r
++                              if(s.max_depth !== -2 && md !== -1) {\r
++                                      d = 0;\r
++                                      if(md === 0) { return false; }\r
++                                      if(typeof m.o.d === "undefined") {\r
++                                              // TODO: deal with progressive rendering and async when checking max_depth (how to know the depth of the moved node)\r
++                                              t = m.o;\r
++                                              while(t.length > 0) {\r
++                                                      t = t.find("> ul > li");\r
++                                                      d ++;\r
++                                              }\r
++                                              m.o.d = d;\r
++                                      }\r
++                                      if(md - m.o.d < 0) { return false; }\r
++                              }\r
++                              return true;\r
++                      },\r
++                      create_node : function (obj, position, js, callback, is_loaded, skip_check) {\r
++                              if(!skip_check && (is_loaded || this._is_loaded(obj))) {\r
++                                      var p  = (typeof position == "string" && position.match(/^before|after$/i) && obj !== -1) ? this._get_parent(obj) : this._get_node(obj),\r
++                                              s  = this._get_settings().types,\r
++                                              mc = this._check("max_children", p),\r
++                                              md = this._check("max_depth", p),\r
++                                              vc = this._check("valid_children", p),\r
++                                              ch;\r
++                                      if(typeof js === "string") { js = { data : js }; }\r
++                                      if(!js) { js = {}; }\r
++                                      if(vc === "none") { return false; } \r
++                                      if($.isArray(vc)) {\r
++                                              if(!js.attr || !js.attr[s.type_attr]) { \r
++                                                      if(!js.attr) { js.attr = {}; }\r
++                                                      js.attr[s.type_attr] = vc[0]; \r
++                                              }\r
++                                              else {\r
++                                                      if($.inArray(js.attr[s.type_attr], vc) === -1) { return false; }\r
++                                              }\r
++                                      }\r
++                                      if(s.max_children !== -2 && mc !== -1) {\r
++                                              ch = p === -1 ? this.get_container().find("> ul > li").length : p.find("> ul > li").length;\r
++                                              if(ch + 1 > mc) { return false; }\r
++                                      }\r
++                                      if(s.max_depth !== -2 && md !== -1 && (md - 1) < 0) { return false; }\r
++                              }\r
++                              return this.__call_old(true, obj, position, js, callback, is_loaded, skip_check);\r
++                      }\r
++              }\r
++      });\r
++})(jQuery);\r
++//*/\r
++\r
++/* \r
++ * jsTree HTML plugin\r
++ * The HTML data store. Datastores are build by replacing the `load_node` and `_is_loaded` functions.\r
++ */\r
++(function ($) {\r
++      $.jstree.plugin("html_data", {\r
++              __init : function () { \r
++                      // this used to use html() and clean the whitespace, but this way any attached data was lost\r
++                      this.data.html_data.original_container_html = this.get_container().find(" > ul > li").clone(true);\r
++                      // remove white space from LI node - otherwise nodes appear a bit to the right\r
++                      this.data.html_data.original_container_html.find("li").andSelf().contents().filter(function() { return this.nodeType == 3; }).remove();\r
++              },\r
++              defaults : { \r
++                      data : false,\r
++                      ajax : false,\r
++                      correct_state : true\r
++              },\r
++              _fn : {\r
++                      load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_html(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); },\r
++                      _is_loaded : function (obj) { \r
++                              obj = this._get_node(obj); \r
++                              return obj == -1 || !obj || (!this._get_settings().html_data.ajax && !$.isFunction(this._get_settings().html_data.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;\r
++                      },\r
++                      load_node_html : function (obj, s_call, e_call) {\r
++                              var d,\r
++                                      s = this.get_settings().html_data,\r
++                                      error_func = function () {},\r
++                                      success_func = function () {};\r
++                              obj = this._get_node(obj);\r
++                              if(obj && obj !== -1) {\r
++                                      if(obj.data("jstree_is_loading")) { return; }\r
++                                      else { obj.data("jstree_is_loading",true); }\r
++                              }\r
++                              switch(!0) {\r
++                                      case ($.isFunction(s.data)):\r
++                                              s.data.call(this, obj, $.proxy(function (d) {\r
++                                                      if(d && d !== "" && d.toString && d.toString().replace(/^[\s\n]+$/,"") !== "") {\r
++                                                              d = $(d);\r
++                                                              if(!d.is("ul")) { d = $("<ul />").append(d); }\r
++                                                              if(obj == -1 || !obj) { this.get_container().children("ul").empty().append(d.children()).find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); }\r
++                                                              else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d).children("ul").find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); obj.removeData("jstree_is_loading"); }\r
++                                                              this.clean_node(obj);\r
++                                                              if(s_call) { s_call.call(this); }\r
++                                                      }\r
++                                                      else {\r
++                                                              if(obj && obj !== -1) {\r
++                                                                      obj.children("a.jstree-loading").removeClass("jstree-loading");\r
++                                                                      obj.removeData("jstree_is_loading");\r
++                                                                      if(s.correct_state) { \r
++                                                                              this.correct_state(obj);\r
++                                                                              if(s_call) { s_call.call(this); } \r
++                                                                      }\r
++                                                              }\r
++                                                              else {\r
++                                                                      if(s.correct_state) { \r
++                                                                              this.get_container().children("ul").empty();\r
++                                                                              if(s_call) { s_call.call(this); } \r
++                                                                      }\r
++                                                              }\r
++                                                      }\r
++                                              }, this));\r
++                                              break;\r
++                                      case (!s.data && !s.ajax):\r
++                                              if(!obj || obj == -1) {\r
++                                                      this.get_container()\r
++                                                              .children("ul").empty()\r
++                                                              .append(this.data.html_data.original_container_html)\r
++                                                              .find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end()\r
++                                                              .filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon");\r
++                                                      this.clean_node();\r
++                                              }\r
++                                              if(s_call) { s_call.call(this); }\r
++                                              break;\r
++                                      case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):\r
++                                              if(!obj || obj == -1) {\r
++                                                      d = $(s.data);\r
++                                                      if(!d.is("ul")) { d = $("<ul />").append(d); }\r
++                                                      this.get_container()\r
++                                                              .children("ul").empty().append(d.children())\r
++                                                              .find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end()\r
++                                                              .filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon");\r
++                                                      this.clean_node();\r
++                                              }\r
++                                              if(s_call) { s_call.call(this); }\r
++                                              break;\r
++                                      case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):\r
++                                              obj = this._get_node(obj);\r
++                                              error_func = function (x, t, e) {\r
++                                                      var ef = this.get_settings().html_data.ajax.error; \r
++                                                      if(ef) { ef.call(this, x, t, e); }\r
++                                                      if(obj != -1 && obj.length) {\r
++                                                              obj.children("a.jstree-loading").removeClass("jstree-loading");\r
++                                                              obj.removeData("jstree_is_loading");\r
++                                                              if(t === "success" && s.correct_state) { this.correct_state(obj); }\r
++                                                      }\r
++                                                      else {\r
++                                                              if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }\r
++                                                      }\r
++                                                      if(e_call) { e_call.call(this); }\r
++                                              };\r
++                                              success_func = function (d, t, x) {\r
++                                                      var sf = this.get_settings().html_data.ajax.success; \r
++                                                      if(sf) { d = sf.call(this,d,t,x) || d; }\r
++                                                      if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "")) {\r
++                                                              return error_func.call(this, x, t, "");\r
++                                                      }\r
++                                                      if(d) {\r
++                                                              d = $(d);\r
++                                                              if(!d.is("ul")) { d = $("<ul />").append(d); }\r
++                                                              if(obj == -1 || !obj) { this.get_container().children("ul").empty().append(d.children()).find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); }\r
++                                                              else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d).children("ul").find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); obj.removeData("jstree_is_loading"); }\r
++                                                              this.clean_node(obj);\r
++                                                              if(s_call) { s_call.call(this); }\r
++                                                      }\r
++                                                      else {\r
++                                                              if(obj && obj !== -1) {\r
++                                                                      obj.children("a.jstree-loading").removeClass("jstree-loading");\r
++                                                                      obj.removeData("jstree_is_loading");\r
++                                                                      if(s.correct_state) { \r
++                                                                              this.correct_state(obj);\r
++                                                                              if(s_call) { s_call.call(this); } \r
++                                                                      }\r
++                                                              }\r
++                                                              else {\r
++                                                                      if(s.correct_state) { \r
++                                                                              this.get_container().children("ul").empty();\r
++                                                                              if(s_call) { s_call.call(this); } \r
++                                                                      }\r
++                                                              }\r
++                                                      }\r
++                                              };\r
++                                              s.ajax.context = this;\r
++                                              s.ajax.error = error_func;\r
++                                              s.ajax.success = success_func;\r
++                                              if(!s.ajax.dataType) { s.ajax.dataType = "html"; }\r
++                                              if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }\r
++                                              if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }\r
++                                              $.ajax(s.ajax);\r
++                                              break;\r
++                              }\r
++                      }\r
++              }\r
++      });\r
++      // include the HTML data plugin by default\r
++      $.jstree.defaults.plugins.push("html_data");\r
++})(jQuery);\r
++//*/\r
++\r
++/* \r
++ * jsTree themeroller plugin\r
++ * Adds support for jQuery UI themes. Include this at the end of your plugins list, also make sure "themes" is not included.\r
++ */\r
++(function ($) {\r
++      $.jstree.plugin("themeroller", {\r
++              __init : function () {\r
++                      var s = this._get_settings().themeroller;\r
++                      this.get_container()\r
++                              .addClass("ui-widget-content")\r
++                              .addClass("jstree-themeroller")\r
++                              .delegate("a","mouseenter.jstree", function (e) {\r
++                                      if(!$(e.currentTarget).hasClass("jstree-loading")) {\r
++                                              $(this).addClass(s.item_h);\r
++                                      }\r
++                              })\r
++                              .delegate("a","mouseleave.jstree", function () {\r
++                                      $(this).removeClass(s.item_h);\r
++                              })\r
++                              .bind("init.jstree", $.proxy(function (e, data) { \r
++                                              data.inst.get_container().find("> ul > li > .jstree-loading > ins").addClass("ui-icon-refresh");\r
++                                              this._themeroller(data.inst.get_container().find("> ul > li"));\r
++                                      }, this))\r
++                              .bind("open_node.jstree create_node.jstree", $.proxy(function (e, data) { \r
++                                              this._themeroller(data.rslt.obj);\r
++                                      }, this))\r
++                              .bind("loaded.jstree refresh.jstree", $.proxy(function (e) {\r
++                                              this._themeroller();\r
++                                      }, this))\r
++                              .bind("close_node.jstree", $.proxy(function (e, data) {\r
++                                              this._themeroller(data.rslt.obj);\r
++                                      }, this))\r
++                              .bind("delete_node.jstree", $.proxy(function (e, data) {\r
++                                              this._themeroller(data.rslt.parent);\r
++                                      }, this))\r
++                              .bind("correct_state.jstree", $.proxy(function (e, data) {\r
++                                              data.rslt.obj\r
++                                                      .children("ins.jstree-icon").removeClass(s.opened + " " + s.closed + " ui-icon").end()\r
++                                                      .find("> a > ins.ui-icon")\r
++                                                              .filter(function() { \r
++                                                                      return this.className.toString()\r
++                                                                              .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")\r
++                                                                              .indexOf("ui-icon-") === -1; \r
++                                                              }).removeClass(s.item_open + " " + s.item_clsd).addClass(s.item_leaf || "jstree-no-icon");\r
++                                      }, this))\r
++                              .bind("select_node.jstree", $.proxy(function (e, data) {\r
++                                              data.rslt.obj.children("a").addClass(s.item_a);\r
++                                      }, this))\r
++                              .bind("deselect_node.jstree deselect_all.jstree", $.proxy(function (e, data) {\r
++                                              this.get_container()\r
++                                                      .find("a." + s.item_a).removeClass(s.item_a).end()\r
++                                                      .find("a.jstree-clicked").addClass(s.item_a);\r
++                                      }, this))\r
++                              .bind("dehover_node.jstree", $.proxy(function (e, data) {\r
++                                              data.rslt.obj.children("a").removeClass(s.item_h);\r
++                                      }, this))\r
++                              .bind("hover_node.jstree", $.proxy(function (e, data) {\r
++                                              this.get_container()\r
++                                                      .find("a." + s.item_h).not(data.rslt.obj).removeClass(s.item_h);\r
++                                              data.rslt.obj.children("a").addClass(s.item_h);\r
++                                      }, this))\r
++                              .bind("move_node.jstree", $.proxy(function (e, data) {\r
++                                              this._themeroller(data.rslt.o);\r
++                                              this._themeroller(data.rslt.op);\r
++                                      }, this));\r
++              },\r
++              __destroy : function () {\r
++                      var s = this._get_settings().themeroller,\r
++                              c = [ "ui-icon" ];\r
++                      $.each(s, function (i, v) {\r
++                              v = v.split(" ");\r
++                              if(v.length) { c = c.concat(v); }\r
++                      });\r
++                      this.get_container()\r
++                              .removeClass("ui-widget-content")\r
++                              .find("." + c.join(", .")).removeClass(c.join(" "));\r
++              },\r
++              _fn : {\r
++                      _themeroller : function (obj) {\r
++                              var s = this._get_settings().themeroller;\r
++                              obj = !obj || obj == -1 ? this.get_container_ul() : this._get_node(obj).parent();\r
++                              obj\r
++                                      .find("li.jstree-closed")\r
++                                              .children("ins.jstree-icon").removeClass(s.opened).addClass("ui-icon " + s.closed).end()\r
++                                              .children("a").addClass(s.item)\r
++                                                      .children("ins.jstree-icon").addClass("ui-icon")\r
++                                                              .filter(function() { \r
++                                                                      return this.className.toString()\r
++                                                                              .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")\r
++                                                                              .indexOf("ui-icon-") === -1; \r
++                                                              }).removeClass(s.item_leaf + " " + s.item_open).addClass(s.item_clsd || "jstree-no-icon")\r
++                                                              .end()\r
++                                                      .end()\r
++                                              .end()\r
++                                      .end()\r
++                                      .find("li.jstree-open")\r
++                                              .children("ins.jstree-icon").removeClass(s.closed).addClass("ui-icon " + s.opened).end()\r
++                                              .children("a").addClass(s.item)\r
++                                                      .children("ins.jstree-icon").addClass("ui-icon")\r
++                                                              .filter(function() { \r
++                                                                      return this.className.toString()\r
++                                                                              .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")\r
++                                                                              .indexOf("ui-icon-") === -1; \r
++                                                              }).removeClass(s.item_leaf + " " + s.item_clsd).addClass(s.item_open || "jstree-no-icon")\r
++                                                              .end()\r
++                                                      .end()\r
++                                              .end()\r
++                                      .end()\r
++                                      .find("li.jstree-leaf")\r
++                                              .children("ins.jstree-icon").removeClass(s.closed + " ui-icon " + s.opened).end()\r
++                                              .children("a").addClass(s.item)\r
++                                                      .children("ins.jstree-icon").addClass("ui-icon")\r
++                                                              .filter(function() { \r
++                                                                      return this.className.toString()\r
++                                                                              .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")\r
++                                                                              .indexOf("ui-icon-") === -1; \r
++                                                              }).removeClass(s.item_clsd + " " + s.item_open).addClass(s.item_leaf || "jstree-no-icon");\r
++                      }\r
++              },\r
++              defaults : {\r
++                      "opened"        : "ui-icon-triangle-1-se",\r
++                      "closed"        : "ui-icon-triangle-1-e",\r
++                      "item"          : "ui-state-default",\r
++                      "item_h"        : "ui-state-hover",\r
++                      "item_a"        : "ui-state-active",\r
++                      "item_open"     : "ui-icon-folder-open",\r
++                      "item_clsd"     : "ui-icon-folder-collapsed",\r
++                      "item_leaf"     : "ui-icon-document"\r
++              }\r
++      });\r
++      $(function() {\r
++              var css_string = '' + \r
++                      '.jstree-themeroller .ui-icon { overflow:visible; } ' + \r
++                      '.jstree-themeroller a { padding:0 2px; } ' + \r
++                      '.jstree-themeroller .jstree-no-icon { display:none; }';\r
++              $.vakata.css.add_sheet({ str : css_string, title : "jstree" });\r
++      });\r
++})(jQuery);\r
++//*/\r
++\r
++/* \r
++ * jsTree unique plugin\r
++ * Forces different names amongst siblings (still a bit experimental)\r
++ * NOTE: does not check language versions (it will not be possible to have nodes with the same title, even in different languages)\r
++ */\r
++(function ($) {\r
++      $.jstree.plugin("unique", {\r
++              __init : function () {\r
++                      this.get_container()\r
++                              .bind("before.jstree", $.proxy(function (e, data) { \r
++                                              var nms = [], res = true, p, t;\r
++                                              if(data.func == "move_node") {\r
++                                                      // obj, ref, position, is_copy, is_prepared, skip_check\r
++                                                      if(data.args[4] === true) {\r
++                                                              if(data.args[0].o && data.args[0].o.length) {\r
++                                                                      data.args[0].o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); });\r
++                                                                      res = this._check_unique(nms, data.args[0].np.find("> ul > li").not(data.args[0].o), "move_node");\r
++                                                              }\r
++                                                      }\r
++                                              }\r
++                                              if(data.func == "create_node") {\r
++                                                      // obj, position, js, callback, is_loaded\r
++                                                      if(data.args[4] || this._is_loaded(data.args[0])) {\r
++                                                              p = this._get_node(data.args[0]);\r
++                                                              if(data.args[1] && (data.args[1] === "before" || data.args[1] === "after")) {\r
++                                                                      p = this._get_parent(data.args[0]);\r
++                                                                      if(!p || p === -1) { p = this.get_container(); }\r
++                                                              }\r
++                                                              if(typeof data.args[2] === "string") { nms.push(data.args[2]); }\r
++                                                              else if(!data.args[2] || !data.args[2].data) { nms.push(this._get_string("new_node")); }\r
++                                                              else { nms.push(data.args[2].data); }\r
++                                                              res = this._check_unique(nms, p.find("> ul > li"), "create_node");\r
++                                                      }\r
++                                              }\r
++                                              if(data.func == "rename_node") {\r
++                                                      // obj, val\r
++                                                      nms.push(data.args[1]);\r
++                                                      t = this._get_node(data.args[0]);\r
++                                                      p = this._get_parent(t);\r
++                                                      if(!p || p === -1) { p = this.get_container(); }\r
++                                                      res = this._check_unique(nms, p.find("> ul > li").not(t), "rename_node");\r
++                                              }\r
++                                              if(!res) {\r
++                                                      e.stopPropagation();\r
++                                                      return false;\r
++                                              }\r
++                                      }, this));\r
++              },\r
++              defaults : { \r
++                      error_callback : $.noop\r
++              },\r
++              _fn : { \r
++                      _check_unique : function (nms, p, func) {\r
++                              var cnms = [];\r
++                              p.children("a").each(function () { cnms.push($(this).text().replace(/^\s+/g,"")); });\r
++                              if(!cnms.length || !nms.length) { return true; }\r
++                              cnms = cnms.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",");\r
++                              if((cnms.length + nms.length) != cnms.concat(nms).sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",").length) {\r
++                                      this._get_settings().unique.error_callback.call(null, nms, p, func);\r
++                                      return false;\r
++                              }\r
++                              return true;\r
++                      },\r
++                      check_move : function () {\r
++                              if(!this.__call_old()) { return false; }\r
++                              var p = this._get_move(), nms = [];\r
++                              if(p.o && p.o.length) {\r
++                                      p.o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); });\r
++                                      return this._check_unique(nms, p.np.find("> ul > li").not(p.o), "check_move");\r
++                              }\r
++                              return true;\r
++                      }\r
++              }\r
++      });\r
++})(jQuery);\r
++//*/\r
++\r
++/*\r
++ * jsTree wholerow plugin\r
++ * Makes select and hover work on the entire width of the node\r
++ * MAY BE HEAVY IN LARGE DOM\r
++ */\r
++(function ($) {\r
++      $.jstree.plugin("wholerow", {\r
++              __init : function () {\r
++                      if(!this.data.ui) { throw "jsTree wholerow: jsTree UI plugin not included."; }\r
++                      this.data.wholerow.html = false;\r
++                      this.data.wholerow.to = false;\r
++                      this.get_container()\r
++                              .bind("init.jstree", $.proxy(function (e, data) { \r
++                                              this._get_settings().core.animation = 0;\r
++                                      }, this))\r
++                              .bind("open_node.jstree create_node.jstree clean_node.jstree loaded.jstree", $.proxy(function (e, data) { \r
++                                              this._prepare_wholerow_span( data && data.rslt && data.rslt.obj ? data.rslt.obj : -1 );\r
++                                      }, this))\r
++                              .bind("search.jstree clear_search.jstree reopen.jstree after_open.jstree after_close.jstree create_node.jstree delete_node.jstree clean_node.jstree", $.proxy(function (e, data) { \r
++                                              if(this.data.to) { clearTimeout(this.data.to); }\r
++                                              this.data.to = setTimeout( (function (t, o) { return function() { t._prepare_wholerow_ul(o); }; })(this,  data && data.rslt && data.rslt.obj ? data.rslt.obj : -1), 0);\r
++                                      }, this))\r
++                              .bind("deselect_all.jstree", $.proxy(function (e, data) { \r
++                                              this.get_container().find(" > .jstree-wholerow .jstree-clicked").removeClass("jstree-clicked " + (this.data.themeroller ? this._get_settings().themeroller.item_a : "" ));\r
++                                      }, this))\r
++                              .bind("select_node.jstree deselect_node.jstree ", $.proxy(function (e, data) { \r
++                                              data.rslt.obj.each(function () { \r
++                                                      var ref = data.inst.get_container().find(" > .jstree-wholerow li:visible:eq(" + ( parseInt((($(this).offset().top - data.inst.get_container().offset().top + data.inst.get_container()[0].scrollTop) / data.inst.data.core.li_height),10)) + ")");\r
++                                                      // ref.children("a")[e.type === "select_node" ? "addClass" : "removeClass"]("jstree-clicked");\r
++                                                      ref.children("a").attr("class",data.rslt.obj.children("a").attr("class"));\r
++                                              });\r
++                                      }, this))\r
++                              .bind("hover_node.jstree dehover_node.jstree", $.proxy(function (e, data) { \r
++                                              this.get_container().find(" > .jstree-wholerow .jstree-hovered").removeClass("jstree-hovered " + (this.data.themeroller ? this._get_settings().themeroller.item_h : "" ));\r
++                                              if(e.type === "hover_node") {\r
++                                                      var ref = this.get_container().find(" > .jstree-wholerow li:visible:eq(" + ( parseInt(((data.rslt.obj.offset().top - this.get_container().offset().top + this.get_container()[0].scrollTop) / this.data.core.li_height),10)) + ")");\r
++                                                      // ref.children("a").addClass("jstree-hovered");\r
++                                                      ref.children("a").attr("class",data.rslt.obj.children(".jstree-hovered").attr("class"));\r
++                                              }\r
++                                      }, this))\r
++                              .delegate(".jstree-wholerow-span, ins.jstree-icon, li", "click.jstree", function (e) {\r
++                                              var n = $(e.currentTarget);\r
++                                              if(e.target.tagName === "A" || (e.target.tagName === "INS" && n.closest("li").is(".jstree-open, .jstree-closed"))) { return; }\r
++                                              n.closest("li").children("a:visible:eq(0)").click();\r
++                                              e.stopImmediatePropagation();\r
++                                      })\r
++                              .delegate("li", "mouseover.jstree", $.proxy(function (e) {\r
++                                              e.stopImmediatePropagation();\r
++                                              if($(e.currentTarget).children(".jstree-hovered, .jstree-clicked").length) { return false; }\r
++                                              this.hover_node(e.currentTarget);\r
++                                              return false;\r
++                                      }, this))\r
++                              .delegate("li", "mouseleave.jstree", $.proxy(function (e) {\r
++                                              if($(e.currentTarget).children("a").hasClass("jstree-hovered").length) { return; }\r
++                                              this.dehover_node(e.currentTarget);\r
++                                      }, this));\r
++                      if(is_ie7 || is_ie6) {\r
++                              $.vakata.css.add_sheet({ str : ".jstree-" + this.get_index() + " { position:relative; } ", title : "jstree" });\r
++                      }\r
++              },\r
++              defaults : {\r
++              },\r
++              __destroy : function () {\r
++                      this.get_container().children(".jstree-wholerow").remove();\r
++                      this.get_container().find(".jstree-wholerow-span").remove();\r
++              },\r
++              _fn : {\r
++                      _prepare_wholerow_span : function (obj) {\r
++                              obj = !obj || obj == -1 ? this.get_container().find("> ul > li") : this._get_node(obj);\r
++                              if(obj === false) { return; } // added for removing root nodes\r
++                              obj.each(function () {\r
++                                      $(this).find("li").andSelf().each(function () {\r
++                                              var $t = $(this);\r
++                                              if($t.children(".jstree-wholerow-span").length) { return true; }\r
++                                              $t.prepend("<span class='jstree-wholerow-span' style='width:" + ($t.parentsUntil(".jstree","li").length * 18) + "px;'>&#160;</span>");\r
++                                      });\r
++                              });\r
++                      },\r
++                      _prepare_wholerow_ul : function () {\r
++                              var o = this.get_container().children("ul").eq(0), h = o.html();\r
++                              o.addClass("jstree-wholerow-real");\r
++                              if(this.data.wholerow.last_html !== h) {\r
++                                      this.data.wholerow.last_html = h;\r
++                                      this.get_container().children(".jstree-wholerow").remove();\r
++                                      this.get_container().append(\r
++                                              o.clone().removeClass("jstree-wholerow-real")\r
++                                                      .wrapAll("<div class='jstree-wholerow' />").parent()\r
++                                                      .width(o.parent()[0].scrollWidth)\r
++                                                      .css("top", (o.height() + ( is_ie7 ? 5 : 0)) * -1 )\r
++                                                      .find("li[id]").each(function () { this.removeAttribute("id"); }).end()\r
++                                      );\r
++                              }\r
++                      }\r
++              }\r
++      });\r
++      $(function() {\r
++              var css_string = '' + \r
++                      '.jstree .jstree-wholerow-real { position:relative; z-index:1; } ' + \r
++                      '.jstree .jstree-wholerow-real li { cursor:pointer; } ' + \r
++                      '.jstree .jstree-wholerow-real a { border-left-color:transparent !important; border-right-color:transparent !important; } ' + \r
++                      '.jstree .jstree-wholerow { position:relative; z-index:0; height:0; } ' + \r
++                      '.jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { width:100%; } ' + \r
++                      '.jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li, .jstree .jstree-wholerow a { margin:0 !important; padding:0 !important; } ' + \r
++                      '.jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { background:transparent !important; }' + \r
++                      '.jstree .jstree-wholerow ins, .jstree .jstree-wholerow span, .jstree .jstree-wholerow input { display:none !important; }' + \r
++                      '.jstree .jstree-wholerow a, .jstree .jstree-wholerow a:hover { text-indent:-9999px; !important; width:100%; padding:0 !important; border-right-width:0px !important; border-left-width:0px !important; } ' + \r
++                      '.jstree .jstree-wholerow-span { position:absolute; left:0; margin:0px; padding:0; height:18px; border-width:0; padding:0; z-index:0; }';\r
++              if(is_ff2) {\r
++                      css_string += '' + \r
++                              '.jstree .jstree-wholerow a { display:block; height:18px; margin:0; padding:0; border:0; } ' + \r
++                              '.jstree .jstree-wholerow-real a { border-color:transparent !important; } ';\r
++              }\r
++              if(is_ie7 || is_ie6) {\r
++                      css_string += '' + \r
++                              '.jstree .jstree-wholerow, .jstree .jstree-wholerow li, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow a { margin:0; padding:0; line-height:18px; } ' + \r
++                              '.jstree .jstree-wholerow a { display:block; height:18px; line-height:18px; overflow:hidden; } ';\r
++              }\r
++              $.vakata.css.add_sheet({ str : css_string, title : "jstree" });\r
++      });\r
++})(jQuery);\r
++//*/\r
++\r
++/*\r
++* jsTree model plugin\r
++* This plugin gets jstree to use a class model to retrieve data, creating great dynamism\r
++*/\r
++(function ($) {\r
++      var nodeInterface = ["getChildren","getChildrenCount","getAttr","getName","getProps"],\r
++              validateInterface = function(obj, inter) {\r
++                      var valid = true;\r
++                      obj = obj || {};\r
++                      inter = [].concat(inter);\r
++                      $.each(inter, function (i, v) {\r
++                              if(!$.isFunction(obj[v])) { valid = false; return false; }\r
++                      });\r
++                      return valid;\r
++              };\r
++      $.jstree.plugin("model", {\r
++              __init : function () {\r
++                      if(!this.data.json_data) { throw "jsTree model: jsTree json_data plugin not included."; }\r
++                      this._get_settings().json_data.data = function (n, b) {\r
++                              var obj = (n == -1) ? this._get_settings().model.object : n.data("jstree_model");\r
++                              if(!validateInterface(obj, nodeInterface)) { return b.call(null, false); }\r
++                              if(this._get_settings().model.async) {\r
++                                      obj.getChildren($.proxy(function (data) {\r
++                                              this.model_done(data, b);\r
++                                      }, this));\r
++                              }\r
++                              else {\r
++                                      this.model_done(obj.getChildren(), b);\r
++                              }\r
++                      };\r
++              },\r
++              defaults : {\r
++                      object : false,\r
++                      id_prefix : false,\r
++                      async : false\r
++              },\r
++              _fn : {\r
++                      model_done : function (data, callback) {\r
++                              var ret = [], \r
++                                      s = this._get_settings(),\r
++                                      _this = this;\r
++\r
++                              if(!$.isArray(data)) { data = [data]; }\r
++                              $.each(data, function (i, nd) {\r
++                                      var r = nd.getProps() || {};\r
++                                      r.attr = nd.getAttr() || {};\r
++                                      if(nd.getChildrenCount()) { r.state = "closed"; }\r
++                                      r.data = nd.getName();\r
++                                      if(!$.isArray(r.data)) { r.data = [r.data]; }\r
++                                      if(_this.data.types && $.isFunction(nd.getType)) {\r
++                                              r.attr[s.types.type_attr] = nd.getType();\r
++                                      }\r
++                                      if(r.attr.id && s.model.id_prefix) { r.attr.id = s.model.id_prefix + r.attr.id; }\r
++                                      if(!r.metadata) { r.metadata = { }; }\r
++                                      r.metadata.jstree_model = nd;\r
++                                      ret.push(r);\r
++                              });\r
++                              callback.call(null, ret);\r
++                      }\r
++              }\r
++      });\r
++})(jQuery);\r
++//*/\r
++\r
++})();
+\ No newline at end of file
+diff -up cacti-0.8.8a/include/js/jquery/jquery.tablednd.js.legal cacti-0.8.8a/include/js/jquery/jquery.tablednd.js
+--- cacti-0.8.8a/include/js/jquery/jquery.tablednd.js.legal    2013-01-04 15:44:38.038416075 -0500
++++ cacti-0.8.8a/include/js/jquery/jquery.tablednd.js  2013-01-04 15:43:12.645377988 -0500
+@@ -0,0 +1,382 @@
++/**
++ * TableDnD plug-in for JQuery, allows you to drag and drop table rows
++ * You can set up various options to control how the system will work
++ * Copyright (c) Denis Howlett <denish@isocra.com>
++ * Licensed like jQuery, see http://docs.jquery.com/License.
++ *
++ * Configuration options:
++ *
++ * onDragStyle
++ *     This is the style that is assigned to the row during drag. There are limitations to the styles that can be
++ *     associated with a row (such as you can't assign a border--well you can, but it won't be
++ *     displayed). (So instead consider using onDragClass.) The CSS style to apply is specified as
++ *     a map (as used in the jQuery css(...) function).
++ * onDropStyle
++ *     This is the style that is assigned to the row when it is dropped. As for onDragStyle, there are limitations
++ *     to what you can do. Also this replaces the original style, so again consider using onDragClass which
++ *     is simply added and then removed on drop.
++ * onDragClass
++ *     This class is added for the duration of the drag and then removed when the row is dropped. It is more
++ *     flexible than using onDragStyle since it can be inherited by the row cells and other content. The default
++ *     is class is tDnD_whileDrag. So to use the default, simply customise this CSS class in your
++ *     stylesheet.
++ * onDrop
++ *     Pass a function that will be called when the row is dropped. The function takes 2 parameters: the table
++ *     and the row that was dropped. You can work out the new order of the rows by using
++ *     table.rows.
++ * onDragStart
++ *     Pass a function that will be called when the user starts dragging. The function takes 2 parameters: the
++ *     table and the row which the user has started to drag.
++ * onAllowDrop
++ *     Pass a function that will be called as a row is over another row. If the function returns true, allow
++ *     dropping on that row, otherwise not. The function takes 2 parameters: the dragged row and the row under
++ *     the cursor. It returns a boolean: true allows the drop, false doesn't allow it.
++ * scrollAmount
++ *     This is the number of pixels to scroll if the user moves the mouse cursor to the top or bottom of the
++ *     window. The page should automatically scroll up or down as appropriate (tested in IE6, IE7, Safari, FF2,
++ *     FF3 beta
++ * dragHandle
++ *     This is the name of a class that you assign to one or more cells in each row that is draggable. If you
++ *     specify this class, then you are responsible for setting cursor: move in the CSS and only these cells
++ *     will have the drag behaviour. If you do not specify a dragHandle, then you get the old behaviour where
++ *     the whole row is draggable.
++ *
++ * Other ways to control behaviour:
++ *
++ * Add class="nodrop" to any rows for which you don't want to allow dropping, and class="nodrag" to any rows
++ * that you don't want to be draggable.
++ *
++ * Inside the onDrop method you can also call $.tableDnD.serialize() this returns a string of the form
++ * <tableID>[]=<rowID1>&<tableID>[]=<rowID2> so that you can send this back to the server. The table must have
++ * an ID as must all the rows.
++ *
++ * Other methods:
++ *
++ * $("...").tableDnDUpdate()
++ * Will update all the matching tables, that is it will reapply the mousedown method to the rows (or handle cells).
++ * This is useful if you have updated the table rows using Ajax and you want to make the table draggable again.
++ * The table maintains the original configuration (so you don't have to specify it again).
++ *
++ * $("...").tableDnDSerialize()
++ * Will serialize and return the serialized string as above, but for each of the matching tables--so it can be
++ * called from anywhere and isn't dependent on the currentTable being set up correctly before calling
++ *
++ * Known problems:
++ * - Auto-scoll has some problems with IE7  (it scrolls even when it shouldn't), work-around: set scrollAmount to 0
++ *
++ * Version 0.2: 2008-02-20 First public version
++ * Version 0.3: 2008-02-07 Added onDragStart option
++ *                         Made the scroll amount configurable (default is 5 as before)
++ * Version 0.4: 2008-03-15 Changed the noDrag/noDrop attributes to nodrag/nodrop classes
++ *                         Added onAllowDrop to control dropping
++ *                         Fixed a bug which meant that you couldn't set the scroll amount in both directions
++ *                         Added serialize method
++ * Version 0.5: 2008-05-16 Changed so that if you specify a dragHandle class it doesn't make the whole row
++ *                         draggable
++ *                         Improved the serialize method to use a default (and settable) regular expression.
++ *                         Added tableDnDupate() and tableDnDSerialize() to be called when you are outside the table
++ */
++jQuery.tableDnD = {
++    /** Keep hold of the current table being dragged */
++    currentTable : null,
++    /** Keep hold of the current drag object if any */
++    dragObject: null,
++    /** The current mouse offset */
++    mouseOffset: null,
++    /** Remember the old value of Y so that we don't do too much processing */
++    oldY: 0,
++
++    /** Actually build the structure */
++    build: function(options) {
++        // Set up the defaults if any
++
++        this.each(function() {
++            // This is bound to each matching table, set up the defaults and override with user options
++            this.tableDnDConfig = jQuery.extend({
++                onDragStyle: null,
++                onDropStyle: null,
++                              // Add in the default class for whileDragging
++                              onDragClass: "tDnD_whileDrag",
++                onDrop: null,
++                onDragStart: null,
++                scrollAmount: 5,
++                              serializeRegexp: /[^\_]*$/, // The regular expression to use to trim row IDs
++                              serializeParamName: null, // If you want to specify another parameter name instead of the table ID
++                dragHandle: null // If you give the name of a class here, then only Cells with this class will be draggable
++            }, options || {});
++            // Now make the rows draggable
++            jQuery.tableDnD.makeDraggable(this);
++        });
++
++        // Now we need to capture the mouse up and mouse move event
++        // We can use bind so that we don't interfere with other event handlers
++        jQuery(document)
++            .bind('mousemove', jQuery.tableDnD.mousemove)
++            .bind('mouseup', jQuery.tableDnD.mouseup);
++
++        // Don't break the chain
++        return this;
++    },
++
++    /** This function makes all the rows on the table draggable apart from those marked as "NoDrag" */
++    makeDraggable: function(table) {
++        var config = table.tableDnDConfig;
++              if (table.tableDnDConfig.dragHandle) {
++                      // We only need to add the event to the specified cells
++                      var cells = jQuery("td."+table.tableDnDConfig.dragHandle, table);
++                      cells.each(function() {
++                              // The cell is bound to "this"
++                jQuery(this).mousedown(function(ev) {
++                    jQuery.tableDnD.dragObject = this.parentNode;
++                    jQuery.tableDnD.currentTable = table;
++                    jQuery.tableDnD.mouseOffset = jQuery.tableDnD.getMouseOffset(this, ev);
++                    if (config.onDragStart) {
++                        // Call the onDrop method if there is one
++                        config.onDragStart(table, this);
++                    }
++                    return false;
++                });
++                      })
++              } else {
++                      // For backwards compatibility, we add the event to the whole row
++              var rows = jQuery("tr", table); // get all the rows as a wrapped set
++              rows.each(function() {
++                              // Iterate through each row, the row is bound to "this"
++                              var row = jQuery(this);
++                              if (! row.hasClass("nodrag")) {
++                      row.mousedown(function(ev) {
++                          if (ev.target.tagName == "TD") {
++                              jQuery.tableDnD.dragObject = this;
++                              jQuery.tableDnD.currentTable = table;
++                              jQuery.tableDnD.mouseOffset = jQuery.tableDnD.getMouseOffset(this, ev);
++                              if (config.onDragStart) {
++                                  // Call the onDrop method if there is one
++                                  config.onDragStart(table, this);
++                              }
++                              return false;
++                          }
++                      }).css("cursor", "move"); // Store the tableDnD object
++                              }
++                      });
++              }
++      },
++
++      updateTables: function() {
++              this.each(function() {
++                      // this is now bound to each matching table
++                      if (this.tableDnDConfig) {
++                              jQuery.tableDnD.makeDraggable(this);
++                      }
++              })
++      },
++
++    /** Get the mouse coordinates from the event (allowing for browser differences) */
++    mouseCoords: function(ev){
++        if(ev.pageX || ev.pageY){
++            return {x:ev.pageX, y:ev.pageY};
++        }
++        return {
++            x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
++            y:ev.clientY + document.body.scrollTop  - document.body.clientTop
++        };
++    },
++
++    /** Given a target element and a mouse event, get the mouse offset from that element.
++        To do this we need the element's position and the mouse position */
++    getMouseOffset: function(target, ev) {
++        ev = ev || window.event;
++
++        var docPos    = this.getPosition(target);
++        var mousePos  = this.mouseCoords(ev);
++        return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
++    },
++
++    /** Get the position of an element by going up the DOM tree and adding up all the offsets */
++    getPosition: function(e){
++        var left = 0;
++        var top  = 0;
++        /** Safari fix -- thanks to Luis Chato for this! */
++        if (e.offsetHeight == 0) {
++            /** Safari 2 doesn't correctly grab the offsetTop of a table row
++            this is detailed here:
++            http://jacob.peargrove.com/blog/2006/technical/table-row-offsettop-bug-in-safari/
++            the solution is likewise noted there, grab the offset of a table cell in the row - the firstChild.
++            note that firefox will return a text node as a first child, so designing a more thorough
++            solution may need to take that into account, for now this seems to work in firefox, safari, ie */
++            e = e.firstChild; // a table cell
++        }
++
++        while (e.offsetParent){
++            left += e.offsetLeft;
++            top  += e.offsetTop;
++            e     = e.offsetParent;
++        }
++
++        left += e.offsetLeft;
++        top  += e.offsetTop;
++
++        return {x:left, y:top};
++    },
++
++    mousemove: function(ev) {
++        if (jQuery.tableDnD.dragObject == null) {
++            return;
++        }
++
++        var dragObj = jQuery(jQuery.tableDnD.dragObject);
++        var config = jQuery.tableDnD.currentTable.tableDnDConfig;
++        var mousePos = jQuery.tableDnD.mouseCoords(ev);
++        var y = mousePos.y - jQuery.tableDnD.mouseOffset.y;
++        //auto scroll the window
++          var yOffset = window.pageYOffset;
++              if (document.all) {
++              // Windows version
++              //yOffset=document.body.scrollTop;
++              if (typeof document.compatMode != 'undefined' &&
++                   document.compatMode != 'BackCompat') {
++                 yOffset = document.documentElement.scrollTop;
++              }
++              else if (typeof document.body != 'undefined') {
++                 yOffset=document.body.scrollTop;
++              }
++
++          }
++
++              if (mousePos.y-yOffset < config.scrollAmount) {
++              window.scrollBy(0, -config.scrollAmount);
++          } else {
++            var windowHeight = window.innerHeight ? window.innerHeight
++                    : document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight;
++            if (windowHeight-(mousePos.y-yOffset) < config.scrollAmount) {
++                window.scrollBy(0, config.scrollAmount);
++            }
++        }
++
++
++        if (y != jQuery.tableDnD.oldY) {
++            // work out if we're going up or down...
++            var movingDown = y > jQuery.tableDnD.oldY;
++            // update the old value
++            jQuery.tableDnD.oldY = y;
++            // update the style to show we're dragging
++                      if (config.onDragClass) {
++                              dragObj.addClass(config.onDragClass);
++                      } else {
++                  dragObj.css(config.onDragStyle);
++                      }
++            // If we're over a row then move the dragged row to there so that the user sees the
++            // effect dynamically
++            var currentRow = jQuery.tableDnD.findDropTargetRow(dragObj, y);
++            if (currentRow) {
++                // TODO worry about what happens when there are multiple TBODIES
++                if (movingDown && jQuery.tableDnD.dragObject != currentRow) {
++                    jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject, currentRow.nextSibling);
++                } else if (! movingDown && jQuery.tableDnD.dragObject != currentRow) {
++                    jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject, currentRow);
++                }
++            }
++        }
++
++        return false;
++    },
++
++    /** We're only worried about the y position really, because we can only move rows up and down */
++    findDropTargetRow: function(draggedRow, y) {
++        var rows = jQuery.tableDnD.currentTable.rows;
++        for (var i=0; i<rows.length; i++) {
++            var row = rows[i];
++            var rowY    = this.getPosition(row).y;
++            var rowHeight = parseInt(row.offsetHeight)/2;
++            if (row.offsetHeight == 0) {
++                rowY = this.getPosition(row.firstChild).y;
++                rowHeight = parseInt(row.firstChild.offsetHeight)/2;
++            }
++            // Because we always have to insert before, we need to offset the height a bit
++            if ((y > rowY - rowHeight) && (y < (rowY + rowHeight))) {
++                // that's the row we're over
++                              // If it's the same as the current row, ignore it
++                              if (row == draggedRow) {return null;}
++                var config = jQuery.tableDnD.currentTable.tableDnDConfig;
++                if (config.onAllowDrop) {
++                    if (config.onAllowDrop(draggedRow, row)) {
++                        return row;
++                    } else {
++                        return null;
++                    }
++                } else {
++                                      // If a row has nodrop class, then don't allow dropping (inspired by John Tarr and Famic)
++                    var nodrop = jQuery(row).hasClass("nodrop");
++                    if (! nodrop) {
++                        return row;
++                    } else {
++                        return null;
++                    }
++                }
++                return row;
++            }
++        }
++        return null;
++    },
++
++    mouseup: function(e) {
++        if (jQuery.tableDnD.currentTable && jQuery.tableDnD.dragObject) {
++            var droppedRow = jQuery.tableDnD.dragObject;
++            var config = jQuery.tableDnD.currentTable.tableDnDConfig;
++            // If we have a dragObject, then we need to release it,
++            // The row will already have been moved to the right place so we just reset stuff
++                      if (config.onDragClass) {
++                  jQuery(droppedRow).removeClass(config.onDragClass);
++                      } else {
++                  jQuery(droppedRow).css(config.onDropStyle);
++                      }
++            jQuery.tableDnD.dragObject   = null;
++            if (config.onDrop) {
++                // Call the onDrop method if there is one
++                config.onDrop(jQuery.tableDnD.currentTable, droppedRow);
++            }
++            jQuery.tableDnD.currentTable = null; // let go of the table too
++        }
++    },
++
++    serialize: function() {
++        if (jQuery.tableDnD.currentTable) {
++            return jQuery.tableDnD.serializeTable(jQuery.tableDnD.currentTable);
++        } else {
++            return "Error: No Table id set, you need to set an id on your table and every row";
++        }
++    },
++
++      serializeTable: function(table) {
++        var result = "";
++        var tableId = table.id;
++        var rows = table.rows;
++        for (var i=0; i<rows.length; i++) {
++            if (result.length > 0) result += "&";
++            var rowId = rows[i].id;
++            if (rowId && rowId && table.tableDnDConfig && table.tableDnDConfig.serializeRegexp) {
++                rowId = rowId.match(table.tableDnDConfig.serializeRegexp)[0];
++            }
++
++            result += tableId + '[]=' + rowId;
++        }
++        return result;
++      },
++
++      serializeTables: function() {
++        var result = "";
++        this.each(function() {
++                      // this is now bound to each matching table
++                      result += jQuery.tableDnD.serializeTable(this);
++              });
++        return result;
++    }
++
++}
++
++jQuery.fn.extend(
++      {
++              tableDnD : jQuery.tableDnD.build,
++              tableDnDUpdate : jQuery.tableDnD.updateTables,
++              tableDnDSerialize: jQuery.tableDnD.serializeTables
++      }
++);
+\ No newline at end of file
+diff -up cacti-0.8.8a/include/js/jquery/jquery.timepicker.js.legal cacti-0.8.8a/include/js/jquery/jquery.timepicker.js
+--- cacti-0.8.8a/include/js/jquery/jquery.timepicker.js.legal  2013-01-04 15:44:38.041416077 -0500
++++ cacti-0.8.8a/include/js/jquery/jquery.timepicker.js        2013-01-04 15:43:12.645377988 -0500
+@@ -0,0 +1,1060 @@
++/*
++* jQuery timepicker addon
++* By: Trent Richardson [http://trentrichardson.com]
++* Version 0.9.6
++* Last Modified: 07/20/2011
++*
++* Copyright 2011 Trent Richardson
++* Dual licensed under the MIT and GPL licenses.
++* http://trentrichardson.com/Impromptu/GPL-LICENSE.txt
++* http://trentrichardson.com/Impromptu/MIT-LICENSE.txt
++*
++* HERES THE CSS:
++* .ui-timepicker-div .ui-widget-header{ margin-bottom: 8px; }
++* .ui-timepicker-div dl{ text-align: left; }
++* .ui-timepicker-div dl dt{ height: 25px; }
++* .ui-timepicker-div dl dd{ margin: -25px 10px 10px 65px; }
++* .ui-timepicker-div td { font-size: 90%; }
++*/
++
++(function($) {
++
++$.extend($.ui, { timepicker: { version: "0.9.6" } });
++
++/* Time picker manager.
++   Use the singleton instance of this class, $.timepicker, to interact with the time picker.
++   Settings for (groups of) time pickers are maintained in an instance object,
++   allowing multiple different settings on the same page. */
++
++function Timepicker() {
++      this.regional = []; // Available regional settings, indexed by language code
++      this.regional[''] = { // Default regional settings
++              currentText: 'Now',
++              closeText: 'Done',
++              ampm: false,
++              timeFormat: 'hh:mm tt',
++              timeSuffix: '',
++              timeOnlyTitle: 'Choose Time',
++              timeText: 'Time',
++              hourText: 'Hour',
++              minuteText: 'Minute',
++              secondText: 'Second',
++              timezoneText: 'Time Zone'
++      };
++      this._defaults = { // Global defaults for all the datetime picker instances
++              showButtonPanel: true,
++              timeOnly: false,
++              showHour: true,
++              showMinute: true,
++              showSecond: false,
++              showTimezone: false,
++              showTime: true,
++              stepHour: 0.05,
++              stepMinute: 0.05,
++              stepSecond: 0.05,
++              hour: 0,
++              minute: 0,
++              second: 0,
++              timezone: '+0000',
++              hourMin: 0,
++              minuteMin: 0,
++              secondMin: 0,
++              hourMax: 23,
++              minuteMax: 59,
++              secondMax: 59,
++              minDateTime: null,
++              maxDateTime: null,
++              hourGrid: 0,
++              minuteGrid: 0,
++              secondGrid: 0,
++              alwaysSetTime: true,
++              separator: ' ',
++              altFieldTimeOnly: true,
++              showTimepicker: true,
++              timezoneList: ["-1100", "-1000", "-0900", "-0800", "-0700", "-0600",
++                             "-0500", "-0400", "-0300", "-0200", "-0100", "+0000",
++                             "+0100", "+0200", "+0300", "+0400", "+0500", "+0600",
++                             "+0700", "+0800", "+0900", "+1000", "+1100", "+1200"]
++      };
++      $.extend(this._defaults, this.regional['']);
++}
++
++$.extend(Timepicker.prototype, {
++      $input: null,
++      $altInput: null,
++      $timeObj: null,
++      inst: null,
++      hour_slider: null,
++      minute_slider: null,
++      second_slider: null,
++      timezone_select: null,
++      hour: 0,
++      minute: 0,
++      second: 0,
++      timezone: '+0000',
++      hourMinOriginal: null,
++      minuteMinOriginal: null,
++      secondMinOriginal: null,
++      hourMaxOriginal: null,
++      minuteMaxOriginal: null,
++      secondMaxOriginal: null,
++      ampm: '',
++      formattedDate: '',
++      formattedTime: '',
++      formattedDateTime: '',
++      timezoneList: ["-1100", "-1000", "-0900", "-0800", "-0700", "-0600",
++                      "-0500", "-0400", "-0300", "-0200", "-0100", "+0000",
++                      "+0100", "+0200", "+0300", "+0400", "+0500", "+0600",
++                      "+0700", "+0800", "+0900", "+1000", "+1100", "+1200"],
++
++      /* Override the default settings for all instances of the time picker.
++         @param  settings  object - the new settings to use as defaults (anonymous object)
++         @return the manager object */
++      setDefaults: function(settings) {
++              extendRemove(this._defaults, settings || {});
++              return this;
++      },
++
++      //########################################################################
++      // Create a new Timepicker instance
++      //########################################################################
++      _newInst: function($input, o) {
++              var tp_inst = new Timepicker(),
++                      inlineSettings = {};
++
++              for (var attrName in this._defaults) {
++                      var attrValue = $input.attr('time:' + attrName);
++                      if (attrValue) {
++                              try {
++                                      inlineSettings[attrName] = eval(attrValue);
++                              } catch (err) {
++                                      inlineSettings[attrName] = attrValue;
++                              }
++                      }
++              }
++              tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, o, {
++                      beforeShow: function(input, dp_inst) {
++                              if ($.isFunction(o.beforeShow))
++                                      o.beforeShow(input, dp_inst, tp_inst);
++                      },
++                      onChangeMonthYear: function(year, month, dp_inst) {
++                              // Update the time as well : this prevents the time from disappearing from the $input field.
++                              tp_inst._updateDateTime(dp_inst);
++                              if ($.isFunction(o.onChangeMonthYear))
++                                      o.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst);
++                      },
++                      onClose: function(dateText, dp_inst) {
++                              if (tp_inst.timeDefined === true && $input.val() != '')
++                                      tp_inst._updateDateTime(dp_inst);
++                              if ($.isFunction(o.onClose))
++                                      o.onClose.call($input[0], dateText, dp_inst, tp_inst);
++                      },
++                      timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker');
++              });
++
++              tp_inst.hour = tp_inst._defaults.hour;
++              tp_inst.minute = tp_inst._defaults.minute;
++              tp_inst.second = tp_inst._defaults.second;
++              tp_inst.ampm = '';
++              tp_inst.$input = $input;
++
++              if (o.altField)
++                      tp_inst.$altInput = $(o.altField)
++                              .css({ cursor: 'pointer' })
++                              .focus(function(){ $input.trigger("focus"); });
++
++              // datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime..
++              if(tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date)
++                      tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime());
++              if(tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date)
++                      tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime());
++              if(tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date)
++                      tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime());
++              if(tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date)
++                      tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime());
++
++              return tp_inst;
++      },
++
++      //########################################################################
++      // add our sliders to the calendar
++      //########################################################################
++      _addTimePicker: function(dp_inst) {
++              var currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ?
++                              this.$input.val() + ' ' + this.$altInput.val() :
++                              this.$input.val();
++
++              this.timeDefined = this._parseTime(currDT);
++              this._limitMinMaxDateTime(dp_inst, false);
++              this._injectTimePicker();
++      },
++
++      //########################################################################
++      // parse the time string from input value or _setTime
++      //########################################################################
++      _parseTime: function(timeString, withDate) {
++              var regstr = this._defaults.timeFormat.toString()
++                              .replace(/h{1,2}/ig, '(\\d?\\d)')
++                              .replace(/m{1,2}/ig, '(\\d?\\d)')
++                              .replace(/s{1,2}/ig, '(\\d?\\d)')
++                              .replace(/t{1,2}/ig, '(am|pm|a|p)?')
++                              .replace(/z{1}/ig, '((\\+|-)\\d\\d\\d\\d)?')
++                              .replace(/\s/g, '\\s?') + this._defaults.timeSuffix + '$',
++                      order = this._getFormatPositions(),
++                      treg;
++
++              if (!this.inst) this.inst = $.datepicker._getInst(this.$input[0]);
++
++              if (withDate || !this._defaults.timeOnly) {
++                      // the time should come after x number of characters and a space.
++                      // x = at least the length of text specified by the date format
++                      var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat');
++                      // escape special regex characters in the seperator
++                      var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g");
++                      regstr = '.{' + dp_dateFormat.length + ',}' + this._defaults.separator.replace(specials, "\\$&") + regstr;
++              }
++
++              treg = timeString.match(new RegExp(regstr, 'i'));
++
++              if (treg) {
++                      if (order.t !== -1)
++                              this.ampm = ((treg[order.t] === undefined || treg[order.t].length === 0) ?
++                                      '' :
++                                      (treg[order.t].charAt(0).toUpperCase() == 'A') ? 'AM' : 'PM').toUpperCase();
++
++                      if (order.h !== -1) {
++                              if (this.ampm == 'AM' && treg[order.h] == '12')
++                                      this.hour = 0; // 12am = 0 hour
++                              else if (this.ampm == 'PM' && treg[order.h] != '12')
++                                      this.hour = (parseFloat(treg[order.h]) + 12).toFixed(0); // 12pm = 12 hour, any other pm = hour + 12
++                              else this.hour = Number(treg[order.h]);
++                      }
++
++                      if (order.m !== -1) this.minute = Number(treg[order.m]);
++                      if (order.s !== -1) this.second = Number(treg[order.s]);
++                      if (order.z !== -1) this.timezone = treg[order.z];
++
++                      return true;
++
++              }
++              return false;
++      },
++
++      //########################################################################
++      // figure out position of time elements.. cause js cant do named captures
++      //########################################################################
++      _getFormatPositions: function() {
++              var finds = this._defaults.timeFormat.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|t{1,2}|z)/g),
++                      orders = { h: -1, m: -1, s: -1, t: -1, z: -1 };
++
++              if (finds)
++                      for (var i = 0; i < finds.length; i++)
++                              if (orders[finds[i].toString().charAt(0)] == -1)
++                                      orders[finds[i].toString().charAt(0)] = i + 1;
++
++              return orders;
++      },
++
++      //########################################################################
++      // generate and inject html for timepicker into ui datepicker
++      //########################################################################
++      _injectTimePicker: function() {
++              var $dp = this.inst.dpDiv,
++                      o = this._defaults,
++                      tp_inst = this,
++                      // Added by Peter Medeiros:
++                      // - Figure out what the hour/minute/second max should be based on the step values.
++                      // - Example: if stepMinute is 15, then minMax is 45.
++                      hourMax = (o.hourMax - (o.hourMax % o.stepHour)).toFixed(0),
++                      minMax  = (o.minuteMax - (o.minuteMax % o.stepMinute)).toFixed(0),
++                      secMax  = (o.secondMax - (o.secondMax % o.stepSecond)).toFixed(0),
++                      dp_id = this.inst.id.toString().replace(/([^A-Za-z0-9_])/g, '');
++
++              // Prevent displaying twice
++              //if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0) {
++              if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0 && o.showTimepicker) {
++                      var noDisplay = ' style="display:none;"',
++                              html =  '<div class="ui-timepicker-div" id="ui-timepicker-div-' + dp_id + '"><dl>' +
++                                              '<dt class="ui_tpicker_time_label" id="ui_tpicker_time_label_' + dp_id + '"' +
++                                              ((o.showTime) ? '' : noDisplay) + '>' + o.timeText + '</dt>' +
++                                              '<dd class="ui_tpicker_time" id="ui_tpicker_time_' + dp_id + '"' +
++                                              ((o.showTime) ? '' : noDisplay) + '></dd>' +
++                                              '<dt class="ui_tpicker_hour_label" id="ui_tpicker_hour_label_' + dp_id + '"' +
++                                              ((o.showHour) ? '' : noDisplay) + '>' + o.hourText + '</dt>',
++                              hourGridSize = 0,
++                              minuteGridSize = 0,
++                              secondGridSize = 0,
++                              size;
++
++                      if (o.showHour && o.hourGrid > 0) {
++                              html += '<dd class="ui_tpicker_hour">' +
++                                              '<div id="ui_tpicker_hour_' + dp_id + '"' + ((o.showHour)   ? '' : noDisplay) + '></div>' +
++                                              '<div style="padding-left: 1px"><table class="ui-tpicker-grid-label"><tr>';
++
++                              for (var h = o.hourMin; h <= hourMax; h += o.hourGrid) {
++                                      hourGridSize++;
++                                      var tmph = (o.ampm && h > 12) ? h-12 : h;
++                                      if (tmph < 10) tmph = '0' + tmph;
++                                      if (o.ampm) {
++                                              if (h == 0) tmph = 12 +'a';
++                                              else if (h < 12) tmph += 'a';
++                                              else tmph += 'p';
++                                      }
++                                      html += '<td>' + tmph + '</td>';
++                              }
++
++                              html += '</tr></table></div>' +
++                                              '</dd>';
++                      } else html += '<dd class="ui_tpicker_hour" id="ui_tpicker_hour_' + dp_id + '"' +
++                                                      ((o.showHour) ? '' : noDisplay) + '></dd>';
++
++                      html += '<dt class="ui_tpicker_minute_label" id="ui_tpicker_minute_label_' + dp_id + '"' +
++                                      ((o.showMinute) ? '' : noDisplay) + '>' + o.minuteText + '</dt>';
++
++                      if (o.showMinute && o.minuteGrid > 0) {
++                              html += '<dd class="ui_tpicker_minute ui_tpicker_minute_' + o.minuteGrid + '">' +
++                                              '<div id="ui_tpicker_minute_' + dp_id + '"' +
++                                              ((o.showMinute) ? '' : noDisplay) + '></div>' +
++                                              '<div style="padding-left: 1px"><table class="ui-tpicker-grid-label"><tr>';
++
++                              for (var m = o.minuteMin; m <= minMax; m += o.minuteGrid) {
++                                      minuteGridSize++;
++                                      html += '<td>' + ((m < 10) ? '0' : '') + m + '</td>';
++                              }
++
++                              html += '</tr></table></div>' +
++                                              '</dd>';
++                      } else html += '<dd class="ui_tpicker_minute" id="ui_tpicker_minute_' + dp_id + '"' +
++                                                      ((o.showMinute) ? '' : noDisplay) + '></dd>';
++
++                      html += '<dt class="ui_tpicker_second_label" id="ui_tpicker_second_label_' + dp_id + '"' +
++                                      ((o.showSecond) ? '' : noDisplay) + '>' + o.secondText + '</dt>';
++
++                      if (o.showSecond && o.secondGrid > 0) {
++                              html += '<dd class="ui_tpicker_second ui_tpicker_second_' + o.secondGrid + '">' +
++                                              '<div id="ui_tpicker_second_' + dp_id + '"' +
++                                              ((o.showSecond) ? '' : noDisplay) + '></div>' +
++                                              '<div style="padding-left: 1px"><table><tr>';
++
++                              for (var s = o.secondMin; s <= secMax; s += o.secondGrid) {
++                                      secondGridSize++;
++                                      html += '<td>' + ((s < 10) ? '0' : '') + s + '</td>';
++                              }
++
++                              html += '</tr></table></div>' +
++                                              '</dd>';
++                      } else html += '<dd class="ui_tpicker_second" id="ui_tpicker_second_' + dp_id + '"'     +
++                                                      ((o.showSecond) ? '' : noDisplay) + '></dd>';
++
++                      html += '<dt class="ui_tpicker_timezone_label" id="ui_tpicker_timezone_label_' + dp_id + '"' +
++                                      ((o.showTimezone) ? '' : noDisplay) + '>' + o.timezoneText + '</dt>';
++                      html += '<dd class="ui_tpicker_timezone" id="ui_tpicker_timezone_' + dp_id + '"'        +
++                                                      ((o.showTimezone) ? '' : noDisplay) + '></dd>';
++
++                      html += '</dl></div>';
++                      $tp = $(html);
++
++                              // if we only want time picker...
++                      if (o.timeOnly === true) {
++                              $tp.prepend(
++                                      '<div class="ui-widget-header ui-helper-clearfix ui-corner-all">' +
++                                              '<div class="ui-datepicker-title">' + o.timeOnlyTitle + '</div>' +
++                                      '</div>');
++                              $dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide();
++                      }
++
++                      this.hour_slider = $tp.find('#ui_tpicker_hour_'+ dp_id).slider({
++                              orientation: "horizontal",
++                              value: this.hour,
++                              min: o.hourMin,
++                              max: hourMax,
++                              step: o.stepHour,
++                              slide: function(event, ui) {
++                                      tp_inst.hour_slider.slider( "option", "value", ui.value);
++                                      tp_inst._onTimeChange();
++                              }
++                      });
++
++                      // Updated by Peter Medeiros:
++                      // - Pass in Event and UI instance into slide function
++                      this.minute_slider = $tp.find('#ui_tpicker_minute_'+ dp_id).slider({
++                              orientation: "horizontal",
++                              value: this.minute,
++                              min: o.minuteMin,
++                              max: minMax,
++                              step: o.stepMinute,
++                              slide: function(event, ui) {
++                                      // update the global minute slider instance value with the current slider value
++                                      tp_inst.minute_slider.slider( "option", "value", ui.value);
++                                      tp_inst._onTimeChange();
++                              }
++                      });
++
++                      this.second_slider = $tp.find('#ui_tpicker_second_'+ dp_id).slider({
++                              orientation: "horizontal",
++                              value: this.second,
++                              min: o.secondMin,
++                              max: secMax,
++                              step: o.stepSecond,
++                              slide: function(event, ui) {
++                                      tp_inst.second_slider.slider( "option", "value", ui.value);
++                                      tp_inst._onTimeChange();
++                              }
++                      });
++
++
++                      this.timezone_select = $tp.find('#ui_tpicker_timezone_'+ dp_id).append('<select></select>').find("select");
++                      $.fn.append.apply(this.timezone_select,
++                              $.map(o.timezoneList, function(val, idx) {
++                                      return $("<option />")
++                                              .val(typeof val == "object" ? val.value : val)
++                                              .text(typeof val == "object" ? val.label : val);
++                              })
++                      );
++                      this.timezone_select.val((typeof this.timezone != "undefined" && this.timezone != null && this.timezone != "") ? this.timezone : o.timezone);
++                      this.timezone_select.change(function() {
++                              tp_inst._onTimeChange();
++                      });
++
++                      // Add grid functionality
++                      if (o.showHour && o.hourGrid > 0) {
++                              size = 100 * hourGridSize * o.hourGrid / (hourMax - o.hourMin);
++
++                              $tp.find(".ui_tpicker_hour table").css({
++                                      width: size + "%",
++                                      marginLeft: (size / (-2 * hourGridSize)) + "%",
++                                      borderCollapse: 'collapse'
++                              }).find("td").each( function(index) {
++                                      $(this).click(function() {
++                                              var h = $(this).html();
++                                              if(o.ampm)      {
++                                                      var ap = h.substring(2).toLowerCase(),
++                                                              aph = parseInt(h.substring(0,2), 10);
++                                                      if (ap == 'a') {
++                                                              if (aph == 12) h = 0;
++                                                              else h = aph;
++                                                      } else if (aph == 12) h = 12;
++                                                      else h = aph + 12;
++                                              }
++                                              tp_inst.hour_slider.slider("option", "value", h);
++                                              tp_inst._onTimeChange();
++                                              tp_inst._onSelectHandler();
++                                      }).css({
++                                              cursor: 'pointer',
++                                              width: (100 / hourGridSize) + '%',
++                                              textAlign: 'center',
++                                              overflow: 'hidden'
++                                      });
++                              });
++                      }
++
++                      if (o.showMinute && o.minuteGrid > 0) {
++                              size = 100 * minuteGridSize * o.minuteGrid / (minMax - o.minuteMin);
++                              $tp.find(".ui_tpicker_minute table").css({
++                                      width: size + "%",
++                                      marginLeft: (size / (-2 * minuteGridSize)) + "%",
++                                      borderCollapse: 'collapse'
++                              }).find("td").each(function(index) {
++                                      $(this).click(function() {
++                                              tp_inst.minute_slider.slider("option", "value", $(this).html());
++                                              tp_inst._onTimeChange();
++                                              tp_inst._onSelectHandler();
++                                      }).css({
++                                              cursor: 'pointer',
++                                              width: (100 / minuteGridSize) + '%',
++                                              textAlign: 'center',
++                                              overflow: 'hidden'
++                                      });
++                              });
++                      }
++
++                      if (o.showSecond && o.secondGrid > 0) {
++                              $tp.find(".ui_tpicker_second table").css({
++                                      width: size + "%",
++                                      marginLeft: (size / (-2 * secondGridSize)) + "%",
++                                      borderCollapse: 'collapse'
++                              }).find("td").each(function(index) {
++                                      $(this).click(function() {
++                                              tp_inst.second_slider.slider("option", "value", $(this).html());
++                                              tp_inst._onTimeChange();
++                                              tp_inst._onSelectHandler();
++                                      }).css({
++                                              cursor: 'pointer',
++                                              width: (100 / secondGridSize) + '%',
++                                              textAlign: 'center',
++                                              overflow: 'hidden'
++                                      });
++                              });
++                      }
++
++                      var $buttonPanel = $dp.find('.ui-datepicker-buttonpane');
++                      if ($buttonPanel.length) $buttonPanel.before($tp);
++                      else $dp.append($tp);
++
++                      this.$timeObj = $tp.find('#ui_tpicker_time_'+ dp_id);
++
++                      if (this.inst !== null) {
++                              var timeDefined = this.timeDefined;
++                              this._onTimeChange();
++                              this.timeDefined = timeDefined;
++                      }
++
++                      //Emulate datepicker onSelect behavior. Call on slidestop.
++                      var onSelectDelegate = function() {
++                              tp_inst._onSelectHandler();
++                      };
++                      this.hour_slider.bind('slidestop',onSelectDelegate);
++                      this.minute_slider.bind('slidestop',onSelectDelegate);
++                      this.second_slider.bind('slidestop',onSelectDelegate);
++              }
++      },
++
++      //########################################################################
++      // This function tries to limit the ability to go outside the
++      // min/max date range
++      //########################################################################
++      _limitMinMaxDateTime: function(dp_inst, adjustSliders){
++              var o = this._defaults,
++                      dp_date = new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay);
++
++              if(!this._defaults.showTimepicker) return; // No time so nothing to check here
++
++              if($.datepicker._get(dp_inst, 'minDateTime') !== null && dp_date){
++                      var minDateTime = $.datepicker._get(dp_inst, 'minDateTime'),
++                              minDateTimeDate = new Date(minDateTime.getFullYear(), minDateTime.getMonth(), minDateTime.getDate(), 0, 0, 0, 0);
++
++                      if(this.hourMinOriginal === null || this.minuteMinOriginal === null || this.secondMinOriginal === null){
++                              this.hourMinOriginal = o.hourMin;
++                              this.minuteMinOriginal = o.minuteMin;
++                              this.secondMinOriginal = o.secondMin;
++                      }
++
++                      if(dp_inst.settings.timeOnly || minDateTimeDate.getTime() == dp_date.getTime()) {
++                              this._defaults.hourMin = minDateTime.getHours();
++                              if (this.hour <= this._defaults.hourMin) {
++                                      this.hour = this._defaults.hourMin;
++                                      this._defaults.minuteMin = minDateTime.getMinutes();
++                                      if (this.minute <= this._defaults.minuteMin) {
++                                              this.minute = this._defaults.minuteMin;
++                                              this._defaults.secondMin = minDateTime.getSeconds();
++                                      } else {
++                                              if(this.second < this._defaults.secondMin) this.second = this._defaults.secondMin;
++                                              this._defaults.secondMin = this.secondMinOriginal;
++                                      }
++                              } else {
++                                      this._defaults.minuteMin = this.minuteMinOriginal;
++                                      this._defaults.secondMin = this.secondMinOriginal;
++                              }
++                      }else{
++                              this._defaults.hourMin = this.hourMinOriginal;
++                              this._defaults.minuteMin = this.minuteMinOriginal;
++                              this._defaults.secondMin = this.secondMinOriginal;
++                      }
++              }
++
++              if($.datepicker._get(dp_inst, 'maxDateTime') !== null && dp_date){
++                      var maxDateTime = $.datepicker._get(dp_inst, 'maxDateTime'),
++                              maxDateTimeDate = new Date(maxDateTime.getFullYear(), maxDateTime.getMonth(), maxDateTime.getDate(), 0, 0, 0, 0);
++
++                      if(this.hourMaxOriginal === null || this.minuteMaxOriginal === null || this.secondMaxOriginal === null){
++                              this.hourMaxOriginal = o.hourMax;
++                              this.minuteMaxOriginal = o.minuteMax;
++                              this.secondMaxOriginal = o.secondMax;
++                      }
++
++                      if(dp_inst.settings.timeOnly || maxDateTimeDate.getTime() == dp_date.getTime()){
++                              this._defaults.hourMax = maxDateTime.getHours();
++                              if (this.hour >= this._defaults.hourMax) {
++                                      this.hour = this._defaults.hourMax;
++                                      this._defaults.minuteMax = maxDateTime.getMinutes();
++                                      if (this.minute >= this._defaults.minuteMax) {
++                                              this.minute = this._defaults.minuteMax;
++                                              this._defaults.secondMax = maxDateTime.getSeconds();
++                                      } else {
++                                              if(this.second > this._defaults.secondMax) this.second = this._defaults.secondMax;
++                                              this._defaults.secondMax = this.secondMaxOriginal;
++                                      }
++                              } else {
++                                      this._defaults.minuteMax = this.minuteMaxOriginal;
++                                      this._defaults.secondMax = this.secondMaxOriginal;
++                              }
++                      }else{
++                              this._defaults.hourMax = this.hourMaxOriginal;
++                              this._defaults.minuteMax = this.minuteMaxOriginal;
++                              this._defaults.secondMax = this.secondMaxOriginal;
++                      }
++              }
++
++              if(adjustSliders !== undefined && adjustSliders === true){
++                      var hourMax = (this._defaults.hourMax - (this._defaults.hourMax % this._defaults.stepHour)).toFixed(0),
++                              minMax  = (this._defaults.minuteMax - (this._defaults.minuteMax % this._defaults.stepMinute)).toFixed(0),
++                              secMax  = (this._defaults.secondMax - (this._defaults.secondMax % this._defaults.stepSecond)).toFixed(0);
++
++                      if(this.hour_slider)
++                              this.hour_slider.slider("option", { min: this._defaults.hourMin, max: hourMax }).slider('value', this.hour);
++                      if(this.minute_slider)
++                              this.minute_slider.slider("option", { min: this._defaults.minuteMin, max: minMax }).slider('value', this.minute);
++                      if(this.second_slider)
++                              this.second_slider.slider("option", { min: this._defaults.secondMin, max: secMax }).slider('value', this.second);
++              }
++
++      },
++
++
++      //########################################################################
++      // when a slider moves, set the internal time...
++      // on time change is also called when the time is updated in the text field
++      //########################################################################
++      _onTimeChange: function() {
++              var hour   = (this.hour_slider) ? this.hour_slider.slider('value') : false,
++                      minute = (this.minute_slider) ? this.minute_slider.slider('value') : false,
++                      second = (this.second_slider) ? this.second_slider.slider('value') : false,
++                      timezone = (this.timezone_select) ? this.timezone_select.val() : false;
++
++              if (typeof(hour) == 'object') hour = false;
++              if (typeof(minute) == 'object') minute = false;
++              if (typeof(second) == 'object') second = false;
++              if (typeof(timezone) == 'object') timezone = false;
++
++              if (hour !== false) hour = parseInt(hour,10);
++              if (minute !== false) minute = parseInt(minute,10);
++              if (second !== false) second = parseInt(second,10);
++
++              var ampm = (hour < 12) ? 'AM' : 'PM';
++
++              // If the update was done in the input field, the input field should not be updated.
++              // If the update was done using the sliders, update the input field.
++              var hasChanged = (hour != this.hour || minute != this.minute || second != this.second || (this.ampm.length > 0 && this.ampm != ampm) || timezone != this.timezone);
++
++              if (hasChanged) {
++
++                      if (hour !== false)this.hour = hour;
++                      if (minute !== false) this.minute = minute;
++                      if (second !== false) this.second = second;
++                      if (timezone !== false) this.timezone = timezone;
++
++                      if (!this.inst) this.inst = $.datepicker._getInst(this.$input[0]);
++
++                      this._limitMinMaxDateTime(this.inst, true);
++              }
++              if (this._defaults.ampm) this.ampm = ampm;
++
++              this._formatTime();
++              if (this.$timeObj) this.$timeObj.text(this.formattedTime + this._defaults.timeSuffix);
++              this.timeDefined = true;
++              if (hasChanged) this._updateDateTime();
++      },
++
++      //########################################################################
++      // call custom onSelect.
++      // bind to sliders slidestop, and grid click.
++      //########################################################################
++      _onSelectHandler: function() {
++              var onSelect = this._defaults['onSelect'];
++              var inputEl = this.$input ? this.$input[0] : null;
++              if (onSelect && inputEl) {
++                      onSelect.apply(inputEl, [this.formattedDateTime, this]);
++              }
++      },
++
++      //########################################################################
++      // format the time all pretty...
++      //########################################################################
++      _formatTime: function(time, format, ampm) {
++              if (ampm == undefined) ampm = this._defaults.ampm;
++              time = time || { hour: this.hour, minute: this.minute, second: this.second, ampm: this.ampm, timezone: this.timezone };
++              var tmptime = format || this._defaults.timeFormat.toString();
++
++              if (ampm) {
++                      var hour12 = ((time.ampm == 'AM') ? (time.hour) : (time.hour % 12));
++                      hour12 = (Number(hour12) === 0) ? 12 : hour12;
++                      tmptime = tmptime.toString()
++                              .replace(/hh/g, ((hour12 < 10) ? '0' : '') + hour12)
++                              .replace(/h/g, hour12)
++                              .replace(/mm/g, ((time.minute < 10) ? '0' : '') + time.minute)
++                              .replace(/m/g, time.minute)
++                              .replace(/ss/g, ((time.second < 10) ? '0' : '') + time.second)
++                              .replace(/s/g, time.second)
++                              .replace(/TT/g, time.ampm.toUpperCase())
++                              .replace(/Tt/g, time.ampm.toUpperCase())
++                              .replace(/tT/g, time.ampm.toLowerCase())
++                              .replace(/tt/g, time.ampm.toLowerCase())
++                              .replace(/T/g, time.ampm.charAt(0).toUpperCase())
++                              .replace(/t/g, time.ampm.charAt(0).toLowerCase())
++                              .replace(/z/g, time.timezone);
++              } else {
++                      tmptime = tmptime.toString()
++                              .replace(/hh/g, ((time.hour < 10) ? '0' : '') + time.hour)
++                              .replace(/h/g, time.hour)
++                              .replace(/mm/g, ((time.minute < 10) ? '0' : '') + time.minute)
++                              .replace(/m/g, time.minute)
++                              .replace(/ss/g, ((time.second < 10) ? '0' : '') + time.second)
++                              .replace(/s/g, time.second)
++                              .replace(/z/g, time.timezone);
++                      tmptime = $.trim(tmptime.replace(/t/gi, ''));
++              }
++
++              if (arguments.length) return tmptime;
++              else this.formattedTime = tmptime;
++      },
++
++      //########################################################################
++      // update our input with the new date time..
++      //########################################################################
++      _updateDateTime: function(dp_inst) {
++              dp_inst = this.inst || dp_inst,
++                      dt = new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay),
++                      dateFmt = $.datepicker._get(dp_inst, 'dateFormat'),
++                      formatCfg = $.datepicker._getFormatConfig(dp_inst),
++                      timeAvailable = dt !== null && this.timeDefined;
++              this.formattedDate = $.datepicker.formatDate(dateFmt, (dt === null ? new Date() : dt), formatCfg);
++              var formattedDateTime = this.formattedDate;
++              if (dp_inst.lastVal !== undefined && (dp_inst.lastVal.length > 0 && this.$input.val().length === 0))
++                      return;
++
++              if (this._defaults.timeOnly === true) {
++                      formattedDateTime = this.formattedTime;
++              } else if (this._defaults.timeOnly !== true && (this._defaults.alwaysSetTime || timeAvailable)) {
++                      formattedDateTime += this._defaults.separator + this.formattedTime + this._defaults.timeSuffix;
++              }
++
++              this.formattedDateTime = formattedDateTime;
++
++              if(!this._defaults.showTimepicker) {
++                      this.$input.val(this.formattedDate);
++              } else if (this.$altInput && this._defaults.altFieldTimeOnly === true) {
++                      this.$altInput.val(this.formattedTime);
++                      this.$input.val(this.formattedDate);
++              } else if(this.$altInput) {
++                      this.$altInput.val(formattedDateTime);
++                      this.$input.val(formattedDateTime);
++              } else {
++                      this.$input.val(formattedDateTime);
++              }
++
++              this.$input.trigger("change");
++      }
++
++});
++
++$.fn.extend({
++      //########################################################################
++      // shorthand just to use timepicker..
++      //########################################################################
++      timepicker: function(o) {
++              o = o || {};
++              var tmp_args = arguments;
++
++              if (typeof o == 'object') tmp_args[0] = $.extend(o, { timeOnly: true });
++
++              return $(this).each(function() {
++                      $.fn.datetimepicker.apply($(this), tmp_args);
++              });
++      },
++
++      //########################################################################
++      // extend timepicker to datepicker
++      //########################################################################
++      datetimepicker: function(o) {
++              o = o || {};
++              var $input = this,
++              tmp_args = arguments;
++
++              if (typeof(o) == 'string'){
++                      if(o == 'getDate')
++                              return $.fn.datepicker.apply($(this[0]), tmp_args);
++                      else
++                              return this.each(function() {
++                                      var $t = $(this);
++                                      $t.datepicker.apply($t, tmp_args);
++                              });
++              }
++              else
++                      return this.each(function() {
++                              var $t = $(this);
++                              $t.datepicker($.timepicker._newInst($t, o)._defaults);
++                      });
++      }
++});
++
++//########################################################################
++// the bad hack :/ override datepicker so it doesnt close on select
++// inspired: http://stackoverflow.com/questions/1252512/jquery-datepicker-prevent-closing-picker-when-clicking-a-date/1762378#1762378
++//########################################################################
++$.datepicker._base_selectDate = $.datepicker._selectDate;
++$.datepicker._selectDate = function (id, dateStr) {
++      var inst = this._getInst($(id)[0]),
++              tp_inst = this._get(inst, 'timepicker');
++
++      if (tp_inst) {
++              tp_inst._limitMinMaxDateTime(inst, true);
++              inst.inline = inst.stay_open = true;
++              //This way the onSelect handler called from calendarpicker get the full dateTime
++              this._base_selectDate(id, dateStr + tp_inst._defaults.separator + tp_inst.formattedTime + tp_inst._defaults.timeSuffix);
++              inst.inline = inst.stay_open = false;
++              this._notifyChange(inst);
++              this._updateDatepicker(inst);
++      }
++      else this._base_selectDate(id, dateStr);
++};
++
++//#############################################################################################
++// second bad hack :/ override datepicker so it triggers an event when changing the input field
++// and does not redraw the datepicker on every selectDate event
++//#############################################################################################
++$.datepicker._base_updateDatepicker = $.datepicker._updateDatepicker;
++$.datepicker._updateDatepicker = function(inst) {
++
++      // don't popup the datepicker if there is another instance already opened
++      var input = inst.input[0];
++      if($.datepicker._curInst &&
++         $.datepicker._curInst != inst &&
++         $.datepicker._datepickerShowing &&
++         $.datepicker._lastInput != input) {
++              return;
++      }
++
++      if (typeof(inst.stay_open) !== 'boolean' || inst.stay_open === false) {
++
++              this._base_updateDatepicker(inst);
++
++              // Reload the time control when changing something in the input text field.
++              var tp_inst = this._get(inst, 'timepicker');
++              if(tp_inst) tp_inst._addTimePicker(inst);
++      }
++};
++
++//#######################################################################################
++// third bad hack :/ override datepicker so it allows spaces and colon in the input field
++//#######################################################################################
++$.datepicker._base_doKeyPress = $.datepicker._doKeyPress;
++$.datepicker._doKeyPress = function(event) {
++      var inst = $.datepicker._getInst(event.target),
++              tp_inst = $.datepicker._get(inst, 'timepicker');
++
++      if (tp_inst) {
++              if ($.datepicker._get(inst, 'constrainInput')) {
++                      var ampm = tp_inst._defaults.ampm,
++                              dateChars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')),
++                              datetimeChars = tp_inst._defaults.timeFormat.toString()
++                                                              .replace(/[hms]/g, '')
++                                                              .replace(/TT/g, ampm ? 'APM' : '')
++                                                              .replace(/Tt/g, ampm ? 'AaPpMm' : '')
++                                                              .replace(/tT/g, ampm ? 'AaPpMm' : '')
++                                                              .replace(/T/g, ampm ? 'AP' : '')
++                                                              .replace(/tt/g, ampm ? 'apm' : '')
++                                                              .replace(/t/g, ampm ? 'ap' : '') +
++                                                              " " +
++                                                              tp_inst._defaults.separator +
++                                                              tp_inst._defaults.timeSuffix +
++                                                              (tp_inst._defaults.showTimezone ? tp_inst._defaults.timezoneList.join('') : '') +
++                                                              dateChars,
++                              chr = String.fromCharCode(event.charCode === undefined ? event.keyCode : event.charCode);
++                      return event.ctrlKey || (chr < ' ' || !dateChars || datetimeChars.indexOf(chr) > -1);
++              }
++      }
++
++      return $.datepicker._base_doKeyPress(event);
++};
++
++//#######################################################################################
++// Override key up event to sync manual input changes.
++//#######################################################################################
++$.datepicker._base_doKeyUp = $.datepicker._doKeyUp;
++$.datepicker._doKeyUp = function (event) {
++      var inst = $.datepicker._getInst(event.target),
++              tp_inst = $.datepicker._get(inst, 'timepicker');
++
++      if (tp_inst) {
++              if (tp_inst._defaults.timeOnly && (inst.input.val() != inst.lastVal)) {
++                      try {
++                              $.datepicker._updateDatepicker(inst);
++                      }
++                      catch (err) {
++                              $.datepicker.log(err);
++                      }
++              }
++      }
++
++      return $.datepicker._base_doKeyUp(event);
++};
++
++//#######################################################################################
++// override "Today" button to also grab the time.
++//#######################################################################################
++$.datepicker._base_gotoToday = $.datepicker._gotoToday;
++$.datepicker._gotoToday = function(id) {
++      this._base_gotoToday(id);
++      this._setTime(this._getInst($(id)[0]), new Date());
++};
++
++//#######################################################################################
++// Disable & enable the Time in the datetimepicker
++//#######################################################################################
++$.datepicker._disableTimepickerDatepicker = function(target, date, withDate) {
++      var inst = this._getInst(target),
++      tp_inst = this._get(inst, 'timepicker');
++      $(target).datepicker('getDate'); // Init selected[Year|Month|Day]
++      if (tp_inst) {
++              tp_inst._defaults.showTimepicker = false;
++              tp_inst._updateDateTime(inst);
++      }
++};
++
++$.datepicker._enableTimepickerDatepicker = function(target, date, withDate) {
++      var inst = this._getInst(target),
++      tp_inst = this._get(inst, 'timepicker');
++      $(target).datepicker('getDate'); // Init selected[Year|Month|Day]
++      if (tp_inst) {
++              tp_inst._defaults.showTimepicker = true;
++              tp_inst._addTimePicker(inst); // Could be disabled on page load
++              tp_inst._updateDateTime(inst);
++      }
++};
++
++//#######################################################################################
++// Create our own set time function
++//#######################################################################################
++$.datepicker._setTime = function(inst, date) {
++      var tp_inst = this._get(inst, 'timepicker');
++      if (tp_inst) {
++              var defaults = tp_inst._defaults,
++                      // calling _setTime with no date sets time to defaults
++                      hour = date ? date.getHours() : defaults.hour,
++                      minute = date ? date.getMinutes() : defaults.minute,
++                      second = date ? date.getSeconds() : defaults.second;
++
++              //check if within min/max times..
++              if ((hour < defaults.hourMin || hour > defaults.hourMax) || (minute < defaults.minuteMin || minute > defaults.minuteMax) || (second < defaults.secondMin || second > defaults.secondMax)) {
++                      hour = defaults.hourMin;
++                      minute = defaults.minuteMin;
++                      second = defaults.secondMin;
++              }
++
++              tp_inst.hour = hour;
++              tp_inst.minute = minute;
++              tp_inst.second = second;
++
++              if (tp_inst.hour_slider) tp_inst.hour_slider.slider('value', hour);
++              if (tp_inst.minute_slider) tp_inst.minute_slider.slider('value', minute);
++              if (tp_inst.second_slider) tp_inst.second_slider.slider('value', second);
++
++              tp_inst._onTimeChange();
++              tp_inst._updateDateTime(inst);
++      }
++};
++
++//#######################################################################################
++// Create new public method to set only time, callable as $().datepicker('setTime', date)
++//#######################################################################################
++$.datepicker._setTimeDatepicker = function(target, date, withDate) {
++      var inst = this._getInst(target),
++              tp_inst = this._get(inst, 'timepicker');
++
++      if (tp_inst) {
++              this._setDateFromField(inst);
++              var tp_date;
++              if (date) {
++                      if (typeof date == "string") {
++                              tp_inst._parseTime(date, withDate);
++                              tp_date = new Date();
++                              tp_date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second);
++                      }
++                      else tp_date = new Date(date.getTime());
++                      if (tp_date.toString() == 'Invalid Date') tp_date = undefined;
++                      this._setTime(inst, tp_date);
++              }
++      }
++
++};
++
++//#######################################################################################
++// override setDate() to allow setting time too within Date object
++//#######################################################################################
++$.datepicker._base_setDateDatepicker = $.datepicker._setDateDatepicker;
++$.datepicker._setDateDatepicker = function(target, date) {
++      var inst = this._getInst(target),
++      tp_date = (date instanceof Date) ? new Date(date.getTime()) : date;
++
++      this._updateDatepicker(inst);
++      this._base_setDateDatepicker.apply(this, arguments);
++      this._setTimeDatepicker(target, tp_date, true);
++};
++
++//#######################################################################################
++// override getDate() to allow getting time too within Date object
++//#######################################################################################
++$.datepicker._base_getDateDatepicker = $.datepicker._getDateDatepicker;
++$.datepicker._getDateDatepicker = function(target, noDefault) {
++      var inst = this._getInst(target),
++              tp_inst = this._get(inst, 'timepicker');
++
++      if (tp_inst) {
++              this._setDateFromField(inst, noDefault);
++              var date = this._getDate(inst);
++              if (date && tp_inst._parseTime($(target).val(), tp_inst.timeOnly)) date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second);
++              return date;
++      }
++      return this._base_getDateDatepicker(target, noDefault);
++};
++
++//#######################################################################################
++// override parseDate() because UI 1.8.14 throws an error about "Extra characters"
++// An option in datapicker to ignore extra format characters would be nicer.
++//#######################################################################################
++$.datepicker._base_parseDate = $.datepicker.parseDate;
++$.datepicker.parseDate = function(format, value, settings) {
++      var date;
++      try {
++              date = this._base_parseDate(format, value, settings);
++      } catch (err) {
++              // Hack!  The error message ends with a colon, a space, and
++              // the "extra" characters.  We rely on that instead of
++              // attempting to perfectly reproduce the parsing algorithm.
++              date = this._base_parseDate(format, value.substring(0,value.length-(err.length-err.indexOf(':')-2)), settings);
++      }
++      return date;
++};
++
++//#######################################################################################
++// override options setter to add time to maxDate(Time) and minDate(Time)
++//#######################################################################################
++$.datepicker._base_optionDatepicker = $.datepicker._optionDatepicker;
++$.datepicker._optionDatepicker = function(target, name, value) {
++      this._base_optionDatepicker(target, name, value);
++      var inst = this._getInst(target),
++              tp_inst = this._get(inst, 'timepicker');
++      if (tp_inst) {
++              //Set minimum and maximum date values if we have timepicker
++              if(name==='minDate') {
++              if(tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date)
++                              tp_inst._defaults.minDateTime = new Date(value);
++                      if(tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date)
++                              tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime());
++                      tp_inst._limitMinMaxDateTime(inst,true);
++              }
++              if(name==='maxDate') {
++                      if(tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date)
++                              tp_inst._defaults.maxDateTime = new Date(value);
++                      if(tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date)
++                              tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime());
++                      tp_inst._limitMinMaxDateTime(inst,true);
++              }
++      }
++};
++
++//#######################################################################################
++// jQuery extend now ignores nulls!
++//#######################################################################################
++function extendRemove(target, props) {
++      $.extend(target, props);
++      for (var name in props)
++              if (props[name] === null || props[name] === undefined)
++                      target[name] = props[name];
++      return target;
++}
++
++$.timepicker = new Timepicker(); // singleton instance
++$.timepicker.version = "0.9.6";
++
++})(jQuery);
+\ No newline at end of file
+diff -up cacti-0.8.8a/include/js/jquery/jquery-ui.js.legal cacti-0.8.8a/include/js/jquery/jquery-ui.js
+--- cacti-0.8.8a/include/js/jquery/jquery-ui.js.legal  2013-01-04 15:44:38.043416079 -0500
++++ cacti-0.8.8a/include/js/jquery/jquery-ui.js        2013-01-04 15:43:12.646377987 -0500
+@@ -0,0 +1,356 @@
++/*!
++ * jQuery UI 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI
++ */(function(a,b){function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;if(!b.href||!g||f.nodeName.toLowerCase()!=="map")return!1;h=a("img[usemap=#"+g+"]")[0];return!!h&&d(h)}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}a.ui=a.ui||{};a.ui.version||(a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)});return c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){if(c===b)return g["inner"+d].call(this);return this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){if(typeof b!="number")return g["outer"+d].call(this,b);return this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!!d&&!!a.element[0].parentNode)for(var e=0;e<d.length;e++)a.options[d[e][0]]&&d[e][1].apply(a.element,c)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(b,c){if(a(b).css("overflow")==="hidden")return!1;var d=c&&c==="left"?"scrollLeft":"scrollTop",e=!1;if(b[d]>0)return!0;b[d]=1,e=b[d]>0,b[d]=0;return e},isOverAxis:function(a,b,c){return a>b&&a<b+c},isOver:function(b,c,d,e,f,g){return a.ui.isOverAxis(b,d,f)&&a.ui.isOverAxis(c,e,g)}}))})(jQuery);/*!
++ * jQuery UI Widget 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Widget
++ */(function(a,b){if(a.cleanData){var c=a.cleanData;a.cleanData=function(b){for(var d=0,e;(e=b[d])!=null;d++)try{a(e).triggerHandler("remove")}catch(f){}c(b)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){c||(!b||a.filter(b,[this]).length)&&a("*",this).add([this]).each(function(){try{a(this).triggerHandler("remove")}catch(b){}});return d.call(a(this),b,c)})}}a.widget=function(b,c,d){var e=b.split(".")[0],f;b=b.split(".")[1],f=e+"-"+b,d||(d=c,c=a.Widget),a.expr[":"][f]=function(c){return!!a.data(c,b)},a[e]=a[e]||{},a[e][b]=function(a,b){arguments.length&&this._createWidget(a,b)};var g=new c;g.options=a.extend(!0,{},g.options),a[e][b].prototype=a.extend(!0,g,{namespace:e,widgetName:b,widgetEventPrefix:a[e][b].prototype.widgetEventPrefix||b,widgetBaseClass:f},d),a.widget.bridge(b,a[e][b])},a.widget.bridge=function(c,d){a.fn[c]=function(e){var f=typeof e=="string",g=Array.prototype.slice.call(arguments,1),h=this;e=!f&&g.length?a.extend.apply(null,[!0,e].concat(g)):e;if(f&&e.charAt(0)==="_")return h;f?this.each(function(){var d=a.data(this,c),f=d&&a.isFunction(d[e])?d[e].apply(d,g):d;if(f!==d&&f!==b){h=f;return!1}}):this.each(function(){var b=a.data(this,c);b?b.option(e||{})._init():a.data(this,c,new d(e,this))});return h}},a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)},a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:!1},_createWidget:function(b,c){a.data(c,this.widgetName,this),this.element=a(c),this.options=a.extend(!0,{},this.options,this._getCreateOptions(),b);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()}),this._create(),this._trigger("create"),this._init()},_getCreateOptions:function(){return a.metadata&&a.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName),this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled "+"ui-state-disabled")},widget:function(){return this.element},option:function(c,d){var e=c;if(arguments.length===0)return a.extend({},this.options);if(typeof c=="string"){if(d===b)return this.options[c];e={},e[c]=d}this._setOptions(e);return this},_setOptions:function(b){var c=this;a.each(b,function(a,b){c._setOption(a,b)});return this},_setOption:function(a,b){this.options[a]=b,a==="disabled"&&this.widget()[b?"addClass":"removeClass"](this.widgetBaseClass+"-disabled"+" "+"ui-state-disabled").attr("aria-disabled",b);return this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_trigger:function(b,c,d){var e,f,g=this.options[b];d=d||{},c=a.Event(c),c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase(),c.target=this.element[0],f=c.originalEvent;if(f)for(e in f)e in c||(c[e]=f[e]);this.element.trigger(c,d);return!(a.isFunction(g)&&g.call(this.element[0],c,d)===!1||c.isDefaultPrevented())}}})(jQuery);/*!
++ * jQuery UI Mouse 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Mouse
++ *
++ * Depends:
++ *    jquery.ui.widget.js
++ */(function(a,b){var c=!1;a(document).mouseup(function(a){c=!1}),a.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var b=this;this.element.bind("mousedown."+this.widgetName,function(a){return b._mouseDown(a)}).bind("click."+this.widgetName,function(c){if(!0===a.data(c.target,b.widgetName+".preventClickEvent")){a.removeData(c.target,b.widgetName+".preventClickEvent"),c.stopImmediatePropagation();return!1}}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(b){if(!c){this._mouseStarted&&this._mouseUp(b),this._mouseDownEvent=b;var d=this,e=b.which==1,f=typeof this.options.cancel=="string"&&b.target.nodeName?a(b.target).closest(this.options.cancel).length:!1;if(!e||f||!this._mouseCapture(b))return!0;this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){d.mouseDelayMet=!0},this.options.delay));if(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)){this._mouseStarted=this._mouseStart(b)!==!1;if(!this._mouseStarted){b.preventDefault();return!0}}!0===a.data(b.target,this.widgetName+".preventClickEvent")&&a.removeData(b.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(a){return d._mouseMove(a)},this._mouseUpDelegate=function(a){return d._mouseUp(a)},a(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),b.preventDefault(),c=!0;return!0}},_mouseMove:function(b){if(a.browser.msie&&!(document.documentMode>=9)&&!b.button)return this._mouseUp(b);if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b));return!this._mouseStarted},_mouseUp:function(b){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b));return!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);/*
++ * jQuery UI Position 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Position
++ */(function(a,b){a.ui=a.ui||{};var c=/left|center|right/,d=/top|center|bottom/,e="center",f={},g=a.fn.position,h=a.fn.offset;a.fn.position=function(b){if(!b||!b.of)return g.apply(this,arguments);b=a.extend({},b);var h=a(b.of),i=h[0],j=(b.collision||"flip").split(" "),k=b.offset?b.offset.split(" "):[0,0],l,m,n;i.nodeType===9?(l=h.width(),m=h.height(),n={top:0,left:0}):i.setTimeout?(l=h.width(),m=h.height(),n={top:h.scrollTop(),left:h.scrollLeft()}):i.preventDefault?(b.at="left top",l=m=0,n={top:b.of.pageY,left:b.of.pageX}):(l=h.outerWidth(),m=h.outerHeight(),n=h.offset()),a.each(["my","at"],function(){var a=(b[this]||"").split(" ");a.length===1&&(a=c.test(a[0])?a.concat([e]):d.test(a[0])?[e].concat(a):[e,e]),a[0]=c.test(a[0])?a[0]:e,a[1]=d.test(a[1])?a[1]:e,b[this]=a}),j.length===1&&(j[1]=j[0]),k[0]=parseInt(k[0],10)||0,k.length===1&&(k[1]=k[0]),k[1]=parseInt(k[1],10)||0,b.at[0]==="right"?n.left+=l:b.at[0]===e&&(n.left+=l/2),b.at[1]==="bottom"?n.top+=m:b.at[1]===e&&(n.top+=m/2),n.left+=k[0],n.top+=k[1];return this.each(function(){var c=a(this),d=c.outerWidth(),g=c.outerHeight(),h=parseInt(a.curCSS(this,"marginLeft",!0))||0,i=parseInt(a.curCSS(this,"marginTop",!0))||0,o=d+h+(parseInt(a.curCSS(this,"marginRight",!0))||0),p=g+i+(parseInt(a.curCSS(this,"marginBottom",!0))||0),q=a.extend({},n),r;b.my[0]==="right"?q.left-=d:b.my[0]===e&&(q.left-=d/2),b.my[1]==="bottom"?q.top-=g:b.my[1]===e&&(q.top-=g/2),f.fractions||(q.left=Math.round(q.left),q.top=Math.round(q.top)),r={left:q.left-h,top:q.top-i},a.each(["left","top"],function(c,e){a.ui.position[j[c]]&&a.ui.position[j[c]][e](q,{targetWidth:l,targetHeight:m,elemWidth:d,elemHeight:g,collisionPosition:r,collisionWidth:o,collisionHeight:p,offset:k,my:b.my,at:b.at})}),a.fn.bgiframe&&c.bgiframe(),c.offset(a.extend(q,{using:b.using}))})},a.ui.position={fit:{left:function(b,c){var d=a(window),e=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft();b.left=e>0?b.left-e:Math.max(b.left-c.collisionPosition.left,b.left)},top:function(b,c){var d=a(window),e=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop();b.top=e>0?b.top-e:Math.max(b.top-c.collisionPosition.top,b.top)}},flip:{left:function(b,c){if(c.at[0]!==e){var d=a(window),f=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft(),g=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,h=c.at[0]==="left"?c.targetWidth:-c.targetWidth,i=-2*c.offset[0];b.left+=c.collisionPosition.left<0?g+h+i:f>0?g+h+i:0}},top:function(b,c){if(c.at[1]!==e){var d=a(window),f=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop(),g=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,h=c.at[1]==="top"?c.targetHeight:-c.targetHeight,i=-2*c.offset[1];b.top+=c.collisionPosition.top<0?g+h+i:f>0?g+h+i:0}}}},a.offset.setOffset||(a.offset.setOffset=function(b,c){/static/.test(a.curCSS(b,"position"))&&(b.style.position="relative");var d=a(b),e=d.offset(),f=parseInt(a.curCSS(b,"top",!0),10)||0,g=parseInt(a.curCSS(b,"left",!0),10)||0,h={top:c.top-e.top+f,left:c.left-e.left+g};"using"in c?c.using.call(b,h):d.css(h)},a.fn.offset=function(b){var c=this[0];if(!c||!c.ownerDocument)return null;if(b)return this.each(function(){a.offset.setOffset(this,b)});return h.call(this)}),function(){var b=document.getElementsByTagName("body")[0],c=document.createElement("div"),d,e,g,h,i;d=document.createElement(b?"div":"body"),g={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},b&&a.extend(g,{position:"absolute",left:"-1000px",top:"-1000px"});for(var j in g)d.style[j]=g[j];d.appendChild(c),e=b||document.documentElement,e.insertBefore(d,e.firstChild),c.style.cssText="position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;",h=a(c).offset(function(a,b){return b}).offset(),d.innerHTML="",e.removeChild(d),i=h.top+h.left+(b?2e3:0),f.fractions=i>21&&i<22}()})(jQuery);/*
++ * jQuery UI Draggable 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Draggables
++ *
++ * Depends:
++ *    jquery.ui.core.js
++ *    jquery.ui.mouse.js
++ *    jquery.ui.widget.js
++ */(function(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},destroy:function(){if(!!this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy();return this}},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is(".ui-resizable-handle"))return!1;this.handle=this._getHandle(b);if(!this.handle)return!1;c.iframeFix&&a(c.iframeFix===!0?"iframe":c.iframeFix).each(function(){a('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(a(this).offset()).appendTo("body")});return!0},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b),this._cacheHelperProportions(),a.ui.ddmanager&&(a.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt),c.containment&&this._setContainment();if(this._trigger("start",b)===!1){this._clear();return!1}this._cacheHelperProportions(),a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.helper.addClass("ui-draggable-dragging"),this._mouseDrag(b,!0),a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,b);return!0},_mouseDrag:function(b,c){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute");if(!c){var d=this._uiHash();if(this._trigger("drag",b,d)===!1){this._mouseUp({});return!1}this.position=d.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";a.ui.ddmanager&&a.ui.ddmanager.drag(this,b);return!1},_mouseStop:function(b){var c=!1;a.ui.ddmanager&&!this.options.dropBehaviour&&(c=a.ui.ddmanager.drop(this,b)),this.dropped&&(c=this.dropped,this.dropped=!1);if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return!1;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===!0||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var d=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){d._trigger("stop",b)!==!1&&d._clear()})}else this._trigger("stop",b)!==!1&&this._clear();return!1},_mouseUp:function(b){this.options.iframeFix===!0&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,b);return a.ui.mouse.prototype._mouseUp.call(this,b)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?!0:!1;a(this.options.handle,this.element).find("*").andSelf().each(function(){this==b.target&&(c=!0)});return c},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo),d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute");return d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[b.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,b.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(b.containment=="document"?0:a(window).scrollLeft())+a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b.containment=="document"?0:a(window).scrollTop())+(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)&&b.containment.constructor!=Array){var c=a(b.containment),d=c[0];if(!d)return;var e=c.offset(),f=a(d).css("overflow")!="hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(f?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(f?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=c}else b.containment.constructor==Array&&(this.containment=b.containment)},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName),f=b.pageX,g=b.pageY;if(this.originalPosition){var h;if(this.containment){if(this.relative_container){var i=this.relative_container.offset();h=[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]}else h=this.containment;b.pageX-this.offset.click.left<h[0]&&(f=h[0]+this.offset.click.left),b.pageY-this.offset.click.top<h[1]&&(g=h[1]+this.offset.click.top),b.pageX-this.offset.click.left>h[2]&&(f=h[2]+this.offset.click.left),b.pageY-this.offset.click.top>h[3]&&(g=h[3]+this.offset.click.top)}if(c.grid){var j=c.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;g=h?j-this.offset.click.top<h[1]||j-this.offset.click.top>h[3]?j-this.offset.click.top<h[1]?j+c.grid[1]:j-c.grid[1]:j:j;var k=c.grid[0]?this.originalPageX+Math.round((f-this.originalPageX)/c.grid[0])*c.grid[0]:this.originalPageX;f=h?k-this.offset.click.left<h[0]||k-this.offset.click.left>h[2]?k-this.offset.click.left<h[0]?k+c.grid[0]:k-c.grid[0]:k:k}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:d.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:d.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(b,c,d){d=d||this._uiHash(),a.ui.plugin.call(this,b,[c,d]),b=="drag"&&(this.positionAbs=this._convertPositionTo("absolute"));return a.Widget.prototype._trigger.call(this,b,c,d)},plugins:{},_uiHash:function(a){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),a.extend(a.ui.draggable,{version:"1.8.18"}),a.ui.plugin.add("draggable","connectToSortable",{start:function(b,c){var d=a(this).data("draggable"),e=d.options,f=a.extend({},c,{item:d.element});d.sortables=[],a(e.connectToSortable).each(function(){var c=a.data(this,"sortable");c&&!c.options.disabled&&(d.sortables.push({instance:c,shouldRevert:c.options.revert}),c.refreshPositions(),c._trigger("activate",b,f))})},stop:function(b,c){var d=a(this).data("draggable"),e=a.extend({},c,{item:d.element});a.each(d.sortables,function(){this.instance.isOver?(this.instance.isOver=0,d.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=!0),this.instance._mouseStop(b),this.instance.options.helper=this.instance.options._helper,d.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",b,e))})},drag:function(b,c){var d=a(this).data("draggable"),e=this,f=function(b){var c=this.offset.click.top,d=this.offset.click.left,e=this.positionAbs.top,f=this.positionAbs.left,g=b.height,h=b.width,i=b.top,j=b.left;return a.ui.isOver(e+c,f+d,i,j,g,h)};a.each(d.sortables,function(f){this.instance.positionAbs=d.positionAbs,this.instance.helperProportions=d.helperProportions,this.instance.offset.click=d.offset.click,this.instance._intersectsWith(this.instance.containerCache)?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=a(e).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return c.helper[0]},b.target=this.instance.currentItem[0],this.instance._mouseCapture(b,!0),this.instance._mouseStart(b,!0,!0),this.instance.offset.click.top=d.offset.click.top,this.instance.offset.click.left=d.offset.click.left,this.instance.offset.parent.left-=d.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=d.offset.parent.top-this.instance.offset.parent.top,d._trigger("toSortable",b),d.dropped=this.instance.element,d.currentItem=d.element,this.instance.fromOutside=d),this.instance.currentItem&&this.instance._mouseDrag(b)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",b,this.instance._uiHash(this.instance)),this.instance._mouseStop(b,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),d._trigger("fromSortable",b),d.dropped=!1)})}}),a.ui.plugin.add("draggable","cursor",{start:function(b,c){var d=a("body"),e=a(this).data("draggable").options;d.css("cursor")&&(e._cursor=d.css("cursor")),d.css("cursor",e.cursor)},stop:function(b,c){var d=a(this).data("draggable").options;d._cursor&&a("body").css("cursor",d._cursor)}}),a.ui.plugin.add("draggable","opacity",{start:function(b,c){var d=a(c.helper),e=a(this).data("draggable").options;d.css("opacity")&&(e._opacity=d.css("opacity")),d.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;d._opacity&&a(c.helper).css("opacity",d._opacity)}}),a.ui.plugin.add("draggable","scroll",{start:function(b,c){var d=a(this).data("draggable");d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML"&&(d.overflowOffset=d.scrollParent.offset())},drag:function(b,c){var d=a(this).data("draggable"),e=d.options,f=!1;if(d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML"){if(!e.axis||e.axis!="x")d.overflowOffset.top+d.scrollParent[0].offsetHeight-b.pageY<e.scrollSensitivity?d.scrollParent[0].scrollTop=f=d.scrollParent[0].scrollTop+e.scrollSpeed:b.pageY-d.overflowOffset.top<e.scrollSensitivity&&(d.scrollParent[0].scrollTop=f=d.scrollParent[0].scrollTop-e.scrollSpeed);if(!e.axis||e.axis!="y")d.overflowOffset.left+d.scrollParent[0].offsetWidth-b.pageX<e.scrollSensitivity?d.scrollParent[0].scrollLeft=f=d.scrollParent[0].scrollLeft+e.scrollSpeed:b.pageX-d.overflowOffset.left<e.scrollSensitivity&&(d.scrollParent[0].scrollLeft=f=d.scrollParent[0].scrollLeft-e.scrollSpeed)}else{if(!e.axis||e.axis!="x")b.pageY-a(document).scrollTop()<e.scrollSensitivity?f=a(document).scrollTop(a(document).scrollTop()-e.scrollSpeed):a(window).height()-(b.pageY-a(document).scrollTop())<e.scrollSensitivity&&(f=a(document).scrollTop(a(document).scrollTop()+e.scrollSpeed));if(!e.axis||e.axis!="y")b.pageX-a(document).scrollLeft()<e.scrollSensitivity?f=a(document).scrollLeft(a(document).scrollLeft()-e.scrollSpeed):a(window).width()-(b.pageX-a(document).scrollLeft())<e.scrollSensitivity&&(f=a(document).scrollLeft(a(document).scrollLeft()+e.scrollSpeed))}f!==!1&&a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(d,b)}}),a.ui.plugin.add("draggable","snap",{start:function(b,c){var d=a(this).data("draggable"),e=d.options;d.snapElements=[],a(e.snap.constructor!=String?e.snap.items||":data(draggable)":e.snap).each(function(){var b=a(this),c=b.offset();this!=d.element[0]&&d.snapElements.push({item:this,width:b.outerWidth(),height:b.outerHeight(),top:c.top,left:c.left})})},drag:function(b,c){var d=a(this).data("draggable"),e=d.options,f=e.snapTolerance,g=c.offset.left,h=g+d.helperProportions.width,i=c.offset.top,j=i+d.helperProportions.height;for(var k=d.snapElements.length-1;k>=0;k--){var l=d.snapElements[k].left,m=l+d.snapElements[k].width,n=d.snapElements[k].top,o=n+d.snapElements[k].height;if(!(l-f<g&&g<m+f&&n-f<i&&i<o+f||l-f<g&&g<m+f&&n-f<j&&j<o+f||l-f<h&&h<m+f&&n-f<i&&i<o+f||l-f<h&&h<m+f&&n-f<j&&j<o+f)){d.snapElements[k].snapping&&d.options.snap.release&&d.options.snap.release.call(d.element,b,a.extend(d._uiHash(),{snapItem:d.snapElements[k].item})),d.snapElements[k].snapping=!1;continue}if(e.snapMode!="inner"){var p=Math.abs(n-j)<=f,q=Math.abs(o-i)<=f,r=Math.abs(l-h)<=f,s=Math.abs(m-g)<=f;p&&(c.position.top=d._convertPositionTo("relative",{top:n-d.helperProportions.height,left:0}).top-d.margins.top),q&&(c.position.top=d._convertPositionTo("relative",{top:o,left:0}).top-d.margins.top),r&&(c.position.left=d._convertPositionTo("relative",{top:0,left:l-d.helperProportions.width}).left-d.margins.left),s&&(c.position.left=d._convertPositionTo("relative",{top:0,left:m}).left-d.margins.left)}var t=p||q||r||s;if(e.snapMode!="outer"){var p=Math.abs(n-i)<=f,q=Math.abs(o-j)<=f,r=Math.abs(l-g)<=f,s=Math.abs(m-h)<=f;p&&(c.position.top=d._convertPositionTo("relative",{top:n,left:0}).top-d.margins.top),q&&(c.position.top=d._convertPositionTo("relative",{top:o-d.helperProportions.height,left:0}).top-d.margins.top),r&&(c.position.left=d._convertPositionTo("relative",{top:0,left:l}).left-d.margins.left),s&&(c.position.left=d._convertPositionTo("relative",{top:0,left:m-d.helperProportions.width}).left-d.margins.left)}!d.snapElements[k].snapping&&(p||q||r||s||t)&&d.options.snap.snap&&d.options.snap.snap.call(d.element,b,a.extend(d._uiHash(),{snapItem:d.snapElements[k].item})),d.snapElements[k].snapping=p||q||r||s||t}}}),a.ui.plugin.add("draggable","stack",{start:function(b,c){var d=a(this).data("draggable").options,e=a.makeArray(a(d.stack)).sort(function(b,c){return(parseInt(a(b).css("zIndex"),10)||0)-(parseInt(a(c).css("zIndex"),10)||0)});if(!!e.length){var f=parseInt(e[0].style.zIndex)||0;a(e).each(function(a){this.style.zIndex=f+a}),this[0].style.zIndex=f+e.length}}}),a.ui.plugin.add("draggable","zIndex",{start:function(b,c){var d=a(c.helper),e=a(this).data("draggable").options;d.css("zIndex")&&(e._zIndex=d.css("zIndex")),d.css("zIndex",e.zIndex)},stop:function(b,c){var d=a(this).data("draggable").options;d._zIndex&&a(c.helper).css("zIndex",d._zIndex)}})})(jQuery);/*
++ * jQuery UI Droppable 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Droppables
++ *
++ * Depends:
++ *    jquery.ui.core.js
++ *    jquery.ui.widget.js
++ *    jquery.ui.mouse.js
++ *    jquery.ui.draggable.js
++ */(function(a,b){a.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect"},_create:function(){var b=this.options,c=b.accept;this.isover=0,this.isout=1,this.accept=a.isFunction(c)?c:function(a){return a.is(c)},this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight},a.ui.ddmanager.droppables[b.scope]=a.ui.ddmanager.droppables[b.scope]||[],a.ui.ddmanager.droppables[b.scope].push(this),b.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){var b=a.ui.ddmanager.droppables[this.options.scope];for(var c=0;c<b.length;c++)b[c]==this&&b.splice(c,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(b,c){b=="accept"&&(this.accept=a.isFunction(c)?c:function(a){return a.is(c)}),a.Widget.prototype._setOption.apply(this,arguments)},_activate:function(b){var c=a.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),c&&this._trigger("activate",b,this.ui(c))},_deactivate:function(b){var c=a.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),c&&this._trigger("deactivate",b,this.ui(c))},_over:function(b){var c=a.ui.ddmanager.current;!!c&&(c.currentItem||c.element)[0]!=this.element[0]&&this.accept.call(this.element[0],c.currentItem||c.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",b,this.ui(c)))},_out:function(b){var c=a.ui.ddmanager.current;!!c&&(c.currentItem||c.element)[0]!=this.element[0]&&this.accept.call(this.element[0],c.currentItem||c.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",b,this.ui(c)))},_drop:function(b,c){var d=c||a.ui.ddmanager.current;if(!d||(d.currentItem||d.element)[0]==this.element[0])return!1;var e=!1;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var b=a.data(this,"droppable");if(b.options.greedy&&!b.options.disabled&&b.options.scope==d.options.scope&&b.accept.call(b.element[0],d.currentItem||d.element)&&a.ui.intersect(d,a.extend(b,{offset:b.element.offset()}),b.options.tolerance)){e=!0;return!1}});if(e)return!1;if(this.accept.call(this.element[0],d.currentItem||d.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",b,this.ui(d));return this.element}return!1},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}}),a.extend(a.ui.droppable,{version:"1.8.18"}),a.ui.intersect=function(b,c,d){if(!c.offset)return!1;var e=(b.positionAbs||b.position.absolute).left,f=e+b.helperProportions.width,g=(b.positionAbs||b.position.absolute).top,h=g+b.helperProportions.height,i=c.offset.left,j=i+c.proportions.width,k=c.offset.top,l=k+c.proportions.height;switch(d){case"fit":return i<=e&&f<=j&&k<=g&&h<=l;case"intersect":return i<e+b.helperProportions.width/2&&f-b.helperProportions.width/2<j&&k<g+b.helperProportions.height/2&&h-b.helperProportions.height/2<l;case"pointer":var m=(b.positionAbs||b.position.absolute).left+(b.clickOffset||b.offset.click).left,n=(b.positionAbs||b.position.absolute).top+(b.clickOffset||b.offset.click).top,o=a.ui.isOver(n,m,k,i,c.proportions.height,c.proportions.width);return o;case"touch":return(g>=k&&g<=l||h>=k&&h<=l||g<k&&h>l)&&(e>=i&&e<=j||f>=i&&f<=j||e<i&&f>j);default:return!1}},a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(b,c){var d=a.ui.ddmanager.droppables[b.options.scope]||[],e=c?c.type:null,f=(b.currentItem||b.element).find(":data(droppable)").andSelf();droppablesLoop:for(var g=0;g<d.length;g++){if(d[g].options.disabled||b&&!d[g].accept.call(d[g].element[0],b.currentItem||b.element))continue;for(var h=0;h<f.length;h++)if(f[h]==d[g].element[0]){d[g].proportions.height=0;continue droppablesLoop}d[g].visible=d[g].element.css("display")!="none";if(!d[g].visible)continue;e=="mousedown"&&d[g]._activate.call(d[g],c),d[g].offset=d[g].element.offset(),d[g].proportions={width:d[g].element[0].offsetWidth,height:d[g].element[0].offsetHeight}}},drop:function(b,c){var d=!1;a.each(a.ui.ddmanager.droppables[b.options.scope]||[],function(){!this.options||(!this.options.disabled&&this.visible&&a.ui.intersect(b,this,this.options.tolerance)&&(d=this._drop.call(this,c)||d),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],b.currentItem||b.element)&&(this.isout=1,this.isover=0,this._deactivate.call(this,c)))});return d},dragStart:function(b,c){b.element.parents(":not(body,html)").bind("scroll.droppable",function(){b.options.refreshPositions||a.ui.ddmanager.prepareOffsets(b,c)})},drag:function(b,c){b.options.refreshPositions&&a.ui.ddmanager.prepareOffsets(b,c),a.each(a.ui.ddmanager.droppables[b.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var d=a.ui.intersect(b,this,this.options.tolerance),e=!d&&this.isover==1?"isout":d&&this.isover==0?"isover":null;if(!e)return;var f;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");g.length&&(f=a.data(g[0],"droppable"),f.greedyChild=e=="isover"?1:0)}f&&e=="isover"&&(f.isover=0,f.isout=1,f._out.call(f,c)),this[e]=1,this[e=="isout"?"isover":"isout"]=0,this[e=="isover"?"_over":"_out"].call(this,c),f&&e=="isout"&&(f.isout=0,f.isover=1,f._over.call(f,c))}})},dragStop:function(b,c){b.element.parents(":not(body,html)").unbind("scroll.droppable"),b.options.refreshPositions||a.ui.ddmanager.prepareOffsets(b,c)}}})(jQuery);/*
++ * jQuery UI Resizable 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Resizables
++ *
++ * Depends:
++ *    jquery.ui.core.js
++ *    jquery.ui.mouse.js
++ *    jquery.ui.widget.js
++ */(function(a,b){a.widget("ui.resizable",a.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1e3},_create:function(){var b=this,c=this.options;this.element.addClass("ui-resizable"),a.extend(this,{_aspectRatio:!!c.aspectRatio,aspectRatio:c.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:c.helper||c.ghost||c.animate?c.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(a('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e<d.length;e++){var f=a.trim(d[e]),g="ui-resizable-"+f,h=a('<div class="ui-resizable-handle '+g+'"></div>');/sw|se|ne|nw/.test(f)&&h.css({zIndex:++c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){c.disabled||(a(this).removeClass("ui-resizable-autohide"),b._handles.show())},function(){c.disabled||b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement);return this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b);return!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",b,this.ui());return!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove();return!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),e<h.maxWidth&&(h.maxWidth=e),g<h.maxHeight&&(h.maxHeight=g);this._vBoundaries=h},_updateCache:function(a){var b=this.options;this.offset=this.helper.offset(),d(a.left)&&(this.position.left=a.left),d(a.top)&&(this.position.top=a.top),d(a.height)&&(this.size.height=a.height),d(a.width)&&(this.size.width=a.width)},_updateRatio:function(a,b){var c=this.options,e=this.position,f=this.size,g=this.axis;d(a.height)?a.width=a.height*this.aspectRatio:d(a.width)&&(a.height=a.width/this.aspectRatio),g=="sw"&&(a.left=e.left+(f.width-a.width),a.top=null),g=="nw"&&(a.top=e.top+(f.height-a.height),a.left=e.left+(f.width-a.width));return a},_respectSize:function(a,b){var c=this.helper,e=this._vBoundaries,f=this._aspectRatio||b.shiftKey,g=this.axis,h=d(a.width)&&e.maxWidth&&e.maxWidth<a.width,i=d(a.height)&&e.maxHeight&&e.maxHeight<a.height,j=d(a.width)&&e.minWidth&&e.minWidth>a.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null);return a},_proportionallyResize:function(){var b=this.options;if(!!this._proportionallyResizeElements.length){var c=this.helper||this.element;for(var d=0;d<this._proportionallyResizeElements.length;d++){var e=this._proportionallyResizeElements[d];if(!this.borderDif){var f=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],g=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];this.borderDif=a.map(f,function(a,b){var c=parseInt(a,10)||0,d=parseInt(g[b],10)||0;return c+d})}if(a.browser.msie&&(!!a(c).is(":hidden")||!!a(c).parents(":hidden").length))continue;e.css({height:c.height()-this.borderDif[0]-this.borderDif[2]||0,width:c.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var b=this.element,c=this.options;this.elementOffset=b.offset();if(this._helper){this.helper=this.helper||a('<div style="overflow:hidden;"></div>');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.18"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10)})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data("resizable-alsoresize"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!!i){e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/e.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*e.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);/*
++ * jQuery UI Selectable 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Selectables
++ *
++ * Depends:
++ *    jquery.ui.core.js
++ *    jquery.ui.mouse.js
++ *    jquery.ui.widget.js
++ */(function(a,b){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var b=this;this.element.addClass("ui-selectable"),this.dragged=!1;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]),c.addClass("ui-selectee"),c.each(function(){var b=a(this),c=b.offset();a.data(this,"selectable-item",{element:this,$element:b,left:c.left,top:c.top,right:c.left+b.outerWidth(),bottom:c.top+b.outerHeight(),startselected:!1,selected:b.hasClass("ui-selected"),selecting:b.hasClass("ui-selecting"),unselecting:b.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=c.addClass("ui-selectee"),this._mouseInit(),this.helper=a("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable"),this._mouseDestroy();return this},_mouseStart:function(b){var c=this;this.opos=[b.pageX,b.pageY];if(!this.options.disabled){var d=this.options;this.selectees=a(d.filter,this.element[0]),this._trigger("start",b),a(d.appendTo).append(this.helper),this.helper.css({left:b.clientX,top:b.clientY,width:0,height:0}),d.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var d=a.data(this,"selectable-item");d.startselected=!0,!b.metaKey&&!b.ctrlKey&&(d.$element.removeClass("ui-selected"),d.selected=!1,d.$element.addClass("ui-unselecting"),d.unselecting=!0,c._trigger("unselecting",b,{unselecting:d.element}))}),a(b.target).parents().andSelf().each(function(){var d=a.data(this,"selectable-item");if(d){var e=!b.metaKey&&!b.ctrlKey||!d.$element.hasClass("ui-selected");d.$element.removeClass(e?"ui-unselecting":"ui-selected").addClass(e?"ui-selecting":"ui-unselecting"),d.unselecting=!e,d.selecting=e,d.selected=e,e?c._trigger("selecting",b,{selecting:d.element}):c._trigger("unselecting",b,{unselecting:d.element});return!1}})}},_mouseDrag:function(b){var c=this;this.dragged=!0;if(!this.options.disabled){var d=this.options,e=this.opos[0],f=this.opos[1],g=b.pageX,h=b.pageY;if(e>g){var i=g;g=e,e=i}if(f>h){var i=h;h=f,f=i}this.helper.css({left:e,top:f,width:g-e,height:h-f}),this.selectees.each(function(){var i=a.data(this,"selectable-item");if(!!i&&i.element!=c.element[0]){var j=!1;d.tolerance=="touch"?j=!(i.left>g||i.right<e||i.top>h||i.bottom<f):d.tolerance=="fit"&&(j=i.left>e&&i.right<g&&i.top>f&&i.bottom<h),j?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,c._trigger("selecting",b,{selecting:i.element}))):(i.selecting&&((b.metaKey||b.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),c._trigger("unselecting",b,{unselecting:i.element}))),i.selected&&!b.metaKey&&!b.ctrlKey&&!i.startselected&&(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,c._trigger("unselecting",b,{unselecting:i.element})))}});return!1}},_mouseStop:function(b){var c=this;this.dragged=!1;var d=this.options;a(".ui-unselecting",this.element[0]).each(function(){var d=a.data(this,"selectable-item");d.$element.removeClass("ui-unselecting"),d.unselecting=!1,d.startselected=!1,c._trigger("unselected",b,{unselected:d.element})}),a(".ui-selecting",this.element[0]).each(function(){var d=a.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected"),d.selecting=!1,d.selected=!0,d.startselected=!0,c._trigger("selected",b,{selected:d.element})}),this._trigger("stop",b),this.helper.remove();return!1}}),a.extend(a.ui.selectable,{version:"1.8.18"})})(jQuery);/*
++ * jQuery UI Sortable 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Sortables
++ *
++ * Depends:
++ *    jquery.ui.core.js
++ *    jquery.ui.mouse.js
++ *    jquery.ui.widget.js
++ */(function(a,b){a.widget("ui.sortable",a.ui.mouse,{widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},destroy:function(){a.Widget.prototype.destroy.call(this),this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--)this.items[b].item.removeData(this.widgetName+"-item");return this},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f){e=a(this);return!1}});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}this.currentItem=e,this._removeCurrentsFromItems();return!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b);return!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY<c.scrollSensitivity?this.scrollParent[0].scrollTop=d=this.scrollParent[0].scrollTop+c.scrollSpeed:b.pageY-this.overflowOffset.top<c.scrollSensitivity&&(this.scrollParent[0].scrollTop=d=this.scrollParent[0].scrollTop-c.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-b.pageX<c.scrollSensitivity?this.scrollParent[0].scrollLeft=d=this.scrollParent[0].scrollLeft+c.scrollSpeed:b.pageX-this.overflowOffset.left<c.scrollSensitivity&&(this.scrollParent[0].scrollLeft=d=this.scrollParent[0].scrollLeft-c.scrollSpeed)):(b.pageY-a(document).scrollTop()<c.scrollSensitivity?d=a(document).scrollTop(a(document).scrollTop()-c.scrollSpeed):a(window).height()-(b.pageY-a(document).scrollTop())<c.scrollSensitivity&&(d=a(document).scrollTop(a(document).scrollTop()+c.scrollSpeed)),b.pageX-a(document).scrollLeft()<c.scrollSensitivity?d=a(document).scrollLeft(a(document).scrollLeft()-c.scrollSpeed):a(window).width()-(b.pageX-a(document).scrollLeft())<c.scrollSensitivity&&(d=a(document).scrollLeft(a(document).scrollLeft()+c.scrollSpeed))),d!==!1&&a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(var e=this.items.length-1;e>=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs;return!1},_mouseStop:function(b,c){if(!!b){a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1}},cancel:function(){var b=this;if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem));return this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"=");return d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")});return d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+j<i&&b+k>f&&b+k<g;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?l:f<b+this.helperProportions.width/2&&c-this.helperProportions.width/2<g&&h<d+this.helperProportions.height/2&&e-this.helperProportions.height/2<i},_intersectsWithPointer:function(b){var c=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,b.top,b.height),d=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,b.left,b.width),e=c&&d,f=this._getDragVerticalDirection(),g=this._getDragHorizontalDirection();if(!e)return!1;return this.floating?g&&g=="right"||f=="down"?2:1:f&&(f=="down"?2:1)},_intersectsWithSides:function(b){var c=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,b.top+b.height/2,b.height),d=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,b.left+b.width/2,b.width),e=this._getDragVerticalDirection(),f=this._getDragHorizontalDirection();return this.floating&&f?f=="right"&&d||f=="left"&&!d:e&&(e=="down"&&c||e=="up"&&!c)},_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a),this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options.items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(b){this.items=[],this.containers=[this];var c=this.items,d=this,e=[[a.isFunction(this.options.items)?this.options.items.call(this.element[0],b,{item:this.currentItem}):a(this.options.items,this.element),this]],f=this._connectWith();if(f&&this.ready)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i<m;i++){var n=a(l[i]);n.data(this.widgetName+"-item",k),c.push({item:n,instance:k,width:0,height:0,left:0,top:0})}}},refreshPositions:function(b){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());for(var c=this.items.length-1;c>=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.containers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];e||(b.style.visibility="hidden");return b},update:function(a,b){if(!e||!!d.forcePlaceholderSize)b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!!c)if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui.contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.items[i][this.containers[d].floating?"left":"top"];Math.abs(j-h)<f&&(f=Math.abs(j-h),g=this.items[i])}if(!g&&!this.options.dropOnEmpty)return;this.currentContainer=this.containers[d],g?this._rearrange(b,g,null,!0):this._rearrange(b,null,this.containers[d].element,!0),this._trigger("change",b,this._uiHash()),this.containers[d]._trigger("change",b,this._uiHash(this)),this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1}},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b,this.currentItem])):c.helper=="clone"?this.currentItem.clone():this.currentItem;d.parents("body").length||a(c.appendTo!="parent"?c.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]),d[0]==this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(d[0].style.width==""||c.forceHelperSize)&&d.width(this.currentItem.width()),(d[0].style.height==""||c.forceHelperSize)&&d.height(this.currentItem.height());return d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)){var c=a(b.containment)[0],d=a(b.containment).offset(),e=a(c).css("overflow")!="hidden";this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(e?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(e?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName);this.cssPosition=="relative"&&(this.scrollParent[0]==document||this.scrollParent[0]==this.offsetParent[0])&&(this.offset.relative=this._getRelativeOffset());var f=b.pageX,g=b.pageY;if(this.originalPosition){this.containment&&(b.pageX-this.offset.click.left<this.containment[0]&&(f=this.containment[0]+this.offset.click.left),b.pageY-this.offset.click.top<this.containment[1]&&(g=this.containment[1]+this.offset.click.top),b.pageX-this.offset.click.left>this.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.top<this.containment[1]||h-this.offset.click.top>this.containment[3]?h-this.offset.click.top<this.containment[1]?h+c.grid[1]:h-c.grid[1]:h:h;var i=this.originalPageX+Math.round((f-this.originalPageX)/c.grid[0])*c.grid[0];f=this.containment?i-this.offset.click.left<this.containment[0]||i-this.offset.click.left>this.containment[2]?i-this.offset.click.left<this.containment[0]?i+c.grid[0]:i-c.grid[0]:i:i}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:d.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:d.scrollLeft())}},_rearrange:function(a,b,c,d){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?b.item[0]:b.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var e=this,f=this.counter;window.setTimeout(function(){f==e.counter&&e.refreshPositions(!d)},0)},_clear:function(b,c){this.reverting=!1;var d=[],e=this;!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var f in this._storedCSS)if(this._storedCSS[f]=="auto"||this._storedCSS[f]=="static")this._storedCSS[f]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!c&&d.push(function(a){this._trigger("receive",a,this._uiHash(this.fromOutside))}),(this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!c&&d.push(function(a){this._trigger("update",a,this._uiHash())});if(!a.ui.contains(this.element[0],this.currentItem[0])){c||d.push(function(a){this._trigger("remove",a,this._uiHash())});for(var f=this.containers.length-1;f>=0;f--)a.ui.contains(this.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f<d.length;f++)d[f].call(this,b);this._trigger("stop",b,this._uiHash())}return!1}c||this._trigger("beforeStop",b,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!=this.currentItem[0]&&this.helper.remove(),this.helper=null;if(!c){for(var f=0;f<d.length;f++)d[f].call(this,b);this._trigger("stop",b,this._uiHash())}this.fromOutside=!1;return!0},_trigger:function(){a.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(b){var c=b||this;return{helper:c.helper,placeholder:c.placeholder||a([]),position:c.position,originalPosition:c.originalPosition,offset:c.positionAbs,item:c.currentItem,sender:b?b.element:null}}}),a.extend(a.ui.sortable,{version:"1.8.18"})})(jQuery);/*
++ * jQuery UI Accordion 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Accordion
++ *
++ * Depends:
++ *    jquery.ui.core.js
++ *    jquery.ui.widget.js
++ */(function(a,b){a.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:!0,clearStyle:!1,collapsible:!1,event:"click",fillSpace:!1,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:!1,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var b=this,c=b.options;b.running=0,b.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"),b.headers=b.element.find(c.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){c.disabled||a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){c.disabled||a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){c.disabled||a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){c.disabled||a(this).removeClass("ui-state-focus")}),b.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(c.navigation){var d=b.element.find("a").filter(c.navigationFilter).eq(0);if(d.length){var e=d.closest(".ui-accordion-header");e.length?b.active=e:b.active=d.closest(".ui-accordion-content").prev()}}b.active=b._findActive(b.active||c.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top"),b.active.next().addClass("ui-accordion-content-active"),b._createIcons(),b.resize(),b.element.attr("role","tablist"),b.headers.attr("role","tab").bind("keydown.accordion",function(a){return b._keydown(a)}).next().attr("role","tabpanel"),b.headers.not(b.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide(),b.active.length?b.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):b.headers.eq(0).attr("tabIndex",0),a.browser.safari||b.headers.find("a").attr("tabIndex",-1),c.event&&b.headers.bind(c.event.split(" ").join(".accordion ")+".accordion",function(a){b._clickHandler.call(b,a,this),a.preventDefault()})},_createIcons:function(){var b=this.options;b.icons&&(a("<span></span>").addClass("ui-icon "+b.icons.header).prependTo(this.headers),this.active.children(".ui-icon").toggleClass(b.icons.header).toggleClass(b.icons.headerSelected),this.element.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.children(".ui-icon").remove(),this.element.removeClass("ui-accordion-icons")},destroy:function(){var b=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"),this.headers.find("a").removeAttr("tabIndex"),this._destroyIcons();var c=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");(b.autoHeight||b.fillHeight)&&c.css("height","");return a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b=="active"&&this.activate(c),b=="icons"&&(this._destroyIcons(),c&&this._createIcons()),b=="disabled"&&this.headers.add(this.headers.next())[c?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(b){if(!(this.options.disabled||b.altKey||b.ctrlKey)){var c=a.ui.keyCode,d=this.headers.length,e=this.headers.index(b.target),f=!1;switch(b.keyCode){case c.RIGHT:case c.DOWN:f=this.headers[(e+1)%d];break;case c.LEFT:case c.UP:f=this.headers[(e-1+d)%d];break;case c.SPACE:case c.ENTER:this._clickHandler({target:b.target},b.target),b.preventDefault()}if(f){a(b.target).attr("tabIndex",-1),a(f).attr("tabIndex",0),f.focus();return!1}return!0}},resize:function(){var b=this.options,c;if(b.fillSpace){if(a.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}c=this.element.parent().height(),a.browser.msie&&this.element.parent().css("overflow",d),this.headers.each(function(){c-=a(this).outerHeight(!0)}),this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+a(this).height()))}).css("overflow","auto")}else b.autoHeight&&(c=0,this.headers.next().each(function(){c=Math.max(c,a(this).height("").height())}).height(c));return this},activate:function(a){this.options.active=a;var b=this._findActive(a)[0];this._clickHandler({target:b},b);return this},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===!1?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(b,c){var d=this.options;if(!d.disabled){if(!b.target){if(!d.collapsible)return;this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),this.active.next().addClass("ui-accordion-content-active");var e=this.active.next(),f={options:d,newHeader:a([]),oldHeader:d.active,newContent:a([]),oldContent:e},g=this.active=a([]);this._toggle(g,e,f);return}var h=a(b.currentTarget||c),i=h[0]===this.active[0];d.active=d.collapsible&&i?!1:this.headers.index(h);if(this.running||!d.collapsible&&i)return;var j=this.active,g=h.next(),e=this.active.next(),f={options:d,newHeader:i&&d.collapsible?a([]):h,oldHeader:this.active,newContent:i&&d.collapsible?a([]):g,oldContent:e},k=this.headers.index(this.active[0])>this.headers.index(h[0]);this.active=i?a([]):h,this._toggle(g,e,f,i,k),j.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),i||(h.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected),h.next().addClass("ui-accordion-content-active"));return}},_toggle:function(b,c,d,e,f){var g=this,h=g.options;g.toShow=b,g.toHide=c,g.data=d;var i=function(){if(!!g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data),g.running=c.size()===0?b.size():c.size();if(h.animated){var j={};h.collapsible&&e?j={toShow:a([]),toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace}:j={toShow:b,toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace},h.proxied||(h.proxied=h.animated),h.proxiedDuration||(h.proxiedDuration=h.duration),h.animated=a.isFunction(h.proxied)?h.proxied(j):h.proxied,h.duration=a.isFunction(h.proxiedDuration)?h.proxiedDuration(j):h.proxiedDuration;var k=a.ui.accordion.animations,l=h.duration,m=h.animated;m&&!k[m]&&!a.easing[m]&&(m="slide"),k[m]||(k[m]=function(a){this.slide(a,{easing:m,duration:l||700})}),k[m](j)}else h.collapsible&&e?b.toggle():(c.hide(),b.show()),i(!0);c.prev().attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).blur(),b.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;this.running||(this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""}),this.toHide.removeClass("ui-accordion-content-active"),this.toHide.length&&(this.toHide.parent()[0].className=this.toHide.parent()[0].className),this._trigger("change",null,this.data))}}),a.extend(a.ui.accordion,{version:"1.8.18",animations:{slide:function(b,c){b=a.extend({easing:"swing",duration:300},b,c);if(!b.toHide.size())b.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},b);else{if(!b.toShow.size()){b.toHide.animate({height:"hide",paddingTop:"hide",paddingBottom:"hide"},b);return}var d=b.toShow.css("overflow"),e=0,f={},g={},h=["height","paddingTop","paddingBottom"],i,j=b.toShow;i=j[0].style.width,j.width(j.parent().width()-parseFloat(j.css("paddingLeft"))-parseFloat(j.css("paddingRight"))-(parseFloat(j.css("borderLeftWidth"))||0)-(parseFloat(j.css("borderRightWidth"))||0)),a.each(h,function(c,d){g[d]="hide";var e=(""+a.css(b.toShow[0],d)).match(/^([\d+-.]+)(.*)$/);f[d]={value:e[1],unit:e[2]||"px"}}),b.toShow.css({height:0,overflow:"hidden"}).show(),b.toHide.filter(":hidden").each(b.complete).end().filter(":visible").animate(g,{step:function(a,c){c.prop=="height"&&(e=c.end-c.start===0?0:(c.now-c.start)/(c.end-c.start)),b.toShow[0].style[c.prop]=e*f[c.prop].value+f[c.prop].unit},duration:b.duration,easing:b.easing,complete:function(){b.autoHeight||b.toShow.css("height",""),b.toShow.css({width:i,overflow:d}),b.complete()}})}},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1e3:200})}}})})(jQuery);/*
++ * jQuery UI Autocomplete 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Autocomplete
++ *
++ * Depends:
++ *    jquery.ui.core.js
++ *    jquery.ui.widget.js
++ *    jquery.ui.position.js
++ */(function(a,b){var c=0;a.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var b=this,c=this.element[0].ownerDocument,d;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!b.options.disabled&&!b.element.propAttr("readOnly")){d=!1;var e=a.ui.keyCode;switch(c.keyCode){case e.PAGE_UP:b._move("previousPage",c);break;case e.PAGE_DOWN:b._move("nextPage",c);break;case e.UP:b._move("previous",c),c.preventDefault();break;case e.DOWN:b._move("next",c),c.preventDefault();break;case e.ENTER:case e.NUMPAD_ENTER:b.menu.active&&(d=!0,c.preventDefault());case e.TAB:if(!b.menu.active)return;b.menu.select(c);break;case e.ESCAPE:b.element.val(b.term),b.close(c);break;default:clearTimeout(b.searching),b.searching=setTimeout(function(){b.term!=b.element.val()&&(b.selectedItem=null,b.search(null,c))},b.options.delay)}}}).bind("keypress.autocomplete",function(a){d&&(d=!1,a.preventDefault())}).bind("focus.autocomplete",function(){b.options.disabled||(b.selectedItem=null,b.previous=b.element.val())}).bind("blur.autocomplete",function(a){b.options.disabled||(clearTimeout(b.searching),b.closing=setTimeout(function(){b.close(a),b._change(a)},150))}),this._initSource(),this.response=function(){return b._response.apply(b,arguments)},this.menu=a("<ul></ul>").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body",c)[0]).mousedown(function(c){var d=b.menu.element[0];a(c.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(c){c.target!==b.element[0]&&c.target!==d&&!a.ui.contains(d,c.target)&&b.close()})},1),setTimeout(function(){clearTimeout(b.closing)},13)}).menu({focus:function(a,c){var d=c.item.data("item.autocomplete");!1!==b._trigger("focus",a,{item:d})&&/^key/.test(a.originalEvent.type)&&b.element.val(d.value)},selected:function(a,d){var e=d.item.data("item.autocomplete"),f=b.previous;b.element[0]!==c.activeElement&&(b.element.focus(),b.previous=f,setTimeout(function(){b.previous=f,b.selectedItem=e},1)),!1!==b._trigger("select",a,{item:e})&&b.element.val(e.value),b.term=b.element.val(),b.close(a),b.selectedItem=e},blur:function(a,c){b.menu.element.is(":visible")&&b.element.val()!==b.term&&b.element.val(b.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"),a.fn.bgiframe&&this.menu.element.bgiframe(),b.beforeunloadHandler=function(){b.element.removeAttr("autocomplete")},a(window).bind("beforeunload",b.beforeunloadHandler)},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"),this.menu.element.remove(),a(window).unbind("beforeunload",this.beforeunloadHandler),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b==="source"&&this._initSource(),b==="appendTo"&&this.menu.element.appendTo(a(c||"body",this.element[0].ownerDocument)[0]),b==="disabled"&&c&&this.xhr&&this.xhr.abort()},_initSource:function(){var b=this,d,e;a.isArray(this.options.source)?(d=this.options.source,this.source=function(b,c){c(a.ui.autocomplete.filter(d,b.term))}):typeof this.options.source=="string"?(e=this.options.source,this.source=function(d,f){b.xhr&&b.xhr.abort(),b.xhr=a.ajax({url:e,data:d,dataType:"json",context:{autocompleteRequest:++c},success:function(a,b){this.autocompleteRequest===c&&f(a)},error:function(){this.autocompleteRequest===c&&f([])}})}):this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val(),this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==!1)return this._search(a)},_search:function(a){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.source({term:a},this.response)},_response:function(a){!this.options.disabled&&a&&a.length?(a=this._normalize(a),this._suggest(a),this._trigger("open")):this.close(),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing),this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.deactivate(),this._trigger("close",a))},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(b){if(b.length&&b[0].label&&b[0].value)return b;return a.map(b,function(b){if(typeof b=="string")return{label:b,value:b};return a.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(b){var c=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(c,b),this.menu.deactivate(),this.menu.refresh(),c.show(),this._resizeMenu(),c.position(a.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next(new a.Event("mouseover"))},_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(b,c){var d=this;a.each(c,function(a,c){d._renderItem(b,c)})},_renderItem:function(b,c){return a("<li></li>").data("item.autocomplete",c).append(a("<a></a>").text(c.label)).appendTo(b)},_move:function(a,b){if(!this.menu.element.is(":visible"))this.search(null,b);else{if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term),this.menu.deactivate();return}this.menu[a](b)}},widget:function(){return this.menu.element}}),a.extend(a.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(b,c){var d=new RegExp(a.ui.autocomplete.escapeRegex(c),"i");return a.grep(b,function(a){return d.test(a.label||a.value||a)})}})})(jQuery),function(a){a.widget("ui.menu",{_create:function(){var b=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){!a(c.target).closest(".ui-menu-item a").length||(c.preventDefault(),b.select(c))}),this.refresh()},refresh:function(){var b=this,c=this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem");c.children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(c){b.activate(c,a(this).parent())}).mouseleave(function(){b.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.scrollTop(),e=this.element.height();c<0?this.element.scrollTop(d+c):c>=e&&this.element.scrollTop(d+c-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end(),this._trigger("focus",a,{item:b})},deactivate:function(){!this.active||(this.active.children("a").removeClass("ui-state-hover").removeAttr("id"),this._trigger("blur"),this.active=null)},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(!this.active)this.activate(c,this.element.children(b));else{var d=this.active[a+"All"](".ui-menu-item").eq(0);d.length?this.activate(c,d):this.activate(c,this.element.children(b))}},nextPage:function(b){if(this.hasScroll()){if(!this.active||this.last()){this.activate(b,this.element.children(".ui-menu-item:first"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c-d+a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:last")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(b){if(this.hasScroll()){if(!this.active||this.first()){this.activate(b,this.element.children(".ui-menu-item:last"));return}var c=this.active.offset().top,d=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c+d-a(this).height();return b<10&&b>-10}),result.length||(result=this.element.children(".ui-menu-item:first")),this.activate(b,result)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element[a.fn.prop?"prop":"attr"]("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})}(jQuery);/*
++ * jQuery UI Button 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Button
++ *
++ * Depends:
++ *    jquery.ui.core.js
++ *    jquery.ui.widget.js
++ */(function(a,b){var c,d,e,f,g="ui-button ui-widget ui-state-default ui-corner-all",h="ui-state-hover ui-state-active ",i="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",j=function(){var b=a(this).find(":ui-button");setTimeout(function(){b.button("refresh")},1)},k=function(b){var c=b.name,d=b.form,e=a([]);c&&(d?e=a(d).find("[name='"+c+"']"):e=a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form}));return e};a.widget("ui.button",{options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",j),typeof this.options.disabled!="boolean"?this.options.disabled=!!this.element.propAttr("disabled"):this.element.propAttr("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var b=this,h=this.options,i=this.type==="checkbox"||this.type==="radio",l="ui-state-hover"+(i?"":" ui-state-active"),m="ui-state-focus";h.label===null&&(h.label=this.buttonElement.html()),this.buttonElement.addClass(g).attr("role","button").bind("mouseenter.button",function(){h.disabled||(a(this).addClass("ui-state-hover"),this===c&&a(this).addClass("ui-state-active"))}).bind("mouseleave.button",function(){h.disabled||a(this).removeClass(l)}).bind("click.button",function(a){h.disabled&&(a.preventDefault(),a.stopImmediatePropagation())}),this.element.bind("focus.button",function(){b.buttonElement.addClass(m)}).bind("blur.button",function(){b.buttonElement.removeClass(m)}),i&&(this.element.bind("change.button",function(){f||b.refresh()}),this.buttonElement.bind("mousedown.button",function(a){h.disabled||(f=!1,d=a.pageX,e=a.pageY)}).bind("mouseup.button",function(a){!h.disabled&&(d!==a.pageX||e!==a.pageY)&&(f=!0)})),this.type==="checkbox"?this.buttonElement.bind("click.button",function(){if(h.disabled||f)return!1;a(this).toggleClass("ui-state-active"),b.buttonElement.attr("aria-pressed",b.element[0].checked)}):this.type==="radio"?this.buttonElement.bind("click.button",function(){if(h.disabled||f)return!1;a(this).addClass("ui-state-active"),b.buttonElement.attr("aria-pressed","true");var c=b.element[0];k(c).not(c).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown.button",function(){if(h.disabled)return!1;a(this).addClass("ui-state-active"),c=this,a(document).one("mouseup",function(){c=null})}).bind("mouseup.button",function(){if(h.disabled)return!1;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(b){if(h.disabled)return!1;(b.keyCode==a.ui.keyCode.SPACE||b.keyCode==a.ui.keyCode.ENTER)&&a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(b){b.keyCode===a.ui.keyCode.SPACE&&a(this).click()})),this._setOption("disabled",h.disabled),this._resetButton()},_determineButtonType:function(){this.element.is(":checkbox")?this.type="checkbox":this.element.is(":radio")?this.type="radio":this.element.is("input")?this.type="input":this.type="button";if(this.type==="checkbox"||this.type==="radio"){var a=this.element.parents().filter(":last"),b="label[for='"+this.element.attr("id")+"']";this.buttonElement=a.find(b),this.buttonElement.length||(a=a.length?a.siblings():this.element.siblings(),this.buttonElement=a.filter(b),this.buttonElement.length||(this.buttonElement=a.find(b))),this.element.addClass("ui-helper-hidden-accessible");var c=this.element.is(":checked");c&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.attr("aria-pressed",c)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(g+" "+h+" "+i).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title"),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);b==="disabled"?c?this.element.propAttr("disabled",!0):this.element.propAttr("disabled",!1):this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b),this.type==="radio"?k(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):this.type==="checkbox"&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass(i),c=a("<span></span>",this.element[0].ownerDocument).addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary,f=[];d.primary||d.secondary?(this.options.text&&f.push("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary")),d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>"),d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>"),this.options.text||(f.push(e?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||b.attr("title",c))):f.push("ui-button-text-only"),b.addClass(f.join(" "))}}}),a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c),a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var b=this.element.css("direction")==="rtl";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(b?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(b?"ui-corner-left":"ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"),a.Widget.prototype.destroy.call(this)}})})(jQuery);/*
++ * jQuery UI Dialog 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Dialog
++ *
++ * Depends:
++ *    jquery.ui.core.js
++ *    jquery.ui.widget.js
++ *  jquery.ui.button.js
++ *    jquery.ui.draggable.js
++ *    jquery.ui.mouse.js
++ *    jquery.ui.position.js
++ *    jquery.ui.resizable.js
++ */(function(a,b){var c="ui-dialog ui-widget ui-widget-content ui-corner-all ",d={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},e={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},f=a.attrFn||{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0,click:!0};a.widget("ui.dialog",{options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",collision:"fit",using:function(b){var c=a(this).css(b).offset().top;c<0&&a(this).css("top",b.top-c)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1e3},_create:function(){this.originalTitle=this.element.attr("title"),typeof this.originalTitle!="string"&&(this.originalTitle=""),this.options.title=this.options.title||this.originalTitle;var b=this,d=b.options,e=d.title||"&#160;",f=a.ui.dialog.getTitleId(b.element),g=(b.uiDialog=a("<div></div>")).appendTo(document.body).hide().addClass(c+d.dialogClass).css({zIndex:d.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(c){d.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}).attr({role:"dialog","aria-labelledby":f}).mousedown(function(a){b.moveToTop(!1,a)}),h=b.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g),i=(b.uiDialogTitlebar=a("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),j=a('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){j.addClass("ui-state-hover")},function(){j.removeClass("ui-state-hover")}).focus(function(){j.addClass("ui-state-focus")}).blur(function(){j.removeClass("ui-state-focus")}).click(function(a){b.close(a);return!1}).appendTo(i),k=(b.uiDialogTitlebarCloseText=a("<span></span>")).addClass("ui-icon ui-icon-closethick").text(d.closeText).appendTo(j),l=a("<span></span>").addClass("ui-dialog-title").attr("id",f).html(e).prependTo(i);a.isFunction(d.beforeclose)&&!a.isFunction(d.beforeClose)&&(d.beforeClose=d.beforeclose),i.find("*").add(i).disableSelection(),d.draggable&&a.fn.draggable&&b._makeDraggable(),d.resizable&&a.fn.resizable&&b._makeResizable(),b._createButtons(d.buttons),b._isOpen=!1,a.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy(),a.uiDialog.hide(),a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"),a.uiDialog.remove(),a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(b){var c=this,d,e;if(!1!==c._trigger("beforeClose",b)){c.overlay&&c.overlay.destroy(),c.uiDialog.unbind("keypress.ui-dialog"),c._isOpen=!1,c.options.hide?c.uiDialog.hide(c.options.hide,function(){c._trigger("close",b)}):(c.uiDialog.hide(),c._trigger("close",b)),a.ui.dialog.overlay.resize(),c.options.modal&&(d=0,a(".ui-dialog").each(function(){this!==c.uiDialog[0]&&(e=a(this).css("z-index"),isNaN(e)||(d=Math.max(d,e)))}),a.ui.dialog.maxZ=d);return c}},isOpen:function(){return this._isOpen},moveToTop:function(b,c){var d=this,e=d.options,f;if(e.modal&&!b||!e.stack&&!e.modal)return d._trigger("focus",c);e.zIndex>a.ui.dialog.maxZ&&(a.ui.dialog.maxZ=e.zIndex),d.overlay&&(a.ui.dialog.maxZ+=1,d.overlay.$el.css("z-index",a.ui.dialog.overlay.maxZ=a.ui.dialog.maxZ)),f={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()},a.ui.dialog.maxZ+=1,d.uiDialog.css("z-index",a.ui.dialog.maxZ),d.element.attr(f),d._trigger("focus",c);return d},open:function(){if(!this._isOpen){var b=this,c=b.options,d=b.uiDialog;b.overlay=c.modal?new a.ui.dialog.overlay(b):null,b._size(),b._position(c.position),d.show(c.show),b.moveToTop(!0),c.modal&&d.bind("keydown.ui-dialog",function(b){if(b.keyCode===a.ui.keyCode.TAB){var c=a(":tabbable",this),d=c.filter(":first"),e=c.filter(":last");if(b.target===e[0]&&!b.shiftKey){d.focus(1);return!1}if(b.target===d[0]&&b.shiftKey){e.focus(1);return!1}}}),a(b.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus(),b._isOpen=!0,b._trigger("open");return b}},_createButtons:function(b){var c=this,d=!1,e=a("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=a("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);c.uiDialog.find(".ui-dialog-buttonpane").remove(),typeof b=="object"&&b!==null&&a.each(b,function(){return!(d=!0)}),d&&(a.each(b,function(b,d){d=a.isFunction(d)?{click:d,text:b}:d;var e=a('<button type="button"></button>').click(function(){d.click.apply(c.element[0],arguments)}).appendTo(g);a.each(d,function(a,b){a!=="click"&&(a in f?e[a](b):e.attr(a,b))}),a.fn.button&&e.button()}),e.appendTo(c.uiDialog))},_makeDraggable:function(){function f(a){return{position:a.position,offset:a.offset}}var b=this,c=b.options,d=a(document),e;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(d,g){e=c.height==="auto"?"auto":a(this).height(),a(this).height(a(this).height()).addClass("ui-dialog-dragging"),b._trigger("dragStart",d,f(g))},drag:function(a,c){b._trigger("drag",a,f(c))},stop:function(g,h){c.position=[h.position.left-d.scrollLeft(),h.position.top-d.scrollTop()],a(this).removeClass("ui-dialog-dragging").height(e),b._trigger("dragStop",g,f(h)),a.ui.dialog.overlay.resize()}})},_makeResizable:function(c){function h(a){return{originalPosition:a.originalPosition,originalSize:a.originalSize,position:a.position,size:a.size}}c=c===b?this.options.resizable:c;var d=this,e=d.options,f=d.uiDialog.css("position"),g=typeof c=="string"?c:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:g,start:function(b,c){a(this).addClass("ui-dialog-resizing"),d._trigger("resizeStart",b,h(c))},resize:function(a,b){d._trigger("resize",a,h(b))},stop:function(b,c){a(this).removeClass("ui-dialog-resizing"),e.height=a(this).height(),e.width=a(this).width(),d._trigger("resizeStop",b,h(c)),a.ui.dialog.overlay.resize()}}).css("position",f).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(b){var c=[],d=[0,0],e;if(b){if(typeof b=="string"||typeof b=="object"&&"0"in b)c=b.split?b.split(" "):[b[0],b[1]],c.length===1&&(c[1]=c[0]),a.each(["left","top"],function(a,b){+c[a]===c[a]&&(d[a]=c[a],c[a]=b)}),b={my:c.join(" "),at:c.join(" "),offset:d.join(" ")};b=a.extend({},a.ui.dialog.prototype.options.position,b)}else b=a.ui.dialog.prototype.options.position;e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.css({top:0,left:0}).position(a.extend({of:window},b)),e||this.uiDialog.hide()},_setOptions:function(b){var c=this,f={},g=!1;a.each(b,function(a,b){c._setOption(a,b),a in d&&(g=!0),a in e&&(f[a]=b)}),g&&this._size(),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",f)},_setOption:function(b,d){var e=this,f=e.uiDialog;switch(b){case"beforeclose":b="beforeClose";break;case"buttons":e._createButtons(d);break;case"closeText":e.uiDialogTitlebarCloseText.text(""+d);break;case"dialogClass":f.removeClass(e.options.dialogClass).addClass(c+d);break;case"disabled":d?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case"draggable":var g=f.is(":data(draggable)");g&&!d&&f.draggable("destroy"),!g&&d&&e._makeDraggable();break;case"position":e._position(d);break;case"resizable":var h=f.is(":data(resizable)");h&&!d&&f.resizable("destroy"),h&&typeof d=="string"&&f.resizable("option","handles",d),!h&&d!==!1&&e._makeResizable(d);break;case"title":a(".ui-dialog-title",e.uiDialogTitlebar).html(""+(d||"&#160;"))}a.Widget.prototype._setOption.apply(e,arguments)},_size:function(){var b=this.options,c,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0}),b.minWidth>b.width&&(b.width=b.minWidth),c=this.uiDialog.css({height:"auto",width:b.width}).height(),d=Math.max(0,b.minHeight-c);if(b.height==="auto")if(a.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();var f=this.element.css("height","auto").height();e||this.uiDialog.hide(),this.element.height(Math.max(f,d))}else this.element.height(Math.max(b.height-c,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}}),a.extend(a.ui.dialog,{version:"1.8.18",uuid:0,maxZ:0,getTitleId:function(a){var b=a.attr("id");b||(this.uuid+=1,b=this.uuid);return"ui-dialog-title-"+b},overlay:function(b){this.$el=a.ui.dialog.overlay.create(b)}}),a.extend(a.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:a.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(b){this.instances.length===0&&(setTimeout(function(){a.ui.dialog.overlay.instances.length&&a(document).bind(a.ui.dialog.overlay.events,function(b){if(a(b.target).zIndex()<a.ui.dialog.overlay.maxZ)return!1})},1),a(document).bind("keydown.dialog-overlay",function(c){b.options.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}),a(window).bind("resize.dialog-overlay",a.ui.dialog.overlay.resize));var c=(this.oldInstances.pop()||a("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});a.fn.bgiframe&&c.bgiframe(),this.instances.push(c);return c},destroy:function(b){var c=a.inArray(b,this.instances);c!=-1&&this.oldInstances.push(this.instances.splice(c,1)[0]),this.instances.length===0&&a([document,window]).unbind(".dialog-overlay"),b.remove();var d=0;a.each(this.instances,function(){d=Math.max(d,this.css("z-index"))}),this.maxZ=d},height:function(){var b,c;if(a.browser.msie&&a.browser.version<7){b=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),c=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return b<c?a(window).height()+"px":b+"px"}return a(document).height()+"px"},width:function(){var b,c;if(a.browser.msie){b=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth),c=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return b<c?a(window).width()+"px":b+"px"}return a(document).width()+"px"},resize:function(){var b=a([]);a.each(a.ui.dialog.overlay.instances,function(){b=b.add(this)}),b.css({width:0,height:0}).css({width:a.ui.dialog.overlay.width(),height:a.ui.dialog.overlay.height()})}}),a.extend(a.ui.dialog.overlay.prototype,{destroy:function(){a.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);/*
++ * jQuery UI Slider 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Slider
++ *
++ * Depends:
++ *    jquery.ui.core.js
++ *    jquery.ui.mouse.js
++ *    jquery.ui.widget.js
++ */(function(a,b){var c=5;a.widget("ui.slider",a.ui.mouse,{widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null},_create:function(){var b=this,d=this.options,e=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),f="<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",g=d.values&&d.values.length||1,h=[];this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"+(d.disabled?" ui-slider-disabled ui-disabled":"")),this.range=a([]),d.range&&(d.range===!0&&(d.values||(d.values=[this._valueMin(),this._valueMin()]),d.values.length&&d.values.length!==2&&(d.values=[d.values[0],d.values[0]])),this.range=a("<div></div>").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.range==="min"||d.range==="max"?" ui-slider-range-"+d.range:"")));for(var i=e.length;i<g;i+=1)h.push(f);this.handles=e.add(a(h.join("")).appendTo(b.element)),this.handle=this.handles.eq(0),this.handles.add(this.range).filter("a").click(function(a){a.preventDefault()}).hover(function(){d.disabled||a(this).addClass("ui-state-hover")},function(){a(this).removeClass("ui-state-hover")}).focus(function(){d.disabled?a(this).blur():(a(".ui-slider .ui-state-focus").removeClass("ui-state-focus"),a(this).addClass("ui-state-focus"))}).blur(function(){a(this).removeClass("ui-state-focus")}),this.handles.each(function(b){a(this).data("index.ui-slider-handle",b)}),this.handles.keydown(function(d){var e=a(this).data("index.ui-slider-handle"),f,g,h,i;if(!b.options.disabled){switch(d.keyCode){case a.ui.keyCode.HOME:case a.ui.keyCode.END:case a.ui.keyCode.PAGE_UP:case a.ui.keyCode.PAGE_DOWN:case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:d.preventDefault();if(!b._keySliding){b._keySliding=!0,a(this).addClass("ui-state-active"),f=b._start(d,e);if(f===!1)return}}i=b.options.step,b.options.values&&b.options.values.length?g=h=b.values(e):g=h=b.value();switch(d.keyCode){case a.ui.keyCode.HOME:h=b._valueMin();break;case a.ui.keyCode.END:h=b._valueMax();break;case a.ui.keyCode.PAGE_UP:h=b._trimAlignValue(g+(b._valueMax()-b._valueMin())/c);break;case a.ui.keyCode.PAGE_DOWN:h=b._trimAlignValue(g-(b._valueMax()-b._valueMin())/c);break;case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:if(g===b._valueMax())return;h=b._trimAlignValue(g+i);break;case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:if(g===b._valueMin())return;h=b._trimAlignValue(g-i)}b._slide(d,e,h)}}).keyup(function(c){var d=a(this).data("index.ui-slider-handle");b._keySliding&&(b._keySliding=!1,b._stop(c,d),b._change(c,d),a(this).removeClass("ui-state-active"))}),this._refreshValue(),this._animateOff=!1},destroy:function(){this.handles.remove(),this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"),this._mouseDestroy();return this},_mouseCapture:function(b){var c=this.options,d,e,f,g,h,i,j,k,l;if(c.disabled)return!1;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),d={x:b.pageX,y:b.pageY},e=this._normValueFromMouse(d),f=this._valueMax()-this._valueMin()+1,h=this,this.handles.each(function(b){var c=Math.abs(e-h.values(b));f>c&&(f=c,g=a(this),i=b)}),c.range===!0&&this.values(1)===c.min&&(i+=1,g=a(this.handles[i])),j=this._start(b,i);if(j===!1)return!1;this._mouseSliding=!0,h._handleIndex=i,g.addClass("ui-state-active").focus(),k=g.offset(),l=!a(b.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:b.pageX-k.left-g.width()/2,top:b.pageY-k.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(b,i,e),this._animateOff=!0;return!0},_mouseStart:function(a){return!0},_mouseDrag:function(a){var b={x:a.pageX,y:a.pageY},c=this._normValueFromMouse(b);this._slide(a,this._handleIndex,c);return!1},_mouseStop:function(a){this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(a,this._handleIndex),this._change(a,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1;return!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b,c,d,e,f;this.orientation==="horizontal"?(b=this.elementSize.width,c=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(b=this.elementSize.height,c=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),d=c/b,d>1&&(d=1),d<0&&(d=0),this.orientation==="vertical"&&(d=1-d),e=this._valueMax()-this._valueMin(),f=this._valueMin()+d*e;return this._trimAlignValue(f)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values());return this._trigger("start",a,c)},_slide:function(a,b,c){var d,e,f;this.options.values&&this.options.values.length?(d=this.values(b?0:1),this.options.values.length===2&&this.options.range===!0&&(b===0&&c>d||b===1&&c<d)&&(c=d),c!==this.values(b)&&(e=this.values(),e[b]=c,f=this._trigger("slide",a,{handle:this.handles[b],value:c,values:e}),d=this.values(b?0:1),f!==!1&&this.values(b,c,!0))):c!==this.value()&&(f=this._trigger("slide",a,{handle:this.handles[b],value:c}),f!==!1&&this.value(c))},_stop:function(a,b){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("stop",a,c)},_change:function(a,b){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("change",a,c)}},value:function(a){if(arguments.length)this.options.value=this._trimAlignValue(a),this._refreshValue(),this._change(null,0);else return this._value()},values:function(b,c){var d,e,f;if(arguments.length>1)this.options.values[b]=this._trimAlignValue(c),this._refreshValue(),this._change(null,b);else{if(!arguments.length)return this._values();if(!a.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(b):this.value();d=this.options.values,e=arguments[0];for(f=0;f<d.length;f+=1)d[f]=this._trimAlignValue(e[f]),this._change(null,f);this._refreshValue()}},_setOption:function(b,c){var d,e=0;a.isArray(this.options.values)&&(e=this.options.values.length),a.Widget.prototype._setOption.apply(this,arguments);switch(b){case"disabled":c?(this.handles.filter(".ui-state-focus").blur(),this.handles.removeClass("ui-state-hover"),this.handles.propAttr("disabled",!0),this.element.addClass("ui-disabled")):(this.handles.propAttr("disabled",!1),this.element.removeClass("ui-disabled"));break;case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue();break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":this._animateOff=!0,this._refreshValue();for(d=0;d<e;d+=1)this._change(null,d);this._animateOff=!1}},_value:function(){var a=this.options.value;a=this._trimAlignValue(a);return a},_values:function(a){var b,c,d;if(arguments.length){b=this.options.values[a],b=this._trimAlignValue(b);return b}c=this.options.values.slice();for(d=0;d<c.length;d+=1)c[d]=this._trimAlignValue(c[d]);return c},_trimAlignValue:function(a){if(a<=this._valueMin())return this._valueMin();if(a>=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b,d=a-c;Math.abs(c)*2>=b&&(d+=c>0?b:-b);return parseFloat(d.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,c=this.options,d=this,e=this._animateOff?!1:c.animate,f,g={},h,i,j,k;this.options.values&&this.options.values.length?this.handles.each(function(b,i){f=(d.values(b)-d._valueMin())/(d._valueMax()-d._valueMin())*100,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",a(this).stop(1,1)[e?"animate":"css"](g,c.animate),d.options.range===!0&&(d.orientation==="horizontal"?(b===0&&d.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({width:f-h+"%"},{queue:!1,duration:c.animate})):(b===0&&d.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({height:f-h+"%"},{queue:!1,duration:c.animate}))),h=f}):(i=this.value(),j=this._valueMin(),k=this._valueMax(),f=k!==j?(i-j)/(k-j)*100:0,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",this.handle.stop(1,1)[e?"animate":"css"](g,c.animate),b==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},c.animate),b==="max"&&this.orientation==="horizontal"&&this.range[e?"animate":"css"]({width:100-f+"%"},{queue:!1,duration:c.animate}),b==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},c.animate),b==="max"&&this.orientation==="vertical"&&this.range[e?"animate":"css"]({height:100-f+"%"},{queue:!1,duration:c.animate}))}}),a.extend(a.ui.slider,{version:"1.8.18"})})(jQuery);/*
++ * jQuery UI Tabs 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Tabs
++ *
++ * Depends:
++ *    jquery.ui.core.js
++ *    jquery.ui.widget.js
++ */(function(a,b){function f(){return++d}function e(){return++c}var c=0,d=0;a.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:!1,cookie:null,collapsible:!1,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(!0)},_setOption:function(a,b){if(a=="selected"){if(this.options.collapsible&&b==this.options.selected)return;this.select(b)}else this.options[a]=b,this._tabify()},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+f());return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(a,b){return{tab:a,panel:b,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function m(b,c){b.css("display",""),!a.support.opacity&&c.opacity&&b[0].style.removeAttribute("filter")}var d=this,e=this.options,f=/^#.+/;this.list=this.element.find("ol,ul").eq(0),this.lis=a(" > li:has(a[href])",this.list),this.anchors=this.lis.map(function(){return a("a",this)[0]}),this.panels=a([]),this.anchors.each(function(b,c){var g=a(c).attr("href"),h=g.split("#")[0],i;h&&(h===location.toString().split("#")[0]||(i=a("base")[0])&&h===i.href)&&(g=c.hash,c.href=g);if(f.test(g))d.panels=d.panels.add(d.element.find(d._sanitizeSelector(g)));else if(g&&g!=="#"){a.data(c,"href.tabs",g),a.data(c,"load.tabs",g.replace(/#.*$/,""));var j=d._tabId(c);c.href="#"+j;var k=d.element.find("#"+j);k.length||(k=a(e.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(d.panels[b-1]||d.list),k.data("destroy.tabs",!0)),d.panels=d.panels.add(k)}else e.disabled.push(b)}),c?(this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.lis.addClass("ui-state-default ui-corner-top"),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom"),e.selected===b?(location.hash&&this.anchors.each(function(a,b){if(b.hash==location.hash){e.selected=a;return!1}}),typeof e.selected!="number"&&e.cookie&&(e.selected=parseInt(d._cookie(),10)),typeof e.selected!="number"&&this.lis.filter(".ui-tabs-selected").length&&(e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))),e.selected=e.selected||(this.lis.length?0:-1)):e.selected===null&&(e.selected=-1),e.selected=e.selected>=0&&this.anchors[e.selected]||e.selected<0?e.selected:0,e.disabled=a.unique(e.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(a,b){return d.lis.index(a)}))).sort(),a.inArray(e.selected,e.disabled)!=-1&&e.disabled.splice(a.inArray(e.selected,e.disabled),1),this.panels.addClass("ui-tabs-hide"),this.lis.removeClass("ui-tabs-selected ui-state-active"),e.selected>=0&&this.anchors.length&&(d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash)).removeClass("ui-tabs-hide"),this.lis.eq(e.selected).addClass("ui-tabs-selected ui-state-active"),d.element.queue("tabs",function(){d._trigger("show",null,d._ui(d.anchors[e.selected],d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash))[0]))}),this.load(e.selected)),a(window).bind("unload",function(){d.lis.add(d.anchors).unbind(".tabs"),d.lis=d.anchors=d.panels=null})):e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")),this.element[e.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible"),e.cookie&&this._cookie(e.selected,e.cookie);for(var g=0,h;h=this.lis[g];g++)a(h)[a.inArray(g,e.disabled)!=-1&&!a(h).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");e.cache===!1&&this.anchors.removeData("cache.tabs"),this.lis.add(this.anchors).unbind(".tabs");if(e.event!=="mouseover"){var i=function(a,b){b.is(":not(.ui-state-disabled)")&&b.addClass("ui-state-"+a)},j=function(a,b){b.removeClass("ui-state-"+a)};this.lis.bind("mouseover.tabs",function(){i("hover",a(this))}),this.lis.bind("mouseout.tabs",function(){j("hover",a(this))}),this.anchors.bind("focus.tabs",function(){i("focus",a(this).closest("li"))}),this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var k,l;e.fx&&(a.isArray(e.fx)?(k=e.fx[0],l=e.fx[1]):k=l=e.fx);var n=l?function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.hide().removeClass("ui-tabs-hide").animate(l,l.duration||"normal",function(){m(c,l),d._trigger("show",null,d._ui(b,c[0]))})}:function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.removeClass("ui-tabs-hide"),d._trigger("show",null,d._ui(b,c[0]))},o=k?function(a,b){b.animate(k,k.duration||"normal",function(){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),m(b,k),d.element.dequeue("tabs")})}:function(a,b,c){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),d.element.dequeue("tabs")};this.anchors.bind(e.event+".tabs",function(){var b=this,c=a(b).closest("li"),f=d.panels.filter(":not(.ui-tabs-hide)"),g=d.element.find(d._sanitizeSelector(b.hash));if(c.hasClass("ui-tabs-selected")&&!e.collapsible||c.hasClass("ui-state-disabled")||c.hasClass("ui-state-processing")||d.panels.filter(":animated").length||d._trigger("select",null,d._ui(this,g[0]))===!1){this.blur();return!1}e.selected=d.anchors.index(this),d.abort();if(e.collapsible){if(c.hasClass("ui-tabs-selected")){e.selected=-1,e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){o(b,f)}).dequeue("tabs"),this.blur();return!1}if(!f.length){e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this)),this.blur();return!1}}e.cookie&&d._cookie(e.selected,e.cookie);if(g.length)f.length&&d.element.queue("tabs",function(){o(b,f)}),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this));else throw"jQuery UI Tabs: Mismatching fragment identifier.";a.browser.msie&&this.blur()}),this.anchors.bind("click.tabs",function(){return!1})},_getIndex:function(a){typeof a=="string"&&(a=this.anchors.index(this.anchors.filter("[href$="+a+"]")));return a},destroy:function(){var b=this.options;this.abort(),this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs"),this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.anchors.each(function(){var b=a.data(this,"href.tabs");b&&(this.href=b);var c=a(this).unbind(".tabs");a.each(["href","load","cache"],function(a,b){c.removeData(b+".tabs")})}),this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}),b.cookie&&this._cookie(null,b.cookie);return this},add:function(c,d,e){e===b&&(e=this.anchors.length);var f=this,g=this.options,h=a(g.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,d)),i=c.indexOf("#")?this._tabId(a("a",h)[0]):c.replace("#","");h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",!0);var j=f.element.find("#"+i);j.length||(j=a(g.panelTemplate).attr("id",i).data("destroy.tabs",!0)),j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"),e>=this.lis.length?(h.appendTo(this.list),j.appendTo(this.list[0].parentNode)):(h.insertBefore(this.lis[e]),j.insertBefore(this.panels[e])),g.disabled=a.map(g.disabled,function(a,b){return a>=e?++a:a}),this._tabify(),this.anchors.length==1&&(g.selected=0,h.addClass("ui-tabs-selected ui-state-active"),j.removeClass("ui-tabs-hide"),this.element.queue("tabs",function(){f._trigger("show",null,f._ui(f.anchors[0],f.panels[0]))}),this.load(0)),this._trigger("add",null,this._ui(this.anchors[e],this.panels[e]));return this},remove:function(b){b=this._getIndex(b);var c=this.options,d=this.lis.eq(b).remove(),e=this.panels.eq(b).remove();d.hasClass("ui-tabs-selected")&&this.anchors.length>1&&this.select(b+(b+1<this.anchors.length?1:-1)),c.disabled=a.map(a.grep(c.disabled,function(a,c){return a!=b}),function(a,c){return a>=b?--a:a}),this._tabify(),this._trigger("remove",null,this._ui(d.find("a")[0],e[0]));return this},enable:function(b){b=this._getIndex(b);var c=this.options;if(a.inArray(b,c.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled"),c.disabled=a.grep(c.disabled,function(a,c){return a!=b}),this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(a){a=this._getIndex(a);var b=this,c=this.options;a!=c.selected&&(this.lis.eq(a).addClass("ui-state-disabled"),c.disabled.push(a),c.disabled.sort(),this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a])));return this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;this.anchors.eq(a).trigger(this.options.event+".tabs");return this},load:function(b){b=this._getIndex(b);var c=this,d=this.options,e=this.anchors.eq(b)[0],f=a.data(e,"load.tabs");this.abort();if(!f||this.element.queue("tabs").length!==0&&a.data(e,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(d.spinner){var g=a("span",e);g.data("label.tabs",g.html()).html(d.spinner)}this.xhr=a.ajax(a.extend({},d.ajaxOptions,{url:f,success:function(f,g){c.element.find(c._sanitizeSelector(e.hash)).html(f),c._cleanup(),d.cache&&a.data(e,"cache.tabs",!0),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.success(f,g)}catch(h){}},error:function(a,f,g){c._cleanup(),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.error(a,f,b,e)}catch(g){}}})),c.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]),this.panels.stop(!1,!0),this.element.queue("tabs",this.element.queue("tabs").splice(-2,2)),this.xhr&&(this.xhr.abort(),delete this.xhr),this._cleanup();return this},url:function(a,b){this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",b);return this},length:function(){return this.anchors.length}}),a.extend(a.ui.tabs,{version:"1.8.18"}),a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(a,b){var c=this,d=this.options,e=c._rotate||(c._rotate=function(b){clearTimeout(c.rotation),c.rotation=setTimeout(function(){var a=d.selected;c.select(++a<c.anchors.length?a:0)},a),b&&b.stopPropagation()}),f=c._unrotate||(c._unrotate=b?function(a){t=d.selected,e()}:function(a){a.clientX&&c.rotate(null)});a?(this.element.bind("tabsshow",e),this.anchors.bind(d.event+".tabs",f),e()):(clearTimeout(c.rotation),this.element.unbind("tabsshow",e),this.anchors.unbind(d.event+".tabs",f),delete this._rotate,delete this._unrotate);return this}})})(jQuery);/*
++ * jQuery UI Datepicker 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Datepicker
++ *
++ * Depends:
++ *    jquery.ui.core.js
++ */(function($,undefined){function isArray(a){return a&&($.browser.safari&&typeof a=="object"&&a.length||a.constructor&&a.constructor.toString().match(/\Array\(\)/))}function extendRemove(a,b){$.extend(a,b);for(var c in b)if(b[c]==null||b[c]==undefined)a[c]=b[c];return a}function bindHover(a){var b="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return a.bind("mouseout",function(a){var c=$(a.target).closest(b);!c.length||c.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(c){var d=$(c.target).closest(b);!$.datepicker._isDisabledDatepicker(instActive.inline?a.parent()[0]:instActive.input[0])&&!!d.length&&(d.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),d.addClass("ui-state-hover"),d.hasClass("ui-datepicker-prev")&&d.addClass("ui-datepicker-prev-hover"),d.hasClass("ui-datepicker-next")&&d.addClass("ui-datepicker-next-hover"))})}function Datepicker(){this.debug=!1,this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},$.extend(this._defaults,this.regional[""]),this.dpDiv=bindHover($('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}$.extend($.ui,{datepicker:{version:"1.8.18"}});var PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){extendRemove(this._defaults,a||{});return this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(a,b){var c=a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:c,input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:b?bindHover($('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')):this.dpDiv}},_connectDatepicker:function(a,b){var c=$(a);b.append=$([]),b.trigger=$([]);c.hasClass(this.markerClassName)||(this._attachments(c,b),c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),this._autoSize(b),$.data(a,PROP_NAME,b),b.settings.disabled&&this._disableDatepicker(a))},_attachments:function(a,b){var c=this._get(b,"appendText"),d=this._get(b,"isRTL");b.append&&b.append.remove(),c&&(b.append=$('<span class="'+this._appendClass+'">'+c+"</span>"),a[d?"before":"after"](b.append)),a.unbind("focus",this._showDatepicker),b.trigger&&b.trigger.remove();var e=this._get(b,"showOn");(e=="focus"||e=="both")&&a.focus(this._showDatepicker);if(e=="button"||e=="both"){var f=this._get(b,"buttonText"),g=this._get(b,"buttonImage");b.trigger=$(this._get(b,"buttonImageOnly")?$("<img/>").addClass(this._triggerClass).attr({src:g,alt:f,title:f}):$('<button type="button"></button>').addClass(this._triggerClass).html(g==""?f:$("<img/>").attr({src:g,alt:f,title:f}))),a[d?"before":"after"](b.trigger),b.trigger.click(function(){$.datepicker._datepickerShowing&&$.datepicker._lastInput==a[0]?$.datepicker._hideDatepicker():$.datepicker._datepickerShowing&&$.datepicker._lastInput!=a[0]?($.datepicker._hideDatepicker(),$.datepicker._showDatepicker(a[0])):$.datepicker._showDatepicker(a[0]);return!1})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var d=function(a){var b=0,c=0;for(var d=0;d<a.length;d++)a[d].length>b&&(b=a[d].length,c=d);return c};b.setMonth(d(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort"))),b.setDate(d(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=$(a);c.hasClass(this.markerClassName)||(c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),$.data(a,PROP_NAME,b),this._setDate(b,this._getDefaultDate(b),!0),this._updateDatepicker(b),this._updateAlternate(b),b.settings.disabled&&this._disableDatepicker(a),b.dpDiv.css("display","block"))},_dialogDatepicker:function(a,b,c,d,e){var f=this._dialogInst;if(!f){this.uuid+=1;var g="dp"+this.uuid;this._dialogInput=$('<input type="text" id="'+g+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>'),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),f=this._dialogInst=this._newInst(this._dialogInput,!1),f.settings={},$.data(this._dialogInput[0],PROP_NAME,f)}extendRemove(f.settings,d||{}),b=b&&b.constructor==Date?this._formatDate(f,b):b,this._dialogInput.val(b),this._pos=e?e.length?e:[e.pageX,e.pageY]:null;if(!this._pos){var h=document.documentElement.clientWidth,i=document.documentElement.clientHeight,j=document.documentElement.scrollLeft||document.body.scrollLeft,k=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[h/2-100+j,i/2-150+k]}this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),f.settings.onSelect=c,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,f);return this},_destroyDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!!b.hasClass(this.markerClassName)){var d=a.nodeName.toLowerCase();$.removeData(a,PROP_NAME),d=="input"?(c.append.remove(),c.trigger.remove(),b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):(d=="div"||d=="span")&&b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!!b.hasClass(this.markerClassName)){var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!1,c.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().removeClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b})}},_disableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!!b.hasClass(this.markerClassName)){var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!0,c.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().addClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b}),this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return!1;for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return!0;return!1},_getInst:function(a){try{return $.data(a,PROP_NAME)}catch(b){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(a,b,c){var d=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?$.extend({},$.datepicker._defaults):d?b=="all"?$.extend({},d.settings):this._get(d,b):null;var e=b||{};typeof b=="string"&&(e={},e[b]=c);if(d){this._curInst==d&&this._hideDatepicker();var f=this._getDateDatepicker(a,!0),g=this._getMinMaxDate(d,"min"),h=this._getMinMaxDate(d,"max");extendRemove(d.settings,e),g!==null&&e.dateFormat!==undefined&&e.minDate===undefined&&(d.settings.minDate=this._formatDate(d,g)),h!==null&&e.dateFormat!==undefined&&e.maxDate===undefined&&(d.settings.maxDate=this._formatDate(d,h)),this._attachments($(a),d),this._autoSize(d),this._setDate(d,f),this._updateAlternate(d),this._updateDatepicker(d)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){var b=this._getInst(a);b&&this._updateDatepicker(b)},_setDateDatepicker:function(a,b){var c=this._getInst(a);c&&(this._setDate(c,b),this._updateDatepicker(c),this._updateAlternate(c))},_getDateDatepicker:function(a,b){var c=this._getInst(a);c&&!c.inline&&this._setDateFromField(c,b);return c?this._getDate(c):null},_doKeyDown:function(a){var b=$.datepicker._getInst(a.target),c=!0,d=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=!0;if($.datepicker._datepickerShowing)switch(a.keyCode){case 9:$.datepicker._hideDatepicker(),c=!1;break;case 13:var e=$("td."+$.datepicker._dayOverClass+":not(."+$.datepicker._currentClass+")",b.dpDiv);e[0]&&$.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,e[0]);var f=$.datepicker._get(b,"onSelect");if(f){var g=$.datepicker._formatDate(b);f.apply(b.input?b.input[0]:null,[g,b])}else $.datepicker._hideDatepicker();return!1;case 27:$.datepicker._hideDatepicker();break;case 33:$.datepicker._adjustDate(a.target,a.ctrlKey?-$.datepicker._get(b,"stepBigMonths"):-$.datepicker._get(b,"stepMonths"),"M");break;case 34:$.datepicker._adjustDate(a.target,a.ctrlKey?+$.datepicker._get(b,"stepBigMonths"):+$.datepicker._get(b,"stepMonths"),"M");break;case 35:(a.ctrlKey||a.metaKey)&&$.datepicker._clearDate(a.target),c=a.ctrlKey||a.metaKey;break;case 36:(a.ctrlKey||a.metaKey)&&$.datepicker._gotoToday(a.target),c=a.ctrlKey||a.metaKey;break;case 37:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,d?1:-1,"D"),c=a.ctrlKey||a.metaKey,a.originalEvent.altKey&&$.datepicker._adjustDate(a.target,a.ctrlKey?-$.datepicker._get(b,"stepBigMonths"):-$.datepicker._get(b,"stepMonths"),"M");break;case 38:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,-7,"D"),c=a.ctrlKey||a.metaKey;break;case 39:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,d?-1:1,"D"),c=a.ctrlKey||a.metaKey,a.originalEvent.altKey&&$.datepicker._adjustDate(a.target,a.ctrlKey?+$.datepicker._get(b,"stepBigMonths"):+$.datepicker._get(b,"stepMonths"),"M");break;case 40:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,7,"D"),c=a.ctrlKey||a.metaKey;break;default:c=!1}else a.keyCode==36&&a.ctrlKey?$.datepicker._showDatepicker(this):c=!1;c&&(a.preventDefault(),a.stopPropagation())},_doKeyPress:function(a){var b=$.datepicker._getInst(a.target);if($.datepicker._get(b,"constrainInput")){var c=$.datepicker._possibleChars($.datepicker._get(b,"dateFormat")),d=String.fromCharCode(a.charCode==undefined?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||d<" "||!c||c.indexOf(d)>-1}},_doKeyUp:function(a){var b=$.datepicker._getInst(a.target);if(b.input.val()!=b.lastVal)try{var c=$.datepicker.parseDate($.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,$.datepicker._getFormatConfig(b));c&&($.datepicker._setDateFromField(b),$.datepicker._updateAlternate(b),$.datepicker._updateDatepicker(b))}catch(a){$.datepicker.log(a)}return!0},_showDatepicker:function(a){a=a.target||a,a.nodeName.toLowerCase()!="input"&&(a=$("input",a.parentNode)[0]);if(!$.datepicker._isDisabledDatepicker(a)&&$.datepicker._lastInput!=a){var b=$.datepicker._getInst(a);$.datepicker._curInst&&$.datepicker._curInst!=b&&($.datepicker._curInst.dpDiv.stop(!0,!0),b&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var c=$.datepicker._get(b,"beforeShow"),d=c?c.apply(a,[a,b]):{};if(d===!1)return;extendRemove(b.settings,d),b.lastVal=null,$.datepicker._lastInput=a,$.datepicker._setDateFromField(b),$.datepicker._inDialog&&(a.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(a),$.datepicker._pos[1]+=a.offsetHeight);var e=!1;$(a).parents().each(function(){e|=$(this).css("position")=="fixed";return!e}),e&&$.browser.opera&&($.datepicker._pos[0]-=document.documentElement.scrollLeft,$.datepicker._pos[1]-=document.documentElement.scrollTop);var f={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,b.dpDiv.empty(),b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(b),f=$.datepicker._checkOffset(b,f,e),b.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":e?"fixed":"absolute",display:"none",left:f.left+"px",top:f.top+"px"});if(!b.inline){var g=$.datepicker._get(b,"showAnim"),h=$.datepicker._get(b,"duration"),i=function(){var a=b.dpDiv.find("iframe.ui-datepicker-cover");if(!!a.length){var c=$.datepicker._getBorders(b.dpDiv);a.css({left:-c[0],top:-c[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex($(a).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&$.effects[g]?b.dpDiv.show(g,$.datepicker._get(b,"showOptions"),h,i):b.dpDiv[g||"show"](g?h:null,i),(!g||!h)&&i(),b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus(),$.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this;b.maxRows=4;var c=$.datepicker._getBorders(a.dpDiv);instActive=a,a.dpDiv.empty().append(this._generateHTML(a));var d=a.dpDiv.find("iframe.ui-datepicker-cover");!d.length||d.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}),a.dpDiv.find("."+this._dayOverClass+" a").mouseover();var e=this._getNumberOfMonths(a),f=e[1],g=17;a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),f>1&&a.dpDiv.addClass("ui-datepicker-multi-"+f).css("width",g*f+"em"),a.dpDiv[(e[0]!=1||e[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),a==$.datepicker._curInst&&$.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var h=a.yearshtml;setTimeout(function(){h===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml),h=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(a){return{thin:1,medium:2,thick:3}[a]||a};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var d=a.dpDiv.outerWidth(),e=a.dpDiv.outerHeight(),f=a.input?a.input.outerWidth():0,g=a.input?a.input.outerHeight():0,h=document.documentElement.clientWidth+$(document).scrollLeft(),i=document.documentElement.clientHeight+$(document).scrollTop();b.left-=this._get(a,"isRTL")?d-f:0,b.left-=c&&b.left==a.input.offset().left?$(document).scrollLeft():0,b.top-=c&&b.top==a.input.offset().top+g?$(document).scrollTop():0,b.left-=Math.min(b.left,b.left+d>h&&h>d?Math.abs(b.left+d-h):0),b.top-=Math.min(b.top,b.top+e>i&&i>e?Math.abs(e+g):0);return b},_findPos:function(a){var b=this._getInst(a),c=this._get(b,"isRTL");while(a&&(a.type=="hidden"||a.nodeType!=1||$.expr.filters.hidden(a)))a=a[c?"previousSibling":"nextSibling"];var d=$(a).offset();return[d.left,d.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=$.data(a,PROP_NAME))&&this._datepickerShowing){var c=this._get(b,"showAnim"),d=this._get(b,"duration"),e=this,f=function(){$.datepicker._tidyDialog(b),e._curInst=null};$.effects&&$.effects[c]?b.dpDiv.hide(c,$.datepicker._get(b,"showOptions"),d,f):b.dpDiv[c=="slideDown"?"slideUp":c=="fadeIn"?"fadeOut":"hide"](c?d:null,f),c||f(),this._datepickerShowing=!1;var g=this._get(b,"onClose");g&&g.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDiv))),this._inDialog=!1}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(!!$.datepicker._curInst){var b=$(a.target),c=$.datepicker._getInst(b[0]);(b[0].id!=$.datepicker._mainDivId&&b.parents("#"+$.datepicker._mainDivId).length==0&&!b.hasClass($.datepicker.markerClassName)&&!b.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||b.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=c)&&$.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){var d=$(a),e=this._getInst(d[0]);this._isDisabledDatepicker(d[0])||(this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c),this._updateDatepicker(e))},_gotoToday:function(a){var b=$(a),c=this._getInst(b[0]);if(this._get(c,"gotoCurrent")&&c.currentDay)c.selectedDay=c.currentDay,c.drawMonth=c.selectedMonth=c.currentMonth,c.drawYear=c.selectedYear=c.currentYear;else{var d=new Date;c.selectedDay=d.getDate(),c.drawMonth=c.selectedMonth=d.getMonth(),c.drawYear=c.selectedYear=d.getFullYear()}this._notifyChange(c),this._adjustDate(b)},_selectMonthYear:function(a,b,c){var d=$(a),e=this._getInst(d[0]);e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10),this._notifyChange(e),this._adjustDate(d)},_selectDay:function(a,b,c,d){var e=$(a);if(!$(d).hasClass(this._unselectableClass)&&!this._isDisabledDatepicker(e[0])){var f=this._getInst(e[0]);f.selectedDay=f.currentDay=$("a",d).html(),f.selectedMonth=f.currentMonth=b,f.selectedYear=f.currentYear=c,this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){var b=$(a),c=this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(a,b){var c=$(a),d=this._getInst(c[0]);b=b!=null?b:this._formatDate(d),d.input&&d.input.val(b),this._updateAlternate(d);var e=this._get(d,"onSelect");e?e.apply(d.input?d.input[0]:null,[b,d]):d.input&&d.input.trigger("change"),d.inline?this._updateDatepicker(d):(this._hideDatepicker(),this._lastInput=d.input[0],typeof d.input[0]!="object"&&d.input.focus(),this._lastInput=null)},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),d=this._getDate(a),e=this.formatDate(c,d,this._getFormatConfig(a));$(b).each(function(){$(this).val(e)})}},noWeekends:function(a){var b=a.getDay();return[b>0&&b<6,""]},iso8601Week:function(a){var b=new Date(a.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();b.setMonth(0),b.setDate(1);return Math.floor(Math.round((c-b)/864e5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var d=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;d=typeof d!="string"?d:(new Date).getFullYear()%100+parseInt(d,10);var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,g=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,h=(c?c.monthNames:null)||this._defaults.monthNames,i=-1,j=-1,k=-1,l=-1,m=!1,n=function(b){var c=s+1<a.length&&a.charAt(s+1)==b;c&&s++;return c},o=function(a){var c=n(a),d=a=="@"?14:a=="!"?20:a=="y"&&c?4:a=="o"?3:2,e=new RegExp("^\\d{1,"+d+"}"),f=b.substring(r).match(e);if(!f)throw"Missing number at position "+r;r+=f[0].length;return parseInt(f[0],10)},p=function(a,c,d){var e=$.map(n(a)?d:c,function(a,b){return[[b,a]]}).sort(function(a,b){return-(a[1].length-b[1].length)}),f=-1;$.each(e,function(a,c){var d=c[1];if(b.substr(r,d.length).toLowerCase()==d.toLowerCase()){f=c[0],r+=d.length;return!1}});if(f!=-1)return f+1;throw"Unknown name at position "+r},q=function(){if(b.charAt(r)!=a.charAt(s))throw"Unexpected literal at position "+r;r++},r=0;for(var s=0;s<a.length;s++)if(m)a.charAt(s)=="'"&&!n("'")?m=!1:q();else switch(a.charAt(s)){case"d":k=o("d");break;case"D":p("D",e,f);break;case"o":l=o("o");break;case"m":j=o("m");break;case"M":j=p("M",g,h);break;case"y":i=o("y");break;case"@":var t=new Date(o("@"));i=t.getFullYear(),j=t.getMonth()+1,k=t.getDate();break;case"!":var t=new Date((o("!")-this._ticksTo1970)/1e4);i=t.getFullYear(),j=t.getMonth()+1,k=t.getDate();break;case"'":n("'")?q():m=!0;break;default:q()}if(r<b.length)throw"Extra/unparsed characters found in date: "+b.substring(r);i==-1?i=(new Date).getFullYear():i<100&&(i+=(new Date).getFullYear()-(new Date).getFullYear()%100+(i<=d?0:-100));if(l>-1){j=1,k=l;for(;;){var u=this._getDaysInMonth(i,j-1);if(k<=u)break;j++,k-=u}}var t=this._daylightSavingAdjust(new Date(i,j-1,k));if(t.getFullYear()!=i||t.getMonth()+1!=j||t.getDate()!=k)throw"Invalid date";return t},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1e7,formatDate:function(a,b,c){if(!b)return"";var d=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,e=(c?c.dayNames:null)||this._defaults.dayNames,f=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,h=function(b){var c=m+1<a.length&&a.charAt(m+1)==b;c&&m++;return c},i=function(a,b,c){var d=""+b;if(h(a))while(d.length<c)d="0"+d;return d},j=function(a,b,c,d){return h(a)?d[b]:c[b]},k="",l=!1;if(b)for(var m=0;m<a.length;m++)if(l)a.charAt(m)=="'"&&!h("'")?l=!1:k+=a.charAt(m);else switch(a.charAt(m)){case"d":k+=i("d",b.getDate(),2);break;case"D":k+=j("D",b.getDay(),d,e);break;case"o":k+=i("o",Math.round(((new Date(b.getFullYear(),b.getMonth(),b.getDate())).getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864e5),3);break;case"m":k+=i("m",b.getMonth()+1,2);break;case"M":k+=j("M",b.getMonth(),f,g);break;case"y":k+=h("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case"@":k+=b.getTime();break;case"!":k+=b.getTime()*1e4+this._ticksTo1970;break;case"'":h("'")?k+="'":l=!0;break;default:k+=a.charAt(m)}return k},_possibleChars:function(a){var b="",c=!1,d=function(b){var c=e+1<a.length&&a.charAt(e+1)==b;c&&e++;return c};for(var e=0;e<a.length;e++)if(c)a.charAt(e)=="'"&&!d("'")?c=!1:b+=a.charAt(e);else switch(a.charAt(e)){case"d":case"m":case"y":case"@":b+="0123456789";break;case"D":case"M":return null;case"'":d("'")?b+="'":c=!0;break;default:b+=a.charAt(e)}return b},_get:function(a,b){return a.settings[b]!==undefined?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),d=a.lastVal=a.input?a.input.val():null,e,f;e=f=this._getDefaultDate(a);var g=this._getFormatConfig(a);try{e=this.parseDate(c,d,g)||f}catch(h){this.log(h),d=b?"":d}a.selectedDay=e.getDate(),a.drawMonth=a.selectedMonth=e.getMonth(),a.drawYear=a.selectedYear=e.getFullYear(),a.currentDay=d?e.getDate():0,a.currentMonth=d?e.getMonth():0,a.currentYear=d?e.getFullYear():0,this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var d=function(a){var b=new Date;b.setDate(b.getDate()+a);return b},e=function(b){try{return $.datepicker.parseDate($.datepicker._get(a,"dateFormat"),b,$.datepicker._getFormatConfig(a))}catch(c){}var d=(b.toLowerCase().match(/^c/)?$.datepicker._getDate(a):null)||new Date,e=d.getFullYear(),f=d.getMonth(),g=d.getDate(),h=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,i=h.exec(b);while(i){switch(i[2]||"d"){case"d":case"D":g+=parseInt(i[1],10);break;case"w":case"W":g+=parseInt(i[1],10)*7;break;case"m":case"M":f+=parseInt(i[1],10),g=Math.min(g,$.datepicker._getDaysInMonth(e,f));break;case"y":case"Y":e+=parseInt(i[1],10),g=Math.min(g,$.datepicker._getDaysInMonth(e,f))}i=h.exec(b)}return new Date(e,f,g)},f=b==null||b===""?c:typeof b=="string"?e(b):typeof b=="number"?isNaN(b)?c:d(b):new Date(b.getTime());f=f&&f.toString()=="Invalid Date"?c:f,f&&(f.setHours(0),f.setMinutes(0),f.setSeconds(0),f.setMilliseconds(0));return this._daylightSavingAdjust(f)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var d=!b,e=a.selectedMonth,f=a.selectedYear,g=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=g.getDate(),a.drawMonth=a.selectedMonth=a.currentMonth=g.getMonth(),a.drawYear=a.selectedYear=a.currentYear=g.getFullYear(),(e!=a.selectedMonth||f!=a.selectedYear)&&!c&&this._notifyChange(a),this._adjustInstDate(a),a.input&&a.input.val(d?"":this._formatDate(a))},_getDate:function(a){var b=!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return b},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),d=this._get(a,"showButtonPanel"),e=this._get(a,"hideIfNoPrevNext"),f=this._get(a,"navigationAsDateFormat"),g=this._getNumberOfMonths(a),h=this._get(a,"showCurrentAtPos"),i=this._get(a,"stepMonths"),j=g[0]!=1||g[1]!=1,k=this._daylightSavingAdjust(a.currentDay?new Date(a.currentYear,a.currentMonth,a.currentDay):new Date(9999,9,9)),l=this._getMinMaxDate(a,"min"),m=this._getMinMaxDate(a,"max"),n=a.drawMonth-h,o=a.drawYear;n<0&&(n+=12,o--);if(m){var p=this._daylightSavingAdjust(new Date(m.getFullYear(),m.getMonth()-g[0]*g[1]+1,m.getDate()));p=l&&p<l?l:p;while(this._daylightSavingAdjust(new Date(o,n,1))>p)n--,n<0&&(n=11,o--)}a.drawMonth=n,a.drawYear=o;var q=this._get(a,"prevText");q=f?this.formatDate(q,this._daylightSavingAdjust(new Date(o,n-i,1)),this._getFormatConfig(a)):q;var r=this._canAdjustMonth(a,-1,o,n)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+dpuuid+".datepicker._adjustDate('#"+a.id+"', -"+i+", 'M');\""+' title="'+q+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+q+"</span></a>":e?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+q+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+q+"</span></a>",s=this._get(a,"nextText");s=f?this.formatDate(s,this._daylightSavingAdjust(new Date(o,n+i,1)),this._getFormatConfig(a)):s;var t=this._canAdjustMonth(a,1,o,n)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+dpuuid+".datepicker._adjustDate('#"+a.id+"', +"+i+", 'M');\""+' title="'+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>":e?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>",u=this._get(a,"currentText"),v=this._get(a,"gotoCurrent")&&a.currentDay?k:b;u=f?this.formatDate(u,v,this._getFormatConfig(a)):u;var w=a.inline?"":'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+dpuuid+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>",x=d?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?w:"")+(this._isInRange(a,v)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+dpuuid+".datepicker._gotoToday('#"+a.id+"');\""+">"+u+"</button>":"")+(c?"":w)+"</div>":"",y=parseInt(this._get(a,"firstDay"),10);y=isNaN(y)?0:y;var z=this._get(a,"showWeek"),A=this._get(a,"dayNames"),B=this._get(a,"dayNamesShort"),C=this._get(a,"dayNamesMin"),D=this._get(a,"monthNames"),E=this._get(a,"monthNamesShort"),F=this._get(a,"beforeShowDay"),G=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths"),I=this._get(a,"calculateWeek")||this.iso8601Week,J=this._getDefaultDate(a),K="";for(var L=0;L<g[0];L++){var M="";this.maxRows=4;for(var N=0;N<g[1];N++){var O=this._daylightSavingAdjust(new Date(o,n,a.selectedDay)),P=" ui-corner-all",Q="";if(j){Q+='<div class="ui-datepicker-group';if(g[1]>1)switch(N){case 0:Q+=" ui-datepicker-group-first",P=" ui-corner-"+(c?"right":"left");break;case g[1]-1:Q+=" ui-datepicker-group-last",P=" ui-corner-"+(c?"left":"right");break;default:Q+=" ui-datepicker-group-middle",P=""}Q+='">'}Q+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+P+'">'+(/all|left/.test(P)&&L==0?c?t:r:"")+(/all|right/.test(P)&&L==0?c?r:t:"")+this._generateMonthYearHeader(a,n,o,l,m,L>0||N>0,D,E)+'</div><table class="ui-datepicker-calendar"><thead>'+"<tr>";var R=z?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(var S=0;S<7;S++){var T=(S+y)%7;R+="<th"+((S+y+6)%7>=5?' class="ui-datepicker-week-end"':"")+">"+'<span title="'+A[T]+'">'+C[T]+"</span></th>"}Q+=R+"</tr></thead><tbody>";var U=this._getDaysInMonth(o,n);o==a.selectedYear&&n==a.selectedMonth&&(a.selectedDay=Math.min(a.selectedDay,U));var V=(this._getFirstDayOfMonth(o,n)-y+7)%7,W=Math.ceil((V+U)/7),X=j?this.maxRows>W?this.maxRows:W:W;this.maxRows=X;var Y=this._daylightSavingAdjust(new Date(o,n,1-V));for(var Z=0;Z<X;Z++){Q+="<tr>";var _=z?'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(Y)+"</td>":"";for(var S=0;S<7;S++){var ba=F?F.apply(a.input?a.input[0]:null,[Y]):[!0,""],bb=Y.getMonth()!=n,bc=bb&&!H||!ba[0]||l&&Y<l||m&&Y>m;_+='<td class="'+((S+y+6)%7>=5?" ui-datepicker-week-end":"")+(bb?" ui-datepicker-other-month":"")+(Y.getTime()==O.getTime()&&n==a.selectedMonth&&a._keyEvent||J.getTime()==Y.getTime()&&J.getTime()==O.getTime()?" "+this._dayOverClass:"")+(bc?" "+this._unselectableClass+" ui-state-disabled":"")+(bb&&!G?"":" "+ba[1]+(Y.getTime()==k.getTime()?" "+this._currentClass:"")+(Y.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!bb||G)&&ba[2]?' title="'+ba[2]+'"':"")+(bc?"":' onclick="DP_jQuery_'+dpuuid+".datepicker._selectDay('#"+a.id+"',"+Y.getMonth()+","+Y.getFullYear()+', this);return false;"')+">"+(bb&&!G?"&#xa0;":bc?'<span class="ui-state-default">'+Y.getDate()+"</span>":'<a class="ui-state-default'+(Y.getTime()==b.getTime()?" ui-state-highlight":"")+(Y.getTime()==k.getTime()?" ui-state-active":"")+(bb?" ui-priority-secondary":"")+'" href="#">'+Y.getDate()+"</a>")+"</td>",Y.setDate(Y.getDate()+1),Y=this._daylightSavingAdjust(Y)}Q+=_+"</tr>"}n++,n>11&&(n=0,o++),Q+="</tbody></table>"+(j?"</div>"+(g[0]>0&&N==g[1]-1?'<div class="ui-datepicker-row-break"></div>':""):""),M+=Q}K+=M}K+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':""),
++a._keyEvent=!1;return K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this._get(a,"showMonthAfterYear"),l='<div class="ui-datepicker-title">',m="";if(f||!i)m+='<span class="ui-datepicker-month">'+g[b]+"</span>";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+dpuuid+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" "+">";for(var p=0;p<12;p++)(!n||p>=d.getMonth())&&(!o||p<=e.getMonth())&&(m+='<option value="'+p+'"'+(p==b?' selected="selected"':"")+">"+h[p]+"</option>");m+="</select>"}k||(l+=m+(f||!i||!j?"&#xa0;":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+='<span class="ui-datepicker-year">'+c+"</span>";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+dpuuid+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" "+">";for(;t<=u;t++)a.yearshtml+='<option value="'+t+'"'+(t==c?' selected="selected"':"")+">"+t+"</option>";a.yearshtml+="</select>",l+=a.yearshtml,a.yearshtml=null}}l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?"&#xa0;":"")+m),l+="</div>";return l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&b<c?c:b;e=d&&e>d?d:e;return e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth()));return this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return $.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return $.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b));return this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)})},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.18",window["DP_jQuery_"+dpuuid]=$})(jQuery);/*
++ * jQuery UI Progressbar 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Progressbar
++ *
++ * Depends:
++ *   jquery.ui.core.js
++ *   jquery.ui.widget.js
++ */(function(a,b){a.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()}),this.valueDiv=a("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove(),a.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===b)return this._value();this._setOption("value",a);return this},_setOption:function(b,c){b==="value"&&(this.options.value=c,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),a.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;typeof a!="number"&&(a=0);return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var a=this.value(),b=this._percentage();this.oldValue!==a&&(this.oldValue=a,this._trigger("change")),this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(b.toFixed(0)+"%"),this.element.attr("aria-valuenow",a)}}),a.extend(a.ui.progressbar,{version:"1.8.18"})})(jQuery);/*
++ * jQuery UI Effects 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Effects/
++ */jQuery.effects||function(a,b){function l(b){if(!b||typeof b=="number"||a.fx.speeds[b])return!0;if(typeof b=="string"&&!a.effects[b])return!0;return!1}function k(b,c,d,e){typeof b=="object"&&(e=c,d=null,c=b,b=c.effect),a.isFunction(c)&&(e=c,d=null,c={});if(typeof c=="number"||a.fx.speeds[c])e=d,d=c,c={};a.isFunction(d)&&(e=d,d=null),c=c||{},d=d||c.duration,d=a.fx.off?0:typeof d=="number"?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,e=e||c.complete;return[b,c,d,e]}function j(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function i(b){var c,d;for(c in b)d=b[c],(d==null||a.isFunction(d)||c in g||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete b[c];return b}function h(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if(a&&a.length&&a[0]&&a[a[0]]){var e=a.length;while(e--)c=a[e],typeof a[c]=="string"&&(d=c.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c])}else for(c in a)typeof a[c]=="string"&&(b[c]=a[c]);return b}function d(b,d){var e;do{e=a.curCSS(b,d);if(e!=""&&e!="transparent"||a.nodeName(b,"body"))break;d="backgroundColor"}while(b=b.parentNode);return c(e)}function c(b){var c;if(b&&b.constructor==Array&&b.length==3)return b;if(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))return[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)];if(c=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))return[parseFloat(c[1])*2.55,parseFloat(c[2])*2.55,parseFloat(c[3])*2.55];if(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))return[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)];if(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))return[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)];if(c=/rgba\(0, 0, 0, 0\)/.exec(b))return e.transparent;return e[a.trim(b).toLowerCase()]}a.effects={},a.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(b,e){a.fx.step[e]=function(a){a.colorInit||(a.start=d(a.elem,e),a.end=c(a.end),a.colorInit=!0),a.elem.style[e]="rgb("+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var e={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},f=["add","remove","toggle"],g={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(b,c,d,e){a.isFunction(d)&&(e=d,d=null);return this.queue(function(){var g=a(this),k=g.attr("style")||" ",l=i(h.call(this)),m,n=g.attr("class");a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),m=i(h.call(this)),g.attr("class",n),g.animate(j(l,m),{queue:!1,duration:c,easing:d,complete:function(){a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),typeof g.attr("style")=="object"?(g.attr("style").cssText="",g.attr("style").cssText=k):g.attr("style",k),e&&e.apply(this,arguments),a.dequeue(this)}})})},a.fn.extend({_addClass:a.fn.addClass,addClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{add:b},c,d,e]):this._addClass(b)},_removeClass:a.fn.removeClass,removeClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{remove:b},c,d,e]):this._removeClass(b)},_toggleClass:a.fn.toggleClass,toggleClass:function(c,d,e,f,g){return typeof d=="boolean"||d===b?e?a.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):a.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(b,c,d,e,f){return a.effects.animateClass.apply(this,[{add:c,remove:b},d,e,f])}}),a.extend(a.effects,{version:"1.8.18",save:function(a,b){for(var c=0;c<b.length;c++)b[c]!==null&&a.data("ec.storage."+b[c],a[0].style[b[c]])},restore:function(a,b){for(var c=0;c<b.length;c++)b[c]!==null&&a.css(b[c],a.data("ec.storage."+b[c]))},setMode:function(a,b){b=="toggle"&&(b=a.is(":hidden")?"show":"hide");return b},getBaseline:function(a,b){var c,d;switch(a[0]){case"top":c=0;break;case"middle":c=.5;break;case"bottom":c=1;break;default:c=a[0]/b.height}switch(a[1]){case"left":d=0;break;case"center":d=.5;break;case"right":d=1;break;default:d=a[1]/b.width}return{x:d,y:c}},createWrapper:function(b){if(b.parent().is(".ui-effects-wrapper"))return b.parent();var c={width:b.outerWidth(!0),height:b.outerHeight(!0),"float":b.css("float")},d=a("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e=document.activeElement;b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css("position")=="static"?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"}));return d.css(c).show()},removeWrapper:function(b){var c,d=document.activeElement;if(b.parent().is(".ui-effects-wrapper")){c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus();return c}return b},setTransition:function(b,c,d,e){e=e||{},a.each(c,function(a,c){unit=b.cssUnit(c),unit[0]>0&&(e[c]=unit[0]*d+unit[1])});return e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];if(a.fx.off||!i)return h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)});return i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);b[1].mode="show";return this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);b[1].mode="hide";return this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b=="boolean"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(this,arguments);c[1].mode="toggle";return this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])});return d}}),a.easing.jswing=a.easing.swing,a.extend(a.easing,{def:"easeOutQuad",swing:function(b,c,d,e,f){return a.easing[a.easing.def](b,c,d,e,f)},easeInQuad:function(a,b,c,d,e){return d*(b/=e)*b+c},easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c},easeInOutQuad:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b+c;return-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b*b+c;return d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c},easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b*b*b+c;return-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)*b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b*b*b*b+c;return d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return b==0?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){if(b==0)return c;if(b==e)return c+d;if((b/=e/2)<1)return d/2*Math.pow(2,10*(b-1))+c;return d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)*b)+c},easeInOutCirc:function(a,b,c,d,e){if((b/=e/2)<1)return-d/2*(Math.sqrt(1-b*b)-1)+c;return d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e)==1)return c+d;g||(g=e*.3);if(h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g))+c},easeOutElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e)==1)return c+d;g||(g=e*.3);if(h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*b)*Math.sin((b*e-f)*2*Math.PI/g)+d+c},easeInOutElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e/2)==2)return c+d;g||(g=e*.3*1.5);if(h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);if(b<1)return-0.5*h*Math.pow(2,10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g)+c;return h*Math.pow(2,-10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g)*.5+d+c},easeInBack:function(a,c,d,e,f,g){g==b&&(g=1.70158);return e*(c/=f)*c*((g+1)*c-g)+d},easeOutBack:function(a,c,d,e,f,g){g==b&&(g=1.70158);return e*((c=c/f-1)*c*((g+1)*c+g)+1)+d},easeInOutBack:function(a,c,d,e,f,g){g==b&&(g=1.70158);if((c/=f/2)<1)return e/2*c*c*(((g*=1.525)+1)*c-g)+d;return e/2*((c-=2)*c*(((g*=1.525)+1)*c+g)+2)+d},easeInBounce:function(b,c,d,e,f){return e-a.easing.easeOutBounce(b,f-c,0,e,f)+d},easeOutBounce:function(a,b,c,d,e){return(b/=e)<1/2.75?d*7.5625*b*b+c:b<2/2.75?d*(7.5625*(b-=1.5/2.75)*b+.75)+c:b<2.5/2.75?d*(7.5625*(b-=2.25/2.75)*b+.9375)+c:d*(7.5625*(b-=2.625/2.75)*b+.984375)+c},easeInOutBounce:function(b,c,d,e,f){if(c<f/2)return a.easing.easeInBounce(b,c*2,0,e,f)*.5+d;return a.easing.easeOutBounce(b,c*2-f,0,e,f)*.5+e*.5+d}})}(jQuery);/*
++ * jQuery UI Effects Blind 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Effects/Blind
++ *
++ * Depends:
++ *    jquery.effects.core.js
++ */(function(a,b){a.effects.blind=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"vertical";a.effects.save(c,d),c.show();var g=a.effects.createWrapper(c).css({overflow:"hidden"}),h=f=="vertical"?"height":"width",i=f=="vertical"?g.height():g.width();e=="show"&&g.css(h,0);var j={};j[h]=e=="show"?i:0,g.animate(j,b.duration,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);/*
++ * jQuery UI Effects Bounce 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Effects/Bounce
++ *
++ * Depends:
++ *    jquery.effects.core.js
++ */(function(a,b){a.effects.bounce=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"effect"),f=b.options.direction||"up",g=b.options.distance||20,h=b.options.times||5,i=b.duration||250;/show|hide/.test(e)&&d.push("opacity"),a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var j=f=="up"||f=="down"?"top":"left",k=f=="up"||f=="left"?"pos":"neg",g=b.options.distance||(j=="top"?c.outerHeight({margin:!0})/3:c.outerWidth({margin:!0})/3);e=="show"&&c.css("opacity",0).css(j,k=="pos"?-g:g),e=="hide"&&(g=g/(h*2)),e!="hide"&&h--;if(e=="show"){var l={opacity:1};l[j]=(k=="pos"?"+=":"-=")+g,c.animate(l,i/2,b.options.easing),g=g/2,h--}for(var m=0;m<h;m++){var n={},p={};n[j]=(k=="pos"?"-=":"+=")+g,p[j]=(k=="pos"?"+=":"-=")+g,c.animate(n,i/2,b.options.easing).animate(p,i/2,b.options.easing),g=e=="hide"?g*2:g/2}if(e=="hide"){var l={opacity:0};l[j]=(k=="pos"?"-=":"+=")+g,c.animate(l,i/2,b.options.easing,function(){c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments)})}else{var n={},p={};n[j]=(k=="pos"?"-=":"+=")+g,p[j]=(k=="pos"?"+=":"-=")+g,c.animate(n,i/2,b.options.easing).animate(p,i/2,b.options.easing,function(){a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments)})}c.queue("fx",function(){c.dequeue()}),c.dequeue()})}})(jQuery);/*
++ * jQuery UI Effects Clip 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Effects/Clip
++ *
++ * Depends:
++ *    jquery.effects.core.js
++ */(function(a,b){a.effects.clip=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right","height","width"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"vertical";a.effects.save(c,d),c.show();var g=a.effects.createWrapper(c).css({overflow:"hidden"}),h=c[0].tagName=="IMG"?g:c,i={size:f=="vertical"?"height":"width",position:f=="vertical"?"top":"left"},j=f=="vertical"?h.height():h.width();e=="show"&&(h.css(i.size,0),h.css(i.position,j/2));var k={};k[i.size]=e=="show"?j:0,k[i.position]=e=="show"?0:j/2,h.animate(k,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()}})})}})(jQuery);/*
++ * jQuery UI Effects Drop 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Effects/Drop
++ *
++ * Depends:
++ *    jquery.effects.core.js
++ */(function(a,b){a.effects.drop=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right","opacity"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"left";a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var g=f=="up"||f=="down"?"top":"left",h=f=="up"||f=="left"?"pos":"neg",i=b.options.distance||(g=="top"?c.outerHeight({margin:!0})/2:c.outerWidth({margin:!0})/2);e=="show"&&c.css("opacity",0).css(g,h=="pos"?-i:i);var j={opacity:e=="show"?1:0};j[g]=(e=="show"?h=="pos"?"+=":"-=":h=="pos"?"-=":"+=")+i,c.animate(j,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);/*
++ * jQuery UI Effects Explode 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Effects/Explode
++ *
++ * Depends:
++ *    jquery.effects.core.js
++ */(function(a,b){a.effects.explode=function(b){return this.queue(function(){var c=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3,d=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3;b.options.mode=b.options.mode=="toggle"?a(this).is(":visible")?"hide":"show":b.options.mode;var e=a(this).show().css("visibility","hidden"),f=e.offset();f.top-=parseInt(e.css("marginTop"),10)||0,f.left-=parseInt(e.css("marginLeft"),10)||0;var g=e.outerWidth(!0),h=e.outerHeight(!0);for(var i=0;i<c;i++)for(var j=0;j<d;j++)e.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-j*(g/d),top:-i*(h/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/d,height:h/c,left:f.left+j*(g/d)+(b.options.mode=="show"?(j-Math.floor(d/2))*(g/d):0),top:f.top+i*(h/c)+(b.options.mode=="show"?(i-Math.floor(c/2))*(h/c):0),opacity:b.options.mode=="show"?0:1}).animate({left:f.left+j*(g/d)+(b.options.mode=="show"?0:(j-Math.floor(d/2))*(g/d)),top:f.top+i*(h/c)+(b.options.mode=="show"?0:(i-Math.floor(c/2))*(h/c)),opacity:b.options.mode=="show"?1:0},b.duration||500);setTimeout(function(){b.options.mode=="show"?e.css({visibility:"visible"}):e.css({visibility:"visible"}).hide(),b.callback&&b.callback.apply(e[0]),e.dequeue(),a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);/*
++ * jQuery UI Effects Fade 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Effects/Fade
++ *
++ * Depends:
++ *    jquery.effects.core.js
++ */(function(a,b){a.effects.fade=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide");c.animate({opacity:d},{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);/*
++ * jQuery UI Effects Fold 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Effects/Fold
++ *
++ * Depends:
++ *    jquery.effects.core.js
++ */(function(a,b){a.effects.fold=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.size||15,g=!!b.options.horizFirst,h=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(c,d),c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"}),j=e=="show"!=g,k=j?["width","height"]:["height","width"],l=j?[i.width(),i.height()]:[i.height(),i.width()],m=/([0-9]+)%/.exec(f);m&&(f=parseInt(m[1],10)/100*l[e=="hide"?0:1]),e=="show"&&i.css(g?{height:0,width:f}:{height:f,width:0});var n={},p={};n[k[0]]=e=="show"?l[0]:f,p[k[1]]=e=="show"?l[1]:0,i.animate(n,h,b.options.easing).animate(p,h,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);/*
++ * jQuery UI Effects Highlight 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Effects/Highlight
++ *
++ * Depends:
++ *    jquery.effects.core.js
++ */(function(a,b){a.effects.highlight=function(b){return this.queue(function(){var c=a(this),d=["backgroundImage","backgroundColor","opacity"],e=a.effects.setMode(c,b.options.mode||"show"),f={backgroundColor:c.css("backgroundColor")};e=="hide"&&(f.opacity=0),a.effects.save(c,d),c.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(f,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),e=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);/*
++ * jQuery UI Effects Pulsate 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Effects/Pulsate
++ *
++ * Depends:
++ *    jquery.effects.core.js
++ */(function(a,b){a.effects.pulsate=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"show");times=(b.options.times||5)*2-1,duration=b.duration?b.duration/2:a.fx.speeds._default/2,isVisible=c.is(":visible"),animateTo=0,isVisible||(c.css("opacity",0).show(),animateTo=1),(d=="hide"&&isVisible||d=="show"&&!isVisible)&&times--;for(var e=0;e<times;e++)c.animate({opacity:animateTo},duration,b.options.easing),animateTo=(animateTo+1)%2;c.animate({opacity:animateTo},duration,b.options.easing,function(){animateTo==0&&c.hide(),b.callback&&b.callback.apply(this,arguments)}),c.queue("fx",function(){c.dequeue()}).dequeue()})}})(jQuery);/*
++ * jQuery UI Effects Scale 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Effects/Scale
++ *
++ * Depends:
++ *    jquery.effects.core.js
++ */(function(a,b){a.effects.puff=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide"),e=parseInt(b.options.percent,10)||150,f=e/100,g={height:c.height(),width:c.width()};a.extend(b.options,{fade:!0,mode:d,percent:d=="hide"?e:100,from:d=="hide"?g:{height:g.height*f,width:g.width*f}}),c.effect("scale",b.options,b.duration,b.callback),c.dequeue()})},a.effects.scale=function(b){return this.queue(function(){var c=a(this),d=a.extend(!0,{},b.options),e=a.effects.setMode(c,b.options.mode||"effect"),f=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:e=="hide"?0:100),g=b.options.direction||"both",h=b.options.origin;e!="effect"&&(d.origin=h||["middle","center"],d.restore=!0);var i={height:c.height(),width:c.width()};c.from=b.options.from||(e=="show"?{height:0,width:0}:i);var j={y:g!="horizontal"?f/100:1,x:g!="vertical"?f/100:1};c.to={height:i.height*j.y,width:i.width*j.x},b.options.fade&&(e=="show"&&(c.from.opacity=0,c.to.opacity=1),e=="hide"&&(c.from.opacity=1,c.to.opacity=0)),d.from=c.from,d.to=c.to,d.mode=e,c.effect("size",d,b.duration,b.callback),c.dequeue()})},a.effects.size=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right","width","height","overflow","opacity"],e=["position","top","bottom","left","right","overflow","opacity"],f=["width","height","overflow"],g=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],i=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],j=a.effects.setMode(c,b.options.mode||"effect"),k=b.options.restore||!1,l=b.options.scale||"both",m=b.options.origin,n={height:c.height(),width:c.width()};c.from=b.options.from||n,c.to=b.options.to||n;if(m){var p=a.effects.getBaseline(m,n);c.from.top=(n.height-c.from.height)*p.y,c.from.left=(n.width-c.from.width)*p.x,c.to.top=(n.height-c.to.height)*p.y,c.to.left=(n.width-c.to.width)*p.x}var q={from:{y:c.from.height/n.height,x:c.from.width/n.width},to:{y:c.to.height/n.height,x:c.to.width/n.width}};if(l=="box"||l=="both")q.from.y!=q.to.y&&(d=d.concat(h),c.from=a.effects.setTransition(c,h,q.from.y,c.from),c.to=a.effects.setTransition(c,h,q.to.y,c.to)),q.from.x!=q.to.x&&(d=d.concat(i),c.from=a.effects.setTransition(c,i,q.from.x,c.from),c.to=a.effects.setTransition(c,i,q.to.x,c.to));(l=="content"||l=="both")&&q.from.y!=q.to.y&&(d=d.concat(g),c.from=a.effects.setTransition(c,g,q.from.y,c.from),c.to=a.effects.setTransition(c,g,q.to.y,c.to)),a.effects.save(c,k?d:e),c.show(),a.effects.createWrapper(c),c.css("overflow","hidden").css(c.from);if(l=="content"||l=="both")h=h.concat(["marginTop","marginBottom"]).concat(g),i=i.concat(["marginLeft","marginRight"]),f=d.concat(h).concat(i),c.find("*[width]").each(function(){child=a(this),k&&a.effects.save(child,f);var c={height:child.height(),width:child.width()};child.from={height:c.height*q.from.y,width:c.width*q.from.x},child.to={height:c.height*q.to.y,width:c.width*q.to.x},q.from.y!=q.to.y&&(child.from=a.effects.setTransition(child,h,q.from.y,child.from),child.to=a.effects.setTransition(child,h,q.to.y,child.to)),q.from.x!=q.to.x&&(child.from=a.effects.setTransition(child,i,q.from.x,child.from),child.to=a.effects.setTransition(child,i,q.to.x,child.to)),child.css(child.from),child.animate(child.to,b.duration,b.options.easing,function(){k&&a.effects.restore(child,f)})});c.animate(c.to,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){c.to.opacity===0&&c.css("opacity",c.from.opacity),j=="hide"&&c.hide(),a.effects.restore(c,k?d:e),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);/*
++ * jQuery UI Effects Shake 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Effects/Shake
++ *
++ * Depends:
++ *    jquery.effects.core.js
++ */(function(a,b){a.effects.shake=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"effect"),f=b.options.direction||"left",g=b.options.distance||20,h=b.options.times||3,i=b.duration||b.options.duration||140;a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var j=f=="up"||f=="down"?"top":"left",k=f=="up"||f=="left"?"pos":"neg",l={},m={},n={};l[j]=(k=="pos"?"-=":"+=")+g,m[j]=(k=="pos"?"+=":"-=")+g*2,n[j]=(k=="pos"?"-=":"+=")+g*2,c.animate(l,i,b.options.easing);for(var p=1;p<h;p++)c.animate(m,i,b.options.easing).animate(n,i,b.options.easing);c.animate(m,i,b.options.easing).animate(l,i/2,b.options.easing,function(){a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments)}),c.queue("fx",function(){c.dequeue()}),c.dequeue()})}})(jQuery);/*
++ * jQuery UI Effects Slide 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Effects/Slide
++ *
++ * Depends:
++ *    jquery.effects.core.js
++ */(function(a,b){a.effects.slide=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"show"),f=b.options.direction||"left";a.effects.save(c,d),c.show(),a.effects.createWrapper(c).css({overflow:"hidden"});var g=f=="up"||f=="down"?"top":"left",h=f=="up"||f=="left"?"pos":"neg",i=b.options.distance||(g=="top"?c.outerHeight({margin:!0}):c.outerWidth({margin:!0}));e=="show"&&c.css(g,h=="pos"?isNaN(i)?"-"+i:-i:i);var j={};j[g]=(e=="show"?h=="pos"?"+=":"-=":h=="pos"?"-=":"+=")+i,c.animate(j,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);/*
++ * jQuery UI Effects Transfer 1.8.18
++ *
++ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * http://docs.jquery.com/UI/Effects/Transfer
++ *
++ * Depends:
++ *    jquery.effects.core.js
++ */(function(a,b){a.effects.transfer=function(b){return this.queue(function(){var c=a(this),d=a(b.options.to),e=d.offset(),f={top:e.top,left:e.left,height:d.innerHeight(),width:d.innerWidth()},g=c.offset(),h=a('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);
+\ No newline at end of file
+diff -up cacti-0.8.8a/include/js/jquery/jquery.zoom.js.legal cacti-0.8.8a/include/js/jquery/jquery.zoom.js
+--- cacti-0.8.8a/include/js/jquery/jquery.zoom.js.legal        2013-01-04 15:44:38.045416081 -0500
++++ cacti-0.8.8a/include/js/jquery/jquery.zoom.js      2013-01-04 15:43:12.646377987 -0500
+@@ -0,0 +1,866 @@
++/*
++ +-------------------------------------------------------------------------+
++ | Copyright (C) 2004-2013 The Cacti Group                                 |
++ |                                                                         |
++ | This 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.                  |
++ |                                                                         |
++ | This program is distributed in the hope that it will be useful,         |
++ | but WITHOUT ANY WARRANTY; without even the implied warranty of          |
++ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           |
++ | GNU General Public License for more details.                            |
++ +-------------------------------------------------------------------------+
++ | Cacti: The Complete RRDTool-based Graphing Solution                     |
++ +-------------------------------------------------------------------------+
++ | This code is designed, written, and maintained by the Cacti Group. See  |
++ | about.php and/or the AUTHORS file for specific developer information.   |
++ +-------------------------------------------------------------------------+
++ | http://www.cacti.net/                                                   |
++ +-------------------------------------------------------------------------+
++*/
++
++/* requirements:
++      jQuery 1.7.x or above
++      jQuery UI 1.8.x or above
++      jQuery cookie plugin
++*/
++
++(function($){
++      $.fn.zoom = function(options) {
++
++              /* +++++++++++++++++++++++ Global Variables +++++++++++++++++++++++++ */
++
++              // default values of the different options being offered
++              var defaults = {
++                      inputfieldStartTime     : '',                                           // ID of the input field that contains the start date
++                      inputfieldEndTime       : '',                                           // ID of the input field that contains the end date
++                      submitButton            : 'button_refresh_x',                           // ID of the submit button
++                      cookieName                      : 'cacti_zoom'                                  // default name required for session cookie
++              };
++
++              // define global variables / objects here
++              var zoom = {
++                      // "initiator" is the element that initiates Zoom
++                      initiator: $(this),
++                      // "image" means the image tag and its properties
++                      image: { top:0, left:0, width:0, height:0 },
++                      // "graph" stands for the rrdgraph itself excluding legend, graph title etc.
++                      graph: { timespan:0, secondsPerPixel:0 },
++                      // "box" describes the area in front of the graph whithin jQueryZoom will allow interaction
++                      box: { top:0, left:0, right:0, width:0, height:0 },
++                      // "markers" are selectors useable within the advanced mode
++                      marker: { 1 : { placed:false }, 2 : { placed:false} },
++                      // "custom" holds the local configuration done by the user
++                      custom: {},
++                      // "options" contains the start input parameters
++                      options: $.extend(defaults, options),
++                      // "attributes" holds all values that will describe the selected area
++                      attr: { activeElement:'', start:'none', end:'none', action:'left2right', location: window.location.href.split("?") }
++              };
++
++
++              /* ++++++++++++++++++++++++ Initialization ++++++++++++++++++++++++++ */
++
++              // use a cookie to support local settings
++              zoom.custom =  $.cookie(zoom.options.cookieName) ? unserialize( $.cookie(zoom.options.cookieName) ) : {};
++              if(zoom.custom.zoomMode == undefined) zoom.custom.zoomMode = 'quick';
++              if(zoom.custom.zoomOutPositioning == undefined) zoom.custom.zoomOutPositioning = 'center';
++              if(zoom.custom.zoomOutFactor == undefined) zoom.custom.zoomOutFactor = '2';
++              if(zoom.custom.zoomMarkers == undefined) zoom.custom.zoomMarkers = true;
++              if(zoom.custom.zoomTimestamps == undefined) zoom.custom.zoomTimestamps = 'auto';
++              if(zoom.custom.zoom3rdMouseButton == undefined) zoom.custom.zoom3rdMouseButton = false;
++
++              // create or update a session cookie
++              $.cookie( zoom.options.cookieName, serialize(zoom.custom), {expires: null} );
++
++              // support jQuery's concatination
++              return this.each(function() { zoom_init( $(this) ); });
++
++
++              /* ++++++++++++++++++++ Universal Functions +++++++++++++++++++++++++ */
++
++              /**
++               * checks if an image has been already loaded or if the link is broken
++               **/
++              function isReady(image){
++                      if(typeof image[0].naturalWidth !== undefined && image[0].naturalWidth == 0) {
++                              return false;
++                      }
++                      // support older versions of IE(6-8)
++                      if(!image[0].complete) {
++                              return false;
++                      }
++                      return true;
++              }
++
++              /**
++               * splits off the parameters of a given url
++               **/
++              function getUrlVars(url) {
++                      var parameters = [], name, value;
++
++                      urlBaseAndParameters = url.split("?");
++                      urlBase = urlBaseAndParameters[0];
++                      urlParameters = urlBaseAndParameters[1].split("&");
++                      parameters["urlBase"] = urlBase;
++
++                      for(var i=0; i<urlParameters.length; i++) {
++                              parameter = urlParameters[i].split("=");
++                              parameters[parameter[0].replace(/^graph_/, "")] = $.isNumeric(parameter[1]) ? +parameter[1] : parameter[1];
++                      }
++                      return parameters;
++              }
++
++              /**
++               * transforms an object into a comma separated string of key-value pairs
++               **/
++              function serialize(object){
++                      var str = "";
++                      for(var key in object) { str += (key + '=' + object[key] + ','); }
++                      return str.slice(0, -1);
++              }
++
++              /**
++               * transforms a comma separated string of key-values pairs into an object
++               * including a change of the value type from string to boolean or numeric if reasonable.
++               **/
++              function unserialize(string){
++                      var obj = new Array();
++                      pairs = string.split(',');
++                      for(var i=0; i<pairs.length; i++) {
++                              pair = pairs[i].split("=");
++                              if(pair[1] == "true") {
++                                      pair[1] = true;
++                              }else if(pair[1] == "false") {
++                                      pair[1] = false;
++                              }else if($.isNumeric(pair[1])) {
++                                      pair[1] = +pair[1];
++                              }
++                              obj[pair[0]] = pair[1];
++                      }
++                      return obj;
++              }
++
++              /**
++               * converts a Unix time stamp to a formatted date string
++               **/
++              function unixTime2Date(unixTime){
++                      var date        = new Date(unixTime*1000);
++                      var year        = date.getFullYear();
++                      var month       = ((date.getMonth()+1) < 9 ) ? '0' + (date.getMonth()+1) : date.getMonth()+1;
++                      var day         = (date.getDate() > 9) ? date.getDate() : '0' + date.getDate();
++                      var hours       = (date.getHours() > 9) ? date.getHours() : '0' + date.getHours();
++                      var minutes     = (date.getMinutes() > 9) ? date.getMinutes() : '0' + date.getMinutes();
++                      var seconds     = (date.getSeconds() > 9) ? date.getSeconds() : '0' + date.getSeconds();
++
++                      var formattedTime = year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds;
++                      return formattedTime;
++              }
++
++
++              /* +++++++++++++++++++++++ Core Functions +++++++++++++++++++++++++++ */
++
++              /* init zoom */
++              function zoom_init(image) {
++                      var $this = image;
++                      $this.mouseenter(
++                              function(){
++                                      if(zoom.attr.activeElement == '') {
++                                              zoom.attr.activeElement = $(this).attr('id');
++                                              zoomFunction_init($this);
++                                      // focusing another image will trigger a reset of Zoom
++                                      }else if(zoom.attr.activeElement != $(this).attr('id')) {
++                                              zoom.attr.activeElement = $(this).attr('id');
++                                              zoomFunction_init($this);
++                                      }
++                              }
++                      );
++              }
++
++              function zoomFunction_init(image) {
++                      var $this = image;
++                      // exit if image has not been already loaded or if image is not available
++                      if(isReady($this)) {
++                              // update zoom.image object with the attributes of this image
++                              zoom.image.width        = parseInt($this.width());
++                              zoom.image.height       = parseInt($this.height());
++                              zoom.image.top          = parseInt($this.offset().top);
++                              zoom.image.left         = parseInt($this.offset().left);
++                      }else {
++                              return;
++                      }
++
++                      // get all graph parameters and merge results with zoom.graph object
++                      $.extend(zoom.graph, getUrlVars( $this.attr("src") ));
++                      zoom.graph.timespan                     = zoom.graph.end - zoom.graph.start;
++                      zoom.graph.secondsPerPixel      = zoom.graph.timespan/zoom.graph.width;
++
++                      if((zoom.graph.title_font_size <= 0) || (zoom.graph.title_font_size == "")) {
++                              zoom.graph.title_font_size = 10;
++                      }
++
++                      if(zoom.graph.nolegend != undefined) {
++                              zoom.graph.title_font_size      *= .70;
++                      }
++
++                      // update all zoom box attributes. Unfortunately we have to use that best fit way
++                      // to support RRDtool 1.2 and below. With RRDtool 1.3 or higher there would be a
++                      // much more elegant solution available. (see RRDdtool graph option "graphv")
++                      zoom.box.width          = zoom.graph.width;
++                      zoom.box.height         = zoom.graph.height;
++
++                      if(zoom.graph.title_font_size == null) {
++                              zoom.box.top = 32 - 1;
++                      }else {
++                              //default multiplier
++                              var multiplier = 2.4;
++                              // array of "best fit" multipliers
++                              multipliers = new Array("-5", "-2", "0", "1.7", "1.6", "1.7", "1.8", "1.9", "2", "2", "2.1", "2.1", "2.2", "2.2", "2.3", "2.3", "2.3", "2.3", "2.3");
++                              if(multipliers[Math.round(zoom.graph.title_font_size)] != null) {
++                                      multiplier = multipliers[Math.round(zoom.graph.title_font_size)];
++                              }
++                              zoom.box.top = zoom.image.top + parseInt(Math.abs(zoom.graph.title_font_size) * multiplier) + 15;
++                      }
++
++                      zoom.box.bottom = zoom.box.top + zoom.box.height;
++                      zoom.box.right  = zoom.image.left + zoom.image.width - 30;
++                      zoom.box.left   = zoom.box.right - zoom.graph.width;
++
++                      // add all additional HTML elements to the DOM if necessary and register
++                      // the individual events needed. Once added we will only reset
++                      // and reposition these elements.
++
++                      // add the "zoomBox"
++                      if($("#zoom-box").length == 0) {
++                              // Please note: IE does not fire hover or click behaviors on completely transparent elements.
++                              // Use a background color and set opacity to 1% as a workaround.(see CSS file)
++                              $("<div id='zoom-box'></div>").appendTo("body");
++                      }
++
++                      // add the "zoomSelectedArea"
++                      if($("#zoom-area").length == 0) {
++                              $("<div id='zoom-area'></div>").appendTo("body");
++                      }
++
++                      // add two markers for the advanced mode
++                      if($("#zoom-marker-1").length == 0) {
++                              $('<div id="zoom-excluded-area-1" class="zoom-area-excluded"></div>').appendTo("body");
++                              $('<div class="zoom-marker" id="zoom-marker-1"><div class="zoom-marker-arrow-down"></div><div class="zoom-marker-arrow-up"></div></div>').appendTo("body");
++                              $('<div id="zoom-marker-tooltip-1" class="zoom-marker-tooltip"><div id="zoom-marker-tooltip-1-arrow-left" class="zoom-marker-tooltip-arrow-left"><div id="zoom-marker-tooltip-1-arrow-left-inner" class="zoom-marker-tooltip-arrow-left-inner"></div></div><span id="zoom-marker-tooltip-value-1" class="zoom-marker-tooltip-value">-</span><div id="zoom-marker-tooltip-1-arrow-right" class="zoom-marker-tooltip-arrow-right"><div id="zoom-marker-tooltip-1-arrow-right-inner" class="zoom-marker-tooltip-arrow-right-inner"></div></div></div>').appendTo('body');
++                      }
++                      if($("#zoom-marker-2").length == 0) {
++                              $('<div id="zoom-excluded-area-2" class="zoom-area-excluded"></div>').appendTo("body");
++                              $('<div class="zoom-marker" id="zoom-marker-2"><div class="zoom-marker-arrow-down"></div><div class="zoom-marker-arrow-up"></div></div>').appendTo("body");
++                              $('<div id="zoom-marker-tooltip-2" class="zoom-marker-tooltip"><div id="zoom-marker-tooltip-2-arrow-left" class="zoom-marker-tooltip-arrow-left"><div id="zoom-marker-tooltip-1-arrow-left-inner" class="zoom-marker-tooltip-arrow-left-inner"></div></div><span id="zoom-marker-tooltip-value-2" class="zoom-marker-tooltip-value">-</span><div id="zoom-marker-tooltip-2-arrow-right" class="zoom-marker-tooltip-arrow-right"><div id="zoom-marker-tooltip-2-arrow-right-inner" class="zoom-marker-tooltip-arrow-right-inner"></div></div></div>').appendTo('body');
++                      }
++                      zoom.marker[1].placed = false;
++                      zoom.marker[2].placed = false;
++
++                      // add the context (right click) menu
++                      if($("#zoom-menu").length == 0) {
++                              $('<div id="zoom-menu" class="zoom-menu">'
++                                      + '<div class="first_li">'
++                                      +               '<div class="ui-icon ui-icon-zoomin"></div>'
++                                      +       '<span class="zoomContextMenuAction__zoom_in">Zoom In</span>'
++                                      + '</div>'
++                                      + '<div class="first_li">'
++                                      +               '<div class="ui-icon ui-icon-zoomout"></div>'
++                                      +               '<span class="zoomContextMenuAction__zoom_out">Zoom Out (2x)</span>'
++                                      +               '<div class="inner_li advanced_mode">'
++                                      +                       '<span class="zoomContextMenuAction__zoom_out__2">2x</span>'
++                                      +                       '<span class="zoomContextMenuAction__zoom_out__4">4x</span>'
++                                      +                       '<span class="zoomContextMenuAction__zoom_out__8">8x</span>'
++                                      +                       '<span class="zoomContextMenuAction__zoom_out__16">16x</span>'
++                                      +                       '<span class="zoomContextMenuAction__zoom_out__32">32x</span>'
++                                      +               '</div>'
++                                      + '</div>'
++                                      + '<div class="sep_li"></div>'
++                                      + '<div class="first_li">'
++                                      +               '<div class="ui-icon ui-icon-empty"></div><span>Zoom Mode</span>'
++                                      +               '<div class="inner_li">'
++                                      +                       '<span class="zoomContextMenuAction__set_zoomMode__quick">Quick</span>'
++                                      +                       '<span class="zoomContextMenuAction__set_zoomMode__advanced">Advanced</span>'
++                                      +               '</div>'
++                                      + '</div>'
++                                      + '<div class="first_li advanced_mode">'
++                                      +               '<div class="ui-icon ui-icon-wrench"></div><span>Settings</span>'
++                                      +                       '<div class="inner_li">'
++                                      +                               '<div class="sec_li"><span>Markers</span>'
++                                      +                                       '<div class="inner_li advanced_mode">'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoomMarkers__on">Enabled</span>'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoomMarkers__off">Disabled</span>'
++                                      +                                       '</div>'
++                                      +                               '</div>'
++                                      +                               '<div class="sec_li"><span>Timestamps</span></span>'
++                                      +                                       '<div class="inner_li advanced_mode">'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoomTimestamps__on">Always On</span>'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoomTimestamps__auto">Auto</span>'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoomTimestamps__off">Always Off</span>'
++                                      +                                       '</div>'
++                                      +                               '</div>'
++                                      +                               '<div class="sep_li"></div>'
++                                      +                               '<div class="sec_li"><span>Zoom Out Factor</span>'
++                                      +                                       '<div class="inner_li advanced_mode">'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoomOutFactor__2">2x</span>'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoomOutFactor__4">4x</span>'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoomOutFactor__8">8x</span>'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoomOutFactor__16">16x</span>'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoomOutFactor__32">32x</span>'
++                                      +                                       '</div>'
++                                      +                               '</div>'
++                                      +                               '<div class="sec_li"><span>Zoom Out Positioning</span>'
++                                      +                                       '<div class="inner_li advanced_mode">'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoomOutPositioning__begin">Begin with</span>'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoomOutPositioning__center">Center</span>'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoomOutPositioning__end">End with</span>'
++                                      +                                       '</div>'
++                                      +                               '</div>'
++                                      +                               '<div class="sec_li"><span>3rd Mouse Button</span>'
++                                      +                                       '<div class="inner_li advanced_mode">'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoom3rdMouseButton__zoom_in">Zoom in</span>'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoom3rdMouseButton__zoom_out">Zoom out</span>'
++                                      +                                               '<span class="zoomContextMenuAction__set_zoom3rdMouseButton__off">Disabled</span>'
++                                      +                                       '</div>'
++                                      +                               '</div>'
++                                      +                       '</div>'
++                                      +               '</div>'
++                                      + '<div class="sep_li"></div>'
++                                      + '<div class="first_li">'
++                                      +               '<div class="ui-icon ui-icon-close"></div><span class="zoomContextMenuAction__close">Close</span>'
++                                      + '</div>').appendTo('body');
++                      }
++                      zoomElemtents_reset()
++                      zoomContextMenu_init();
++                      zoomAction_init(image);
++              }
++
++              /**
++               * resets all elements of Zoom
++               **/
++              function zoomElemtents_reset() {
++                      zoom.marker = { 1 : { placed:false }, 2 : { placed:false} };
++                      $('div[id^="zoom-"]').not('#zoom-menu').each( function () {
++                              $(this).removeAttr('style');
++                      });
++                      $("#zoom-box").off();
++                      $("#zoom-box").css({ cursor:'crosshair', width:zoom.box.width + 'px', height:zoom.box.height + 'px', top:zoom.box.top+'px', left:zoom.box.left+'px' });
++                      $("#zoom-box").bind('contextmenu', function(e) { zoomContextMenu_show(e); return false;} );
++                      $("#zoom-area").off().css({ top:zoom.box.top+'px', height:zoom.box.height+'px' });
++                      $(".zoom-area-excluded").off();
++                      $(".zoom-area-excluded").bind('contextmenu', function(e) { zoomContextMenu_show(e); return false;} );
++                      $(".zoom-area-excluded").bind('click', function(e) { zoomContextMenu_hide(); return false;} );
++                      $(".zoom-marker-arrow-up").css({ top:(zoom.box.height-6) + 'px' });
++                      $(".zoom-marker-tooltip-value").disableSelection();
++              }
++
++              /*
++              * registers all the different mouse click event handler
++              */
++              function zoomAction_init(image) {
++
++                      if(zoom.custom.zoomMode == 'quick') {
++                              $("#zoom-box").off("mousedown").on("mousedown", function(e) {
++                                      switch(e.which) {
++                                              /* clicking the left mouse button will initiates a zoom-in */
++                                              case 1:
++                                                      zoomContextMenu_hide();
++                                                      // reset the zoom area
++                                                      zoom.attr.start = e.pageX;
++                                                      if(zoom.custom.zoomMode != 'quick') {
++                                                              $("#zoom-marker-1").css({ height:zoom.box.height+'px', top:zoom.box.top+'px', left:zoom.attr.start+'px', display:'block' });
++                                                              $("#zoom-marker-tooltip-1").css({ top:zoom.box.top+'px', left:zoom.attr.start+'px'});
++                                                      }
++                                                      $("#zoom-box").css({ cursor:'e-resize' });
++                                                      $("#zoom-area").css({ width:'0px', left:zoom.attr.start+'px' });
++                                              break;
++                                      }
++                              });
++
++                              /* register the mouse up event */
++                              $("#zoom-area").off("mouseup").on("mouseup", function(e) {
++                                      switch(e.which) {
++                                              /* leaving the left mouse button will execute a zoom in */
++                                              case 1:
++                                                      if(zoom.custom.zoomMode == 'quick' && zoom.attr.start != 'none') {
++                                                              zoomAction_zoom_in();
++                                                      }
++                                              break;
++                                      }
++                              });
++
++                              /* stretch the zoom area in that direction the user moved the mouse pointer */
++                              $("#zoom-box").mousemove( function(e) { zoomAction_draw(e) } );
++
++                              /* stretch the zoom area in that direction the user moved the mouse pointer.
++                                 That is required to get it working faultlessly with Opera, IE and Chrome     */
++                              $("#zoom-area").mousemove( function(e) { zoomAction_draw(e); } );
++
++                              /* moving the mouse pointer quickly will avoid that the mousemove event has enough time to actualize the zoom area */
++                              $("#zoom-box").mouseout( function(e) { zoomAction_draw(e) } );
++
++                      }else{
++                              /* welcome to the advanced mode ;) */
++                              $("#zoom-box").off("mousedown").on("mousedown", function(e) {
++                                      switch(e.which) {
++                                              case 1:
++                                                      /* hide context menu if open */
++                                                      zoomContextMenu_hide();
++
++                                                      /* find out which marker has to be added */
++                                                      if(zoom.marker[1].placed && zoom.marker[2].placed) {
++                                                              zoomAction_zoom_in();
++                                                              return;
++                                                      }else {
++                                                              var marker = zoom.marker[1].placed ? 2 : 1;
++                                                              var secondmarker = (marker == 1) ? 2 : 1;
++                                                      }
++
++                                                      /* select marker */
++                                                      var $this = $("#zoom-marker-" + marker);
++
++                                                      /* place the marker and make it visible */
++                                                      $this.css({ height:zoom.box.height+'px', top:zoom.box.top+'px', left:e.pageX+'px', display:'block' });
++                                                      zoom.marker[marker].placed = true;
++                                                      zoom.marker[marker].left = e.pageX;
++
++                                                      /* place the marker's tooltip, update its value and make it visible if necessary (Setting: "Always On") */
++                                                      zoom.marker[marker].unixtime = parseInt(parseInt(zoom.graph.start) + (e.pageX + 1 - zoom.box.left)*zoom.graph.secondsPerPixel);
++                                                      $("#zoom-marker-tooltip-value-" + marker).html(
++                                                              unixTime2Date(zoom.marker[marker].unixtime).replace(" ", "<br>")
++                                                      );
++                                                      zoom.marker[marker].width = $("#zoom-marker-tooltip-" + marker).width();
++
++                                                      $("#zoom-marker-tooltip-" + marker).css({
++                                                              top: ( (marker == 1) ? zoom.box.top+3 : zoom.box.bottom-30 )+'px',
++                                                              left:( (marker == 1) ? e.pageX - zoom.marker[marker].width : e.pageX )+'px'}
++                                                      );
++
++                                                      if(zoom.custom.zoomTimestamps === true) {
++                                                              $("#zoom-marker-tooltip-" + marker).fadeIn(500);
++                                                      }
++
++                                                      if(e.pageX == $("#zoom-marker-tooltip-" + marker).position().left) {
++                                                              $("#zoom-marker-tooltip-" + marker + "-arrow-right").css({ visibility:'hidden'});
++                                                      }else {
++                                                              $("#zoom-marker-tooltip-" + marker + "-arrow-left").css({ visibility:'hidden'});
++                                                      }
++
++                                                      /* make the excluded areas visible directly in that moment both markers are set */
++                                                      if(zoom.marker[1].placed && zoom.marker[2].placed) {
++                                                              zoom.marker.distance    = zoom.marker[1].left - zoom.marker[2].left;
++
++                                                              $("#zoom-excluded-area-1").css({
++                                                                      height:zoom.box.height+'px',
++                                                                      top:zoom.box.top+'px',
++                                                                      left: (zoom.marker.distance > 0) ? zoom.marker[1].left : zoom.box.left,
++                                                                      width: (zoom.marker.distance > 0) ? zoom.box.right - zoom.marker[1].left : zoom.marker[1].left - zoom.box.left,
++                                                                      display:'block'
++                                                              });
++
++                                                              $("#zoom-excluded-area-2").css({
++                                                                      height:zoom.box.height+'px',
++                                                                      top:zoom.box.top+'px',
++                                                                      left: (zoom.marker.distance < 0) ? zoom.marker[2].left : zoom.box.left,
++                                                                      width: (zoom.marker.distance < 0) ? zoom.box.right - zoom.marker[2].left : zoom.marker[2].left - zoom.box.left,
++                                                                      display:'block'
++                                                              });
++
++                                                              /* reposition both tooltips */
++                                                              $("#zoom-marker-tooltip-1").css({ left: $("#zoom-marker-1").position().left - ( (zoom.marker.distance > 0) ? 0 : $("#zoom-marker-tooltip-1").width() ) + 'px' });
++                                                              $("#zoom-marker-tooltip-1-arrow-left").css({ visibility: (($("#zoom-marker-tooltip-1").position().left < $("#zoom-marker-1").position().left ) ? 'hidden' : 'visible') });
++                                                              $("#zoom-marker-tooltip-1-arrow-right").css({ visibility: (($("#zoom-marker-tooltip-1").position().left < $("#zoom-marker-1").position().left ) ? 'visible' : 'hidden') });
++
++                                                              $("#zoom-marker-tooltip-2").css({ left: $("#zoom-marker-2").position().left - ( (zoom.marker.distance < 0) ? 0 : $("#zoom-marker-tooltip-2").width() ) + 'px' });
++                                                              $("#zoom-marker-tooltip-2-arrow-left").css({ visibility: (($("#zoom-marker-tooltip-2").position().left < $("#zoom-marker-2").position().left ) ? 'hidden' : 'visible') });
++                                                              $("#zoom-marker-tooltip-2-arrow-right").css({ visibility: (($("#zoom-marker-tooltip-2").position().left < $("#zoom-marker-2").position().left ) ? 'visible' : 'hidden') });
++                                                      }
++
++                                                      /* make the marker draggable */
++                                                      $this.draggable({
++                                                              containment:[ zoom.box.left-1, 0 , zoom.box.left+parseInt(zoom.box.width), 0 ],
++                                                              axis: "x",
++                                                              start:
++                                                                      function(event, ui) {
++                                                                              if(zoom.custom.zoomTimestamps == "auto") {
++                                                                                      $(".zoom-marker-tooltip").fadeIn(500);
++                                                                              }
++                                                                      },
++                                                              drag:
++                                                                      function(event, ui) {
++
++                                                                              zoom.marker[marker].left = ui.position["left"];
++
++                                                                              /* update the timestamp shown in tooltip */
++                                                                              zoom.marker[marker].unixtime = parseInt(parseInt(zoom.graph.start) + (zoom.marker[marker].left + 1 - zoom.box.left)*zoom.graph.secondsPerPixel);
++                                                                              $("#zoom-marker-tooltip-value-" + marker).html(
++                                                                                      unixTime2Date(zoom.marker[marker].unixtime).replace(" ", "<br>")
++                                                                              );
++
++                                                                              zoom.marker[marker].width = $("#zoom-marker-tooltip-" + marker).width();
++
++                                                                              /* update the execludedArea if both markers have been placed */
++                                                                              if(zoom.marker[1].placed && zoom.marker[2].placed) {
++                                                                                      zoom.marker.distance = zoom.marker[marker].left - zoom.marker[secondmarker].left;
++
++                                                                                      if( zoom.marker.distance > 0 ) {
++                                                                                              zoom.marker[marker].excludeArea = 'right';
++                                                                                              zoom.marker[secondmarker].excludeArea = 'left';
++                                                                                      }else {
++                                                                                              zoom.marker[marker].excludeArea = 'left';
++                                                                                              zoom.marker[secondmarker].excludeArea = 'right';
++                                                                                      }
++
++                                                                                      /* in that case we have to update the tooltip of both marker */
++                                                                                      $("#zoom-excluded-area-" + marker).css({ left: (zoom.marker.distance > 0) ? zoom.marker[marker].left : zoom.box.left, width: (zoom.marker.distance > 0) ? zoom.box.right - zoom.marker[marker].left : zoom.marker[marker].left - zoom.box.left});
++                                                                                      $("#zoom-marker-tooltip-" + marker).css({ left: zoom.marker[marker].left + ( (zoom.marker[marker].excludeArea == 'right') ? (0) : (-zoom.marker[marker].width) ) });
++                                                                                      $("#zoom-marker-tooltip-" + marker + "-arrow-left").css({ visibility: ( zoom.marker[marker].excludeArea == 'left' ? 'hidden' : 'visible') });
++                                                                                      $("#zoom-marker-tooltip-" + marker + "-arrow-right").css({ visibility: ( zoom.marker[marker].excludeArea == 'left' ? 'visible' : 'hidden') });
++
++                                                                                      $("#zoom-excluded-area-" + secondmarker).css({ left: (zoom.marker.distance > 0) ? zoom.box.left : zoom.marker[secondmarker].left, width: (zoom.marker.distance > 0) ? zoom.marker[secondmarker].left - zoom.box.left : zoom.box.right - zoom.marker[secondmarker].left});
++                                                                                      $("#zoom-marker-tooltip-" + secondmarker ).css({ left: zoom.marker[secondmarker].left + ( (zoom.marker[secondmarker].excludeArea == 'right') ? (0) : (-zoom.marker[secondmarker].width) ) });
++                                                                                      $("#zoom-marker-tooltip-" + secondmarker + "-arrow-left").css({ visibility: ( zoom.marker[secondmarker].excludeArea == 'left' ? 'hidden' : 'visible') });
++                                                                                      $("#zoom-marker-tooltip-" + secondmarker + "-arrow-right").css({ visibility: ( zoom.marker[secondmarker].excludeArea == 'left' ? 'visible' : 'hidden') });
++
++                                                                              }else {
++                                                                                      /* let the tooltip follow its marker */
++                                                                                      $("#zoom-marker-tooltip-" + marker).css({ left: zoom.marker[marker].left -zoom.marker[marker].width });
++                                                                              }
++
++                                                                      },
++                                                              stop:
++                                                                      function(event,ui) {
++                                                                              /* hide all tooltip if we are in auto mode */
++                                                                              if(zoom.custom.zoomTimestamps == "auto") {
++                                                                                      $(".zoom-marker-tooltip").fadeOut(1000);
++                                                                              }
++                                                                      }
++
++                                                      });
++
++                                                      break;
++                                              case 2:
++                                                      if(zoom.custom.zoom3rdMouseButton != false) {
++                                                              /* hide context menu if open */
++                                                              zoomContextMenu_hide();
++                                                              if(zoom.custom.zoom3rdMouseButton == "zoom_in") {
++                                                                      zoomAction_zoom_in();
++                                                              }else {
++                                                                      zoomAction_zoom_out( zoom.custom.zoomOutFactor );
++                                                              }
++                                                      }
++                                                      break;
++                                      }
++                                      return false;
++
++                              });
++
++                      }
++              }
++
++
++              /*
++              * executes a dynamic zoom in
++              */
++              function zoomAction_zoom_in(){
++
++                      /* hide context menu if open */
++                      zoomContextMenu_hide();
++
++                      if(zoom.custom.zoomMode == 'quick') {
++
++                              var newGraphStartTime   = (zoom.attr.action == 'left2right')    ? parseInt(parseInt(zoom.graph.start) + (zoom.attr.start - zoom.box.left)*zoom.graph.secondsPerPixel)
++                                                                                                                                                              : parseInt(parseInt(zoom.graph.start) + (zoom.attr.end - zoom.box.left)*zoom.graph.secondsPerPixel);
++                              var newGraphEndTime     = (zoom.attr.action == 'left2right')    ? parseInt(newGraphStartTime + (zoom.attr.end-zoom.attr.start)*zoom.graph.secondsPerPixel)
++                                                                                                                                                              : parseInt(newGraphStartTime + (zoom.attr.start-zoom.attr.end)*zoom.graph.secondsPerPixel);
++
++                              /* If the user only clicked on a graph then equal end and start date to ensure that we do not propergate NaNs */
++                              if(isNaN(newGraphStartTime) & isNaN(newGraphEndTime)) {
++                                      return;
++                              }else if(isNaN(newGraphStartTime) & !isNaN(newGraphEndTime)) {
++                                      newGraphStartTime = newGraphEndTime;
++                              }else if(!isNaN(newGraphStartTime) & isNaN(newGraphEndTime)){
++                                      newGraphEndTime = newGraphStartTime;
++                              }
++                      }else {
++                              /* advanced mode has other requirements */
++                              /* first of, do nothing if not both marker have been positioned */
++                              if(!zoom.marker[1].placed | !zoom.marker[2].placed) {
++                                      alert("NOTE: In advanced mode both markers have to be positioned first to define the period of time you want to zoom in.");
++                                      return;
++                              }else {
++                                      var newGraphStartTime = zoom.marker[((zoom.marker[1].unixtime > zoom.marker[2].unixtime)? 2 : 1 )].unixtime;
++                                      var newGraphEndTime = zoom.marker[((zoom.marker[1].unixtime > zoom.marker[2].unixtime)? 1 : 2 )].unixtime;
++                              }
++                      }
++
++                      if(zoom.options.inputfieldStartTime != '' & zoom.options.inputfieldEndTime != ''){
++                              /* execute zoom within "tree view" or the "preview view" */
++                              $('#' + zoom.options.inputfieldStartTime).val(unixTime2Date(newGraphStartTime));
++                              $('#' + zoom.options.inputfieldEndTime).val(unixTime2Date(newGraphEndTime));
++
++                              $("input[name='" + zoom.options.submitButton + "']").trigger('click');
++                              return false;
++                      }else {
++                              /* graph view is alread in zoom status */
++                              open(zoom.attr.location[0] + "?action=" + zoom.graph.action + "&local_graph_id=" + zoom.graph.local_graph_id + "&rra_id=" + zoom.graph.rra_id + "&view_type=" + zoom.graph.view_type + "&graph_start=" + newGraphStartTime + "&graph_end=" + newGraphEndTime + "&graph_height=" + zoom.graph.height + "&graph_width=" + zoom.graph.width + "&title_font_size=" + zoom.graph.title_font_size, "_self");
++                      }
++
++              }
++
++
++
++
++              /*
++              * executes a static zoom out (as right click event)
++              */
++              function zoomAction_zoom_out(multiplier){
++
++                      multiplier--;
++                      /* avoid that we can not zoom out anymore if start and end date will be equal */
++                      if(zoom.graph.timespan == 0) {
++                              zoom.graph.timespan = 1;
++                      }
++
++                      if(zoom.custom.zoomMode == 'quick' || !zoom.marker[1].placed || !zoom.marker[2].placed ) {
++                              if(zoom.custom.zoomOutPositioning == 'begin') {
++                                      var newGraphStartTime = parseInt(zoom.graph.start);
++                                      var newGraphEndTime = parseInt(parseInt(zoom.graph.end) + (multiplier * zoom.graph.timespan));
++                              }else if(zoom.custom.zoomOutPositioning == 'end') {
++                                      var newGraphStartTime = parseInt(parseInt(zoom.graph.start) - (multiplier * zoom.graph.timespan));
++                                      var newGraphEndTime = parseInt(zoom.graph.end);
++                              }else {
++                                      // define the new start and end time, so that the selected area will be centered per default
++                                      var newGraphStartTime = parseInt(parseInt(zoom.graph.start) - (0.5 * multiplier * zoom.graph.timespan));
++                                      var newGraphEndTime = parseInt(parseInt(zoom.graph.end) + (0.5 * multiplier * zoom.graph.timespan));
++                              }
++                      }else {
++                              var newGraphStartTime = zoom.marker[((zoom.marker[1].unixtime > zoom.marker[2].unixtime)? 2 : 1 )].unixtime;
++                              var newGraphEndTime = zoom.marker[((zoom.marker[1].unixtime > zoom.marker[2].unixtime)? 1 : 2 )].unixtime;
++                              var selectedTimeSpan = newGraphEndTime - newGraphStartTime;
++
++                              if(zoom.custom.zoomOutPositioning == 'begin') {
++                                      newGraphEndTime = newGraphEndTime + multiplier * selectedTimeSpan;
++                              }else if(zoom.custom.zoomOutPositioning == 'end') {
++                                      newGraphStartTime = newGraphStartTime - multiplier * selectedTimeSpan;
++                              }else {
++                                      newGraphStartTime = newGraphStartTime - 0.5 * multiplier * selectedTimeSpan;
++                                      newGraphEndTime = newGraphEndTime + 0.5 * multiplier * selectedTimeSpan;
++                              }
++                      }
++
++                      if(zoom.options.inputfieldStartTime != '' & zoom.options.inputfieldEndTime != ''){
++                              $('#' + zoom.options.inputfieldStartTime).val(unixTime2Date(newGraphStartTime));
++                              $('#' + zoom.options.inputfieldEndTime).val(unixTime2Date(newGraphEndTime));
++                              $('#' + zoom.options.inputfieldStartTime).closest("form").submit();
++                      }else {
++                              open(zoom.attr.location[0] + "?action=" + zoom.graph.action + "&local_graph_id=" + zoom.graph.local_graph_id + "&rra_id=" + zoom.graph.rra_id + "&view_type=" + zoom.graph.view_type + "&graph_start=" + newGraphStartTime + "&graph_end=" + newGraphEndTime + "&graph_height=" + zoom.graph.height + "&graph_width=" + zoom.graph.width + "&title_font_size=" + zoom.graph.title_font_size, "_self");
++                      }
++              }
++
++
++              /*
++              * updates the css parameters of the zoom area to reflect user's interaction
++              */
++              function zoomAction_draw(event) {
++
++                      if(zoom.attr.start == 'none') { return; }
++
++                      /* mouse has been moved from right to left */
++                      if((event.pageX-zoom.attr.start)<0) {
++                              zoom.attr.action = 'right2left';
++                              zoom.attr.end = (event.pageX < zoom.box.left) ? zoom.box.left : event.pageX;
++                              $("#zoom-area").css({ background:'red', left:(zoom.attr.end+1)+'px', width:Math.abs(zoom.attr.start-zoom.attr.end-1)+'px' });
++                      /* mouse has been moved from left to right*/
++                      }else {
++                              zoom.attr.action = 'left2right';
++                              zoom.attr.end = (event.pageX > zoom.box.right) ? zoom.box.right : event.pageX;
++                              $("#zoom-area").css({ background:'red', left:zoom.attr.start+'px', width:Math.abs(zoom.attr.end-zoom.attr.start-1)+'px' });
++                      }
++                      /* move second marker if necessary */
++                      if(zoom.custom.zoomMode != 'quick') {
++                              $("#zoom-marker-2").css({ left:(zoom.attr.end+1)+'px' });
++                              $("#zoom-marker-tooltip-2").css({ top:zoom.box.top+'px', left:(zoom.attr.end-5)+'px' });
++                      }
++              }
++
++              /**
++               *
++               * @access public
++               * @return void
++               **/
++              function zoomContextMenu_init(){
++
++                      /* sync menu with cookie parameters */
++                      $(".zoomContextMenuAction__set_zoomMode__" + zoom.custom.zoomMode).addClass("ui-state-highlight");
++                      $(".zoomContextMenuAction__set_zoomMarkers__" + ((zoom.custom.zoomMarkers === true) ? "on" : "off") ).addClass("ui-state-highlight");
++                      $(".zoomContextMenuAction__set_zoomTimestamps__" + ((zoom.custom.zoomTimestamps == 'auto') ? "auto" : ((zoom.custom.zoomTimestamps) ? "on" : "off" ))).addClass("ui-state-highlight");
++                      $(".zoomContextMenuAction__set_zoomOutFactor__" + zoom.custom.zoomOutFactor).addClass("ui-state-highlight");
++                      $(".zoomContextMenuAction__set_zoomOutPositioning__" + zoom.custom.zoomOutPositioning).addClass("ui-state-highlight");
++                      $(".zoomContextMenuAction__set_zoom3rdMouseButton__" + ((zoom.custom.zoom3rdMouseButton === false) ? "off" : zoom.custom.zoom3rdMouseButton) ).addClass("ui-state-highlight");
++
++                      if(zoom.custom.zoomMode == "quick") {
++                              $("#zoom-menu > .advanced_mode").hide();
++                      }else {
++                              $(".zoomContextMenuAction__zoom_out").text("Zoom Out (" + zoom.custom.zoomOutFactor + "x)");
++                      }
++
++                      /* init click on events */
++                      $('[class*=zoomContextMenuAction__]').off().on('click', function() {
++                              var zoomContextMenuAction = false;
++                              var zoomContextMenuActionValue = false;
++                              var classList = $(this).attr('class').trim().split(/\s+/);
++
++                              $.each( classList, function(index, item){
++                                      if( item.search("zoomContextMenuAction__") != -1) {
++                                              zoomContextMenuActionList = item.replace("zoomContextMenuAction__", "").split("__");
++                                              zoomContextMenuAction = zoomContextMenuActionList[0];
++                                              if(zoomContextMenuActionList[1] == 'undefined' || zoomContextMenuActionList[1] == 'off') {
++                                                      zoomContextMenuActionValue = false;
++                                              }else if(zoomContextMenuActionList[1] == 'on') {
++                                                      zoomContextMenuActionValue = true;
++                                              }else {
++                                                      zoomContextMenuActionValue = zoomContextMenuActionList[1];
++                                              }
++                                              return( false );
++                                      }
++                              });
++
++                              if( zoomContextMenuAction ) {
++                                      if( zoomContextMenuAction.substring(0,8) == "set_zoom") {
++                                              zoomContextMenuAction_set( zoomContextMenuAction.replace("set_zoom", "").toLowerCase(), zoomContextMenuActionValue);
++                                      }else {
++                                              zoomContextMenuAction_do( zoomContextMenuAction, zoomContextMenuActionValue);
++                                      }
++                              }
++                      });
++
++                      /* init hover events */
++                      $(".first_li , .sec_li, .inner_li span").hover(
++                              function () {
++                                      $(this).css({backgroundColor : '#E0EDFE' , cursor : 'pointer'});
++                                      if ( $(this).children().size() >0 )
++                                              if(zoom.custom.zoomMode == "quick") {
++                                                      $(this).children('.inner_li:not(.advanced_mode)').show();
++                                              }else {
++                                                      $(this).children('.inner_li').show();
++                                              }
++                                      },
++                              function () {
++                                      $(this).css('background-color' , '#fff' );
++                                      $(this).children('.inner_li').hide();
++                              }
++                      );
++              };
++
++              /**
++               *
++               * @access public
++               * @return void
++               **/
++              function zoomContextMenuAction_set(object, value){
++                      switch(object) {
++                              case "mode":
++                                      if( zoom.custom.zoomMode != value) {
++                                              zoom.custom.zoomMode = value;
++                                              $('[class*=zoomContextMenuAction__set_zoomMode__]').toggleClass("ui-state-highlight");
++
++                                              if(value == "quick") {
++                                                      // reset menu
++                                                      $("#zoom-menu > .advanced_mode").hide();
++                                                      $(".zoomContextMenuAction__zoom_out").text("Zoom Out (2x)");
++
++                                                      zoom.custom.zoomMode                    = 'quick';
++                                                      $.cookie( zoom.options.cookieName, serialize(zoom.custom));
++                                              }else {
++                                                      // switch to advanced mode
++                                                      $("#zoom-menu > .advanced_mode").show();
++                                                      $(".zoomContextMenuAction__zoom_out").text("Zoom Out (" +  + zoom.custom.zoomOutFactor + "x)");
++
++                                                      zoom.custom.zoomMode                    = 'advanced';
++                                                      $.cookie( zoom.options.cookieName, serialize(zoom.custom));
++                                              }
++                                              zoomElemtents_reset();
++                                              zoomAction_init(zoom.initiator);
++
++                                      }
++                                      break;
++                              case "markers":
++                                      if( zoom.custom.zoomMarkers != value) {
++                                              zoom.custom.zoomMarkers = value;
++                                              $.cookie( zoom.options.cookieName, serialize(zoom.custom));
++                                              $('[class*=zoomContextMenuAction__set_zoomMarkers__]').toggleClass('ui-state-highlight');
++                                      }
++                                      break;
++                              case "timestamps":
++                                      if( zoom.custom.zoomTimestamps != value) {
++                                              zoom.custom.zoomTimestamps = value;
++                                              $.cookie( zoom.options.cookieName, serialize(zoom.custom));
++                                              $('[class*=zoomContextMenuAction__set_zoomTimestamps__]').removeClass('ui-state-highlight');
++                                              $('.zoomContextMenuAction__set_zoomTimestamps__' + ((zoom.custom.zoomTimestamps == 'auto') ? "auto" : ((zoom.custom.zoomTimestamps) ? "on" : "off" ))).addClass('ui-state-highlight');
++
++                                              /* make them visible only for mode "Always On" */
++                                              if(zoom.custom.zoomTimestamps === true) {
++                                                      $('.zoom-marker-tooltip').fadeIn(500);
++                                              }else {
++                                                      $('.zoom-marker-tooltip').fadeOut(500);
++                                              }
++                                      }
++                                      break;
++                              case "outfactor":
++                                      if( zoom.custom.zoomOutFactor != value) {
++                                              zoom.custom.zoomOutFactor = value;
++                                              $.cookie( zoom.options.cookieName, serialize(zoom.custom));
++                                              $('[class*=zoomContextMenuAction__set_zoomOutFactor__]').removeClass('ui-state-highlight');
++                                              $('.zoomContextMenuAction__set_zoomOutFactor__' + value).addClass('ui-state-highlight');
++                                              $('.zoomContextMenuAction__zoom_out').text('Zoom Out (' + value + 'x)');
++                                      }
++                                      break;
++                              case "outpositioning":
++                                      if( zoom.custom.zoomOutPositioning != value) {
++                                              zoom.custom.zoomOutPositioning = value;
++                                              $.cookie( zoom.options.cookieName, serialize(zoom.custom));
++                                              $('[class*=zoomContextMenuAction__set_zoomOutPositioning__]').removeClass('ui-state-highlight');
++                                              $('.zoomContextMenuAction__set_zoomOutPositioning__' + value).addClass('ui-state-highlight');
++                                      }
++                                      break;
++                              case "3rdmousebutton":
++                                      if( zoom.custom.zoom3rdMouseButton != value) {
++                                              zoom.custom.zoom3rdMouseButton = value;
++                                              $.cookie( zoom.options.cookieName, serialize(zoom.custom));
++                                              $('[class*=zoomContextMenuAction__set_zoom3rdMouseButton__]').removeClass('ui-state-highlight');
++                                              $('.zoomContextMenuAction__set_zoom3rdMouseButton__' + ((value === false) ? "off" : value)).addClass('ui-state-highlight');
++                                      }
++                                      break;
++                      }
++              }
++
++              function zoomContextMenuAction_do(action, value){
++                      switch(action) {
++                              case "close":
++                                      zoomContextMenu_hide();
++                                      break;
++                              case "zoom_out":
++                                      if(value == undefined) {
++                                              value = (zoom.custom.zoomMode != "quick") ? zoom.custom.zoomOutFactor : 2;
++                                      }
++                                      zoomAction_zoom_out(value);
++                                      break;
++                              case "zoom_in":
++                                      zoomAction_zoom_in();
++                                      break;
++                      }
++              }
++
++              function zoomContextMenu_show(e){
++                      $("#zoom-menu").css({ left: e.pageX, top: e.pageY, zIndex: '101' }).show();
++              };
++
++              function zoomContextMenu_hide(){
++                      $('#zoom-menu').hide();
++              }
++
++      };
++
++})(jQuery);
+\ No newline at end of file
+diff -up cacti-0.8.8a/include/js/jquery/themes/default/d.gif.legal cacti-0.8.8a/include/js/jquery/themes/default/d.gif
+Binary files cacti-0.8.8a/include/js/jquery/themes/default/d.gif.legal and cacti-0.8.8a/include/js/jquery/themes/default/d.gif differ
+diff -up cacti-0.8.8a/include/js/jquery/themes/default/d.png.legal cacti-0.8.8a/include/js/jquery/themes/default/d.png
+Binary files cacti-0.8.8a/include/js/jquery/themes/default/d.png.legal and cacti-0.8.8a/include/js/jquery/themes/default/d.png differ
+diff -up cacti-0.8.8a/include/js/jquery/themes/default/style.css.legal cacti-0.8.8a/include/js/jquery/themes/default/style.css
+--- cacti-0.8.8a/include/js/jquery/themes/default/style.css.legal      2013-01-04 15:44:49.350420872 -0500
++++ cacti-0.8.8a/include/js/jquery/themes/default/style.css    2013-01-04 15:44:08.391403304 -0500
+@@ -0,0 +1,74 @@
++/*
++ * jsTree default theme 1.0
++ * Supported features: dots/no-dots, icons/no-icons, focused, loading
++ * Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search
++ */
++
++.jstree-default li, 
++.jstree-default ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; }
++.jstree-default li { background-position:-90px 0; background-repeat:repeat-y; }
++.jstree-default li.jstree-last { background:transparent; }
++.jstree-default .jstree-open > ins { background-position:-72px 0; }
++.jstree-default .jstree-closed > ins { background-position:-54px 0; }
++.jstree-default .jstree-leaf > ins { background-position:-36px 0; }
++
++.jstree-default .jstree-hovered { background:#e7f4f9; border:1px solid #d8f0fa; padding:0 2px 0 1px; }
++.jstree-default .jstree-clicked { background:#beebff; border:1px solid #99defd; padding:0 2px 0 1px; }
++.jstree-default a .jstree-icon { background-position:-56px -19px; }
++.jstree-default a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; }
++
++.jstree-default.jstree-focused { background:#ffffee; }
++
++.jstree-default .jstree-no-dots li, 
++.jstree-default .jstree-no-dots .jstree-leaf > ins { background:transparent; }
++.jstree-default .jstree-no-dots .jstree-open > ins { background-position:-18px 0; }
++.jstree-default .jstree-no-dots .jstree-closed > ins { background-position:0 0; }
++
++.jstree-default .jstree-no-icons a .jstree-icon { display:none; }
++
++.jstree-default .jstree-search { font-style:italic; }
++
++.jstree-default .jstree-no-icons .jstree-checkbox { display:inline-block; }
++.jstree-default .jstree-no-checkboxes .jstree-checkbox { display:none !important; }
++.jstree-default .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; }
++.jstree-default .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; }
++.jstree-default .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; }
++.jstree-default .jstree-checked > a > .jstree-checkbox:hover { background-position:-38px -37px; }
++.jstree-default .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; }
++.jstree-default .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; }
++
++#vakata-dragged.jstree-default ins { background:transparent !important; }
++#vakata-dragged.jstree-default .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; }
++#vakata-dragged.jstree-default .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; }
++#jstree-marker.jstree-default { background:url("d.png") -41px -57px no-repeat !important; text-indent:-100px; }
++
++.jstree-default a.jstree-search { color:aqua; }
++.jstree-default .jstree-locked a { color:silver; cursor:default; }
++
++#vakata-contextmenu.jstree-default-context, 
++#vakata-contextmenu.jstree-default-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; }
++#vakata-contextmenu.jstree-default-context li { }
++#vakata-contextmenu.jstree-default-context a { color:black; }
++#vakata-contextmenu.jstree-default-context a:hover, 
++#vakata-contextmenu.jstree-default-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; }
++#vakata-contextmenu.jstree-default-context li.jstree-contextmenu-disabled a, 
++#vakata-contextmenu.jstree-default-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; }
++#vakata-contextmenu.jstree-default-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; }
++#vakata-contextmenu.jstree-default-context li ul { margin-left:-4px; }
++
++/* IE6 BEGIN */
++.jstree-default li, 
++.jstree-default ins,
++#vakata-dragged.jstree-default .jstree-invalid, 
++#vakata-dragged.jstree-default .jstree-ok, 
++#jstree-marker.jstree-default { _background-image:url("d.gif"); }
++.jstree-default .jstree-open ins { _background-position:-72px 0; }
++.jstree-default .jstree-closed ins { _background-position:-54px 0; }
++.jstree-default .jstree-leaf ins { _background-position:-36px 0; }
++.jstree-default a ins.jstree-icon { _background-position:-56px -19px; }
++#vakata-contextmenu.jstree-default-context ins { _display:none; }
++#vakata-contextmenu.jstree-default-context li { _zoom:1; }
++.jstree-default .jstree-undetermined a .jstree-checkbox { _background-position:-20px -19px; }
++.jstree-default .jstree-checked a .jstree-checkbox { _background-position:-38px -19px; }
++.jstree-default .jstree-unchecked a .jstree-checkbox { _background-position:-2px -19px; }
++/* IE6 END */
+\ No newline at end of file
+diff -up cacti-0.8.8a/include/js/jquery/themes/default/throbber.gif.legal cacti-0.8.8a/include/js/jquery/themes/default/throbber.gif
+Binary files cacti-0.8.8a/include/js/jquery/themes/default/throbber.gif.legal and cacti-0.8.8a/include/js/jquery/themes/default/throbber.gif differ
diff --git a/src/patches/cacti/cacti-0.8.8a-replace_treeview_by_jquery.jstree.patch b/src/patches/cacti/cacti-0.8.8a-replace_treeview_by_jquery.jstree.patch
new file mode 100644 (file)
index 0000000..b0b54fe
--- /dev/null
@@ -0,0 +1,607 @@
+Description: treeview has a license issue, cacti upstream is going to replace it
+ with functionality from jquery.jstree.
+ .
+ This patch implements the changes needed for an upstream layout where the
+ necessary code is in cacti/include/js/jquery/ but the code in that path is
+ not included in this patch.
+ .
+ The necessary jquery scripts and theme info can come from cacti upstream and from
+ debian packages (libjs-jquery and libjs-jquery-cookie) The version used when
+ creating this patch can be found here:
+ http://svn.cacti.net/viewvc/cacti/branches/0.8.9/include/js/jquery/jquery.js?pathrev=7324
+ http://svn.cacti.net/viewvc/cacti/branches/0.8.9/include/js/jquery/jquery.jstree.js?pathrev=7324
+ http://svn.cacti.net/viewvc/cacti/branches/main/include/js/jquery/themes/default/?pathrev=7324
+ http://anonscm.debian.org/gitweb/?p=pkg-javascript/jquery-goodies.git;a=blob;f=cookie/jquery.cookie.js;hb=c50e1a2d599cb48893e8d77470e71e83e44dfdb5
+ .
+ This patch does NOT implement the changes needed for the Debian package of
+ cacti.
+ .
+ This patch was updated with the patch from Jan Zalesak <zalesak@jaw.cz> in
+ http://bugs.debian.org/702690 which was further improved to also cover
+ lib/graph_export.php and to keep tag alignment consistent. 
+Bug: http://bugs.cacti.net/view.php?id=2228
+Bug-Debian: http://bugs.debian.org/679980
+Author: Paul Gevers <elbrus@debian.org>
+Date: Sun, 31 Mar 2013 11:59:05 +0200
+
+--- a/include/top_graph_header.php
++++ b/include/top_graph_header.php
+@@ -84,8 +84,9 @@
+       <link href="<?php echo $config['url_path']; ?>include/main.css" type="text/css" rel="stylesheet">
+       <link href="<?php echo $config['url_path']; ?>images/favicon.ico" rel="shortcut icon"/>
+       <script type="text/javascript" src="<?php echo $config['url_path']; ?>include/layout.js"></script>
+-      <script type="text/javascript" src="<?php echo $config['url_path']; ?>include/treeview/ua.js"></script>
+-      <script type="text/javascript" src="<?php echo $config['url_path']; ?>include/treeview/ftiens4.js"></script>
++      <script type="text/javascript" src="<?php echo $config['url_path']; ?>include/js/jquery/jquery.js" language="javascript"></script>
++      <script type="text/javascript" src="<?php echo $config['url_path']; ?>include/js/jquery/jquery.cookie.js" language="javascript"></script>
++      <script type="text/javascript" src="<?php echo $config['url_path']; ?>include/js/jquery/jquery.jstree.js"></script>
+       <script type="text/javascript" src="<?php echo $config['url_path']; ?>include/jscalendar/calendar.js"></script>
+       <script type="text/javascript" src="<?php echo $config['url_path']; ?>include/jscalendar/lang/calendar-en.js"></script>
+       <script type="text/javascript" src="<?php echo $config['url_path']; ?>include/jscalendar/calendar-setup.js"></script>
+@@ -178,7 +179,6 @@
+               <td valign="top" style="padding: 5px; border-right: #aaaaaa 1px solid;background-repeat:repeat-y;background-color:#efefef;" bgcolor='#efefef' width='<?php print htmlspecialchars(read_graph_config_option("default_dual_pane_width"));?>' class='noprint'>
+                       <table border=0 cellpadding=0 cellspacing=0><tr><td><a style="font-size:7pt;text-decoration:none;color:silver" href="http://www.treemenu.net/" target=_blank></a></td></tr></table>
+                       <?php grow_dhtml_trees(); ?>
+-                      <script type="text/javascript">initializeDocument();</script>
+                       <?php if (isset($_GET["select_first"])) { ?>
+                       <script type="text/javascript">
+--- a/lib/graph_export.php
++++ b/lib/graph_export.php
+@@ -1365,15 +1365,6 @@
+       /* create the treeview representation for the html data */
+       grow_dhtml_trees_export($fp,$tree_id);
+-      fwrite($fp,"<script type='text/javascript'>initializeDocument();</script>\n");
+-      fwrite($fp,"<script type='text/javascript'>\n");
+-      fwrite($fp,"var obj;\n");
+-      fwrite($fp,"obj = findObj(1);\n");
+-      fwrite($fp,"if (!obj.isOpen) {\n");
+-      fwrite($fp,"clickOnNode(1);\n");
+-      fwrite($fp,"}\n");
+-      fwrite($fp,"clickOnLink(2,'','main');\n");
+-      fwrite($fp,"</script>\n");
+       fwrite($fp,"</td>\n");
+       fwrite($fp,"<td valign='top'>\n");
+ }
+@@ -1383,16 +1374,7 @@
+       include_once($config["library_path"] . "/tree.php");
+       include_once($config["library_path"] . "/data_query.php");
+-      fwrite($fp, "<script type='text/javascript'>\n");
+-      fwrite($fp, "<!--
+-                      USETEXTLINKS = 1
+-                      STARTALLOPEN = 0
+-                      USEFRAMES = 0
+-                      USEICONS = 0
+-                      WRAPTEXT = 1
+-                      ICONPATH = 'treeview/'
+-                      PERSERVESTATE = 1
+-                      HIGHLIGHT = 1\n");
++      fwrite($fp, "<div id=\"jtree\">\n");
+       if (read_config_option("export_tree_isolation") == "off") {
+               $dhtml_tree_base = 0;
+@@ -1413,9 +1395,34 @@
+               }
+       }
+-      fwrite($fp,"foldersTree.treeID = \"t2\"
+-                      //-->\n
+-                      </script>\n");
++      fwrite($fp, "</div>\n");
++      fwrite($fp, "<script type=\"text/javascript\">\n");
++      fwrite($fp, "$(function () {
++      $(\"#jtree\")
++              .jstree({
++                        \"plugins\" : [\"ui\",\"themes\",\"html_data\",\"cookies\"],
++                      \"themes\" : {\"icons\" : false,
++                              \"url\" : \"./js/style.css\"},
++                      \"cookies\" : {
++                              \"save_opened\" : \"Cacti_jstree_open\",
++                              \"save_selected\" : \"Cacti_jstree_select\"
++                              }
++
++                })
++
++                // Make sure that the nodes are actually used as links
++                // We need reselect to prevent endless loops
++                // https://groups.google.com/d/topic/jstree/j6XNq9hQdeA/discussion
++                .bind(\"reselect.jstree\", function (e, data) {
++                      data.inst.get_container().bind(\"select_node.jstree\", function (e, data) {
++                           // data.rstl.obj is the object that was selected.
++                           document.location.href = data.rslt.obj.children(\"a\").attr(\"href\");
++                       });
++                });
++
++});\n");
++      fwrite($fp, "</script>\n");
++
+ }
+ /* get_graph_tree_array_export - returns a list of graph trees taking permissions into account if
+@@ -1478,8 +1485,7 @@
+       $dhtml_tree = array();
+       $dhtml_tree[0] = $start;
+       $dhtml_tree[1] = read_graph_config_option("expand_hosts");
+-      $dhtml_tree[2] = "foldersTree = gFld(\"\", \"\")\n";
+-      $i = 2;
++      $i = 1;
+       $tree_list = get_graph_tree_array_export();
+@@ -1499,7 +1505,6 @@
+               if (((read_config_option("export_tree_isolation") == "on") && ($tree_id == $tree["id"])) ||
+                       (read_config_option("export_tree_isolation") == "off")) {
+-                      $i++;
+                       $hier_sql = "SELECT DISTINCT
+                                       graph_tree_items.id,
+@@ -1522,19 +1527,53 @@
+                       $dhtml_tree_id = 0;
+                       if (sizeof($hierarchy) > 0) {
++                              $last_tier = 1;
++                              $openli = false;
++                              $lasthost = false;
++                              $opentree = false;
+                               foreach ($hierarchy as $leaf) {
+                                       if ($dhtml_tree_id <> $tree["id"]) {
+-                                              $dhtml_tree[$i] = "ou0 = insFld(foldersTree, gFld(\"" . get_tree_name($tree["id"]) . "\", \"" . clean_up_export_name(get_tree_name($tree["id"])) . "_leaf.html\"))\n";
++                                              if ($opentree) {
++                                                      $i++;
++                                                      $dhtml_tree[$i] = "\t\t\t</ul>\n\t\t</li>\n\t</ul>\n";
++                                              }
++                                              $i++;
++                                              $clean_id = clean_up_export_name(get_tree_name($tree["id"]));
++                                              $dhtml_tree[$i] = "\t<ul>\n\t\t<li id=\"" . $clean_id . "\"><a href=\"" . $clean_id . "_leaf.html\">" . get_tree_name($tree["id"]) . "</a>\n\t\t\t<ul>\n";
++                                              $opentree = true;
+                                       }
+                                       $dhtml_tree_id = $tree["id"];
+-                                      $i++;
+                                       $tier = tree_tier($leaf["order_key"]);
+                                       if ($leaf["host_id"] > 0) {  //It's a host
+-                                              $dhtml_tree[$i] = "ou" . ($tier) . " = insFld(ou" . ($tier-1) . ", gFld(\"Host: " . $leaf["hostname"] . "\", \"" . clean_up_export_name($leaf["hostname"] . "_" . $leaf["id"]) . ".html\"))\n";
++                                              if ($tier > $last_tier) {
++                                                      $i++;
++                                                      $dhtml_tree[$i] = "\t\t\t<ul>\n";
++                                              } elseif ($tier < $last_tier) {
++                                                      if (!$lasthost) {
++                                                              $i++;
++                                                              $dhtml_tree[$i] = "\t\t\t\t</li>\n";
++                                                      }
++                                                      for ($x = $tier; $x < $last_tier; $x++) {
++                                                              $i++;
++                                                              $dhtml_tree[$i] = "\t\t\t</ul>\n\t\t\t\t</li>\n";
++                                                              $openli = false;
++                                                      }
++                                              } elseif ($openli && !$lasthost) {
++                                                      $i++;
++                                                      $dhtml_tree[$i] = "\t\t\t\t</li>\n";
++                                                      $openli = false;
++                                              }
++                                              $last_tier = $tier;
++                                              $lasthost = true;
++                                              $i++;
++                                              $clean_id = clean_up_export_name($leaf["hostname"] . "_" . $leaf["id"]);
++                                              $dhtml_tree[$i] = "\t\t\t\t<li id=\"" . $clean_id . "\"><a href=\"" . $clean_id . ".html\">Host: " . htmlspecialchars($leaf["hostname"]) . "</a>\n";
+                                               if (read_config_option("export_tree_expand_hosts") == "on") {
++                                                      $i++;
++                                                      $dhtml_tree[$i] = "\t\t\t\t\t<ul>\n";
+                                                       if ($leaf["host_grouping_type"] == HOST_GROUPING_GRAPH_TEMPLATE) {
+                                                               $graph_templates = db_fetch_assoc("SELECT
+                                                                       graph_templates.id,
+@@ -1552,7 +1591,8 @@
+                                                               if (sizeof($graph_templates) > 0) {
+                                                                       foreach ($graph_templates as $graph_template) {
+                                                                               $i++;
+-                                                                              $dhtml_tree[$i] = "ou" . ($tier+1) . " = insFld(ou" . ($tier) . ", gFld(\" " . $graph_template["name"] . "\", \"" . clean_up_export_name($leaf["hostname"] . "_gt_" . $leaf["id"]) . "_" . $graph_template["id"] . ".html\"))\n";
++                                                                              $clean_id = clean_up_export_name($leaf["hostname"] . "_gt_" . $leaf["id"] . "_" . $graph_template["id"]);
++                                                                              $dhtml_tree[$i] = "\t\t\t\t\t\t<li id=\"" . $clean_id . "\"><a href=\"" . $clean_id . ".html\">" . htmlspecialchars($graph_template["name"]) . "</a></li>\n";
+                                                                       }
+                                                               }
+                                                       }else if ($leaf["host_grouping_type"] == HOST_GROUPING_DATA_QUERY_INDEX) {
+@@ -1567,36 +1607,77 @@
+                                                               array_push($data_queries, array(
+                                                                       "id" => "0",
+-                                                                      "name" => "Graph Template Based"
++                                                                      "name" => "Non Query Based"
+                                                                       ));
+                                                               if (sizeof($data_queries) > 0) {
+-                                                              foreach ($data_queries as $data_query) {
+-                                                                      $i++;
+-
+-                                                                      $dhtml_tree[$i] = "ou" . ($tier+1) . " = insFld(ou" . ($tier) . ", gFld(\" " . $data_query["name"] . "\", \"" . clean_up_export_name($leaf["hostname"] . "_dq_" . $leaf["title"] . "_" . $leaf["id"]) . "_" . $data_query["id"] . ".html\"))\n";
++                                                                      foreach ($data_queries as $data_query) {
++                                                                              $i++;
++                                                                              $clean_id = clean_up_export_name($leaf["hostname"] . "_dq_" . $leaf["title"] . "_" . $leaf["id"] . "_" . $data_query["id"]);
++                                                                              $dhtml_tree[$i] = "\t\t\t\t\t\t<li id=\"" . $clean_id . "\"><a href=\"" . $clean_id . ".html\">" . htmlspecialchars($data_query["name"]) . "</a>\n";
+-                                                                      /* fetch a list of field names that are sorted by the preferred sort field */
+-                                                                      $sort_field_data = get_formatted_data_query_indexes($leaf["host_id"], $data_query["id"]);
++                                                                              /* fetch a list of field names that are sorted by the preferred sort field */
++                                                                              $sort_field_data = get_formatted_data_query_indexes($leaf["host_id"], $data_query["id"]);
+-                                                                      if ($data_query["id"] > 0) {
+-                                                                              while (list($snmp_index, $sort_field_value) = each($sort_field_data)) {
++                                                                              if ($data_query["id"] > 0) {
++                                                                                      $i++;
++                                                                                      $dhtml_tree[$i] = "\t\t\t\t\t\t\t<ul>\n";
++                                                                                      while (list($snmp_index, $sort_field_value) = each($sort_field_data)) {
++                                                                                              $i++;
++                                                                                              $clean_id = clean_up_export_name($leaf["hostname"] . "_dqi_" . $leaf["id"] . "_" . $data_query["id"] . "_" . $snmp_index);
++                                                                                              $dhtml_tree[$i] = "\t\t\t\t\t\t\t\t<li id=\"" . $clean_id . "\"><a href=\"" . $clean_id . ".html\">" . htmlspecialchars($sort_field_value) . "</a></li>\n";
++                                                                                      }
+                                                                                       $i++;
+-                                                                                      $dhtml_tree[$i] = "ou" . ($tier+2) . " = insFld(ou" . ($tier+1) . ", gFld(\" " . $sort_field_value . "\", \"" . clean_up_export_name($leaf["hostname"] . "_dqi_" . $leaf["title"] . "_" . $leaf["id"]) . "_" . $data_query["id"] . "_" . $snmp_index . ".html\"))\n";
++                                                                                      $dhtml_tree[$i] = "\t\t\t\t\t\t\t</ul>\n";
+                                                                               }
++                                                                              $i++;
++                                                                              $dhtml_tree[$i] = "\t\t\t\t\t\t</li>\n";
+                                                                       }
+                                                               }
+-                                                              }
+                                                       }
++                                                      $i++;
++                                                      $dhtml_tree[$i] = "\t\t\t\t\t</ul>\n";
+                                               }
+-                                      }else {
+-                                              $dhtml_tree[$i] = "ou" . ($tier) . " = insFld(ou" . ($tier-1) . ", gFld(\"" . $leaf["title"] . "\", \"" . clean_up_export_name(get_tree_name($tree["id"]) . "_" . $leaf["title"] . "_" . $leaf["id"]) . "_leaf.html\"))\n";
++                                              $i++;
++                                              $dhtml_tree[$i] = "\t\t\t\t</li>\n";
++                                      }else { //It's not a host
++                                              if ($tier > $last_tier) {
++                                                      $i++;
++                                                      $dhtml_tree[$i] = "\t\t\t<ul>\n";
++                                              } elseif ($tier < $last_tier) {
++                                                      if (!$lasthost) {
++                                                              $i++;
++                                                              $dhtml_tree[$i] = "</li>\n";
++                                                      }
++                                                      for ($x = $tier; $x < $last_tier; $x++) {
++                                                              $i++;
++                                                              $dhtml_tree[$i] = "\t\t\t\t</ul>\n\t\t\t\t</li>\n";
++                                                              $openli = false;
++                                                      }
++                                              } elseif ($openli && !$lasthost) {
++                                                      $i++;
++                                                      $dhtml_tree[$i] = "</li>\n";
++                                                      $openli = false;
++                                              }
++                                              $last_tier = $tier;
++                                              $i++;
++                                              $clean_id = clean_up_export_name(get_tree_name($tree["id"]) . "_" . $leaf["title"] . "_" . $leaf["id"]);
++                                              $dhtml_tree[$i] = "\t\t\t\t<li id=\"" . $clean_id . "\"><a href=\"" . $clean_id . "_leaf.html\">" . htmlspecialchars($leaf["title"]) . "</a>\n";
++                                              $openli = true;
++                                              $lasthost = false;
+                                       }
+                               }
++                              for ($x = $last_tier; $x > 1; $x--) {
++                                      $i++;
++                                      $dhtml_tree[$i] = "\t\t\t\t\t</ul>\n\t\t\t\t</li>\n";
++                              }
++                              $i++;
++                              $dhtml_tree[$i] = "\t\t\t</ul>\n\t\t</li>\n\t</ul>\n";
+                       }else{
+                               if ($dhtml_tree_id <> $tree["id"]) {
+-                                      $dhtml_tree[$i] = "ou0 = insFld(foldersTree, gFld(\"" . get_tree_name($tree["id"]) . "\", \"" . clean_up_export_name(get_tree_name($tree["id"])) . "_leaf.html\"))\n";
+                                       $i++;
++                                      $clean_id = clean_up_export_name(get_tree_name($tree["id"]));
++                                      $dhtml_tree[$i] = "\t<ul>\n\t\t<li id=\"" . $clean_id . "_leaf\"><a href=\"" . $clean_id . "_leaf.html\">" . get_tree_name($tree["id"]) . "</a></li>\n\t</ul>";
+                               }
+                       }
+               }
+@@ -1612,10 +1693,10 @@
+         $dir - the export directory where graphs will either be staged or located.
+ */
+ function create_export_directory_structure($cacti_root_path, $dir) {
+-      /* create the treeview sub-directory */
+-      if (!is_dir("$dir/treeview")) {
+-              if (!mkdir("$dir/treeview", 0755)) {
+-                      export_fatal("Create directory '" . $dir . "/treeview' failed.  Can not continue");
++      /* create the jquery sub-directory */
++      if (!is_dir("$dir/js")) {
++              if (!mkdir("$dir/js", 0755)) {
++                      export_fatal("Create directory '" . $dir . "/js' failed.  Can not continue");
+               }
+       }
+@@ -1626,8 +1707,6 @@
+               }
+       }
+-      $treeview_dir = $dir . "/treeview";
+-
+       /* css */
+       copy("$cacti_root_path/include/main.css", "$dir/main.css");
+@@ -1639,18 +1718,15 @@
+       copy("$cacti_root_path/images/shadow_gray.gif", "$dir/shadow_gray.gif");
+       /* java scripts for the tree */
+-      copy("$cacti_root_path/include/treeview/ftiens4_export.js", "$treeview_dir/ftiens4.js");
+-      copy("$cacti_root_path/include/treeview/ua.js", "$treeview_dir/ua.js");
+-
+-      /* images for the tree */
+-      copy("$cacti_root_path/include/treeview/ftv2blank.gif", "$treeview_dir/ftv2blank.gif");
+-      copy("$cacti_root_path/include/treeview/ftv2lastnode.gif", "$treeview_dir/ftv2lastnode.gif");
+-      copy("$cacti_root_path/include/treeview/ftv2mlastnode.gif", "$treeview_dir/ftv2mlastnode.gif");
+-      copy("$cacti_root_path/include/treeview/ftv2mnode.gif", "$treeview_dir/ftv2mnode.gif");
+-      copy("$cacti_root_path/include/treeview/ftv2node.gif", "$treeview_dir/ftv2node.gif");
+-      copy("$cacti_root_path/include/treeview/ftv2plastnode.gif", "$treeview_dir/ftv2plastnode.gif");
+-      copy("$cacti_root_path/include/treeview/ftv2pnode.gif", "$treeview_dir/ftv2pnode.gif");
+-      copy("$cacti_root_path/include/treeview/ftv2vertline.gif", "$treeview_dir/ftv2vertline.gif");
++      copy("$cacti_root_path/include/js/jquery/jquery.js", "$dir/js/jquery.js");
++      copy("$cacti_root_path/include/js/jquery/jquery.jstree.js", "$dir/js/jquery.jstree.js");
++      copy("$cacti_root_path/include/js/jquery/jquery.cookie.js", "$dir/js/jquery.cookie.js");
++
++      /* theme info for java scripts */
++      copy("$cacti_root_path/include/js/jquery/themes/default/style.css", "$dir/js/style.css");
++      copy("$cacti_root_path/include/js/jquery/themes/default/d.png", "$dir/js/d.png");
++      copy("$cacti_root_path/include/js/jquery/themes/default/d.gif", "$dir/js/d.gif");
++      copy("$cacti_root_path/include/js/jquery/themes/default/throbber.gif", "$dir/js/throbber.gif");
+ }
+ function get_host_description($host_id) {
+@@ -1738,8 +1814,9 @@
+       <meta http-equiv=refresh content='300'; url='index.html'>
+       <meta http-equiv=Pragma content=no-cache>
+       <meta http-equiv=cache-control content=no-cache>
+-      <script type=\"text/javascript\" src=\"./treeview/ua.js\"></script>
+-      <script type=\"text/javascript\" src=\"./treeview/ftiens4.js\"></script>
++      <script type=\"text/javascript\" src=\"./js/jquery.js\" language=\"javascript\"></script>
++      <script type=\"text/javascript\" src=\"./js/jquery.cookie.js\" language=\"javascript\"></script>
++      <script type=\"text/javascript\" src=\"./js/jquery.jstree.js\" language=\"javascript\"></script>
+ </head>
+ <body>
+ <table style='width:100%;height:100%;' cellspacing='0' cellpadding='0'>
+--- a/lib/html_tree.php
++++ b/lib/html_tree.php
+@@ -495,17 +495,9 @@
+       include_once($config["library_path"] . "/data_query.php");
+       ?>
+-      <script type="text/javascript">
+-      <!--
+-      USETEXTLINKS = 1
+-      STARTALLOPEN = 0
+-      USEFRAMES = 0
+-      USEICONS = 0
+-      WRAPTEXT = 1
+-      PERSERVESTATE = 1
+-      HIGHLIGHT = 1
+       <?php
+       /* get current time */
++/* Probably not needed anymore as jstree uses jquery.cookies
+       list($micro,$seconds) = explode(" ", microtime());
+       $current_time = $seconds + $micro;
+       $expand_hosts = read_graph_config_option("expand_hosts");
+@@ -522,6 +514,8 @@
+                       $dhtml_tree = $_SESSION['dhtml_tree'];
+               }
+       }
++*/
++      $dhtml_tree = create_dhtml_tree();
+       $total_tree_items = sizeof($dhtml_tree) - 1;
+@@ -529,8 +523,31 @@
+               print $dhtml_tree[$i];
+       }
+       ?>
+-      //-->
+-      </script>
++<script type="text/javascript">
++$(function () {
++      $("#jtree")
++              .jstree({
++                      "plugins" : ["ui","themes","html_data","cookies"],
++                      "themes" : {"icons" : false,
++                              "url" : "<?php echo  $config['url_path']; ?>include/js/jquery/themes/default/style.css"},
++                      "cookies" : {
++                              "save_opened" : "Cacti_jstree_open",
++                              "save_selected" : "Cacti_jstree_select"
++                              }
++                      })
++
++              // Make sure that the nodes are actually used as links
++              // We need reselect to prevent endless loops
++              // https://groups.google.com/d/topic/jstree/j6XNq9hQdeA/discussion
++              .bind("reselect.jstree", function (e, data) {
++                      data.inst.get_container().bind("select_node.jstree", function (e, data) {
++                              // data.rstl.obj is the object that was selected.
++                              document.location.href = data.rslt.obj.children("a").attr("href");
++                      });
++              });
++
++});
++</script>
+       <?php
+ }
+@@ -543,9 +560,8 @@
+       $dhtml_tree[0] = $start;
+       $dhtml_tree[1] = read_graph_config_option("expand_hosts");
+-      $dhtml_tree[2] = "foldersTree = gFld(\"\", \"\")\n";
+-      $dhtml_tree[3] = "foldersTree.xID = \"root\"\n";
+-      $i = 3;
++      $dhtml_tree[2] = "\n<div id=\"jtree\">\n";
++      $i = 2;
+       $tree_list = get_graph_tree_array();
+@@ -567,7 +583,6 @@
+       if (sizeof($tree_list) > 0) {
+               foreach ($tree_list as $tree) {
+-                      $i++;
+                       $hierarchy = db_fetch_assoc("select
+                               graph_tree_items.id,
+                               graph_tree_items.title,
+@@ -583,21 +598,45 @@
+                               and graph_tree_items.local_graph_id = 0
+                               order by graph_tree_items.order_key");
+-                      $dhtml_tree[$i] = "ou0 = insFld(foldersTree, gFld(\"" . htmlspecialchars($tree["name"]) . "\", \"" . htmlspecialchars("graph_view.php?action=tree&tree_id=" . $tree["id"]) . "\"))\n";
+                       $i++;
+-                      $dhtml_tree[$i] = "ou0.xID = \"tree_" . $tree["id"] . "\"\n";
++                      $dhtml_tree[$i] = "\t<ul>\n\t\t<li id=\"" . htmlspecialchars("tree_" . $tree["id"]) . "\"><a href=\"" . htmlspecialchars("graph_view.php?action=tree&tree_id=" . $tree["id"]) . "\">" . htmlspecialchars($tree["name"]) . "</a>\n";
+                       if (sizeof($hierarchy) > 0) {
++                              $i++;
++                              $dhtml_tree[$i] = "\t\t\t<ul>\n";
++                              $last_tier = 1;
++                              $openli = false;
++                              $lasthost = false;
+                               foreach ($hierarchy as $leaf) {
+-                                      $i++;
+                                       $tier = tree_tier($leaf["order_key"]);
+-                                      if ($leaf["host_id"] > 0) {
+-                                              $dhtml_tree[$i] = "ou" . ($tier) . " = insFld(ou" . abs(($tier-1)) . ", gFld(\"" . "Host: " . htmlspecialchars($leaf["hostname"]) . "\", \"" . htmlspecialchars("graph_view.php?action=tree&tree_id=" . $tree["id"] . "&leaf_id=" . $leaf["id"]) . "\"))\n";
++                                      if ($leaf["host_id"] > 0) {  //It's a host
++                                              if ($tier > $last_tier) {
++                                                      $i++;
++                                                      $dhtml_tree[$i] = "\t\t\t<ul>\n";
++                                              } elseif ($tier < $last_tier) {
++                                                      if (!$lasthost) {
++                                                              $i++;
++                                                              $dhtml_tree[$i] = "\t\t\t\t</li>\n";
++                                                      }
++                                                      for ($x = $tier; $x < $last_tier; $x++) {
++                                                              $i++;
++                                                              $dhtml_tree[$i] = "\t\t\t</ul>\n\t\t\t\t</li>\n";
++                                                              $openli = false;
++                                                      }
++                                              } elseif ($openli && !$lasthost) {
++                                                      $i++;
++                                                      $dhtml_tree[$i] = "\t\t\t\t</li>\n";
++                                                      $openli = false;
++                                              }
++                                              $last_tier = $tier;
++                                              $lasthost = true;
+                                               $i++;
+-                                              $dhtml_tree[$i] = "ou" . ($tier) . ".xID = \"tree_" . $tree["id"] . "_leaf_" . $leaf["id"] . "\"\n";
++                                              $dhtml_tree[$i] = "\t\t\t\t<li id=\"" . htmlspecialchars("tree_" . $tree["id"] . "_leaf_" . $leaf["id"]) . "\"><a href=\"" . htmlspecialchars("graph_view.php?action=tree&tree_id=" . $tree["id"] . "&leaf_id=" . $leaf["id"]) . "\">Host: " . htmlspecialchars($leaf["hostname"]) . "</a>\n";
+                                               if (read_graph_config_option("expand_hosts") == "on") {
++                                                      $i++;
++                                                      $dhtml_tree[$i] = "\t\t\t\t\t<ul>\n";
+                                                       if ($leaf["host_grouping_type"] == HOST_GROUPING_GRAPH_TEMPLATE) {
+                                                               $graph_templates = db_fetch_assoc("select
+                                                                       graph_templates.id,
+@@ -612,9 +651,7 @@
+                                                               if (sizeof($graph_templates) > 0) {
+                                                                       foreach ($graph_templates as $graph_template) {
+                                                                               $i++;
+-                                                                              $dhtml_tree[$i] = "ou" . ($tier+1) . " = insFld(ou" . ($tier) . ", gFld(\" " . htmlspecialchars($graph_template["name"]) . "\", \"graph_view.php?action=tree&tree_id=" . $tree["id"] . "&leaf_id=" . $leaf["id"] . "&host_group_data=graph_template:" . $graph_template["id"] . "\"))\n";
+-                                                                              $i++;
+-                                                                              $dhtml_tree[$i] = "ou" . ($tier+1) . ".xID = \"tree_" . $tree["id"] . "_leaf_" . $leaf["id"] . "_hgd_gt_" . $graph_template["id"] . "\"\n";
++                                                                              $dhtml_tree[$i] = "\t\t\t\t\t\t<li id=\"" . htmlspecialchars("tree_" . $tree["id"] . "_leaf_" . $leaf["id"] . "_hgd_gt_" . $graph_template["id"]) . "\"><a href=\"" . htmlspecialchars("graph_view.php?action=tree&tree_id=" . $tree["id"] . "&leaf_id=" . $leaf["id"] . "&host_group_data=graph_template:" . $graph_template["id"]) . "\">" . htmlspecialchars($graph_template["name"]) . "</a></li>\n";
+                                                                       }
+                                                               }
+                                                       }else if ($leaf["host_grouping_type"] == HOST_GROUPING_DATA_QUERY_INDEX) {
+@@ -645,33 +682,71 @@
+                                                                               if ((($data_query["id"] == 0) && ($non_template_graphs > 0)) ||
+                                                                                       (($data_query["id"] > 0) && (sizeof($sort_field_data) > 0))) {
+                                                                                       $i++;
+-                                                                                      $dhtml_tree[$i] = "ou" . ($tier+1) . " = insFld(ou" . ($tier) . ", gFld(\" " . htmlspecialchars($data_query["name"]) . "\", \"" . htmlspecialchars("graph_view.php?action=tree&tree_id=" . $tree["id"] . "&leaf_id=" . $leaf["id"] . "&host_group_data=data_query:" . $data_query["id"]) . "\"))\n";
+-                                                                                      $i++;
+-                                                                                      $dhtml_tree[$i] = "ou" . ($tier+1) . ".xID = \"tree_" . $tree["id"] . "_leaf_" . $leaf["id"] . "_hgd_dq_" . $data_query["id"] . "\"\n";
+-
++                                                                                      $dhtml_tree[$i] = "\t\t\t\t\t\t<li id=\"" . htmlspecialchars("tree_" . $tree["id"] . "_leaf_" . $leaf["id"] . "_hgd_dq_" . $data_query["id"]) . "\"><a href=\"" . htmlspecialchars("graph_view.php?action=tree&tree_id=" . $tree["id"] . "&leaf_id=" . $leaf["id"] . "&host_group_data=data_query:" . $data_query["id"]) . "\">" . htmlspecialchars($data_query["name"]) . "</a>\n";
+                                                                                       if ($data_query["id"] > 0) {
++                                                                                              $i++;
++                                                                                              $dhtml_tree[$i] = "\t\t\t\t\t\t\t<ul>\n";
+                                                                                               while (list($snmp_index, $sort_field_value) = each($sort_field_data)) {
+                                                                                                       $i++;
+-                                                                                                      $dhtml_tree[$i] = "ou" . ($tier+2) . " = insFld(ou" . ($tier+1) . ", gFld(\" " . htmlspecialchars($sort_field_value) . "\", \"" . htmlspecialchars("graph_view.php?action=tree&tree_id=" . $tree["id"] . "&leaf_id=" . $leaf["id"] . "&host_group_data=data_query_index:" . $data_query["id"] . ":" . urlencode($snmp_index)) . "\"))\n";
+-                                                                                                      $i++;
+-                                                                                                      $dhtml_tree[$i] = "ou" . ($tier+2) . ".xID = \"tree_" . $tree["id"] . "_leaf_" . $leaf["id"] . "_hgd_dqi" . $data_query["id"] . "_" . urlencode($snmp_index) . "\"\n";
++                                                                                                      $dhtml_tree[$i] = "\t\t\t\t\t\t\t\t<li id=\"" . htmlspecialchars("tree_" . $tree["id"] . "_leaf_" . $leaf["id"] . "_hgd_dqi" . $data_query["id"]) . "_" . urlencode($snmp_index) . "\"><a href=\"" . htmlspecialchars("graph_view.php?action=tree&tree_id=" . $tree["id"] . "&leaf_id=" . $leaf["id"] . "&host_group_data=data_query_index:" . $data_query["id"] . ":" . urlencode($snmp_index)) . "\">" . htmlspecialchars($sort_field_value) . "</a></li>\n";
+                                                                                               }
++                                                                                      $i++;
++                                                                                      $dhtml_tree[$i] = "\t\t\t\t\t\t\t</ul>\n";
++                                                                                      $i++;
++                                                                                      $dhtml_tree[$i] = "\t\t\t\t\t\t</li>\n";
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               }
++                                                      $i++;
++                                                      $dhtml_tree[$i] = "\t\t\t\t\t\t</li>\n";
++                                                      }
++                                              $i++;
++                                              $dhtml_tree[$i] = "\t\t\t\t\t</ul>\n";
++                                              }
++                                      $i++;
++                                      $dhtml_tree[$i] = "\t\t\t\t</li>\n";
++                                      }else{ //It's not a host
++                                              if ($tier > $last_tier) {
++                                                      $i++;
++                                                      $dhtml_tree[$i] = "\t\t\t<ul>\n";
++                                              } elseif ($tier < $last_tier) {
++                                                      if (!$lasthost) {
++                                                              $i++;
++                                                              $dhtml_tree[$i] = "</li>\n";
+                                                       }
++                                                      for ($x = $tier; $x < $last_tier; $x++) {
++                                                              $i++;
++                                                              $dhtml_tree[$i] = "\t\t\t\t</ul>\n\t\t\t\t</li>\n";
++                                                              $openli = false;
++                                                      }
++                                              } elseif ($openli && !$lasthost) {
++                                                      $i++;
++                                                      $dhtml_tree[$i] = "</li>\n";
++                                                      $openli = false;
+                                               }
+-                                      }else{
+-                                              $dhtml_tree[$i] = "ou" . ($tier) . " = insFld(ou" . abs(($tier-1)) . ", gFld(\"" . htmlspecialchars($leaf["title"]) . "\", \"" . htmlspecialchars("graph_view.php?action=tree&tree_id=" . $tree["id"] . "&leaf_id=" . $leaf["id"]) . "\"))\n";
++                                              $last_tier = $tier;
+                                               $i++;
+-                                              $dhtml_tree[$i] = "ou" . ($tier) . ".xID = \"tree_" . $tree["id"] . "_leaf_" . $leaf["id"] . "\"\n";
++                                              $dhtml_tree[$i] = "\t\t\t\t<li id=\"" . htmlspecialchars("tree_" . $tree["id"] . "_leaf_" . $leaf["id"]) . "\"><a href=\"" . htmlspecialchars("graph_view.php?action=tree&tree_id=" . $tree["id"] . "&leaf_id=" . $leaf["id"]) . "\">" . htmlspecialchars($leaf["title"]) . "</a>\n";
++                                              $openli = true;
++                                              $lasthost = false;
+                                       }
+                               }
++                              for ($x = $last_tier; $x > 1; $x--) {
++                                      $i++;
++                                      $dhtml_tree[$i] = "\t\t\t\t\t</ul>\n\t\t\t\t</li>\n";
++                              }
++                              $i++;
++                              $dhtml_tree[$i] = "\t\t\t</ul>\n";
+                       }
++                      $i++;
++                      $dhtml_tree[$i] = "\t\t</li>\n\t</ul>\n";
+               }
+       }
++      $i++;
++      $dhtml_tree[$i] = "</div>\n";
++
+       return $dhtml_tree;
+ }
+@@ -758,14 +833,6 @@
+               }
+       }
+-      print "<script type=\"text/javascript\">\n";
+-      print "<!--\n";
+-      print "myNode = findObj(\"$nodeid\")\n";
+-      print "myNode.forceOpeningOfAncestorFolders();\n";
+-      print "highlightObjLink(myNode)\n";
+-      print "//-->\n";
+-      print "</script>";
+-
+       /* ================= input validation ================= */
+       input_validate_input_number(get_request_var_post("graphs"));
+       input_validate_input_number(get_request_var_post("page"));
diff --git a/src/patches/cacti/cacti-0.8.8b-html-injection.patch b/src/patches/cacti/cacti-0.8.8b-html-injection.patch
new file mode 100644 (file)
index 0000000..1326dff
--- /dev/null
@@ -0,0 +1,19 @@
+------------------------------------------------------------------------
+r7443 | rony | 2014-03-30 18:43:28 -0500 (Sun, 30 Mar 2014) | 2 lines
+
+bug#0002431: CVE-2014-2326 Unspecified HTML Injection Vulnerability 
+
+------------------------------------------------------------------------
+Index: branches/0.8.8/cdef.php
+===================================================================
+--- branches/0.8.8/cdef.php    (revision 7442)
++++ branches/0.8.8/cdef.php    (revision 7443)
+@@ -431,7 +431,7 @@
+                                               <a class="linkEditMain" href="<?php print htmlspecialchars("cdef.php?action=item_edit&id=" . $cdef_item["id"] . "&cdef_id=" . $cdef["id"]);?>">Item #<?php print htmlspecialchars($i);?></a>
+                                       </td>
+                                       <td>
+-                                              <em><?php $cdef_item_type = $cdef_item["type"]; print $cdef_item_types[$cdef_item_type];?></em>: <strong><?php print get_cdef_item_name($cdef_item["id"]);?></strong>
++                                              <em><?php $cdef_item_type = $cdef_item["type"]; print $cdef_item_types[$cdef_item_type];?></em>: <strong><?php print htmlspecialchars(get_cdef_item_name($cdef_item["id"]));?></strong>
+                                       </td>
+                                       <td>
+                                               <a href="<?php print htmlspecialchars("cdef.php?action=item_movedown&id=" . $cdef_item["id"] . "&cdef_id=" . $cdef["id"]);?>"><img src="images/move_down.gif" border="0" alt="Move Down"></a>
diff --git a/src/patches/cacti/cacti-0.8.8b-remote-command-execution.patch b/src/patches/cacti/cacti-0.8.8b-remote-command-execution.patch
new file mode 100644 (file)
index 0000000..c357a06
--- /dev/null
@@ -0,0 +1,28 @@
+------------------------------------------------------------------------
+r7442 | rony | 2014-03-30 18:41:56 -0500 (Sun, 30 Mar 2014) | 2 lines
+
+bug#0002433: CVE-2014-2328 Unspecified Remote Command Execution Vulnerability
+
+------------------------------------------------------------------------
+Index: branches/0.8.8/lib/graph_export.php
+===================================================================
+--- branches/0.8.8/lib/graph_export.php        (revision 7441)
++++ branches/0.8.8/lib/graph_export.php        (revision 7442)
+@@ -339,7 +339,7 @@
+       chdir($stExportDir);
+       /* set the initial command structure */
+-      $stExecute = 'ncftpput -R -V -r 1 -u '.$aFtpExport['username'].' -p '.$aFtpExport['password'];
++      $stExecute = 'ncftpput -R -V -r 1 -u ' . cacti_escapeshellarg($aFtpExport['username']) . ' -p ' . cacti_escapeshellarg($aFtpExport['password']);
+       /* if the user requested passive mode, use it */
+       if ($aFtpExport['passive']) {
+@@ -347,7 +347,7 @@
+       }
+       /* setup the port, server, remote directory and all files */
+-      $stExecute .= ' -P ' . $aFtpExport['port'] . ' ' . $aFtpExport['server'] . ' ' . $aFtpExport['remotedir'] . ".";
++      $stExecute .= ' -P ' . cacti_escapeshellarg($aFtpExport['port']) . ' ' . cacti_escapeshellarg($aFtpExport['server']) . ' ' . cacti_escapeshellarg($aFtpExport['remotedir']) . ".";
+       /* run the command */
+       $iExecuteReturns = 0;
diff --git a/src/patches/cacti/cacti-0.8.8b-rra-comments.patch b/src/patches/cacti/cacti-0.8.8b-rra-comments.patch
new file mode 100644 (file)
index 0000000..c5becfe
--- /dev/null
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------
+r7418 | gandalf | 2013-08-13 13:32:49 -0600 (Tue, 13 Aug 2013) | 1 line
+
+fix COMMENT handling, even in case COMMENT is empty, with or without HR and with variable substitution
+------------------------------------------------------------------------
+Index: branches/0.8.8/lib/rrd.php
+===================================================================
+--- branches/0.8.8/lib/rrd.php (revision 7417)
++++ branches/0.8.8/lib/rrd.php (revision 7418)
+@@ -1343,20 +1343,20 @@
+               $need_rrd_nl = TRUE;
+               if ($graph_item_types{$graph_item["graph_type_id"]} == "COMMENT") {
++                      # perform variable substitution first (in case this will yield an empty results or brings command injection problems)
++                      $comment_arg = rrd_substitute_host_query_data($graph_variables["text_format"][$graph_item_id], $graph, $graph_item);
++                      # next, compute the argument of the COMMENT statement and perform injection counter measures
++                      if (trim($comment_arg) == '') { # an empty COMMENT must be treated with care
++                              $comment_arg = cacti_escapeshellarg(' ' . $hardreturn[$graph_item_id]);
++                      } else {
++                              $comment_arg = cacti_escapeshellarg($comment_arg . $hardreturn[$graph_item_id]);
++                      }
++
++                      # create rrdtool specific command line
+                       if (read_config_option("rrdtool_version") != "rrd-1.0.x") {
+-                              $comment_string = $graph_item_types{$graph_item["graph_type_id"]} . ":" . str_replace(":", "\:", cacti_escapeshellarg($graph_variables["text_format"][$graph_item_id] . $hardreturn[$graph_item_id])) . " ";
+-                              if (trim($comment_string) == 'COMMENT:"\n"') {
+-                                      $txt_graph_items .= 'COMMENT:" \n"'; # rrdtool will skip a COMMENT that holds a NL only; so add a blank to make NL work
+-                              } else if (trim($comment_string) != "COMMENT:\"\"") {
+-                                      $txt_graph_items .= rrd_substitute_host_query_data($comment_string, $graph, $graph_item);
+-                              }
++                              $txt_graph_items .= $graph_item_types{$graph_item["graph_type_id"]} . ":" . str_replace(":", "\:", $comment_arg) . " ";
+                       }else {
+-                              $comment_string = $graph_item_types{$graph_item["graph_type_id"]} . ":" . cacti_escapeshellarg($graph_variables["text_format"][$graph_item_id] . $hardreturn[$graph_item_id]) . " ";
+-                              if (trim($comment_string) == 'COMMENT:"\n"') {
+-                                      $txt_graph_items .= 'COMMENT:" \n"'; # rrdtool will skip a COMMENT that holds a NL only; so add a blank to make NL work
+-                              } else if (trim($comment_string) != "COMMENT:\"\"") {
+-                                      $txt_graph_items .= rrd_substitute_host_query_data($comment_string, $graph, $graph_item);
+-                              }
++                              $txt_graph_items .= $graph_item_types{$graph_item["graph_type_id"]} . ":" . $comment_arg . " ";
+                       }
+               }elseif (($graph_item_types{$graph_item["graph_type_id"]} == "GPRINT") && (!isset($graph_data_array["graph_nolegend"]))) {
+                       $graph_variables["text_format"][$graph_item_id] = str_replace(":", "\:", $graph_variables["text_format"][$graph_item_id]); /* escape colons */
diff --git a/src/patches/cacti/cacti-0.8.8b-sanitize-variables.patch b/src/patches/cacti/cacti-0.8.8b-sanitize-variables.patch
new file mode 100644 (file)
index 0000000..37ded2e
--- /dev/null
@@ -0,0 +1,155 @@
+------------------------------------------------------------------------
+r7420 | cigamit | 2013-08-17 21:41:24 -0600 (Sat, 17 Aug 2013) | 1 line
+
+Bug #0002383 : Sanitize the step and id variables
+------------------------------------------------------------------------
+Index: branches/0.8.8/host.php
+===================================================================
+--- branches/0.8.8/host.php    (revision 7419)
++++ branches/0.8.8/host.php    (revision 7420)
+@@ -149,6 +149,9 @@
+               if ($_POST["snmp_version"] == 3 && ($_POST["snmp_password"] != $_POST["snmp_password_confirm"])) {
+                       raise_message(4);
+               }else{
++                      input_validate_input_number(get_request_var_post("id"));
++                      input_validate_input_number(get_request_var_post("host_template_id"));
++
+                       $host_id = api_device_save($_POST["id"], $_POST["host_template_id"], $_POST["description"],
+                               trim($_POST["hostname"]), $_POST["snmp_community"], $_POST["snmp_version"],
+                               $_POST["snmp_username"], $_POST["snmp_password"],
+Index: branches/0.8.8/lib/api_device.php
+===================================================================
+--- branches/0.8.8/lib/api_device.php  (revision 7419)
++++ branches/0.8.8/lib/api_device.php  (revision 7420)
+@@ -107,7 +107,7 @@
+               $_host_template_id = db_fetch_cell("select host_template_id from host where id=$id");
+       }
+-      $save["id"] = $id;
++      $save["id"]                   = form_input_validate($id, "id", "^[0-9]+$", false, 3);
+       $save["host_template_id"]     = form_input_validate($host_template_id, "host_template_id", "^[0-9]+$", false, 3);
+       $save["description"]          = form_input_validate($description, "description", "", false, 3);
+       $save["hostname"]             = form_input_validate(trim($hostname), "hostname", "", false, 3);
+Index: branches/0.8.8/install/index.php
+===================================================================
+--- branches/0.8.8/install/index.php   (revision 7419)
++++ branches/0.8.8/install/index.php   (revision 7420)
+@@ -310,27 +310,28 @@
+ }
+ /* pre-processing that needs to be done for each step */
+-if (empty($_REQUEST["step"])) {
+-      $_REQUEST["step"] = 1;
+-}else{
+-      if ($_REQUEST["step"] == "1") {
+-              $_REQUEST["step"] = "2";
+-      }elseif (($_REQUEST["step"] == "2") && ($_REQUEST["install_type"] == "1")) {
+-              $_REQUEST["step"] = "3";
+-      }elseif (($_REQUEST["step"] == "2") && ($_REQUEST["install_type"] == "3")) {
+-              $_REQUEST["step"] = "8";
+-      }elseif (($_REQUEST["step"] == "8") && ($old_version_index <= array_search("0.8.5a", $cacti_versions))) {
+-              $_REQUEST["step"] = "9";
+-      }elseif ($_REQUEST["step"] == "8") {
+-              $_REQUEST["step"] = "3";
+-      }elseif ($_REQUEST["step"] == "9") {
+-              $_REQUEST["step"] = "3";
+-      }elseif ($_REQUEST["step"] == "3") {
+-              $_REQUEST["step"] = "4";
++if (isset($_REQUEST["step"]) && $_REQUEST["step"] > 0) {
++      $step = intval($_REQUEST["step"]);
++      if ($step == "1") {
++              $step = "2";
++      } elseif (($step == "2") && ($_REQUEST["install_type"] == "1")) {
++              $step = "3";
++      } elseif (($step == "2") && ($_REQUEST["install_type"] == "3")) {
++              $step = "8";
++      } elseif (($step == "8") && ($old_version_index <= array_search("0.8.5a", $cacti_versions))) {
++              $step = "9";
++      } elseif ($step == "8") {
++              $step = "3";
++      } elseif ($step == "9") {
++              $step = "3";
++      } elseif ($step == "3") {
++              $step = "4";
+       }
++} else {
++      $step = 1;
+ }
+-if ($_REQUEST["step"] == "4") {
++if ($step == "4") {
+       include_once("../lib/data_query.php");
+       include_once("../lib/utility.php");
+@@ -366,7 +367,7 @@
+       header ("Location: ../index.php");
+       exit;
+-}elseif (($_REQUEST["step"] == "8") && ($_REQUEST["install_type"] == "3")) {
++}elseif (($step == "8") && ($_REQUEST["install_type"] == "3")) {
+       /* if the version is not found, die */
+       if (!is_int($old_version_index)) {
+               print " <p style='font-family: Verdana, Arial; font-size: 16px; font-weight: bold; color: red;'>Error</p>
+@@ -505,7 +506,7 @@
+                               </tr>
+                               <tr>
+                                       <td width="100%" style="font-size: 12px;">
+-                                              <?php if ($_REQUEST["step"] == "1") { ?>
++                                              <?php if ($step == "1") { ?>
+                                               <p>Thanks for taking the time to download and install cacti, the complete graphing
+                                               solution for your network. Before you can start making cool graphs, there are a few
+@@ -530,7 +531,7 @@
+                                               MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+                                               GNU General Public License for more details.</p>
+-                                              <?php }elseif ($_REQUEST["step"] == "2") { ?>
++                                              <?php }elseif ($step == "2") { ?>
+                                               <p>Please select the type of installation</p>
+@@ -551,7 +552,7 @@
+                                                       print "Server Operating System Type: " . $config["cacti_server_os"] . "<br>"; ?>
+                                               </p>
+-                                              <?php }elseif ($_REQUEST["step"] == "3") { ?>
++                                              <?php }elseif ($step == "3") { ?>
+                                               <p>Make sure all of these values are correct before continuing.</p>
+                                               <?php
+@@ -609,7 +610,7 @@
+                                               is an upgrade. You can change any of the settings on this screen at a later
+                                               time by going to "Cacti Settings" from within Cacti.</p>
+-                                              <?php }elseif ($_REQUEST["step"] == "8") { ?>
++                                              <?php }elseif ($step == "8") { ?>
+                                               <p>Upgrade results:</p>
+@@ -659,7 +660,7 @@
+                                               print $upgrade_results;
+                                               ?>
+-                                              <?php }elseif ($_REQUEST["step"] == "9") { ?>
++                                              <?php }elseif ($step == "9") { ?>
+                                               <p style='font-size: 16px; font-weight: bold; color: red;'>Important Upgrade Notice</p>
+@@ -673,7 +674,7 @@
+                                               <?php }?>
+-                                              <p align="right"><input type="image" src="install_<?php if ($_REQUEST["step"] == "3") {?>finish<?php }else{?>next<?php }?>.gif" alt="<?php if ($_REQUEST["step"] == "3"){?>Finish<?php }else{?>Next<?php }?>"></p>
++                                              <p align="right"><input type="image" src="install_<?php if ($step == "3") {?>finish<?php }else{?>next<?php }?>.gif" alt="<?php if ($step == "3"){?>Finish<?php }else{?>Next<?php }?>"></p>
+                                       </td>
+                               </tr>
+                       </table>
+@@ -681,7 +682,7 @@
+       </tr>
+ </table>
+-<input type="hidden" name="step" value="<?php print $_REQUEST["step"];?>">
++<input type="hidden" name="step" value="<?php print $step;?>">
+ </form>
diff --git a/src/patches/cacti/cacti-0.8.8b-sql-injection-shell-escaping.patch b/src/patches/cacti/cacti-0.8.8b-sql-injection-shell-escaping.patch
new file mode 100644 (file)
index 0000000..cb72d79
--- /dev/null
@@ -0,0 +1,117 @@
+------------------------------------------------------------------------
+r7439 | rony | 2014-03-30 17:52:10 -0500 (Sun, 30 Mar 2014) | 5 lines
+
+bug#0002405: SQL injection in graph_xport.php
+
+ - Fixed form input validation problems
+ - Fixed rrd export and graph shell escape issues
+
+------------------------------------------------------------------------
+Index: branches/0.8.8/graph_xport.php
+===================================================================
+--- branches/0.8.8/graph_xport.php     (revision 7438)
++++ branches/0.8.8/graph_xport.php     (revision 7439)
+@@ -47,43 +47,48 @@
+ $graph_data_array = array();
++/* ================= input validation ================= */
++input_validate_input_number(get_request_var("local_graph_id"));
++input_validate_input_number(get_request_var("rra_id"));
++/* ==================================================== */
++
+ /* override: graph start time (unix time) */
+-if (!empty($_GET["graph_start"]) && $_GET["graph_start"] < 1600000000) {
+-      $graph_data_array["graph_start"] = $_GET["graph_start"];
++if (!empty($_GET["graph_start"]) && is_numeric($_GET["graph_start"] && $_GET["graph_start"] < 1600000000)) {
++      $graph_data_array["graph_start"] = get_request_var("graph_start");
+ }
+ /* override: graph end time (unix time) */
+-if (!empty($_GET["graph_end"]) && $_GET["graph_end"] < 1600000000) {
+-      $graph_data_array["graph_end"] = $_GET["graph_end"];
++if (!empty($_GET["graph_end"]) && is_numeric($_GET["graph_end"]) && $_GET["graph_end"] < 1600000000) {
++      $graph_data_array["graph_end"] = get_request_var("graph_end");
+ }
+ /* override: graph height (in pixels) */
+-if (!empty($_GET["graph_height"]) && $_GET["graph_height"] < 3000) {
+-      $graph_data_array["graph_height"] = $_GET["graph_height"];
++if (!empty($_GET["graph_height"]) && is_numeric($_GET["graph_height"]) && $_GET["graph_height"] < 3000) {
++      $graph_data_array["graph_height"] = get_request_var("graph_height");
+ }
+ /* override: graph width (in pixels) */
+-if (!empty($_GET["graph_width"]) && $_GET["graph_width"] < 3000) {
+-      $graph_data_array["graph_width"] = $_GET["graph_width"];
++if (!empty($_GET["graph_width"]) && is_numeric($_GET["graph_width"]) && $_GET["graph_width"] < 3000) {
++      $graph_data_array["graph_width"] = get_request_var("graph_width");
+ }
+ /* override: skip drawing the legend? */
+ if (!empty($_GET["graph_nolegend"])) {
+-      $graph_data_array["graph_nolegend"] = $_GET["graph_nolegend"];
++      $graph_data_array["graph_nolegend"] = get_request_var("graph_nolegend");
+ }
+ /* print RRDTool graph source? */
+ if (!empty($_GET["show_source"])) {
+-      $graph_data_array["print_source"] = $_GET["show_source"];
++      $graph_data_array["print_source"] = get_request_var("show_source");
+ }
+-$graph_info = db_fetch_row("SELECT * FROM graph_templates_graph WHERE local_graph_id='" . $_REQUEST["local_graph_id"] . "'");
++$graph_info = db_fetch_row("SELECT * FROM graph_templates_graph WHERE local_graph_id='" . get_request_var("local_graph_id") . "'");
+ /* for bandwidth, NThPercentile */
+ $xport_meta = array();
+ /* Get graph export */
+-$xport_array = @rrdtool_function_xport($_GET["local_graph_id"], $_GET["rra_id"], $graph_data_array, $xport_meta);
++$xport_array = @rrdtool_function_xport($_GET["local_graph_id"], get_request_var("rra_id"), $graph_data_array, $xport_meta);
+ /* Make graph title the suggested file name */
+ if (is_array($xport_array["meta"])) {
+Index: branches/0.8.8/lib/rrd.php
+===================================================================
+--- branches/0.8.8/lib/rrd.php (revision 7438)
++++ branches/0.8.8/lib/rrd.php (revision 7439)
+@@ -865,13 +865,13 @@
+       /* basic graph options */
+       $graph_opts .=
+               "--imgformat=" . $image_types{$graph["image_format_id"]} . RRD_NL .
+-              "--start=$graph_start" . RRD_NL .
+-              "--end=$graph_end" . RRD_NL .
++              "--start=" . cacti_escapeshellarg($graph_start) . RRD_NL .
++              "--end=" . cacti_escapeshellarg($graph_end) . RRD_NL .
+               "--title=" . cacti_escapeshellarg($graph["title_cache"]) . RRD_NL .
+               "$rigid" .
+-              "--base=" . $graph["base_value"] . RRD_NL .
+-              "--height=$graph_height" . RRD_NL .
+-              "--width=$graph_width" . RRD_NL .
++              "--base=" . cacti_escapeshellarg($graph["base_value"]) . RRD_NL .
++              "--height=" . cacti_escapeshellarg($graph_height) . RRD_NL .
++              "--width=" . cacti_escapeshellarg($graph_width) . RRD_NL .
+               "$scale" .
+               "$unit_value" .
+               "$unit_exponent_value" .
+@@ -1606,8 +1606,8 @@
+       /* basic export options */
+       $xport_opts =
+-              "--start=$xport_start" . RRD_NL .
+-              "--end=$xport_end" . RRD_NL .
++              "--start=" . cacti_escapeshellarg($xport_start) . RRD_NL .
++              "--end=" . cacti_escapeshellarg($xport_end) . RRD_NL .
+               "--maxrows=10000" . RRD_NL;
+       $xport_defs = "";
+@@ -1997,7 +1997,7 @@
+                       $stacked_columns["col" . $j] = ($graph_item_types{$xport_item["graph_type_id"]} == "STACK") ? 1 : 0;
+                       $j++;
+-                      $txt_xport_items .= "XPORT:" . $data_source_name . ":" . str_replace(":", "", cacti_escapeshellarg($legend_name)) ;
++                      $txt_xport_items .= "XPORT:" . cacti_escapeshellarg($data_source_name) . ":" . str_replace(":", "", cacti_escapeshellarg($legend_name)) ;
+               }else{
+                       $need_rrd_nl = FALSE;
+               }
diff --git a/src/patches/inetutils-1.4.2-daemon_fixes-1.patch b/src/patches/inetutils-1.4.2-daemon_fixes-1.patch
deleted file mode 100644 (file)
index c57f9ae..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-Submitted By:            Randy McMurchy <randy_at_linuxfromscratch_dot_org>
-Date:                    2005-03-23
-Initial Package Version: 1.4.2
-Upstream Status:         Not sure
-Origin:                  Internet (URL's are now lost)
-Description:             Fix the rexecd daemon so that it understands shadow
-                         passwords. Fix the rshd daemon so that it properly
-                         resolves hostnames.
-
-diff -Naur inetutils-1.4.2-orig/rexecd/rexecd.c inetutils-1.4.2/rexecd/rexecd.c
---- inetutils-1.4.2-orig/rexecd/rexecd.c       2002-12-11 12:38:00.000000000 +0000
-+++ inetutils-1.4.2/rexecd/rexecd.c    2005-02-22 19:53:44.146962264 +0000
-@@ -79,6 +79,10 @@
- #include <varargs.h>
- #endif
-+#ifdef HAVE_SHADOW_H
-+#include <shadow.h>
-+#endif
-+
- void error __P ((const char *fmt, ...));
- /*
-  * remote execute server:
-@@ -127,6 +131,10 @@
-       char *cmdbuf, *cp, *namep;
-       char *user, *pass;
-       struct passwd *pwd;
-+#ifdef HAVE_SHADOW_H
-+      struct spwd *spwd;
-+      char *pw_field;
-+#endif
-       int s;
-       u_short port;
-       int pv[2], pid, cc;
-@@ -186,6 +194,24 @@
-               exit(1);
-       }
-       endpwent();
-+
-+#ifdef HAVE_SHADOW_H
-+      // Get encrypted password from /etc/shadow if possible,
-+      // else from /etc/passwd.
-+      spwd = getspnam(user);
-+      if (spwd) {
-+              pw_field = spwd->sp_pwdp;
-+      } else {
-+              pw_field = pwd->pw_passwd;
-+      }
-+      if (*pw_field != '\0') {
-+              namep = CRYPT (pass, pw_field);
-+              if (strcmp(namep, pw_field)) {
-+                      error("Password incorrect.\n");
-+                      exit(1);
-+              }
-+      }
-+#else
-       if (*pwd->pw_passwd != '\0') {
-               namep = CRYPT (pass, pwd->pw_passwd);
-               if (strcmp(namep, pwd->pw_passwd)) {
-@@ -193,6 +219,7 @@
-                       exit(1);
-               }
-       }
-+#endif
-       write(STDERR_FILENO, "\0", 1);
-       if (port) {
-               pipe(pv);
-diff -Naur inetutils-1.4.2-orig/rshd/rshd.c inetutils-1.4.2/rshd/rshd.c
---- inetutils-1.4.2-orig/rshd/rshd.c   2002-12-11 12:38:00.000000000 +0000
-+++ inetutils-1.4.2/rshd/rshd.c        2005-02-22 19:54:33.162510768 +0000
-@@ -443,7 +443,7 @@
-       dup2 (sockfd, STDERR_FILENO);
-     }
--  /* Get the "name" of the clent form its Internet address.
-+  /* Get the "name" of the client form its Internet address.
-    * This is used for the autentication below
-    */
-   errorstr = NULL;
-@@ -457,52 +457,49 @@
-        * in a remote net; look up the name and check that this
-        * address corresponds to the name.
-        */
--      hostname = strdup (hp->h_name);
-+      const char *remotehost = strdup(hp->h_name);
- #ifdef        KERBEROS
-       if (!use_kerberos)
- #endif
--      if (check_all || local_domain (hp->h_name))
-+       if (! remotehost)
-+           errorstr = "Out of memory\n";
-+       else if (check_all || local_domain (remotehost))
-         {
--          char *remotehost = (char *) alloca (strlen (hp->h_name) + 1);
--          if (! remotehost)
--            errorstr = "Out of memory\n";
--          else
-+           errorhost = remotehost;
-+           hp = gethostbyname (remotehost);
-+           if (hp == NULL)
-             {
--              strcpy (remotehost, hp->h_name);
--              errorhost = remotehost;
--              hp = gethostbyname (remotehost);
--              if (hp == NULL)
-+               syslog (LOG_INFO,
-+                       "Couldn't look up address for %s", remotehost);
-+                       errorstr = "Couldn't look up address for your host (%s)\n";
-+                       hostname = strdup(inet_ntoa(fromp->sin_addr));
-+             }
-+           else
-+              {
-+               for (; ; hp->h_addr_list++)
-                 {
--                  syslog (LOG_INFO,
--                          "Couldn't look up address for %s", remotehost);
--                  errorstr = "Couldn't look up address for your host (%s)\n";
--                  hostname = inet_ntoa (fromp->sin_addr);
-+                   if (hp->h_addr_list[0] == NULL)
-+                     {
-+                       syslog (LOG_NOTICE,
-+                               "Host addr %s not listed for host %s",
-+                               inet_ntoa (fromp->sin_addr), hp->h_name);
-+                       errorstr = "Host address mismatch for %s\n";
-+                       hostname = strdup(inet_ntoa(fromp->sin_addr));
-+                       break;
-+                     }
-+                   if (!memcmp (hp->h_addr_list[0],
-+                               (caddr_t)&fromp->sin_addr,
-+                               sizeof fromp->sin_addr))
-+                     {
-+                       hostname = strdup(hp->h_name);
-+                       break; /* equal, OK */
-+                     }
-                 }
--              else
--                for (; ; hp->h_addr_list++)
--                  {
--                    if (hp->h_addr_list[0] == NULL)
--                      {
--                        syslog (LOG_NOTICE,
--                                "Host addr %s not listed for host %s",
--                                inet_ntoa (fromp->sin_addr), hp->h_name);
--                        errorstr = "Host address mismatch for %s\n";
--                        hostname = inet_ntoa (fromp->sin_addr);
--                        break;
--                      }
--                    if (!memcmp (hp->h_addr_list[0],
--                                 (caddr_t)&fromp->sin_addr,
--                                 sizeof fromp->sin_addr))
--                      {
--                        hostname = hp->h_name;
--                        break; /* equal, OK */
--                      }
--                  }
--            }
-+              }
-         }
-     }
-   else
--    errorhost = hostname = inet_ntoa (fromp->sin_addr);
-+    errorhost = hostname = strdup(inet_ntoa(fromp->sin_addr));
- #ifdef        KERBEROS
-   if (use_kerberos)
-
diff --git a/src/patches/inetutils-1.4.2-gcc4_fixes-3.patch b/src/patches/inetutils-1.4.2-gcc4_fixes-3.patch
deleted file mode 100644 (file)
index fd7d847..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-Submitted By: Matthew Burgess <matthew@linuxfromscratch.org>
-Date: 2005-08-30
-Initial Package Version: 1.4.2
-Upstream Status: From upstream
-Origin: Greg Schafer <gschafer@zip.com.au> (http://www.diy-linux.org/downloads/patches/GCC4/inetutils-1.4.2-gcc4-fixes-1.patch)
-Description: Fix compilation issues with gcc4
-
-diff -Naur inetutils-1.4.2.orig/ftp/ftp_var.h inetutils-1.4.2/ftp/ftp_var.h
---- inetutils-1.4.2.orig/ftp/ftp_var.h 2000-07-08 01:00:53.000000000 +0000
-+++ inetutils-1.4.2/ftp/ftp_var.h      2005-08-30 20:25:27.205932304 +0000
-@@ -36,8 +36,6 @@
- #include <sys/param.h>
- #include <setjmp.h>
--#include "extern.h"
--
- #ifndef FTP_EXTERN
- #define FTP_EXTERN extern
- #endif
-@@ -129,3 +127,5 @@
- FTP_EXTERN int macnum;                        /* number of defined macros */
- FTP_EXTERN struct macel macros[16];
- FTP_EXTERN char macbuf[4096];
-+
-+#include "extern.h"
-diff -Naur inetutils-1.4.2.orig/libinetutils/ttymsg.c inetutils-1.4.2/libinetutils/ttymsg.c
---- inetutils-1.4.2.orig/libinetutils/ttymsg.c 2001-11-01 15:52:19.000000000 +0000
-+++ inetutils-1.4.2/libinetutils/ttymsg.c      2005-08-30 20:24:27.168059448 +0000
-@@ -132,7 +132,7 @@
-           }
-         if (wret)
-           {
--            (char *)iov->iov_base += wret;
-+            iov->iov_base = (char *)iov->iov_base + wret;
-             iov->iov_len -= wret;
-           }
-         continue;
diff --git a/src/patches/linux-3.10.39-pie_packet_sch.patch b/src/patches/linux-3.10.39-pie_packet_sch.patch
new file mode 100644 (file)
index 0000000..6bec374
--- /dev/null
@@ -0,0 +1,674 @@
+From d4b36210c2e6ecef0ce52fb6c18c51144f5c2d88 Mon Sep 17 00:00:00 2001
+From: Vijay Subramanian <vijaynsu@cisco.com>
+Date: Sat, 4 Jan 2014 17:33:55 -0800
+Subject: net: pkt_sched: PIE AQM scheme
+
+Proportional Integral controller Enhanced (PIE) is a scheduler to address the
+bufferbloat problem.
+
+>From the IETF draft below:
+" Bufferbloat is a phenomenon where excess buffers in the network cause high
+latency and jitter. As more and more interactive applications (e.g. voice over
+IP, real time video streaming and financial transactions) run in the Internet,
+high latency and jitter degrade application performance. There is a pressing
+need to design intelligent queue management schemes that can control latency and
+jitter; and hence provide desirable quality of service to users.
+
+We present here a lightweight design, PIE(Proportional Integral controller
+Enhanced) that can effectively control the average queueing latency to a target
+value. Simulation results, theoretical analysis and Linux testbed results have
+shown that PIE can ensure low latency and achieve high link utilization under
+various congestion situations. The design does not require per-packet
+timestamp, so it incurs very small overhead and is simple enough to implement
+in both hardware and software.  "
+
+Many thanks to Dave Taht for extensive feedback, reviews, testing and
+suggestions. Thanks also to Stephen Hemminger and Eric Dumazet for reviews and
+suggestions.  Naeem Khademi and Dave Taht independently contributed to ECN
+support.
+
+For more information, please see technical paper about PIE in the IEEE
+Conference on High Performance Switching and Routing 2013. A copy of the paper
+can be found at ftp://ftpeng.cisco.com/pie/.
+
+Please also refer to the IETF draft submission at
+http://tools.ietf.org/html/draft-pan-tsvwg-pie-00
+
+All relevant code, documents and test scripts and results can be found at
+ftp://ftpeng.cisco.com/pie/.
+
+For problems with the iproute2/tc or Linux kernel code, please contact Vijay
+Subramanian (vijaynsu@cisco.com or subramanian.vijay@gmail.com) Mythili Prabhu
+(mysuryan@cisco.com)
+
+Signed-off-by: Vijay Subramanian <subramanian.vijay@gmail.com>
+Signed-off-by: Mythili Prabhu <mysuryan@cisco.com>
+CC: Dave Taht <dave.taht@bufferbloat.net>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+
+diff -Naur linux-3.10.39.org/include/uapi/linux/pkt_sched.h linux-3.10.39/include/uapi/linux/pkt_sched.h
+--- linux-3.10.39.org/include/uapi/linux/pkt_sched.h   2014-05-06 16:56:24.000000000 +0200
++++ linux-3.10.39/include/uapi/linux/pkt_sched.h       2014-05-15 10:33:08.296828477 +0200
+@@ -744,4 +744,29 @@
+       };
+ };
++/* PIE */
++enum {
++      TCA_PIE_UNSPEC,
++      TCA_PIE_TARGET,
++      TCA_PIE_LIMIT,
++      TCA_PIE_TUPDATE,
++      TCA_PIE_ALPHA,
++      TCA_PIE_BETA,
++      TCA_PIE_ECN,
++      TCA_PIE_BYTEMODE,
++      __TCA_PIE_MAX
++};
++#define TCA_PIE_MAX   (__TCA_PIE_MAX - 1)
++
++struct tc_pie_xstats {
++      __u32 prob;             /* current probability */
++      __u32 delay;            /* current delay in ms */
++      __u32 avg_dq_rate;      /* current average dq_rate in bits/pie_time */
++      __u32 packets_in;       /* total number of packets enqueued */
++      __u32 dropped;          /* packets dropped due to pie_action */
++      __u32 overlimit;        /* dropped due to lack of space in queue */
++      __u32 maxq;             /* maximum queue size */
++      __u32 ecn_mark;         /* packets marked with ecn*/
++};
++
+ #endif
+diff -Naur linux-3.10.39.org/net/sched/Kconfig linux-3.10.39/net/sched/Kconfig
+--- linux-3.10.39.org/net/sched/Kconfig        2014-05-06 16:56:24.000000000 +0200
++++ linux-3.10.39/net/sched/Kconfig    2014-05-15 09:30:29.866632326 +0200
+@@ -272,6 +272,19 @@
+         If unsure, say N.
++config NET_SCH_PIE
++      tristate "Proportional Integral controller Enhanced (PIE) scheduler"
++      help
++        Say Y here if you want to use the Proportional Integral controller
++        Enhanced scheduler packet scheduling algorithm.
++        For more information, please see
++        http://tools.ietf.org/html/draft-pan-tsvwg-pie-00
++
++        To compile this driver as a module, choose M here: the module
++        will be called sch_pie.
++
++        If unsure, say N.
++
+ config NET_SCH_INGRESS
+       tristate "Ingress Qdisc"
+       depends on NET_CLS_ACT
+diff -Naur linux-3.10.39.org/net/sched/Makefile linux-3.10.39/net/sched/Makefile
+--- linux-3.10.39.org/net/sched/Makefile       2014-05-06 16:56:24.000000000 +0200
++++ linux-3.10.39/net/sched/Makefile   2014-05-15 10:34:55.533502406 +0200
+@@ -39,6 +39,7 @@
+ obj-$(CONFIG_NET_SCH_QFQ)     += sch_qfq.o
+ obj-$(CONFIG_NET_SCH_CODEL)   += sch_codel.o
+ obj-$(CONFIG_NET_SCH_FQ_CODEL)        += sch_fq_codel.o
++obj-$(CONFIG_NET_SCH_PIE)     += sch_pie.o
+ obj-$(CONFIG_NET_CLS_U32)     += cls_u32.o
+ obj-$(CONFIG_NET_CLS_ROUTE4)  += cls_route.o
+diff -Naur linux-3.10.39.org/net/sched/sch_pie.c linux-3.10.39/net/sched/sch_pie.c
+--- linux-3.10.39.org/net/sched/sch_pie.c      1970-01-01 01:00:00.000000000 +0100
++++ linux-3.10.39/net/sched/sch_pie.c  2014-05-15 09:30:29.869966724 +0200
+@@ -0,0 +1,555 @@
++/* Copyright (C) 2013 Cisco Systems, Inc, 2013.
++ *
++ * This 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.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * Author: Vijay Subramanian <vijaynsu@cisco.com>
++ * Author: Mythili Prabhu <mysuryan@cisco.com>
++ *
++ * ECN support is added by Naeem Khademi <naeemk@ifi.uio.no>
++ * University of Oslo, Norway.
++ */
++
++#include <linux/module.h>
++#include <linux/slab.h>
++#include <linux/types.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/skbuff.h>
++#include <net/pkt_sched.h>
++#include <net/inet_ecn.h>
++
++#define QUEUE_THRESHOLD 10000
++#define DQCOUNT_INVALID -1
++#define MAX_PROB  0xffffffff
++#define PIE_SCALE 8
++
++/* parameters used */
++struct pie_params {
++      psched_time_t target;   /* user specified target delay in pschedtime */
++      u32 tupdate;            /* timer frequency (in jiffies) */
++      u32 limit;              /* number of packets that can be enqueued */
++      u32 alpha;              /* alpha and beta are between -4 and 4 */
++      u32 beta;               /* and are used for shift relative to 1 */
++      bool ecn;               /* true if ecn is enabled */
++      bool bytemode;          /* to scale drop early prob based on pkt size */
++};
++
++/* variables used */
++struct pie_vars {
++      u32 prob;               /* probability but scaled by u32 limit. */
++      psched_time_t burst_time;
++      psched_time_t qdelay;
++      psched_time_t qdelay_old;
++      u64 dq_count;           /* measured in bytes */
++      psched_time_t dq_tstamp;        /* drain rate */
++      u32 avg_dq_rate;        /* bytes per pschedtime tick,scaled */
++      u32 qlen_old;           /* in bytes */
++};
++
++/* statistics gathering */
++struct pie_stats {
++      u32 packets_in;         /* total number of packets enqueued */
++      u32 dropped;            /* packets dropped due to pie_action */
++      u32 overlimit;          /* dropped due to lack of space in queue */
++      u32 maxq;               /* maximum queue size */
++      u32 ecn_mark;           /* packets marked with ECN */
++};
++
++/* private data for the Qdisc */
++struct pie_sched_data {
++      struct pie_params params;
++      struct pie_vars vars;
++      struct pie_stats stats;
++      struct timer_list adapt_timer;
++};
++
++static void pie_params_init(struct pie_params *params)
++{
++      params->alpha = 2;
++      params->beta = 20;
++      params->tupdate = usecs_to_jiffies(30 * USEC_PER_MSEC); /* 30 ms */
++      params->limit = 1000;   /* default of 1000 packets */
++      params->target = PSCHED_NS2TICKS(20 * NSEC_PER_MSEC);   /* 20 ms */
++      params->ecn = false;
++      params->bytemode = false;
++}
++
++static void pie_vars_init(struct pie_vars *vars)
++{
++      vars->dq_count = DQCOUNT_INVALID;
++      vars->avg_dq_rate = 0;
++      /* default of 100 ms in pschedtime */
++      vars->burst_time = PSCHED_NS2TICKS(100 * NSEC_PER_MSEC);
++}
++
++static bool drop_early(struct Qdisc *sch, u32 packet_size)
++{
++      struct pie_sched_data *q = qdisc_priv(sch);
++      u32 rnd;
++      u32 local_prob = q->vars.prob;
++      u32 mtu = psched_mtu(qdisc_dev(sch));
++
++      /* If there is still burst allowance left skip random early drop */
++      if (q->vars.burst_time > 0)
++              return false;
++
++      /* If current delay is less than half of target, and
++       * if drop prob is low already, disable early_drop
++       */
++      if ((q->vars.qdelay < q->params.target / 2)
++          && (q->vars.prob < MAX_PROB / 5))
++              return false;
++
++      /* If we have fewer than 2 mtu-sized packets, disable drop_early,
++       * similar to min_th in RED
++       */
++      if (sch->qstats.backlog < 2 * mtu)
++              return false;
++
++      /* If bytemode is turned on, use packet size to compute new
++       * probablity. Smaller packets will have lower drop prob in this case
++       */
++      if (q->params.bytemode && packet_size <= mtu)
++              local_prob = (local_prob / mtu) * packet_size;
++      else
++              local_prob = q->vars.prob;
++
++      rnd = net_random();
++      if (rnd < local_prob)
++              return true;
++
++      return false;
++}
++
++static int pie_qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch)
++{
++      struct pie_sched_data *q = qdisc_priv(sch);
++      bool enqueue = false;
++
++      if (unlikely(qdisc_qlen(sch) >= sch->limit)) {
++              q->stats.overlimit++;
++              goto out;
++      }
++
++      if (!drop_early(sch, skb->len)) {
++              enqueue = true;
++      } else if (q->params.ecn && (q->vars.prob <= MAX_PROB / 10) &&
++                 INET_ECN_set_ce(skb)) {
++              /* If packet is ecn capable, mark it if drop probability
++               * is lower than 10%, else drop it.
++               */
++              q->stats.ecn_mark++;
++              enqueue = true;
++      }
++
++      /* we can enqueue the packet */
++      if (enqueue) {
++              q->stats.packets_in++;
++              if (qdisc_qlen(sch) > q->stats.maxq)
++                      q->stats.maxq = qdisc_qlen(sch);
++
++              return qdisc_enqueue_tail(skb, sch);
++      }
++
++out:
++      q->stats.dropped++;
++      return qdisc_drop(skb, sch);
++}
++
++static const struct nla_policy pie_policy[TCA_PIE_MAX + 1] = {
++      [TCA_PIE_TARGET] = {.type = NLA_U32},
++      [TCA_PIE_LIMIT] = {.type = NLA_U32},
++      [TCA_PIE_TUPDATE] = {.type = NLA_U32},
++      [TCA_PIE_ALPHA] = {.type = NLA_U32},
++      [TCA_PIE_BETA] = {.type = NLA_U32},
++      [TCA_PIE_ECN] = {.type = NLA_U32},
++      [TCA_PIE_BYTEMODE] = {.type = NLA_U32},
++};
++
++static int pie_change(struct Qdisc *sch, struct nlattr *opt)
++{
++      struct pie_sched_data *q = qdisc_priv(sch);
++      struct nlattr *tb[TCA_PIE_MAX + 1];
++      unsigned int qlen;
++      int err;
++
++      if (!opt)
++              return -EINVAL;
++
++      err = nla_parse_nested(tb, TCA_PIE_MAX, opt, pie_policy);
++      if (err < 0)
++              return err;
++
++      sch_tree_lock(sch);
++
++      /* convert from microseconds to pschedtime */
++      if (tb[TCA_PIE_TARGET]) {
++              /* target is in us */
++              u32 target = nla_get_u32(tb[TCA_PIE_TARGET]);
++
++              /* convert to pschedtime */
++              q->params.target = PSCHED_NS2TICKS((u64)target * NSEC_PER_USEC);
++      }
++
++      /* tupdate is in jiffies */
++      if (tb[TCA_PIE_TUPDATE])
++              q->params.tupdate = usecs_to_jiffies(nla_get_u32(tb[TCA_PIE_TUPDATE]));
++
++      if (tb[TCA_PIE_LIMIT]) {
++              u32 limit = nla_get_u32(tb[TCA_PIE_LIMIT]);
++
++              q->params.limit = limit;
++              sch->limit = limit;
++      }
++
++      if (tb[TCA_PIE_ALPHA])
++              q->params.alpha = nla_get_u32(tb[TCA_PIE_ALPHA]);
++
++      if (tb[TCA_PIE_BETA])
++              q->params.beta = nla_get_u32(tb[TCA_PIE_BETA]);
++
++      if (tb[TCA_PIE_ECN])
++              q->params.ecn = nla_get_u32(tb[TCA_PIE_ECN]);
++
++      if (tb[TCA_PIE_BYTEMODE])
++              q->params.bytemode = nla_get_u32(tb[TCA_PIE_BYTEMODE]);
++
++      /* Drop excess packets if new limit is lower */
++      qlen = sch->q.qlen;
++      while (sch->q.qlen > sch->limit) {
++              struct sk_buff *skb = __skb_dequeue(&sch->q);
++
++              sch->qstats.backlog -= qdisc_pkt_len(skb);
++              qdisc_drop(skb, sch);
++      }
++      qdisc_tree_decrease_qlen(sch, qlen - sch->q.qlen);
++
++      sch_tree_unlock(sch);
++      return 0;
++}
++
++static void pie_process_dequeue(struct Qdisc *sch, struct sk_buff *skb)
++{
++
++      struct pie_sched_data *q = qdisc_priv(sch);
++      int qlen = sch->qstats.backlog; /* current queue size in bytes */
++
++      /* If current queue is about 10 packets or more and dq_count is unset
++       * we have enough packets to calculate the drain rate. Save
++       * current time as dq_tstamp and start measurement cycle.
++       */
++      if (qlen >= QUEUE_THRESHOLD && q->vars.dq_count == DQCOUNT_INVALID) {
++              q->vars.dq_tstamp = psched_get_time();
++              q->vars.dq_count = 0;
++      }
++
++      /* Calculate the average drain rate from this value.  If queue length
++       * has receded to a small value viz., <= QUEUE_THRESHOLD bytes,reset
++       * the dq_count to -1 as we don't have enough packets to calculate the
++       * drain rate anymore The following if block is entered only when we
++       * have a substantial queue built up (QUEUE_THRESHOLD bytes or more)
++       * and we calculate the drain rate for the threshold here.  dq_count is
++       * in bytes, time difference in psched_time, hence rate is in
++       * bytes/psched_time.
++       */
++      if (q->vars.dq_count != DQCOUNT_INVALID) {
++              q->vars.dq_count += skb->len;
++
++              if (q->vars.dq_count >= QUEUE_THRESHOLD) {
++                      psched_time_t now = psched_get_time();
++                      u32 dtime = now - q->vars.dq_tstamp;
++                      u32 count = q->vars.dq_count << PIE_SCALE;
++
++                      if (dtime == 0)
++                              return;
++
++                      count = count / dtime;
++
++                      if (q->vars.avg_dq_rate == 0)
++                              q->vars.avg_dq_rate = count;
++                      else
++                              q->vars.avg_dq_rate =
++                                  (q->vars.avg_dq_rate -
++                                   (q->vars.avg_dq_rate >> 3)) + (count >> 3);
++
++                      /* If the queue has receded below the threshold, we hold
++                       * on to the last drain rate calculated, else we reset
++                       * dq_count to 0 to re-enter the if block when the next
++                       * packet is dequeued
++                       */
++                      if (qlen < QUEUE_THRESHOLD)
++                              q->vars.dq_count = DQCOUNT_INVALID;
++                      else {
++                              q->vars.dq_count = 0;
++                              q->vars.dq_tstamp = psched_get_time();
++                      }
++
++                      if (q->vars.burst_time > 0) {
++                              if (q->vars.burst_time > dtime)
++                                      q->vars.burst_time -= dtime;
++                              else
++                                      q->vars.burst_time = 0;
++                      }
++              }
++      }
++}
++
++static void calculate_probability(struct Qdisc *sch)
++{
++      struct pie_sched_data *q = qdisc_priv(sch);
++      u32 qlen = sch->qstats.backlog; /* queue size in bytes */
++      psched_time_t qdelay = 0;       /* in pschedtime */
++      psched_time_t qdelay_old = q->vars.qdelay;      /* in pschedtime */
++      s32 delta = 0;          /* determines the change in probability */
++      u32 oldprob;
++      u32 alpha, beta;
++      bool update_prob = true;
++
++      q->vars.qdelay_old = q->vars.qdelay;
++
++      if (q->vars.avg_dq_rate > 0)
++              qdelay = (qlen << PIE_SCALE) / q->vars.avg_dq_rate;
++      else
++              qdelay = 0;
++
++      /* If qdelay is zero and qlen is not, it means qlen is very small, less
++       * than dequeue_rate, so we do not update probabilty in this round
++       */
++      if (qdelay == 0 && qlen != 0)
++              update_prob = false;
++
++      /* Add ranges for alpha and beta, more aggressive for high dropping
++       * mode and gentle steps for light dropping mode
++       * In light dropping mode, take gentle steps; in medium dropping mode,
++       * take medium steps; in high dropping mode, take big steps.
++       */
++      if (q->vars.prob < MAX_PROB / 100) {
++              alpha =
++                  (q->params.alpha * (MAX_PROB / PSCHED_TICKS_PER_SEC)) >> 7;
++              beta =
++                  (q->params.beta * (MAX_PROB / PSCHED_TICKS_PER_SEC)) >> 7;
++      } else if (q->vars.prob < MAX_PROB / 10) {
++              alpha =
++                  (q->params.alpha * (MAX_PROB / PSCHED_TICKS_PER_SEC)) >> 5;
++              beta =
++                  (q->params.beta * (MAX_PROB / PSCHED_TICKS_PER_SEC)) >> 5;
++      } else {
++              alpha =
++                  (q->params.alpha * (MAX_PROB / PSCHED_TICKS_PER_SEC)) >> 4;
++              beta =
++                  (q->params.beta * (MAX_PROB / PSCHED_TICKS_PER_SEC)) >> 4;
++      }
++
++      /* alpha and beta should be between 0 and 32, in multiples of 1/16 */
++      delta += alpha * ((qdelay - q->params.target));
++      delta += beta * ((qdelay - qdelay_old));
++
++      oldprob = q->vars.prob;
++
++      /* to ensure we increase probability in steps of no more than 2% */
++      if (delta > (s32) (MAX_PROB / (100 / 2)) &&
++          q->vars.prob >= MAX_PROB / 10)
++              delta = (MAX_PROB / 100) * 2;
++
++      /* Non-linear drop:
++       * Tune drop probability to increase quickly for high delays(>= 250ms)
++       * 250ms is derived through experiments and provides error protection
++       */
++
++      if (qdelay > (PSCHED_NS2TICKS(250 * NSEC_PER_MSEC)))
++              delta += MAX_PROB / (100 / 2);
++
++      q->vars.prob += delta;
++
++      if (delta > 0) {
++              /* prevent overflow */
++              if (q->vars.prob < oldprob) {
++                      q->vars.prob = MAX_PROB;
++                      /* Prevent normalization error. If probability is at
++                       * maximum value already, we normalize it here, and
++                       * skip the check to do a non-linear drop in the next
++                       * section.
++                       */
++                      update_prob = false;
++              }
++      } else {
++              /* prevent underflow */
++              if (q->vars.prob > oldprob)
++                      q->vars.prob = 0;
++      }
++
++      /* Non-linear drop in probability: Reduce drop probability quickly if
++       * delay is 0 for 2 consecutive Tupdate periods.
++       */
++
++      if ((qdelay == 0) && (qdelay_old == 0) && update_prob)
++              q->vars.prob = (q->vars.prob * 98) / 100;
++
++      q->vars.qdelay = qdelay;
++      q->vars.qlen_old = qlen;
++
++      /* We restart the measurement cycle if the following conditions are met
++       * 1. If the delay has been low for 2 consecutive Tupdate periods
++       * 2. Calculated drop probability is zero
++       * 3. We have atleast one estimate for the avg_dq_rate ie.,
++       *    is a non-zero value
++       */
++      if ((q->vars.qdelay < q->params.target / 2) &&
++          (q->vars.qdelay_old < q->params.target / 2) &&
++          (q->vars.prob == 0) &&
++          (q->vars.avg_dq_rate > 0))
++              pie_vars_init(&q->vars);
++}
++
++static void pie_timer(unsigned long arg)
++{
++      struct Qdisc *sch = (struct Qdisc *)arg;
++      struct pie_sched_data *q = qdisc_priv(sch);
++      spinlock_t *root_lock = qdisc_lock(qdisc_root_sleeping(sch));
++
++      spin_lock(root_lock);
++      calculate_probability(sch);
++
++      /* reset the timer to fire after 'tupdate'. tupdate is in jiffies. */
++      if (q->params.tupdate)
++              mod_timer(&q->adapt_timer, jiffies + q->params.tupdate);
++      spin_unlock(root_lock);
++
++}
++
++static int pie_init(struct Qdisc *sch, struct nlattr *opt)
++{
++      struct pie_sched_data *q = qdisc_priv(sch);
++
++      pie_params_init(&q->params);
++      pie_vars_init(&q->vars);
++      sch->limit = q->params.limit;
++
++      setup_timer(&q->adapt_timer, pie_timer, (unsigned long)sch);
++      mod_timer(&q->adapt_timer, jiffies + HZ / 2);
++
++      if (opt) {
++              int err = pie_change(sch, opt);
++
++              if (err)
++                      return err;
++      }
++
++      return 0;
++}
++
++static int pie_dump(struct Qdisc *sch, struct sk_buff *skb)
++{
++      struct pie_sched_data *q = qdisc_priv(sch);
++      struct nlattr *opts;
++
++      opts = nla_nest_start(skb, TCA_OPTIONS);
++      if (opts == NULL)
++              goto nla_put_failure;
++
++      /* convert target from pschedtime to us */
++      if (nla_put_u32(skb, TCA_PIE_TARGET,
++                      ((u32) PSCHED_TICKS2NS(q->params.target)) /
++                      NSEC_PER_USEC) ||
++          nla_put_u32(skb, TCA_PIE_LIMIT, sch->limit) ||
++          nla_put_u32(skb, TCA_PIE_TUPDATE, jiffies_to_usecs(q->params.tupdate)) ||
++          nla_put_u32(skb, TCA_PIE_ALPHA, q->params.alpha) ||
++          nla_put_u32(skb, TCA_PIE_BETA, q->params.beta) ||
++          nla_put_u32(skb, TCA_PIE_ECN, q->params.ecn) ||
++          nla_put_u32(skb, TCA_PIE_BYTEMODE, q->params.bytemode))
++              goto nla_put_failure;
++
++      return nla_nest_end(skb, opts);
++
++nla_put_failure:
++      nla_nest_cancel(skb, opts);
++      return -1;
++
++}
++
++static int pie_dump_stats(struct Qdisc *sch, struct gnet_dump *d)
++{
++      struct pie_sched_data *q = qdisc_priv(sch);
++      struct tc_pie_xstats st = {
++              .prob           = q->vars.prob,
++              .delay          = ((u32) PSCHED_TICKS2NS(q->vars.qdelay)) /
++                                 NSEC_PER_USEC,
++              /* unscale and return dq_rate in bytes per sec */
++              .avg_dq_rate    = q->vars.avg_dq_rate *
++                                (PSCHED_TICKS_PER_SEC) >> PIE_SCALE,
++              .packets_in     = q->stats.packets_in,
++              .overlimit      = q->stats.overlimit,
++              .maxq           = q->stats.maxq,
++              .dropped        = q->stats.dropped,
++              .ecn_mark       = q->stats.ecn_mark,
++      };
++
++      return gnet_stats_copy_app(d, &st, sizeof(st));
++}
++
++static struct sk_buff *pie_qdisc_dequeue(struct Qdisc *sch)
++{
++      struct sk_buff *skb;
++      skb = __qdisc_dequeue_head(sch, &sch->q);
++
++      if (!skb)
++              return NULL;
++
++      pie_process_dequeue(sch, skb);
++      return skb;
++}
++
++static void pie_reset(struct Qdisc *sch)
++{
++      struct pie_sched_data *q = qdisc_priv(sch);
++      qdisc_reset_queue(sch);
++      pie_vars_init(&q->vars);
++}
++
++static void pie_destroy(struct Qdisc *sch)
++{
++      struct pie_sched_data *q = qdisc_priv(sch);
++      q->params.tupdate = 0;
++      del_timer_sync(&q->adapt_timer);
++}
++
++static struct Qdisc_ops pie_qdisc_ops __read_mostly = {
++      .id = "pie",
++      .priv_size      = sizeof(struct pie_sched_data),
++      .enqueue        = pie_qdisc_enqueue,
++      .dequeue        = pie_qdisc_dequeue,
++      .peek           = qdisc_peek_dequeued,
++      .init           = pie_init,
++      .destroy        = pie_destroy,
++      .reset          = pie_reset,
++      .change         = pie_change,
++      .dump           = pie_dump,
++      .dump_stats     = pie_dump_stats,
++      .owner          = THIS_MODULE,
++};
++
++static int __init pie_module_init(void)
++{
++      return register_qdisc(&pie_qdisc_ops);
++}
++
++static void __exit pie_module_exit(void)
++{
++      unregister_qdisc(&pie_qdisc_ops);
++}
++
++module_init(pie_module_init);
++module_exit(pie_module_exit);
++
++MODULE_DESCRIPTION("Proportional Integral controller Enhanced (PIE) scheduler");
++MODULE_AUTHOR("Vijay Subramanian");
++MODULE_AUTHOR("Mythili Prabhu");
++MODULE_LICENSE("GPL");
diff --git a/src/patches/ppp/0003-build-sys-utilize-compiler-flags-handed-to-us-by-rpm.patch b/src/patches/ppp/0003-build-sys-utilize-compiler-flags-handed-to-us-by-rpm.patch
new file mode 100644 (file)
index 0000000..4a43d44
--- /dev/null
@@ -0,0 +1,121 @@
+From d729b06f0ac7a5ebd3648ef60bef0499b59bf82d Mon Sep 17 00:00:00 2001
+From: Michal Sekletar <msekleta@redhat.com>
+Date: Fri, 4 Apr 2014 11:29:39 +0200
+Subject: [PATCH 03/25] build-sys: utilize compiler flags handed to us by
+ rpmbuild
+
+---
+ chat/Makefile.linux                  | 2 +-
+ pppd/Makefile.linux                  | 3 +--
+ pppd/plugins/Makefile.linux          | 2 +-
+ pppd/plugins/pppoatm/Makefile.linux  | 2 +-
+ pppd/plugins/radius/Makefile.linux   | 2 +-
+ pppd/plugins/rp-pppoe/Makefile.linux | 2 +-
+ pppdump/Makefile.linux               | 2 +-
+ pppstats/Makefile.linux              | 2 +-
+ 8 files changed, 8 insertions(+), 9 deletions(-)
+
+diff --git a/chat/Makefile.linux b/chat/Makefile.linux
+index 1065ac5..848cd8d 100644
+--- a/chat/Makefile.linux
++++ b/chat/Makefile.linux
+@@ -10,7 +10,7 @@ CDEF3=       -UNO_SLEEP                      # Use the usleep function
+ CDEF4=        -DFNDELAY=O_NDELAY              # Old name value
+ CDEFS=        $(CDEF1) $(CDEF2) $(CDEF3) $(CDEF4)
+-COPTS=        -O2 -g -pipe
++COPTS=        $(RPM_OPT_FLAGS)
+ CFLAGS=       $(COPTS) $(CDEFS)
+ INSTALL= install
+diff --git a/pppd/Makefile.linux b/pppd/Makefile.linux
+index 5a44d30..63872eb 100644
+--- a/pppd/Makefile.linux
++++ b/pppd/Makefile.linux
+@@ -32,8 +32,7 @@ endif
+ CC = gcc
+ #
+-COPTS = -O2 -pipe -Wall -g
+-LIBS =
++COPTS = -Wall $(RPM_OPT_FLAGS)
+ # Uncomment the next 2 lines to include support for Microsoft's
+ # MS-CHAP authentication protocol.  Also, edit plugins/radius/Makefile.linux.
+diff --git a/pppd/plugins/Makefile.linux b/pppd/plugins/Makefile.linux
+index 0a7ec7b..e09a369 100644
+--- a/pppd/plugins/Makefile.linux
++++ b/pppd/plugins/Makefile.linux
+@@ -1,5 +1,5 @@
+ #CC   = gcc
+-COPTS = -O2 -g
++COPTS = $(RPM_OPT_FLAGS)
+ CFLAGS        = $(COPTS) -I.. -I../../include -fPIC
+ LDFLAGS       = -shared
+ INSTALL       = install
+diff --git a/pppd/plugins/pppoatm/Makefile.linux b/pppd/plugins/pppoatm/Makefile.linux
+index 20f62e6..5a81447 100644
+--- a/pppd/plugins/pppoatm/Makefile.linux
++++ b/pppd/plugins/pppoatm/Makefile.linux
+@@ -1,5 +1,5 @@
+ #CC   = gcc
+-COPTS = -O2 -g
++COPTS = $(RPM_OPT_FLAGS)
+ CFLAGS        = $(COPTS) -I../.. -I../../../include -fPIC
+ LDFLAGS       = -shared
+ INSTALL       = install
+diff --git a/pppd/plugins/radius/Makefile.linux b/pppd/plugins/radius/Makefile.linux
+index 24ed3e5..45b3b8d 100644
+--- a/pppd/plugins/radius/Makefile.linux
++++ b/pppd/plugins/radius/Makefile.linux
+@@ -12,7 +12,7 @@ VERSION = $(shell awk -F '"' '/VERSION/ { print $$2; }' ../../patchlevel.h)
+ INSTALL       = install
+ PLUGIN=radius.so radattr.so radrealms.so
+-CFLAGS=-I. -I../.. -I../../../include -O2 -fPIC -DRC_LOG_FACILITY=LOG_DAEMON
++CFLAGS=-I. -I../.. -I../../../include $(RPM_OPT_FLAGS) -DRC_LOG_FACILITY=LOG_DAEMON
+ # Uncomment the next line to include support for Microsoft's
+ # MS-CHAP authentication protocol.
+diff --git a/pppd/plugins/rp-pppoe/Makefile.linux b/pppd/plugins/rp-pppoe/Makefile.linux
+index 5d7a271..352991a 100644
+--- a/pppd/plugins/rp-pppoe/Makefile.linux
++++ b/pppd/plugins/rp-pppoe/Makefile.linux
+@@ -25,7 +25,7 @@ INSTALL      = install
+ # Version is set ONLY IN THE MAKEFILE!  Don't delete this!
+ RP_VERSION=3.8p
+-COPTS=-O2 -g
++COPTS=$(RPM_OPT_FLAGS)
+ CFLAGS=$(COPTS) -I../../../include '-DRP_VERSION="$(RP_VERSION)"'
+ all: rp-pppoe.so pppoe-discovery
+diff --git a/pppdump/Makefile.linux b/pppdump/Makefile.linux
+index ac028f6..d0a5032 100644
+--- a/pppdump/Makefile.linux
++++ b/pppdump/Makefile.linux
+@@ -2,7 +2,7 @@ DESTDIR = $(INSTROOT)@DESTDIR@
+ BINDIR = $(DESTDIR)/sbin
+ MANDIR = $(DESTDIR)/share/man/man8
+-CFLAGS= -O -I../include/net
++CFLAGS= $(RPM_OPT_FLAGS) -I../include/net
+ OBJS = pppdump.o bsd-comp.o deflate.o zlib.o
+ INSTALL= install
+diff --git a/pppstats/Makefile.linux b/pppstats/Makefile.linux
+index cca6f0f..42aba73 100644
+--- a/pppstats/Makefile.linux
++++ b/pppstats/Makefile.linux
+@@ -10,7 +10,7 @@ PPPSTATSRCS = pppstats.c
+ PPPSTATOBJS = pppstats.o
+ #CC = gcc
+-COPTS = -O
++COPTS = $(RPM_OPT_FLAGS)
+ COMPILE_FLAGS = -I../include
+ LIBS =
+-- 
+1.8.3.1
+
diff --git a/src/patches/ppp/0012-pppd-we-don-t-want-to-accidentally-leak-fds.patch b/src/patches/ppp/0012-pppd-we-don-t-want-to-accidentally-leak-fds.patch
new file mode 100644 (file)
index 0000000..90bb2d1
--- /dev/null
@@ -0,0 +1,143 @@
+From 82cd789df0f022eb6f3d28646e7a61d1d0715805 Mon Sep 17 00:00:00 2001
+From: Michal Sekletar <msekleta@redhat.com>
+Date: Mon, 7 Apr 2014 12:23:36 +0200
+Subject: [PATCH 12/25] pppd: we don't want to accidentally leak fds
+
+---
+ pppd/auth.c      | 20 ++++++++++----------
+ pppd/options.c   |  2 +-
+ pppd/sys-linux.c |  4 ++--
+ 3 files changed, 13 insertions(+), 13 deletions(-)
+
+diff --git a/pppd/auth.c b/pppd/auth.c
+index 4271af6..9e957fa 100644
+--- a/pppd/auth.c
++++ b/pppd/auth.c
+@@ -428,7 +428,7 @@ setupapfile(argv)
+       option_error("unable to reset uid before opening %s: %m", fname);
+       return 0;
+     }
+-    ufile = fopen(fname, "r");
++    ufile = fopen(fname, "re");
+     if (seteuid(euid) == -1)
+       fatal("unable to regain privileges: %m");
+     if (ufile == NULL) {
+@@ -1413,7 +1413,7 @@ check_passwd(unit, auser, userlen, apasswd, passwdlen, msg)
+     filename = _PATH_UPAPFILE;
+     addrs = opts = NULL;
+     ret = UPAP_AUTHNAK;
+-    f = fopen(filename, "r");
++    f = fopen(filename, "re");
+     if (f == NULL) {
+       error("Can't open PAP password file %s: %m", filename);
+@@ -1512,7 +1512,7 @@ null_login(unit)
+     if (ret <= 0) {
+       filename = _PATH_UPAPFILE;
+       addrs = NULL;
+-      f = fopen(filename, "r");
++      f = fopen(filename, "re");
+       if (f == NULL)
+           return 0;
+       check_access(f, filename);
+@@ -1559,7 +1559,7 @@ get_pap_passwd(passwd)
+     }
+     filename = _PATH_UPAPFILE;
+-    f = fopen(filename, "r");
++    f = fopen(filename, "re");
+     if (f == NULL)
+       return 0;
+     check_access(f, filename);
+@@ -1597,7 +1597,7 @@ have_pap_secret(lacks_ipp)
+     }
+     filename = _PATH_UPAPFILE;
+-    f = fopen(filename, "r");
++    f = fopen(filename, "re");
+     if (f == NULL)
+       return 0;
+@@ -1642,7 +1642,7 @@ have_chap_secret(client, server, need_ip, lacks_ipp)
+     }
+     filename = _PATH_CHAPFILE;
+-    f = fopen(filename, "r");
++    f = fopen(filename, "re");
+     if (f == NULL)
+       return 0;
+@@ -1684,7 +1684,7 @@ have_srp_secret(client, server, need_ip, lacks_ipp)
+     struct wordlist *addrs;
+     filename = _PATH_SRPFILE;
+-    f = fopen(filename, "r");
++    f = fopen(filename, "re");
+     if (f == NULL)
+       return 0;
+@@ -1740,7 +1740,7 @@ get_secret(unit, client, server, secret, secret_len, am_server)
+       addrs = NULL;
+       secbuf[0] = 0;
+-      f = fopen(filename, "r");
++      f = fopen(filename, "re");
+       if (f == NULL) {
+           error("Can't open chap secret file %s: %m", filename);
+           return 0;
+@@ -1797,7 +1797,7 @@ get_srp_secret(unit, client, server, secret, am_server)
+       filename = _PATH_SRPFILE;
+       addrs = NULL;
+-      fp = fopen(filename, "r");
++      fp = fopen(filename, "re");
+       if (fp == NULL) {
+           error("Can't open srp secret file %s: %m", filename);
+           return 0;
+@@ -2203,7 +2203,7 @@ scan_authfile(f, client, server, secret, addrs, opts, filename, flags)
+            */
+           if (word[0] == '@' && word[1] == '/') {
+               strlcpy(atfile, word+1, sizeof(atfile));
+-              if ((sf = fopen(atfile, "r")) == NULL) {
++              if ((sf = fopen(atfile, "re")) == NULL) {
+                   warn("can't open indirect secret file %s", atfile);
+                   continue;
+               }
+diff --git a/pppd/options.c b/pppd/options.c
+index 45fa742..1d754ae 100644
+--- a/pppd/options.c
++++ b/pppd/options.c
+@@ -427,7 +427,7 @@ options_from_file(filename, must_exist, check_prot, priv)
+       option_error("unable to drop privileges to open %s: %m", filename);
+       return 0;
+     }
+-    f = fopen(filename, "r");
++    f = fopen(filename, "re");
+     err = errno;
+     if (check_prot && seteuid(euid) == -1)
+       fatal("unable to regain privileges");
+diff --git a/pppd/sys-linux.c b/pppd/sys-linux.c
+index 72a7727..8a12fa0 100644
+--- a/pppd/sys-linux.c
++++ b/pppd/sys-linux.c
+@@ -1412,7 +1412,7 @@ static char *path_to_procfs(const char *tail)
+       /* Default the mount location of /proc */
+       strlcpy (proc_path, "/proc", sizeof(proc_path));
+       proc_path_len = 5;
+-      fp = fopen(MOUNTED, "r");
++      fp = fopen(MOUNTED, "re");
+       if (fp != NULL) {
+           while ((mntent = getmntent(fp)) != NULL) {
+               if (strcmp(mntent->mnt_type, MNTTYPE_IGNORE) == 0)
+@@ -1472,7 +1472,7 @@ static int open_route_table (void)
+     close_route_table();
+     path = path_to_procfs("/net/route");
+-    route_fd = fopen (path, "r");
++    route_fd = fopen (path, "re");
+     if (route_fd == NULL) {
+       error("can't open routing table %s: %m", path);
+       return 0;
+-- 
+1.8.3.1
+
diff --git a/src/patches/ppp/0013-everywhere-O_CLOEXEC-harder.patch b/src/patches/ppp/0013-everywhere-O_CLOEXEC-harder.patch
new file mode 100644 (file)
index 0000000..e3608a0
--- /dev/null
@@ -0,0 +1,241 @@
+From 302c1b736cb656c7885a0cba270fd953a672d8a8 Mon Sep 17 00:00:00 2001
+From: Michal Sekletar <msekleta@redhat.com>
+Date: Mon, 7 Apr 2014 13:56:34 +0200
+Subject: [PATCH 13/25] everywhere: O_CLOEXEC harder
+
+---
+ pppd/eap.c       |  2 +-
+ pppd/main.c      |  4 ++--
+ pppd/options.c   |  4 ++--
+ pppd/sys-linux.c | 22 +++++++++++-----------
+ pppd/tdb.c       |  4 ++--
+ pppd/tty.c       |  4 ++--
+ pppd/utils.c     |  6 +++---
+ 7 files changed, 23 insertions(+), 23 deletions(-)
+
+diff --git a/pppd/eap.c b/pppd/eap.c
+index 6ea6c1f..faced53 100644
+--- a/pppd/eap.c
++++ b/pppd/eap.c
+@@ -1226,7 +1226,7 @@ mode_t modebits;
+       if ((path = name_of_pn_file()) == NULL)
+               return (-1);
+-      fd = open(path, modebits, S_IRUSR | S_IWUSR);
++      fd = open(path, modebits, S_IRUSR | S_IWUSR | O_CLOEXEC);
+       err = errno;
+       free(path);
+       errno = err;
+diff --git a/pppd/main.c b/pppd/main.c
+index 6d50d1b..4880377 100644
+--- a/pppd/main.c
++++ b/pppd/main.c
+@@ -420,7 +420,7 @@ main(argc, argv)
+       die(0);
+     /* Make sure fds 0, 1, 2 are open to somewhere. */
+-    fd_devnull = open(_PATH_DEVNULL, O_RDWR);
++    fd_devnull = open(_PATH_DEVNULL, O_RDWR | O_CLOEXEC);
+     if (fd_devnull < 0)
+       fatal("Couldn't open %s: %m", _PATH_DEVNULL);
+     while (fd_devnull <= 2) {
+@@ -1679,7 +1679,7 @@ device_script(program, in, out, dont_wait)
+     if (log_to_fd >= 0)
+       errfd = log_to_fd;
+     else
+-      errfd = open(_PATH_CONNERRS, O_WRONLY | O_APPEND | O_CREAT, 0600);
++      errfd = open(_PATH_CONNERRS, O_WRONLY | O_APPEND | O_CREAT | O_CLOEXEC, 0600);
+     ++conn_running;
+     pid = safe_fork(in, out, errfd);
+diff --git a/pppd/options.c b/pppd/options.c
+index 1d754ae..8e62635 100644
+--- a/pppd/options.c
++++ b/pppd/options.c
+@@ -1544,9 +1544,9 @@ setlogfile(argv)
+       option_error("unable to drop permissions to open %s: %m", *argv);
+       return 0;
+     }
+-    fd = open(*argv, O_WRONLY | O_APPEND | O_CREAT | O_EXCL, 0644);
++    fd = open(*argv, O_WRONLY | O_APPEND | O_CREAT | O_EXCL | O_CLOEXEC, 0644);
+     if (fd < 0 && errno == EEXIST)
+-      fd = open(*argv, O_WRONLY | O_APPEND);
++      fd = open(*argv, O_WRONLY | O_APPEND | O_CLOEXEC);
+     err = errno;
+     if (!privileged_option && seteuid(euid) == -1)
+       fatal("unable to regain privileges: %m");
+diff --git a/pppd/sys-linux.c b/pppd/sys-linux.c
+index 8a12fa0..00a2cf5 100644
+--- a/pppd/sys-linux.c
++++ b/pppd/sys-linux.c
+@@ -459,7 +459,7 @@ int generic_establish_ppp (int fd)
+           goto err;
+       }
+       dbglog("using channel %d", chindex);
+-      fd = open("/dev/ppp", O_RDWR);
++      fd = open("/dev/ppp", O_RDWR | O_CLOEXEC);
+       if (fd < 0) {
+           error("Couldn't reopen /dev/ppp: %m");
+           goto err;
+@@ -619,7 +619,7 @@ static int make_ppp_unit()
+               dbglog("in make_ppp_unit, already had /dev/ppp open?");
+               close(ppp_dev_fd);
+       }
+-      ppp_dev_fd = open("/dev/ppp", O_RDWR);
++      ppp_dev_fd = open("/dev/ppp", O_RDWR | O_CLOEXEC);
+       if (ppp_dev_fd < 0)
+               fatal("Couldn't open /dev/ppp: %m");
+       flags = fcntl(ppp_dev_fd, F_GETFL);
+@@ -693,7 +693,7 @@ int bundle_attach(int ifnum)
+       if (!new_style_driver)
+               return -1;
+-      master_fd = open("/dev/ppp", O_RDWR);
++      master_fd = open("/dev/ppp", O_RDWR | O_CLOEXEC);
+       if (master_fd < 0)
+               fatal("Couldn't open /dev/ppp: %m");
+       if (ioctl(master_fd, PPPIOCATTACH, &ifnum) < 0) {
+@@ -1715,7 +1715,7 @@ int sifproxyarp (int unit, u_int32_t his_adr)
+       if (tune_kernel) {
+           forw_path = path_to_procfs("/sys/net/ipv4/ip_forward");
+           if (forw_path != 0) {
+-              int fd = open(forw_path, O_WRONLY);
++              int fd = open(forw_path, O_WRONLY | O_CLOEXEC);
+               if (fd >= 0) {
+                   if (write(fd, "1", 1) != 1)
+                       error("Couldn't enable IP forwarding: %m");
+@@ -2030,7 +2030,7 @@ int ppp_available(void)
+     sscanf(utsname.release, "%d.%d.%d", &osmaj, &osmin, &ospatch);
+     kernel_version = KVERSION(osmaj, osmin, ospatch);
+-    fd = open("/dev/ppp", O_RDWR);
++    fd = open("/dev/ppp", O_RDWR | O_CLOEXEC);
+     if (fd >= 0) {
+       new_style_driver = 1;
+@@ -2208,7 +2208,7 @@ void logwtmp (const char *line, const char *name, const char *host)
+ #if __GLIBC__ >= 2
+     updwtmp(_PATH_WTMP, &ut);
+ #else
+-    wtmp = open(_PATH_WTMP, O_APPEND|O_WRONLY);
++    wtmp = open(_PATH_WTMP, O_APPEND|O_WRONLY|O_CLOEXEC);
+     if (wtmp >= 0) {
+       flock(wtmp, LOCK_EX);
+@@ -2394,7 +2394,7 @@ int sifaddr (int unit, u_int32_t our_adr, u_int32_t his_adr,
+       int fd;
+       path = path_to_procfs("/sys/net/ipv4/ip_dynaddr");
+-      if (path != 0 && (fd = open(path, O_WRONLY)) >= 0) {
++      if (path != 0 && (fd = open(path, O_WRONLY | O_CLOEXEC)) >= 0) {
+           if (write(fd, "1", 1) != 1)
+               error("Couldn't enable dynamic IP addressing: %m");
+           close(fd);
+@@ -2570,7 +2570,7 @@ get_pty(master_fdp, slave_fdp, slave_name, uid)
+     /*
+      * Try the unix98 way first.
+      */
+-    mfd = open("/dev/ptmx", O_RDWR);
++    mfd = open("/dev/ptmx", O_RDWR | O_CLOEXEC);
+     if (mfd >= 0) {
+       int ptn;
+       if (ioctl(mfd, TIOCGPTN, &ptn) >= 0) {
+@@ -2581,7 +2581,7 @@ get_pty(master_fdp, slave_fdp, slave_name, uid)
+           if (ioctl(mfd, TIOCSPTLCK, &ptn) < 0)
+               warn("Couldn't unlock pty slave %s: %m", pty_name);
+ #endif
+-          if ((sfd = open(pty_name, O_RDWR | O_NOCTTY)) < 0)
++          if ((sfd = open(pty_name, O_RDWR | O_NOCTTY | O_CLOEXEC)) < 0)
+               warn("Couldn't open pty slave %s: %m", pty_name);
+       }
+     }
+@@ -2592,10 +2592,10 @@ get_pty(master_fdp, slave_fdp, slave_name, uid)
+       for (i = 0; i < 64; ++i) {
+           slprintf(pty_name, sizeof(pty_name), "/dev/pty%c%x",
+                    'p' + i / 16, i % 16);
+-          mfd = open(pty_name, O_RDWR, 0);
++          mfd = open(pty_name, O_RDWR | O_CLOEXEC, 0);
+           if (mfd >= 0) {
+               pty_name[5] = 't';
+-              sfd = open(pty_name, O_RDWR | O_NOCTTY, 0);
++              sfd = open(pty_name, O_RDWR | O_NOCTTY | O_CLOEXEC, 0);
+               if (sfd >= 0) {
+                   fchown(sfd, uid, -1);
+                   fchmod(sfd, S_IRUSR | S_IWUSR);
+diff --git a/pppd/tdb.c b/pppd/tdb.c
+index bdc5828..c7ab71c 100644
+--- a/pppd/tdb.c
++++ b/pppd/tdb.c
+@@ -1724,7 +1724,7 @@ TDB_CONTEXT *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
+               goto internal;
+       }
+-      if ((tdb->fd = open(name, open_flags, mode)) == -1) {
++      if ((tdb->fd = open(name, open_flags | O_CLOEXEC, mode)) == -1) {
+               TDB_LOG((tdb, 5, "tdb_open_ex: could not open file %s: %s\n",
+                        name, strerror(errno)));
+               goto fail;      /* errno set by open(2) */
+@@ -1967,7 +1967,7 @@ int tdb_reopen(TDB_CONTEXT *tdb)
+       }
+       if (close(tdb->fd) != 0)
+               TDB_LOG((tdb, 0, "tdb_reopen: WARNING closing tdb->fd failed!\n"));
+-      tdb->fd = open(tdb->name, tdb->open_flags & ~(O_CREAT|O_TRUNC), 0);
++      tdb->fd = open(tdb->name, (tdb->open_flags & ~(O_CREAT|O_TRUNC)) | O_CLOEXEC, 0);
+       if (tdb->fd == -1) {
+               TDB_LOG((tdb, 0, "tdb_reopen: open failed (%s)\n", strerror(errno)));
+               goto fail;
+diff --git a/pppd/tty.c b/pppd/tty.c
+index d571b11..bc96695 100644
+--- a/pppd/tty.c
++++ b/pppd/tty.c
+@@ -569,7 +569,7 @@ int connect_tty()
+                               status = EXIT_OPEN_FAILED;
+                               goto errret;
+                       }
+-                      real_ttyfd = open(devnam, O_NONBLOCK | O_RDWR, 0);
++                      real_ttyfd = open(devnam, O_NONBLOCK | O_RDWR | O_CLOEXEC, 0);
+                       err = errno;
+                       if (prio < OPRIO_ROOT && seteuid(0) == -1)
+                               fatal("Unable to regain privileges");
+@@ -723,7 +723,7 @@ int connect_tty()
+       if (connector == NULL && modem && devnam[0] != 0) {
+               int i;
+               for (;;) {
+-                      if ((i = open(devnam, O_RDWR)) >= 0)
++                      if ((i = open(devnam, O_RDWR | O_CLOEXEC)) >= 0)
+                               break;
+                       if (errno != EINTR) {
+                               error("Failed to reopen %s: %m", devnam);
+diff --git a/pppd/utils.c b/pppd/utils.c
+index 29bf970..6051b9a 100644
+--- a/pppd/utils.c
++++ b/pppd/utils.c
+@@ -918,14 +918,14 @@ lock(dev)
+     slprintf(lock_file, sizeof(lock_file), "%s/LCK..%s", LOCK_DIR, dev);
+ #endif
+-    while ((fd = open(lock_file, O_EXCL | O_CREAT | O_RDWR, 0644)) < 0) {
++    while ((fd = open(lock_file, O_EXCL | O_CREAT | O_RDWR | O_CLOEXEC, 0644)) < 0) {
+       if (errno != EEXIST) {
+           error("Can't create lock file %s: %m", lock_file);
+           break;
+       }
+       /* Read the lock file to find out who has the device locked. */
+-      fd = open(lock_file, O_RDONLY, 0);
++      fd = open(lock_file, O_RDONLY | O_CLOEXEC, 0);
+       if (fd < 0) {
+           if (errno == ENOENT) /* This is just a timing problem. */
+               continue;
+@@ -1004,7 +1004,7 @@ relock(pid)
+     if (lock_file[0] == 0)
+       return -1;
+-    fd = open(lock_file, O_WRONLY, 0);
++    fd = open(lock_file, O_WRONLY | O_CLOEXEC, 0);
+     if (fd < 0) {
+       error("Couldn't reopen lock file %s: %m", lock_file);
+       lock_file[0] = 0;
+-- 
+1.8.3.1
+
diff --git a/src/patches/ppp/0014-everywhere-use-SOCK_CLOEXEC-when-creating-socket.patch b/src/patches/ppp/0014-everywhere-use-SOCK_CLOEXEC-when-creating-socket.patch
new file mode 100644 (file)
index 0000000..3475f09
--- /dev/null
@@ -0,0 +1,174 @@
+From 2a97ab28ee00586e5f06b3ef3a0e43ea0c7c6499 Mon Sep 17 00:00:00 2001
+From: Michal Sekletar <msekleta@redhat.com>
+Date: Mon, 7 Apr 2014 14:21:41 +0200
+Subject: [PATCH 14/25] everywhere: use SOCK_CLOEXEC when creating socket
+
+---
+ pppd/plugins/pppoatm/pppoatm.c          |  2 +-
+ pppd/plugins/pppol2tp/openl2tp.c        |  2 +-
+ pppd/plugins/pppol2tp/pppol2tp.c        |  2 +-
+ pppd/plugins/rp-pppoe/if.c              |  2 +-
+ pppd/plugins/rp-pppoe/plugin.c          |  6 +++---
+ pppd/plugins/rp-pppoe/pppoe-discovery.c |  2 +-
+ pppd/sys-linux.c                        | 10 +++++-----
+ pppd/tty.c                              |  2 +-
+ 8 files changed, 14 insertions(+), 14 deletions(-)
+
+diff --git a/pppd/plugins/pppoatm/pppoatm.c b/pppd/plugins/pppoatm/pppoatm.c
+index d693350..c31bb34 100644
+--- a/pppd/plugins/pppoatm/pppoatm.c
++++ b/pppd/plugins/pppoatm/pppoatm.c
+@@ -135,7 +135,7 @@ static int connect_pppoatm(void)
+       if (!device_got_set)
+               no_device_given_pppoatm();
+-      fd = socket(AF_ATMPVC, SOCK_DGRAM, 0);
++      fd = socket(AF_ATMPVC, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+       if (fd < 0)
+               fatal("failed to create socket: %m");
+       memset(&qos, 0, sizeof qos);
+diff --git a/pppd/plugins/pppol2tp/openl2tp.c b/pppd/plugins/pppol2tp/openl2tp.c
+index 9643b96..1099575 100644
+--- a/pppd/plugins/pppol2tp/openl2tp.c
++++ b/pppd/plugins/pppol2tp/openl2tp.c
+@@ -83,7 +83,7 @@ static int openl2tp_client_create(void)
+       int result;
+       if (openl2tp_fd < 0) {
+-              openl2tp_fd = socket(PF_UNIX, SOCK_DGRAM, 0);
++              openl2tp_fd = socket(PF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+               if (openl2tp_fd < 0) {
+                       error("openl2tp connection create: %m");
+                       return -ENOTCONN;
+diff --git a/pppd/plugins/pppol2tp/pppol2tp.c b/pppd/plugins/pppol2tp/pppol2tp.c
+index a7e3400..e64a778 100644
+--- a/pppd/plugins/pppol2tp/pppol2tp.c
++++ b/pppd/plugins/pppol2tp/pppol2tp.c
+@@ -208,7 +208,7 @@ static void send_config_pppol2tp(int mtu,
+               struct ifreq ifr;
+               int fd;
+-              fd = socket(AF_INET, SOCK_DGRAM, 0);
++              fd = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+               if (fd >= 0) {
+                       memset (&ifr, '\0', sizeof (ifr));
+                       strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+diff --git a/pppd/plugins/rp-pppoe/if.c b/pppd/plugins/rp-pppoe/if.c
+index 91e9a57..72aba41 100644
+--- a/pppd/plugins/rp-pppoe/if.c
++++ b/pppd/plugins/rp-pppoe/if.c
+@@ -116,7 +116,7 @@ openInterface(char const *ifname, UINT16_t type, unsigned char *hwaddr)
+     stype = SOCK_PACKET;
+ #endif
+-    if ((fd = socket(domain, stype, htons(type))) < 0) {
++    if ((fd = socket(domain, stype | SOCK_CLOEXEC, htons(type))) < 0) {
+       /* Give a more helpful message for the common error case */
+       if (errno == EPERM) {
+           fatal("Cannot create raw socket -- pppoe must be run as root.");
+diff --git a/pppd/plugins/rp-pppoe/plugin.c b/pppd/plugins/rp-pppoe/plugin.c
+index a8c2bb4..24bdf8f 100644
+--- a/pppd/plugins/rp-pppoe/plugin.c
++++ b/pppd/plugins/rp-pppoe/plugin.c
+@@ -137,7 +137,7 @@ PPPOEConnectDevice(void)
+     /* server equipment).                                                  */
+     /* Opening this socket just before waitForPADS in the discovery()      */
+     /* function would be more appropriate, but it would mess-up the code   */
+-    conn->sessionSocket = socket(AF_PPPOX, SOCK_STREAM, PX_PROTO_OE);
++    conn->sessionSocket = socket(AF_PPPOX, SOCK_STREAM | SOCK_CLOEXEC, PX_PROTO_OE);
+     if (conn->sessionSocket < 0) {
+       error("Failed to create PPPoE socket: %m");
+       return -1;
+@@ -148,7 +148,7 @@ PPPOEConnectDevice(void)
+     lcp_wantoptions[0].mru = conn->mru;
+     /* Update maximum MRU */
+-    s = socket(AF_INET, SOCK_DGRAM, 0);
++    s = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+     if (s < 0) {
+       error("Can't get MTU for %s: %m", conn->ifName);
+       goto errout;
+@@ -320,7 +320,7 @@ PPPoEDevnameHook(char *cmd, char **argv, int doit)
+     }
+     /* Open a socket */
+-    if ((fd = socket(PF_PACKET, SOCK_RAW, 0)) < 0) {
++    if ((fd = socket(PF_PACKET, SOCK_RAW | SOCK_CLOEXEC, 0)) < 0) {
+       r = 0;
+     }
+diff --git a/pppd/plugins/rp-pppoe/pppoe-discovery.c b/pppd/plugins/rp-pppoe/pppoe-discovery.c
+index 3d3bf4e..c0d927d 100644
+--- a/pppd/plugins/rp-pppoe/pppoe-discovery.c
++++ b/pppd/plugins/rp-pppoe/pppoe-discovery.c
+@@ -121,7 +121,7 @@ openInterface(char const *ifname, UINT16_t type, unsigned char *hwaddr)
+     stype = SOCK_PACKET;
+ #endif
+-    if ((fd = socket(domain, stype, htons(type))) < 0) {
++    if ((fd = socket(domain, stype | SOCK_CLOEXEC, htons(type))) < 0) {
+       /* Give a more helpful message for the common error case */
+       if (errno == EPERM) {
+           rp_fatal("Cannot create raw socket -- pppoe must be run as root.");
+diff --git a/pppd/sys-linux.c b/pppd/sys-linux.c
+index 00a2cf5..0690019 100644
+--- a/pppd/sys-linux.c
++++ b/pppd/sys-linux.c
+@@ -308,12 +308,12 @@ static int modify_flags(int fd, int clear_bits, int set_bits)
+ void sys_init(void)
+ {
+     /* Get an internet socket for doing socket ioctls. */
+-    sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
++    sock_fd = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+     if (sock_fd < 0)
+       fatal("Couldn't create IP socket: %m(%d)", errno);
+ #ifdef INET6
+-    sock6_fd = socket(AF_INET6, SOCK_DGRAM, 0);
++    sock6_fd = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+     if (sock6_fd < 0)
+       sock6_fd = -errno;      /* save errno for later */
+ #endif
+@@ -1857,7 +1857,7 @@ get_if_hwaddr(u_char *addr, char *name)
+       struct ifreq ifreq;
+       int ret, sock_fd;
+-      sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
++      sock_fd = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+       if (sock_fd < 0)
+               return 0;
+       memset(&ifreq.ifr_hwaddr, 0, sizeof(struct sockaddr));
+@@ -2067,7 +2067,7 @@ int ppp_available(void)
+ /*
+  * Open a socket for doing the ioctl operations.
+  */
+-    s = socket(AF_INET, SOCK_DGRAM, 0);
++    s = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+     if (s < 0)
+       return 0;
+@@ -2860,7 +2860,7 @@ ether_to_eui64(eui64_t *p_eui64)
+     int skfd;
+     const unsigned char *ptr;
+-    skfd = socket(PF_INET6, SOCK_DGRAM, 0);
++    skfd = socket(PF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+     if(skfd == -1)
+     {
+         warn("could not open IPv6 socket");
+diff --git a/pppd/tty.c b/pppd/tty.c
+index bc96695..8e76a5d 100644
+--- a/pppd/tty.c
++++ b/pppd/tty.c
+@@ -896,7 +896,7 @@ open_socket(dest)
+     *sep = ':';
+     /* get a socket and connect it to the other end */
+-    sock = socket(PF_INET, SOCK_STREAM, 0);
++    sock = socket(PF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
+     if (sock < 0) {
+       error("Can't create socket: %m");
+       return -1;
+-- 
+1.8.3.1
+
diff --git a/src/patches/ppp/ppp-2.4.6-increase-max-padi-attempts.patch b/src/patches/ppp/ppp-2.4.6-increase-max-padi-attempts.patch
new file mode 100644 (file)
index 0000000..b09a9b5
--- /dev/null
@@ -0,0 +1,13 @@
+diff --git a/pppd/plugins/rp-pppoe/pppoe.h b/pppd/plugins/rp-pppoe/pppoe.h
+index 9ab2eee..86762bd 100644
+--- a/pppd/plugins/rp-pppoe/pppoe.h
++++ b/pppd/plugins/rp-pppoe/pppoe.h
+@@ -148,7 +148,7 @@ extern UINT16_t Eth_PPPOE_Session;
+ #define STATE_TERMINATED    4
+ /* How many PADI/PADS attempts? */
+-#define MAX_PADI_ATTEMPTS 3
++#define MAX_PADI_ATTEMPTS 12
+ /* Initial timeout for PADO/PADS */
+ #define PADI_TIMEOUT 5
index dab1d6dc9309beb5b973afc327c5562056bcdee9..a340d6f1462e6eb1dd2ddacef5682dd28f8306b7 100644 (file)
@@ -60,6 +60,7 @@ echo "Running mkisofs"
 mkisofs -J -r -V "ipfire backup ${TS}" \
             -b boot/isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table \
             -c boot/isolinux/boot.catalog backupiso.${TS} > $(basename ${ISO} .iso)-${TS}.iso
+isohybrid $(basename ${ISO} .iso)-${TS}.iso
 
 echo "Cleaning up"
 rm -rf backupiso.${TS}
index f97e75074b48e5bf9d6f6412b800ce7d5084a03e..5e77fce5c024a3f17ba4c892a94abfe95845e8c6 100644 (file)
@@ -51,7 +51,7 @@ if ($ip eq "unavailable") {
        exit(0);
 }
 
-&General::log("Dynamic DNS public router IP is: $ip");
+#&General::log("Dynamic DNS public router IP is: $ip");
 
 if ($ARGV[0] eq '-f') {
        unlink ($cachefile);    # next regular calls will try again if this force update fails.
@@ -400,6 +400,41 @@ if ($ip ne $ipcache) {
                                &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure (could not connect to server)");
                            }
                        }
+                        elsif ($settings{'SERVICE'} eq 'spdns.de') {
+                            # use proxy ?
+                            my %proxysettings;
+                            &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
+                            if ($_=$proxysettings{'UPSTREAM_PROXY'}) {
+                                my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);
+                                Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );
+                            }
+                            
+                            if ($settings{'HOSTNAME'} eq '') {
+                                $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};
+                            } else {
+                                $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";
+                            }
+                            
+                            my ($out, $response) = Net::SSLeay::get_https( 'update.spdns.de', 443,
+                                                                            "/nic/update?&hostname=$settings{'HOSTDOMAIN'}&myip=$ip",
+                                                                            Net::SSLeay::make_headers('User-Agent' => 'IPFire' ,
+                                                                                                      'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}"))
+                                                                         );
+                            
+                            #Valid responses from service are:
+                            # good xxx.xxx.xxx.xxx
+                            # nochg  xxx.xxx.xxx.xxx
+                            if ($response =~ m%HTTP/1\.. 200 OK%) {
+                                if ($out !~ m/good |nochg /ig) {
+                                    &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");
+                                } else {
+                                    &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");
+                                    $success++;
+                                }
+                            } else {
+                                &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)");
+                            }
+                        }
                        elsif ($settings{'SERVICE'} eq 'strato') {
                                # use proxy ?
                                my %proxysettings;
@@ -616,7 +651,7 @@ if ($ip ne $ipcache) {
                                &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)");
                            }
                        }
-                       elsif ($settings{'SERVICE'} eq 'udmedia.de') {
+                       elsif ($settings{'SERVICE'} eq 'udmedia') {
                            # use proxy ?
                            my %proxysettings;
                            &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
@@ -650,6 +685,73 @@ if ($ip ne $ipcache) {
                                &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server, check your credentials---$out-$response--)");
                            }
                        }
+                        elsif ($settings{'SERVICE'} eq 'twodns') {
+                            # use proxy ?
+                            my %proxysettings;
+                            &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
+                            if ($_=$proxysettings{'UPSTREAM_PROXY'}) {
+                                my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);
+                                Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );
+                            }
+
+                            if ($settings{'HOSTNAME'} eq '') {
+                                $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};
+                            } else {
+                                $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";
+                            }
+
+                            my ($out, $response) = Net::SSLeay::get_https( 'update.twodns.de',
+                                                                            443,
+                                                                           "/update?hostname=$settings{'HOSTDOMAIN'}&ip=$ip",
+                                                                            Net::SSLeay::make_headers('User-Agent' => 'IPFire',
+                                                                                                      'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}")) );
+
+                            # Valid response are 'ok'   'nochange'
+                            if ($response =~ m%HTTP/1\.. 200 OK%) {
+                                if ( $out !~ m/^(good|nochg)/ ) {
+                                    $out =~ s/\n/ /g;
+                                    &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");
+                                } else {
+                                    &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");
+                                    $success++;
+                                }
+                            } else {
+                                &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server, check your credentials---$out-$response--)");
+                            }
+                        }
+                       elsif ($settings{'SERVICE'} eq 'variomedia') { 
+                           # use proxy ?
+                           my %proxysettings;
+                           &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
+                           if ($_=$proxysettings{'UPSTREAM_PROXY'}) {
+                               my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);
+                               Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );
+                           }
+                           if ($settings{'HOSTNAME'} eq '') {
+                               $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};
+                           } else {
+                               $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";
+                           }
+                           my ($out, $response) = Net::SSLeay::get_https( 'dyndns.variomedia.de',
+                                                                           443,
+                                                                           "/nic/update?hostname=$settings{'HOSTDOMAIN'}&myip=$ip",
+                                                                           Net::SSLeay::make_headers('User-Agent' => 'IPFire',
+                                                                                                     'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}")) );
+                           # Valid response is 'good $ip'
+                           if ($response =~ m%HTTP/1\.. 200 OK%) {
+                               if ( $out !~ m/^good $ip/ ) {
+                                   &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} ($ip) : failure ($out)");
+                               } else {
+                                   &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} ($ip) : success");
+                                   $success++;
+                               }
+                           } else {
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server, check your credentials---$out-$response--)");
+                           }
+                       }
                        else {
                                if ($settings{'WILDCARDS'} eq 'on') {
                                    $settings{'WILDCARDS'} = '-w';
index 48fc6d434dd5ef0e7c5535800f73df6d383edb8a..ba6654700c0f2e75682223445318a05269409942 100644 (file)
@@ -60,6 +60,67 @@ WARN="\\033[1;35m"
 FAIL="\\033[1;31m"
 NORMAL="\\033[0;39m"
 
+configure_target() {
+       local target_arch="${1}"
+
+       if [ "${target_arch}" = "default" ]; then
+               target_arch="$(configure_target_guess)"
+       fi
+
+       case "${target_arch}" in
+               i586)
+                       BUILDTARGET="${target_arch}-pc-linux-gnu"
+                       CROSSTARGET="${BUILD_ARCH}-cross-linux-gnu"
+                       CFLAGS_ARCH="-march=i586 -fomit-frame-pointer"
+                       ;;
+
+               armv5tel)
+                       BUILDTARGET="${target_arch}-unknown-linux-gnueabi"
+                       CROSSTARGET="${BUILD_ARCH}-cross-linux-gnueabi"
+                       CFLAGS_ARCH="-march=armv5te -mfloat-abi=soft -fomit-frame-pointer"
+                       MACHINE_TYPE="arm"
+                       ;;
+
+               *)
+                       exiterror "Cannot build for architure ${target_arch}"
+                       ;;
+       esac
+
+       # Check if the QEMU helper is available if needed.
+       if qemu_is_required "${target_arch}"; then
+               local qemu_target_helper="$(qemu_find_target_helper_name "${target_arch}")"
+
+               if [ -n "${qemu_target_helper}" ]; then
+                       QEMU_TARGET_HELPER="${qemu_target_helper}"
+               else
+                       exiterror "Could not find a binfmt_misc helper entry for ${target_arch}"
+               fi
+       fi
+
+       TARGET_ARCH="${target_arch}"
+
+       # Old variable names
+       MACHINE="${TARGET_ARCH}"
+
+       CFLAGS="-O2 -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fPIC"
+       CFLAGS="${CFLAGS} -fstack-protector-all --param=ssp-buffer-size=4 ${CFLAGS_ARCH}"
+       CXXFLAGS="${CFLAGS}"
+}
+
+configure_target_guess() {
+       case "${BUILD_ARCH}" in
+               x86_64|i686|i586)
+                       echo "i586"
+                       ;;
+               armv7*|armv6*|armv5*)
+                       echo "armv5tel"
+                       ;;
+               *)
+                       exiterror "Cannot guess target architecture"
+                       ;;
+       esac
+}
+
 evaluate() {
        if [ "$?" -eq "0" ]; then
                beautify message DONE
@@ -217,30 +278,6 @@ get_pkg_ver()
        echo "$PKG_VER"
 } # End of get_pkg_ver()
 
-if [ 'x86_64' = $MACHINE -o 'i686' = $MACHINE -o 'i586' = $MACHINE ]; then
-       echo "`date -u '+%b %e %T'`: Machine is iX86 (or equivalent)" >> $LOGFILE
-       MACHINE=i586
-       CROSSTARGET=${MACHINE}-cross-linux-gnu
-       BUILDTARGET=i586-pc-linux-gnu
-       CFLAGS_ARCH="${GLOBAL_CFLAGS} -march=i586 -fomit-frame-pointer"
-elif [ 'armv5tejl' = $MACHINE -o 'armv5tel' = $MACHINE -o 'armv6l' = $MACHINE -o 'armv7l' = $MACHINE ]; then
-       echo "`date -u '+%b %e %T'`: Machine is ARM (or equivalent)" >> $LOGFILE
-       MACHINE=armv5tel
-       MACHINE_TYPE=arm
-       CROSSTARGET=${MACHINE}-cross-linux-gnueabi
-       BUILDTARGET=${MACHINE}-unknown-linux-gnueabi
-       CFLAGS_ARCH="-march=armv5te -mfloat-abi=soft -fomit-frame-pointer"
-else
-       echo "`date -u '+%b %e %T'`: Can't determine your architecture - $MACHINE"
-       exit 1
-fi
-
-CFLAGS="-O2 -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fPIC"
-CFLAGS="${CFLAGS} -fstack-protector-all --param=ssp-buffer-size=4 ${CFLAGS_ARCH}"
-CXXFLAGS="${CFLAGS}"
-C2FLAGS="${CFLAGS}"
-CXX2FLAGS="${CXXFLAGS}"
-
 # Define immediately
 stdumount() {
        umount $BASEDIR/build/sys                       2>/dev/null;
@@ -282,22 +319,136 @@ fake_environ() {
        env="${env} UTS_RELEASE=${KVER}"
 
        # Fake machine version.
-       env="${env} UTS_MACHINE=${MACHINE}"
+       env="${env} UTS_MACHINE=${TARGET_ARCH}"
+
+       echo "${env}"
+}
+
+qemu_environ() {
+       local env
+
+       # Don't add anything if qemu is not used.
+       if ! qemu_is_required; then
+               return
+       fi
+
+       # Set default qemu options
+       case "${TARGET_ARCH}" in
+               arm*)
+                       QEMU_CPU="${QEMU_CPU:-cortex-a9}"
+
+                       env="${env} QEMU_CPU=${QEMU_CPU}"
+                       ;;
+       esac
+
+       # Enable QEMU strace
+       #env="${env} QEMU_STRACE=1"
 
        echo "${env}"
 }
 
+qemu_is_required() {
+       local target_arch="${1}"
+
+       if [ -z "${target_arch}" ]; then
+               target_arch="${TARGET_ARCH}"
+       fi
+
+       case "${BUILD_ARCH},${target_arch}" in
+               x86_64,arm*|i?86,arm*)
+                       return 0
+                       ;;
+               *)
+                       return 1
+                       ;;
+       esac
+}
+
+qemu_install_helper() {
+       # Do nothing, if qemu is not required
+       if ! qemu_is_required; then
+               return 0
+       fi
+
+       if [ -z "${QEMU_TARGET_HELPER}" ]; then
+               exiterror "QEMU_TARGET_HELPER not set"
+       fi
+
+       # Check if the helper is already installed.
+       if [ -x "${LFS}${QEMU_TARGET_HELPER}" ]; then
+               return 0
+       fi
+
+       # Try to find a suitable binary that we can install
+       # to the build environment.
+       local file
+       for file in "${QEMU_TARGET_HELPER}" "${QEMU_TARGET_HELPER}-static"; do
+               # file must exist and be executable.
+               [ -x "${file}" ] || continue
+
+               # Must be static.
+               file_is_static "${file}" || continue
+
+               local dirname="${LFS}$(dirname "${file}")"
+               mkdir -p "${dirname}"
+
+               install -m 755 "${file}" "${LFS}${QEMU_TARGET_HELPER}"
+               return 0
+       done
+
+       exiterror "Could not find a statically-linked QEMU emulator: ${QEMU_TARGET_HELPER}"
+}
+
+qemu_find_target_helper_name() {
+       local target_arch="${1}"
+
+       local magic
+       case "${target_arch}" in
+               arm*)
+                       magic="7f454c4601010100000000000000000002002800"
+                       ;;
+       esac
+
+       [ -z "${magic}" ] && return 1
+
+       local file
+       for file in /proc/sys/fs/binfmt_misc/*; do
+               # Search for the file with the correct magic value.
+               grep -qE "^magic ${magic}$" "${file}" || continue
+
+               local interpreter="$(grep "^interpreter" "${file}" | awk '{ print $2 }')"
+
+               [ -n "${interpreter}" ] || continue
+               [ "${interpreter:0:1}" = "/" ] || continue
+               [ -x "${interpreter}" ] || continue
+
+               echo "${interpreter}"
+               return 0
+       done
+
+       return 1
+}
+
+file_is_static() {
+       local file="${1}"
+
+       file ${file} 2>/dev/null | grep -q "statically linked"
+}
+
 entershell() {
        if [ ! -e $BASEDIR/build/usr/src/lfs/ ]; then
                exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/"
        fi
 
+       # Install QEMU helper, if needed
+       qemu_install_helper
+
        echo "Entering to a shell inside LFS chroot, go out with exit"
-       chroot $LFS /tools/bin/env -i HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
+       chroot $LFS /tools/bin/env -i HOME=/root TERM=$TERM PS1='ipfire build chroot ($(uname -m)) \u:\w\$ ' \
                PATH=/tools/ccache/bin:/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
                VERSION=$VERSION CONFIG_ROOT=$CONFIG_ROOT \
                NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
-               CFLAGS="$CF2LAGS" CXXFLAGS="$CXX2FLAGS" \
+               CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" \
                CCACHE_DIR=/usr/src/ccache \
                CCACHE_COMPRESS=1 \
                CCACHE_COMPILERCHECK="none" \
@@ -306,9 +457,9 @@ entershell() {
                CROSSTARGET="${CROSSTARGET}" \
                MACHINE="$MACHINE" \
                MACHINE_TYPE="$MACHINE_TYPE" \
-               KGCC="ccache /usr/bin/gcc" \
                $(fake_environ) \
-               /tools/bin/bash
+               $(qemu_environ) \
+               /tools/bin/bash -i
        if [ $? -ne 0 ]; then
                        beautify message FAIL
                        exiterror "chroot error"
@@ -410,6 +561,9 @@ lfsmake2() {
        lfsmakecommoncheck $*
        [ $? == 1 ] && return 0
 
+       # Install QEMU helper, if needed
+       qemu_install_helper
+
        local PKG_TIME_START=`date +%s`
        chroot $LFS /tools/bin/env -i   HOME=/root \
                                                TERM=$TERM PS1='\u:\w\$ ' \
@@ -418,7 +572,7 @@ lfsmake2() {
                                                SYSTEM_RELEASE="${SYSTEM_RELEASE}" \
                                                CONFIG_ROOT=$CONFIG_ROOT \
                                                NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
-                                               CFLAGS="$C2FLAGS" CXXFLAGS="$CXX2FLAGS" \
+                                               CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" \
                                                CCACHE_DIR=/usr/src/ccache CCACHE_COMPRESS=1 \
                                                CCACHE_COMPILERCHECK="none" \
                                                KVER=$KVER MAKETUNING=$MAKETUNING \
@@ -426,6 +580,7 @@ lfsmake2() {
                                                CROSSTARGET="${CROSSTARGET}" \
                                                MACHINE="$MACHINE" \
                                                MACHINE_TYPE="$MACHINE_TYPE" \
+                                               $(qemu_environ) \
                                                $(fake_environ) \
                                                /tools/bin/bash -x -c "cd /usr/src/lfs && \
                                                make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
@@ -446,6 +601,9 @@ ipfiremake() {
        lfsmakecommoncheck $*
        [ $? == 1 ] && return 0
 
+       # Install QEMU helper, if needed
+       qemu_install_helper
+
        local PKG_TIME_START=`date +%s`
        chroot $LFS /tools/bin/env -i   HOME=/root \
                                                TERM=$TERM PS1='\u:\w\$ ' \
@@ -455,7 +613,7 @@ ipfiremake() {
                                                CONFIG_ROOT=$CONFIG_ROOT \
                                                NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
                                                SYSTEM_RELEASE="$SYSTEM_RELEASE" \
-                                               CFLAGS="$C2FLAGS" CXXFLAGS="$CXX2FLAGS" \
+                                               CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" \
                                                CCACHE_DIR=/usr/src/ccache CCACHE_COMPRESS=1 \
                                                CCACHE_COMPILERCHECK="none" \
                                                KVER=$KVER MAKETUNING=$MAKETUNING \
@@ -463,6 +621,7 @@ ipfiremake() {
                                                CROSSTARGET="${CROSSTARGET}" \
                                                MACHINE="$MACHINE" \
                                                MACHINE_TYPE="$MACHINE_TYPE" \
+                                               $(qemu_environ) \
                                                $(fake_environ) \
                                                /bin/bash -x -c "cd /usr/src/lfs && \
                                                make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
@@ -483,6 +642,9 @@ ipfiredist() {
        lfsmakecommoncheck $*
        [ $? == 1 ] && return 0
        
+       # Install QEMU helper, if needed
+       qemu_install_helper
+
        local PKG_TIME_START=`date +%s`
        chroot $LFS /tools/bin/env -i   HOME=/root \
                                        TERM=$TERM PS1='\u:\w\$ ' \
@@ -490,7 +652,7 @@ ipfiredist() {
                                        VERSION=$VERSION \
                                        CONFIG_ROOT=$CONFIG_ROOT \
                                        NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
-                                       CFLAGS="$C2FLAGS" CXXFLAGS="$CXX2FLAGS" \
+                                       CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" \
                                        CCACHE_DIR=/usr/src/ccache CCACHE_COMPRESS=1 \
                                        CCACHE_COMPILERCHECK="none" \
                                        KVER=$KVER \
@@ -498,6 +660,7 @@ ipfiredist() {
                                        CROSSTARGET="${CROSSTARGET}" \
                                        MACHINE="$MACHINE" \
                                        MACHINE_TYPE="$MACHINE_TYPE" \
+                                       $(qemu_environ) \
                                        $(fake_environ) \
                                        /bin/bash -x -c "cd /usr/src/lfs && \
                                        make -f $1 LFS_BASEDIR=/usr/src dist" >>$LOGFILE 2>&1
@@ -518,6 +681,9 @@ installmake() {
        lfsmakecommoncheck $*
        [ $? == 1 ] && return 0
 
+       # Install QEMU helper, if needed
+       qemu_install_helper
+
        local PKG_TIME_START=`date +%s`
        chroot $LFS /tools/bin/env -i   HOME=/root \
                                                TERM=$TERM PS1='\u:\w\$ ' \
@@ -526,7 +692,7 @@ installmake() {
                                                SYSTEM_RELEASE="${SYSTEM_RELEASE}" \
                                                CONFIG_ROOT=$CONFIG_ROOT \
                                                NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
-                                               CFLAGS="-Os" CXXFLAGS="-Os" \
+                                               CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" \
                                                CCACHE_DIR=/usr/src/ccache CCACHE_COMPRESS=1 CCACHE_HASHDIR=1 \
                                                KVER=$KVER \
                                                BUILDTARGET="$BUILDTARGET" \